From a0366891fde6d5fe1495555f110f7ecac712e485 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Mon, 25 May 2026 13:28:29 +0200 Subject: [PATCH 1/7] build: migrate to Symbolics 7 / SciMLBase 3 / MTKBase stack Compat bumps: Symbolics 7, SymbolicUtils 4, SciMLBase 3, OrdinaryDiffEqTsit5 2, OrdinaryDiffEqRosenbrock 2, ModelingToolkitBase 1, HarmonicBalance 0.17, QuestBase 0.4. LinearSolve, NonlinearSolve, and SteadyStateDiffEq are pinned to the versions that widen their SciMLBase compat to 3 (3.75 / 4.17 / 2.10). Bump HSS itself to v0.5.0. ModelingToolkit weakdep is replaced with ModelingToolkitBase across the SteadyStateDiffEq extension test, which now uses `mtkcompile` instead of the removed `structural_simplify`. Latexify is no longer re-exported from Symbolics 7, so it is added as a direct weakdep and the PlotsExt trigger becomes `[Plots, Latexify]`. QuantumCumulants extension and its tests (`input_output.jl`) are temporarily disabled because the latest QC release (0.4.3) caps SymbolicUtils at 3 and SciMLBase at 2. Re-enable when QC supports the new stack. Symbolics 7's `substitute` no longer auto-folds numeric Const wrappers, so the numerical extraction points (`transform_solutions`, `Lorentzian_spectrum`, LinearResponse `response.jl`, and TimeEvolution `ODEProblem`) now go through `Symbolics.substitute(...; fold=Val{true}())` plus `Symbolics.value` (or `SymbolicUtils.unwrap_const`) to return concrete `Float64`s. A `[sources]` block points test sandboxes at the local HarmonicBalance and QuestBase clones so the upgrade can be validated end to end without registering the bumped versions first. --- Project.toml | 44 ++++++++++++----------- ext/PlotsExt/PlotsExt.jl | 4 +-- ext/TimeEvolution/ODEProblem.jl | 16 ++++----- ext/TimeEvolution/TimeEvolution.jl | 2 +- src/LinearResponse/LinearResponse.jl | 1 + src/LinearResponse/Lorentzian_spectrum.jl | 2 +- src/LinearResponse/response.jl | 2 +- src/transform_solutions.jl | 13 ++++--- test/code_quality.jl | 2 ++ test/extensions/SteadyStateDiffEqExt.jl | 10 +++--- test/runtests.jl | 12 ++++--- 11 files changed, 61 insertions(+), 47 deletions(-) diff --git a/Project.toml b/Project.toml index a439cff..efb8dbf 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "HarmonicSteadyState" uuid = "1158f75c-a779-4b85-8bfb-8fcf6bf02ced" +version = "0.5.0" authors = ["Orjan Ameye ", "Jan Kosata ", "Javier del Pino "] -version = "0.4.1" [deps] BijectiveHilbert = "91e7fc40-53cd-4118-bd19-d7fcd1de2a54" @@ -23,22 +23,21 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" [weakdeps] HarmonicBalance = "e13b9ff6-59c3-11ec-14b1-f3d2cc6c135e" +Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +ModelingToolkitBase = "7771a370-6774-4173-bd38-47e70ca0b839" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -QuantumCumulants = "35bcea6d-e19f-57db-af74-8011de6c7255" SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" [extensions] HarmonicBalanceExt = "HarmonicBalance" -PlotsExt = "Plots" -QuantumCumulantsExt = "QuantumCumulants" +PlotsExt = ["Plots", "Latexify"] SteadyStateDiffEqExt = "SteadyStateDiffEq" TimeEvolution = "OrdinaryDiffEqTsit5" [compat] -Peaks = "0.5" Aqua = "0.8.11" BijectiveHilbert = "0.3, 0.5" CheckConcreteStructs = "0.1.0" @@ -47,29 +46,30 @@ DocStringExtensions = "0.9.4" Documenter = "1.4" ExplicitImports = "1.11" FunctionWrappers = "1.1.3" -HarmonicBalance = "0.16" +HarmonicBalance = "0.17" HomotopyContinuation = "2.12" JET = "0.9.18, 0.10" +Latexify = "0.16" LinearAlgebra = "1.10" -LinearSolve = "3.7.2" -ModelingToolkit = "10" +LinearSolve = "3.75" +ModelingToolkitBase = "1" NaNMath = "1.1" -NonlinearSolve = "4.5.1" +NonlinearSolve = "4.17" OrderedCollections = "1.8" -OrdinaryDiffEqRosenbrock = "1.9" -OrdinaryDiffEqTsit5 = "1.1" +OrdinaryDiffEqRosenbrock = "2" +OrdinaryDiffEqTsit5 = "2" +Peaks = "0.5" Plots = "1.40.9" PrecompileTools = "1.2" Printf = "1.10" ProgressMeter = "1.7.2" -QuantumCumulants = "0.4" -QuestBase = "0.3.4" +QuestBase = "0.4" Random = "1.10" RuntimeGeneratedFunctions = "0.5.5" -SciMLBase = "2.83.1" -SteadyStateDiffEq = "2.5" -SymbolicUtils = "3.25" -Symbolics = "6.34" +SciMLBase = "3" +SteadyStateDiffEq = "2.10" +SymbolicUtils = "4" +Symbolics = "7" Test = "1.10" TestExtras = "0.3" julia = "1.10" @@ -81,14 +81,14 @@ Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7" HarmonicBalance = "e13b9ff6-59c3-11ec-14b1-f3d2cc6c135e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" +ModelingToolkitBase = "7771a370-6774-4173-bd38-47e70ca0b839" NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce" OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a" Peaks = "18e31ff7-3703-566c-8e60-38913d67486b" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -QuantumCumulants = "35bcea6d-e19f-57db-af74-8011de6c7255" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" @@ -96,5 +96,9 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a" +[sources] +HarmonicBalance = {path = "../HarmonicBalance.jl"} +QuestBase = {path = "../QuestBase.jl"} + [targets] -test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "QuantumCumulants", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkit", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks"] +test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkitBase", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks", "Latexify"] diff --git a/ext/PlotsExt/PlotsExt.jl b/ext/PlotsExt/PlotsExt.jl index 55d8409..ba14396 100644 --- a/ext/PlotsExt/PlotsExt.jl +++ b/ext/PlotsExt/PlotsExt.jl @@ -24,8 +24,8 @@ using HarmonicSteadyState.LinearResponse: get_jacobian_response, get_rotframe_jacobian_response using Plots: heatmap, theme_palette, scatter, RGB, cgrad -using Symbolics.Latexify: Latexify, latexify -using Symbolics.Latexify.LaTeXStrings: LaTeXStrings, @L_str +using Latexify: Latexify, latexify +using Latexify.LaTeXStrings: LaTeXStrings, @L_str using SciMLBase: SciMLBase const _set_Plots_default = Dict{Symbol,Any}([ diff --git a/ext/TimeEvolution/ODEProblem.jl b/ext/TimeEvolution/ODEProblem.jl index 1900974..cb9ca18 100644 --- a/ext/TimeEvolution/ODEProblem.jl +++ b/ext/TimeEvolution/ODEProblem.jl @@ -29,16 +29,16 @@ function OrdinaryDiffEqTsit5.ODEProblem( ) vars = get_variables(eom) - # substitute the harmonic variables - eqs(v) = [substitute(eq, Dict(zip(vars, v))) for eq in subeqs] - # substitute sweep parameters + # substitute the harmonic variables and sweep parameters; fold so the result is numeric function eqs(v, T) - return real.( - unwrap.([ - substitute(eq, Dict(zip(keys(sweep), [sweep[p](T) for p in keys(sweep)]))) - for eq in eqs(v) - ]), + sub_dict = merge( + Dict(zip(vars, v)), + Dict(zip(keys(sweep), [sweep[p](T) for p in keys(sweep)])), ) + return [ + real(Symbolics.value(Symbolics.substitute(eq, sub_dict; fold=Val{true}()))) + for eq in subeqs + ] end function f!(du, u, p, T) # in-place diff --git a/ext/TimeEvolution/TimeEvolution.jl b/ext/TimeEvolution/TimeEvolution.jl index 0c0d3bf..346ec70 100644 --- a/ext/TimeEvolution/TimeEvolution.jl +++ b/ext/TimeEvolution/TimeEvolution.jl @@ -1,7 +1,7 @@ module TimeEvolution using DocStringExtensions: TYPEDSIGNATURES -using Symbolics: Num, substitute, unwrap, get_variables +using Symbolics: Symbolics, Num, get_variables using OrdinaryDiffEqTsit5: OrdinaryDiffEqTsit5 using HarmonicSteadyState: diff --git a/src/LinearResponse/LinearResponse.jl b/src/LinearResponse/LinearResponse.jl index ab63c42..8a324e8 100644 --- a/src/LinearResponse/LinearResponse.jl +++ b/src/LinearResponse/LinearResponse.jl @@ -5,6 +5,7 @@ using DocStringExtensions: TYPEDFIELDS, TYPEDSIGNATURES, TYPEDEF using ProgressMeter: ProgressMeter, Progress, next! using Symbolics: Symbolics, Num, unwrap +using SymbolicUtils: SymbolicUtils using LinearAlgebra: LinearAlgebra, norm, eigen, eigvals, eigvecs, I using HarmonicSteadyState: diff --git a/src/LinearResponse/Lorentzian_spectrum.jl b/src/LinearResponse/Lorentzian_spectrum.jl index 7172436..ac968d5 100644 --- a/src/LinearResponse/Lorentzian_spectrum.jl +++ b/src/LinearResponse/Lorentzian_spectrum.jl @@ -112,7 +112,7 @@ function JacobianSpectrum( for pair in _get_uv_pairs(hvars) u, v = hvars[pair] eigvec_2d = eigvec[pair] # fetch the relevant part of the Jacobian eigenvector - ωnum = real(unwrap(Symbolics.substitute(u.ω, Dict(solution_dict)))) + ωnum = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(Symbolics.substitute(u.ω, Dict(solution_dict))))) # ^ the harmonic (numerical now) associated to this harmonic variable # eigvec_2d is associated to a natural variable -> this variable gets Lorentzian peaks diff --git a/src/LinearResponse/response.jl b/src/LinearResponse/response.jl index 47a625b..22de401 100644 --- a/src/LinearResponse/response.jl +++ b/src/LinearResponse/response.jl @@ -227,7 +227,7 @@ function get_response(rmat::ResponseMatrix, s::StateDict, Ω) # uv-type for pair in _get_uv_pairs(rmat.variables) u, v = rmat.variables[pair] - this_ω = unwrap(substitute_all(u.ω, s)) + this_ω = SymbolicUtils.unwrap_const(unwrap(substitute_all(u.ω, s))) uv1 = _evaluate_response_vector(rmat, s, Ω - this_ω)[pair] uv2 = _evaluate_response_vector(rmat, s, -Ω + this_ω)[pair] resp += sqrt(_plusamp(uv1)^2 + _minusamp(uv2)^2) diff --git a/src/transform_solutions.jl b/src/transform_solutions.jl index 681d32a..6cefbd0 100644 --- a/src/transform_solutions.jl +++ b/src/transform_solutions.jl @@ -128,7 +128,10 @@ function transform_solutions( rule(u) = Dict(zip(vars, u)) - transformed = map(x -> Symbolics.unwrap(substitute_all(expr, rule(x))), soln) + transformed = map( + x -> Symbolics.value(Symbolics.substitute(expr, rule(x); fold=Val{true}())), + soln, + ) return convert(T, transformed) # TODO is this necessary? end """ Parse `expr` into a Symbolics.jl expression, substitute with `rules` and build a function taking free_symbols """ @@ -306,8 +309,8 @@ end function _to_lab_frame_velocity(soln, vars, times) timetrace = zeros(length(times)) for var in vars - val = real(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)) - ω = real(real(unwrap(substitute_all(var.ω, soln)))) + val = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)))) + ω = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(var.ω, soln)))) if var.type == "u" timetrace .+= -ω * val * sin.(ω * times) elseif var.type == "v" @@ -321,8 +324,8 @@ function _to_lab_frame(soln, vars, times)::Vector{AbstractFloat} timetrace = zeros(length(times)) for var in vars - val = real(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)) - ω = real(unwrap(substitute_all(var.ω, soln))) + val = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)))) + ω = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(var.ω, soln)))) if var.type == "u" timetrace .+= val * cos.(ω * times) elseif var.type == "v" diff --git a/test/code_quality.jl b/test/code_quality.jl index 22269fc..3b0c5c5 100644 --- a/test/code_quality.jl +++ b/test/code_quality.jl @@ -35,6 +35,7 @@ end @testset "Code quality" begin using Aqua using OrdinaryDiffEqTsit5, SteadyStateDiffEq, Plots, HarmonicBalance + using Latexify TimeEvolution = Base.get_extension(HarmonicSteadyState, :TimeEvolution) SteadyStateDiffEqExt = Base.get_extension(HarmonicSteadyState, :SteadyStateDiffEqExt) @@ -48,6 +49,7 @@ end piracies=(treat_as_own=[ModelKit.Variable, ModelKit.System],), ambiguities=false, persistent_tasks=false, + stale_deps=(; ignore=[:SciMLBase, :HarmonicBalance]), ) for mod in [TimeEvolution, SteadyStateDiffEqExt, PlotsExt, HarmonicBalanceExt] @test check_no_stale_explicit_imports(mod) == nothing diff --git a/test/extensions/SteadyStateDiffEqExt.jl b/test/extensions/SteadyStateDiffEqExt.jl index b9a270c..356e5b2 100644 --- a/test/extensions/SteadyStateDiffEqExt.jl +++ b/test/extensions/SteadyStateDiffEqExt.jl @@ -1,5 +1,5 @@ using HarmonicSteadyState, - ModelingToolkit, + ModelingToolkitBase, SteadyStateDiffEq, OrdinaryDiffEqRosenbrock, LinearAlgebra, @@ -13,9 +13,9 @@ using HarmonicSteadyState, @parameters g = 9.8 k = 0.2 D = Differential(t) eqs = [D(v) ~ g - k * v] - @named model = ModelingToolkit.System(eqs, t) + @named model = ModelingToolkitBase.System(eqs, t) - model = structural_simplify(model) + model = mtkcompile(model) prob_ss = SteadyStateProblem{false}(model, [], []; jac=true) prob_np = NonlinearProblem(prob_ss) @@ -58,8 +58,8 @@ using HarmonicSteadyState, ) / (-(γ^2) - (4) * (ω^2)), ] - @named model = ModelingToolkit.System(eqs, t, [u1, v1], [α, ω, ω0, F, γ]) - model = structural_simplify(model) + @named model = ModelingToolkitBase.System(eqs, t, [u1, v1], [α, ω, ω0, F, γ]) + model = mtkcompile(model) param = [α, ω, ω0, F, γ] .=> [1.0, 1.2, 1.0, 0.01, 0.01] u0 = [1.0, 0.0] diff --git a/test/runtests.jl b/test/runtests.jl index 8b7ef4f..dae9aee 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -36,7 +36,8 @@ end @testset "Linear response" begin include("linear_response.jl") - include("input_output.jl") + # input_output.jl needs QuantumCumulants; re-enable once QC supports SU 4 / SciMLBase 3. + # include("input_output.jl") end @testset "Limit cycle" begin @@ -44,9 +45,12 @@ end end @testset "extensions" begin - @testset "QuantumCumulants extension" begin - include("extensions/QuantumCumulantsExt.jl") - end + # @testset "QuantumCumulants extension" begin + # include("extensions/QuantumCumulantsExt.jl") + # end + # QuantumCumulants extension currently disabled: QC 0.4 caps SymbolicUtils to ≤3 + # and SciMLBase to ≤2, incompatible with this upgrade. Re-enable once QC supports + # SymbolicUtils 4 / SciMLBase 3. @testset "Time evolution extension" begin include("extensions/time_evolution.jl") include("extensions/hysteresis_sweep.jl") From 49c3f320ce254768ed739c92205eb262bfbc44a8 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Fri, 24 Jul 2026 09:34:11 +0200 Subject: [PATCH 2/7] build: use git-url sources, target Julia 1.12, bump dep compat Switch [sources] from local paths to git url and branch rev so CI can resolve the unreleased QuestBase 0.4 and HarmonicBalance. Set julia compat to 1.12 and run Tests and Documentation on 1.12 only. Widen BijectiveHilbert to allow 0.6 and OrderedCollections to allow v2. Add the QuestBase source to the docs environment. Add an informational codecov config. Apply JuliaFormatter v2. --- .github/codecov.yml | 10 ++++++++++ .github/workflows/Documentation.yml | 2 +- .github/workflows/Tests.yml | 5 ++--- Project.toml | 10 +++++----- docs/Project.toml | 5 ++++- ext/HarmonicBalanceExt.jl | 2 +- ext/PlotsExt/linear_response.jl | 2 +- ext/QuantumCumulantsExt.jl | 12 +++++++----- ext/SteadyStateDiffEqExt.jl | 2 +- ext/TimeEvolution/ODEProblem.jl | 7 +++---- src/HC_wrapper.jl | 6 +++++- src/LimitCycles/gauge_fixing.jl | 2 +- src/LinearResponse/Lorentzian_spectrum.jl | 8 ++++++-- src/LinearResponse/response.jl | 8 ++++---- src/Result.jl | 2 +- src/transform_solutions.jl | 19 +++++++++++++++---- 16 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 0000000..03f06fc --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,10 @@ +coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true + +comment: false diff --git a/.github/workflows/Documentation.yml b/.github/workflows/Documentation.yml index 29251e5..1dff008 100644 --- a/.github/workflows/Documentation.yml +++ b/.github/workflows/Documentation.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/checkout@v6 - uses: julia-actions/setup-julia@v2 with: - version: 'lts' + version: '1.12' - uses: julia-actions/cache@v3 - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-docdeploy@v1 diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 571282e..2c10f35 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -29,8 +29,7 @@ jobs: fail-fast: false matrix: version: - - 'lts' - - '1' + - '1.12' os: - ubuntu-latest arch: @@ -60,4 +59,4 @@ jobs: files: lcov.info name: codecov-umbrella fail_ci_if_error: false - if: ${{ matrix.version == 'lts' }} + if: ${{ matrix.version == '1.12' }} diff --git a/Project.toml b/Project.toml index efb8dbf..bcd8b06 100644 --- a/Project.toml +++ b/Project.toml @@ -39,7 +39,7 @@ TimeEvolution = "OrdinaryDiffEqTsit5" [compat] Aqua = "0.8.11" -BijectiveHilbert = "0.3, 0.5" +BijectiveHilbert = "0.3, 0.5, 0.6" CheckConcreteStructs = "0.1.0" Distances = "0.10.11" DocStringExtensions = "0.9.4" @@ -55,7 +55,7 @@ LinearSolve = "3.75" ModelingToolkitBase = "1" NaNMath = "1.1" NonlinearSolve = "4.17" -OrderedCollections = "1.8" +OrderedCollections = "1.8, 2" OrdinaryDiffEqRosenbrock = "2" OrdinaryDiffEqTsit5 = "2" Peaks = "0.5" @@ -72,7 +72,7 @@ SymbolicUtils = "4" Symbolics = "7" Test = "1.10" TestExtras = "0.3" -julia = "1.10" +julia = "1.12" [extras] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" @@ -97,8 +97,8 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a" [sources] -HarmonicBalance = {path = "../HarmonicBalance.jl"} -QuestBase = {path = "../QuestBase.jl"} +HarmonicBalance = {url = "https://github.com/QuantumEngineeredSystems/HarmonicBalance.jl", rev = "source"} +QuestBase = {url = "https://github.com/QuantumEngineeredSystems/QuestBase.jl", rev = "symbolicsv7-upgrade"} [targets] test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkitBase", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks", "Latexify"] diff --git a/docs/Project.toml b/docs/Project.toml index cba1058..24c6a89 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -13,4 +13,7 @@ SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" [compat] Documenter = "1" -julia = "1.10" +julia = "1.12" + +[sources] +QuestBase = {url = "https://github.com/QuantumEngineeredSystems/QuestBase.jl", rev = "symbolicsv7-upgrade"} diff --git a/ext/HarmonicBalanceExt.jl b/ext/HarmonicBalanceExt.jl index 92eb7fd..8895769 100644 --- a/ext/HarmonicBalanceExt.jl +++ b/ext/HarmonicBalanceExt.jl @@ -63,7 +63,7 @@ function HarmonicSteadyState.LinearResponse.ResponseMatrix( args = cat(symbols, [Δ]; dims=1) f_re = Symbolics.build_function(el.re, args; expression=Val{false}) f_im = Symbolics.build_function(el.im, args; expression=Val{false}) - (args...) -> f_re(args...) + im * f_im(args...) + return (args...) -> f_re(args...) + im * f_im(args...) end return ResponseMatrix(compiled_M, symbols, res.problem.eom.variables) end diff --git a/ext/PlotsExt/linear_response.jl b/ext/PlotsExt/linear_response.jl index a78c763..a53c18f 100644 --- a/ext/PlotsExt/linear_response.jl +++ b/ext/PlotsExt/linear_response.jl @@ -203,7 +203,7 @@ function HarmonicSteadyState.plot_eigenvalues( ), ) end - eigvals(jac) + return eigvals(jac) end eigenvalues_filtered = map(.*, eigenvalues, filter_branch) diff --git a/ext/QuantumCumulantsExt.jl b/ext/QuantumCumulantsExt.jl index 0d781ed..be9087c 100644 --- a/ext/QuantumCumulantsExt.jl +++ b/ext/QuantumCumulantsExt.jl @@ -47,7 +47,7 @@ function replace_to_reals(eqs::Vector{String}, ops_av::Vector{String}, conjugate is_real || push!(variables, op_i) conj_replace = map(eachindex(pair)) do i op = ops_av[pair[i]] # ∨ f(i) contains "+" or "-" - op => if is_real + return op => if is_real "(" * op_r * ")" else "(" * op_r * " $(f(i)) im*" * op_i * ")" @@ -89,14 +89,14 @@ function compute_real_equations(eqs::MeanfieldEquations) eq_re = real(eq) # the factor of √(2) is needed to have Q to C limit. eq_im = - imag(eq) iszero(eq_re) || push!(eqs_real, eq_re) - iszero(eq_im) || push!(eqs_real, eq_im) + return iszero(eq_im) || push!(eqs_real, eq_im) end return eqs_real, Num.(vars) end # TODO: test if order of vars and eqs is correct function add_iv(eqs, vars, iv) var_new = map(vars) do var - QuestBase.declare_variable(string(var), iv) + return QuestBase.declare_variable(string(var), iv) end subs = Dict(zip(vars, var_new)) eqs_new = QuestBase.substitute_all(eqs, subs) @@ -126,12 +126,14 @@ function QuestBase.HarmonicEquation(MFeqs::MeanfieldEquations, parameters) jac = HarmonicSteadyState.get_Jacobian(eqs_jac, vars_jac) hvars = map(vars) do var - HarmonicSteadyState.QuestBase.HarmonicVariable(Num(var), "", "", Num(1), Num(0)) + return HarmonicSteadyState.QuestBase.HarmonicVariable( + Num(var), "", "", Num(1), Num(0) + ) end equations_lhs = map(enumerate(vars)) do (idx, var) dvar = QuestBase.d(var, MFeqs.iv) - equations_lhs[idx] ~ dvar # by convention lhs in HB + return equations_lhs[idx] ~ dvar # by convention lhs in HB end return QuestBase.HarmonicEquation(equations_lhs, hvars, Num.(parameters), jac) diff --git a/ext/SteadyStateDiffEqExt.jl b/ext/SteadyStateDiffEqExt.jl index 87e7dc4..df554df 100644 --- a/ext/SteadyStateDiffEqExt.jl +++ b/ext/SteadyStateDiffEqExt.jl @@ -31,7 +31,7 @@ function HarmonicSteadyState.steady_state_sweep( # make type-stable: FD.Dual or Float p = get_new_parameters(prob, varied_idx, value) sol = solve(remake(prob; p, u0), alg; kwargs...) - result[i] = sol.u + return result[i] = sol.u end return result end diff --git a/ext/TimeEvolution/ODEProblem.jl b/ext/TimeEvolution/ODEProblem.jl index cb9ca18..349d186 100644 --- a/ext/TimeEvolution/ODEProblem.jl +++ b/ext/TimeEvolution/ODEProblem.jl @@ -32,12 +32,11 @@ function OrdinaryDiffEqTsit5.ODEProblem( # substitute the harmonic variables and sweep parameters; fold so the result is numeric function eqs(v, T) sub_dict = merge( - Dict(zip(vars, v)), - Dict(zip(keys(sweep), [sweep[p](T) for p in keys(sweep)])), + Dict(zip(vars, v)), Dict(zip(keys(sweep), [sweep[p](T) for p in keys(sweep)])) ) return [ - real(Symbolics.value(Symbolics.substitute(eq, sub_dict; fold=Val{true}()))) - for eq in subeqs + real(Symbolics.value(Symbolics.substitute(eq, sub_dict; fold=Val{true}()))) for + eq in subeqs ] end diff --git a/src/HC_wrapper.jl b/src/HC_wrapper.jl index edfd166..41f3d12 100644 --- a/src/HC_wrapper.jl +++ b/src/HC_wrapper.jl @@ -12,7 +12,11 @@ HC = HomotopyContinuation "Conversion from Symbolics.jl types to HomotopyContinuation types." function HomotopyContinuation.ModelKit.Variable(var::Num) - isterm(var.val) ? HC.Variable(string(var.val.f)) : HC.Variable(string(var_name(var))) + return if isterm(var.val) + HC.Variable(string(var.val.f)) + else + HC.Variable(string(var_name(var))) + end end "Converts a Num into Variable in the active namespace." diff --git a/src/LimitCycles/gauge_fixing.jl b/src/LimitCycles/gauge_fixing.jl index 6af8667..303c255 100644 --- a/src/LimitCycles/gauge_fixing.jl +++ b/src/LimitCycles/gauge_fixing.jl @@ -14,7 +14,7 @@ Equivalent to adding `n` pairs of harmonics ω +- ω_lc for each existing ω. """ function add_pairs!(eom::DifferentialEquation; ω_lc::Num, n::Int) foreach(1:n) do k - add_pairs!(eom, ω_lc) + return add_pairs!(eom, ω_lc) end return nothing end diff --git a/src/LinearResponse/Lorentzian_spectrum.jl b/src/LinearResponse/Lorentzian_spectrum.jl index ac968d5..6a09ef7 100644 --- a/src/LinearResponse/Lorentzian_spectrum.jl +++ b/src/LinearResponse/Lorentzian_spectrum.jl @@ -47,7 +47,7 @@ end "Gives the numerical value of a peak at ω." function evaluate(peak::Lorentzian{T}, ω::T) where {T<:Real} - peak.A / sqrt(((peak.ω0 - ω)^2 + (peak.Γ)^2)) + return peak.A / sqrt(((peak.ω0 - ω)^2 + (peak.Γ)^2)) end "Gives the numerical value of a JacobianSpectrum at ω" @@ -112,7 +112,11 @@ function JacobianSpectrum( for pair in _get_uv_pairs(hvars) u, v = hvars[pair] eigvec_2d = eigvec[pair] # fetch the relevant part of the Jacobian eigenvector - ωnum = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(Symbolics.substitute(u.ω, Dict(solution_dict))))) + ωnum = real( + SymbolicUtils.unwrap_const( + Symbolics.unwrap(Symbolics.substitute(u.ω, Dict(solution_dict))) + ), + ) # ^ the harmonic (numerical now) associated to this harmonic variable # eigvec_2d is associated to a natural variable -> this variable gets Lorentzian peaks diff --git a/src/LinearResponse/response.jl b/src/LinearResponse/response.jl index 22de401..dd2f6e1 100644 --- a/src/LinearResponse/response.jl +++ b/src/LinearResponse/response.jl @@ -152,11 +152,11 @@ function eigenvalues(res::Result{D,S,P}, branch; class=["physical"]) where {D,S, throw( ErrorException( "The branch contains NaN values. - Likely, the branch has non-physical solutions in the parameter sweep", + Likely, the branch has non-physical solutions in the parameter sweep" ), ) end - eigvals(jac) + return eigvals(jac) end eigenvalues_filtered = map(.*, eigenvalues, filter_branch) @@ -189,11 +189,11 @@ function eigenvectors(res::Result{D,S,P}, branch; class=["physical"]) where {D,S throw( ErrorException( "The branch contains NaN values. - Likely, the branch has non-physical solutions in the parameter sweep", + Likely, the branch has non-physical solutions in the parameter sweep" ), ) end - eigvecs(jac) + return eigvecs(jac) end eigvecs_filtered = map(.*, eigenvectors, filter_branch) diff --git a/src/Result.jl b/src/Result.jl index 161ada6..3ec3a10 100644 --- a/src/Result.jl +++ b/src/Result.jl @@ -143,7 +143,7 @@ function attractors(res::Result{D}; class="stable", not_class=[]) where {D} Y = _get_mask(res, class, not_class) return map(enumerate(Y)) do (idx, bools) - Dict(i => get_branch(res, i)[idx] for (i, bool) in pairs(bools) if bool) + return Dict(i => get_branch(res, i)[idx] for (i, bool) in pairs(bools) if bool) end # map end diff --git a/src/transform_solutions.jl b/src/transform_solutions.jl index 6cefbd0..17409cc 100644 --- a/src/transform_solutions.jl +++ b/src/transform_solutions.jl @@ -129,8 +129,7 @@ function transform_solutions( rule(u) = Dict(zip(vars, u)) transformed = map( - x -> Symbolics.value(Symbolics.substitute(expr, rule(x); fold=Val{true}())), - soln, + x -> Symbolics.value(Symbolics.substitute(expr, rule(x); fold=Val{true}())), soln ) return convert(T, transformed) # TODO is this necessary? end @@ -309,7 +308,13 @@ end function _to_lab_frame_velocity(soln, vars, times) timetrace = zeros(length(times)) for var in vars - val = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)))) + val = real( + SymbolicUtils.unwrap_const( + Symbolics.unwrap( + substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln) + ), + ), + ) ω = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(var.ω, soln)))) if var.type == "u" timetrace .+= -ω * val * sin.(ω * times) @@ -324,7 +329,13 @@ function _to_lab_frame(soln, vars, times)::Vector{AbstractFloat} timetrace = zeros(length(times)) for var in vars - val = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln)))) + val = real( + SymbolicUtils.unwrap_const( + Symbolics.unwrap( + substitute_all(Symbolics.unwrap(_remove_brackets(var)), soln) + ), + ), + ) ω = real(SymbolicUtils.unwrap_const(Symbolics.unwrap(substitute_all(var.ω, soln)))) if var.type == "u" timetrace .+= val * cos.(ω * times) From 27677353a6acb2ea709dad46a81f404221514462 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Fri, 24 Jul 2026 10:12:32 +0200 Subject: [PATCH 3/7] fix(docs): filter unloaded extensions from makedocs modules PlotsExt is not loaded in the docs environment because its Latexify trigger is absent, so Base.get_extension returned nothing and makedocs rejected the modules vector with a TypeError. Filter nothing out of the modules list. --- docs/make.jl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/make.jl b/docs/make.jl index c0154fd..1bb1257 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -19,13 +19,16 @@ end makedocs(; sitename="HarmonicSteadyState.jl", authors="Quest group", - modules=[ - HarmonicSteadyState, - TimeEvolution, - SteadyStateDiffEqExt, - HarmonicSteadyState.LinearResponse, - PlotsExt, - ], + modules=filter( + !isnothing, + [ + HarmonicSteadyState, + TimeEvolution, + SteadyStateDiffEqExt, + HarmonicSteadyState.LinearResponse, + PlotsExt, + ], + ), format=Documenter.HTML(; canonical="https://quantumengineeredsystems.github.io/HarmonicSteadyState.jl/stable/", ), From 1f02c7db4902d256615a9becbf36a83356cc01e3 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Fri, 24 Jul 2026 11:10:28 +0200 Subject: [PATCH 4/7] fix(docs): load Latexify so PlotsExt is available for @docs blocks API.md documents PlotsExt functions (plot, plot_phase_diagram, plot_spaghetti, ...). PlotsExt only loads when both Plots and Latexify are present, so without Latexify the @docs blocks failed with a docs_block error. Add Latexify to the docs environment and load it in make.jl, and build the makedocs modules list as a Vector{Module} filtered of unloaded extensions. --- docs/Project.toml | 1 + docs/make.jl | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Project.toml b/docs/Project.toml index 24c6a89..82d9191 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -2,6 +2,7 @@ Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8" HarmonicSteadyState = "1158f75c-a779-4b85-8bfb-8fcf6bf02ced" +Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce" diff --git a/docs/make.jl b/docs/make.jl index 1bb1257..fb364a9 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -2,7 +2,7 @@ CI = get(ENV, "CI", nothing) == "true" || get(ENV, "GITHUB_TOKEN", nothing) !== using HarmonicSteadyState using Documenter -using Plots, SteadyStateDiffEq, OrdinaryDiffEqTsit5 +using Plots, Latexify, SteadyStateDiffEq, OrdinaryDiffEqTsit5 TimeEvolution = Base.get_extension(HarmonicSteadyState, :TimeEvolution) SteadyStateDiffEqExt = Base.get_extension(HarmonicSteadyState, :SteadyStateDiffEqExt) @@ -19,16 +19,15 @@ end makedocs(; sitename="HarmonicSteadyState.jl", authors="Quest group", - modules=filter( - !isnothing, - [ + modules=Module[ + m for m in [ HarmonicSteadyState, TimeEvolution, SteadyStateDiffEqExt, HarmonicSteadyState.LinearResponse, PlotsExt, - ], - ), + ] if !isnothing(m) + ], format=Documenter.HTML(; canonical="https://quantumengineeredsystems.github.io/HarmonicSteadyState.jl/stable/", ), From 25e93822bf2abcac47cce8e11c8f7c031a146181 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Fri, 24 Jul 2026 12:34:42 +0200 Subject: [PATCH 5/7] fix: restore QuantumCumulants extension for QC 0.7, incl. second-order cumulants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-enable the QuantumCumulants weak dependency, extension and tests, which were dropped during the Symbolics 7 migration because QuantumCumulants 0.4 capped SymbolicUtils and SciMLBase. QuantumCumulants 0.7 supports the new stack. Fix the moment-to-real-variable conversion for QuantumCumulants 0.7: averages now render operator products with spaces and use an ASCII apostrophe for the adjoint. Strip spaces and map both the apostrophe and the prime to the superscript plus when building variable names, so second-order cumulants (e.g. a⁺aᵣ) work in addition to first order. Update examples and tests to the QuantumCumulants 0.7 parameter idiom (@variables instead of the removed @rnumbers / @cnumbers). --- Project.toml | 6 +++++- examples/forward_transmission.jl | 2 +- ext/QuantumCumulantsExt.jl | 4 +++- test/extensions/QuantumCumulantsExt.jl | 10 +++++----- test/input_output.jl | 2 +- test/runtests.jl | 12 ++++-------- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Project.toml b/Project.toml index bcd8b06..28b863b 100644 --- a/Project.toml +++ b/Project.toml @@ -29,11 +29,13 @@ ModelingToolkitBase = "7771a370-6774-4173-bd38-47e70ca0b839" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +QuantumCumulants = "35bcea6d-e19f-57db-af74-8011de6c7255" SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" [extensions] HarmonicBalanceExt = "HarmonicBalance" PlotsExt = ["Plots", "Latexify"] +QuantumCumulantsExt = "QuantumCumulants" SteadyStateDiffEqExt = "SteadyStateDiffEq" TimeEvolution = "OrdinaryDiffEqTsit5" @@ -63,6 +65,7 @@ Plots = "1.40.9" PrecompileTools = "1.2" Printf = "1.10" ProgressMeter = "1.7.2" +QuantumCumulants = "0.7" QuestBase = "0.4" Random = "1.10" RuntimeGeneratedFunctions = "0.5.5" @@ -86,6 +89,7 @@ LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" ModelingToolkitBase = "7771a370-6774-4173-bd38-47e70ca0b839" NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce" +QuantumCumulants = "35bcea6d-e19f-57db-af74-8011de6c7255" OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a" Peaks = "18e31ff7-3703-566c-8e60-38913d67486b" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" @@ -101,4 +105,4 @@ HarmonicBalance = {url = "https://github.com/QuantumEngineeredSystems/HarmonicBa QuestBase = {url = "https://github.com/QuantumEngineeredSystems/QuestBase.jl", rev = "symbolicsv7-upgrade"} [targets] -test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkitBase", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks", "Latexify"] +test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkitBase", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks", "Latexify", "QuantumCumulants"] diff --git a/examples/forward_transmission.jl b/examples/forward_transmission.jl index 5f12213..65e5af1 100644 --- a/examples/forward_transmission.jl +++ b/examples/forward_transmission.jl @@ -10,7 +10,7 @@ h = hm ⊗ hc # Hilbertspace @qnumbers m::Destroy(h, 1) c::Destroy(h, 2) # Operators -@rnumbers Δ Vk Ωd γm γk # Parameters +@variables Δ::Real Vk::Real Ωd::Real γm::Real γk::Real # Parameters param = [Δ, Vk, Ωd, γm, γk] H_RWA_sym = ( diff --git a/ext/QuantumCumulantsExt.jl b/ext/QuantumCumulantsExt.jl index be9087c..818cf6e 100644 --- a/ext/QuantumCumulantsExt.jl +++ b/ext/QuantumCumulantsExt.jl @@ -39,7 +39,9 @@ function replace_to_reals(eqs::Vector{String}, ops_av::Vector{String}, conjugate foreach(conjugate_pairs) do pair is_real = isequal(pair...) op_pair = ops_av[pair[1]] - op_name = replace(op_pair, "⟨" => "", "⟩" => "", "*" => "", "′" => "⁺") + op_name = replace( + op_pair, "⟨" => "", "⟩" => "", "*" => "", "′" => "⁺", "'" => "⁺", " " => "" + ) op_r = op_name * "ᵣ" op_i = op_name * "ᵢ" diff --git a/test/extensions/QuantumCumulantsExt.jl b/test/extensions/QuantumCumulantsExt.jl index 2be551e..59bb51d 100644 --- a/test/extensions/QuantumCumulantsExt.jl +++ b/test/extensions/QuantumCumulantsExt.jl @@ -59,10 +59,10 @@ using Test end @testset "work with rnumbers and cumber" begin - @testset "@cnumbers" begin + @testset "complex parameters" begin h = FockSpace(:cavity) @qnumbers a::Destroy(h) - @cnumbers Δ U G κ + @variables Δ U G κ param = [Δ, U, G, κ] H_RWA = -Δ * a' * a + U * (a'^2 * a^2) / 2 - G * (a' * a' + a * a) / 2 @@ -76,10 +76,10 @@ end complete(eqs), param, varied, fixed ) end - @testset "@rnumbers" begin + @testset "real parameters" begin h = FockSpace(:cavity) @qnumbers a::Destroy(h) - @rnumbers Δ U G κ + @variables Δ::Real U::Real G::Real κ::Real param = [Δ, U, G, κ] H_RWA = -Δ * a' * a + U * (a'^2 * a^2) / 2 - G * (a' * a' + a * a) / 2 @@ -105,7 +105,7 @@ end @qnumbers a::Destroy(h, 1) b::Destroy(h, 2) # Parameters - @rnumbers Δ K F κ ωm g0 Γm + @variables Δ::Real K::Real F::Real κ::Real ωm::Real g0::Real Γm::Real param = [Δ, K, F, κ, ωm, g0, Γm] diff --git a/test/input_output.jl b/test/input_output.jl index ae1f594..f6476c5 100644 --- a/test/input_output.jl +++ b/test/input_output.jl @@ -8,7 +8,7 @@ using HarmonicSteadyState, QuantumCumulants, Test # Operators @qnumbers m::Destroy(h, 1) c::Destroy(h, 2) - @rnumbers Δ Vk Ωd γm γk + @variables Δ::Real Vk::Real Ωd::Real γm::Real γk::Real param = [Δ, Vk, Ωd, γm, γk] H_RWA_sym = ( diff --git a/test/runtests.jl b/test/runtests.jl index dae9aee..8b7ef4f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -36,8 +36,7 @@ end @testset "Linear response" begin include("linear_response.jl") - # input_output.jl needs QuantumCumulants; re-enable once QC supports SU 4 / SciMLBase 3. - # include("input_output.jl") + include("input_output.jl") end @testset "Limit cycle" begin @@ -45,12 +44,9 @@ end end @testset "extensions" begin - # @testset "QuantumCumulants extension" begin - # include("extensions/QuantumCumulantsExt.jl") - # end - # QuantumCumulants extension currently disabled: QC 0.4 caps SymbolicUtils to ≤3 - # and SciMLBase to ≤2, incompatible with this upgrade. Re-enable once QC supports - # SymbolicUtils 4 / SciMLBase 3. + @testset "QuantumCumulants extension" begin + include("extensions/QuantumCumulantsExt.jl") + end @testset "Time evolution extension" begin include("extensions/time_evolution.jl") include("extensions/hysteresis_sweep.jl") From 82befdcf733890c30f48f7c1513d8db1c82e2cad Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Fri, 24 Jul 2026 17:30:34 +0200 Subject: [PATCH 6/7] use tagged QuestBase --- Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Project.toml b/Project.toml index 28b863b..2f8a40d 100644 --- a/Project.toml +++ b/Project.toml @@ -102,7 +102,6 @@ TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a" [sources] HarmonicBalance = {url = "https://github.com/QuantumEngineeredSystems/HarmonicBalance.jl", rev = "source"} -QuestBase = {url = "https://github.com/QuantumEngineeredSystems/QuestBase.jl", rev = "symbolicsv7-upgrade"} [targets] test = ["Aqua", "JET", "CheckConcreteStructs", "SymbolicUtils", "Symbolics", "ExplicitImports", "Test", "Random", "OrdinaryDiffEqTsit5", "Documenter", "Plots", "SteadyStateDiffEq", "LinearSolve", "TestExtras", "ModelingToolkitBase", "OrdinaryDiffEqRosenbrock", "NonlinearSolve", "HarmonicBalance", "Peaks", "Latexify", "QuantumCumulants"] From 4e90450666dd45cfc6c364f55945e86c486a1800 Mon Sep 17 00:00:00 2001 From: Orjan Ameye Date: Sat, 25 Jul 2026 12:06:20 +0200 Subject: [PATCH 7/7] build: require QuestBase 0.4.1 QuestBase 0.4.0 solves symbolic systems with `Symbolics.symbolic_linear_solve`, whose nested fraction denominators grow without bound on the van der Pol limit cycle system. That exhausted the CI runner's memory and killed the job partway through the limit cycle tests. 0.4.1 solves via fraction-free Bareiss elimination instead, so require it rather than letting the resolver pick 0.4.0. The docs environment pinned QuestBase to a git branch that no longer exists now that the work is released; use the registered version there too. --- Project.toml | 2 +- docs/Project.toml | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index 2f8a40d..babd7a0 100644 --- a/Project.toml +++ b/Project.toml @@ -66,7 +66,7 @@ PrecompileTools = "1.2" Printf = "1.10" ProgressMeter = "1.7.2" QuantumCumulants = "0.7" -QuestBase = "0.4" +QuestBase = "0.4.1" Random = "1.10" RuntimeGeneratedFunctions = "0.5.5" SciMLBase = "3" diff --git a/docs/Project.toml b/docs/Project.toml index 82d9191..1d17185 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -14,7 +14,5 @@ SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" [compat] Documenter = "1" +QuestBase = "0.4.1" julia = "1.12" - -[sources] -QuestBase = {url = "https://github.com/QuantumEngineeredSystems/QuestBase.jl", rev = "symbolicsv7-upgrade"}