From d83d2a2714dba28c877b81b67aa951122b3d47ea Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 10:34:08 -0400 Subject: [PATCH 01/10] clean up TODOs; and draft code_quality_test --- Project.toml | 14 ++++++++------ TODOs.md | 26 +++++++++++--------------- test/code_quality_test.jl | 37 +++++++++++++++++++++++++++++++++++++ test/runtests.jl | 1 + 4 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 test/code_quality_test.jl diff --git a/Project.toml b/Project.toml index 8123ba3..e6e3520 100644 --- a/Project.toml +++ b/Project.toml @@ -18,12 +18,13 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" [compat] -# Aqua = "0.8" -# CheckConcreteStructs = "0.1" +Aqua = "0.8" +CheckConcreteStructs = "0.1" DataInterpolations = "8" FunctionWrappers = "1" DiffEqNoiseProcess = "5.27.0" -# ExplicitImports = "1.12" +ExplicitImports = "1.11" +JET = "0.9.18, 0.10, 0.11" LinearAlgebra = "1.10" ModelingToolkit = "10" NumericalIntegration = "0.3" @@ -41,11 +42,12 @@ julia = "1.10" [extras] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" -# CheckConcreteStructs = "73c92db5-9da6-4938-911a-6443a7e94a58" -# ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7" +CheckConcreteStructs = "73c92db5-9da6-4938-911a-6443a7e94a58" +ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7" +JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" QuantumCumulants = "35bcea6d-e19f-57db-af74-8011de6c7255" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test"] #, "QuantumCumulants", "Aqua", "ExplicitImports", "CheckConcreteStructs"] +test = ["Test", "Aqua", "ExplicitImports", "JET", "CheckConcreteStructs"] #, "QuantumCumulants" diff --git a/TODOs.md b/TODOs.md index cb2d374..d2046be 100644 --- a/TODOs.md +++ b/TODOs.md @@ -1,15 +1,9 @@ # MAIN TODO - LIST: -- [ ] clean up - - [x] rm QC.jl - - [ ] types - - [ ] rename translate_qo (to to_numerics ?) - - [ ] speed up derivation - - [ ] examples - [ ] Multi-mode Dicke state superradiance (https://journals.aps.org/pra/abstract/10.1103/PhysRevA.103.033713) - - [ ] SUPER example (Johannes) - - [ ] pulse delay advanced example (Victor paper) + - [ ] SUPER example + - [ ] pulse delay advanced example - [x] feedback reduction (see SLH paper) - [ ] cumulants correlation matrix modes - [ ] H_loop in example 09-1 is not simplified correctly on the docu (locally it is fine; pkg versions) @@ -25,12 +19,8 @@ - [ ] u_Gaussian, v_Gaussian; slower? - [ ] more functionalities - - [x] feedback reduction + - [ ] pulse delay - [ ] better method for u_eff and v_eff (Victor) - - [ ] interaction picture (Victor paper) - - [ ] general expression for A(t) - - [ ] pulse delay (Victor paper) - - [x] two_time_corr_matrix for Ls const (see example 02-2) - [x] Formatter/SpellCheck @@ -41,14 +31,16 @@ ## Additional TODOs -- [ ] SLH more specific types - - [ ] AbstractVector{<:QTerm} - [ ] directly use gu(t) without substitution? (think about iscall) - [ ] u_eff and v_eff equation (PRA 2020, appendix) theory, API, implementation +- [ ] rename translate_qo (to to_numerics ?) ## DONE +- [x] rm QC.jl +- [x] types +- [x] speed up derivation - [x] Translate function: - [x] Try TimeDependentSums again (after solving the gu(t) mistake/problem) [~factor 2 slower!] @@ -95,3 +87,7 @@ - [x] arg u not needed?! - [x] analytic expression for u=v - [x] kwarg for adjoint replacement in substitute_operators + - [x] feedback reduction + - [x] interaction picture + - [x] general expression for A(t) + - [x] two_time_corr_matrix for Ls const (see example 02-2) diff --git a/test/code_quality_test.jl b/test/code_quality_test.jl new file mode 100644 index 0000000..99e31ed --- /dev/null +++ b/test/code_quality_test.jl @@ -0,0 +1,37 @@ +using QuantumInputOutput, Test + +# @testset "best practices" begin + using Aqua + + Aqua.test_ambiguities([QuantumInputOutput]; broken=true) + Aqua.test_piracies(QuantumInputOutput; broken=true) + Aqua.test_all(QuantumInputOutput; ambiguities=false, piracies=false) +# end + +# @testset "ExplicitImports" begin + using ExplicitImports + + @test check_no_implicit_imports(QuantumInputOutput) == nothing + @test check_all_explicit_imports_via_owners(QuantumInputOutput) == nothing + @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing + @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing + @test check_no_self_qualified_accesses(QuantumInputOutput) == nothing +# end + +# if isempty(VERSION.prerelease) + # @testset "Code linting" begin + using JET + + rep = report_package(QuantumInputOutput) + @show rep + @test_broken length(JET.get_reports(rep)) == 0 + # end +# end + +# @testset "Concretely typed" begin + import QuantumInputOutput as QIO + using CheckConcreteStructs + + all_concrete(QIO.SLH) + all_concrete(QIO.Gaussian) +# end diff --git a/test/runtests.jl b/test/runtests.jl index dafa4ec..f5833aa 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,5 @@ names = [ + "code_quality_test.jl", "test_SLH.jl", "test_feedback.jl", "test_translate.jl", From 23e7682724e094c6f798f6f6bc1f95093dc31406 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 13:30:36 -0400 Subject: [PATCH 02/10] rm stale --- .codex | 0 src/QuantumInputOutput.jl | 19 +++++++++---------- src/SLH.jl | 5 +---- src/utils.jl | 13 ------------- test/code_quality_test.jl | 16 ++++++++-------- 5 files changed, 18 insertions(+), 35 deletions(-) create mode 100644 .codex diff --git a/.codex b/.codex new file mode 100644 index 0000000..e69de29 diff --git a/src/QuantumInputOutput.jl b/src/QuantumInputOutput.jl index 228e252..fb5d687 100644 --- a/src/QuantumInputOutput.jl +++ b/src/QuantumInputOutput.jl @@ -1,21 +1,20 @@ module QuantumInputOutput -using SecondQuantizedAlgebra -using QuantumOpticsBase -using QuantumOptics +using SecondQuantizedAlgebra: + SecondQuantizedAlgebra, QSym, to_numeric +using QuantumOpticsBase: QuantumOpticsBase, expect, basis, dagger, sparse +using QuantumOptics: QuantumOptics, timeevolution using SymbolicUtils: - SymbolicUtils, substitute, BasicSymbolic, operation, arguments, iscall, simplify, expand -using Symbolics + SymbolicUtils, substitute, BasicSymbolic, arguments, simplify, expand +using Symbolics: Symbolics, build_function using SpecialFunctions: erf using DataInterpolations: LinearInterpolation, ExtrapolationType using NumericalIntegration: cumul_integrate using LinearAlgebra: LinearAlgebra, I, mul! -using OrdinaryDiffEq -using StaticArrays -using FunctionWrappers +using OrdinaryDiffEq: OrdinaryDiffEq, ODEProblem, Tsit5, solve +using StaticArrays: StaticArrays, SMatrix, SVector +using FunctionWrappers: FunctionWrappers, FunctionWrapper -import QuantumOpticsBase: expect -import SecondQuantizedAlgebra: numeric_average const SQA = SecondQuantizedAlgebra export SLH, diff --git a/src/SLH.jl b/src/SLH.jl index fd68d9d..20a0cfb 100644 --- a/src/SLH.jl +++ b/src/SLH.jl @@ -1,4 +1,4 @@ -using StaticArrays +using StaticArrays: StaticArrays, SMatrix, SVector using FunctionWrappers: FunctionWrapper # NOTE: FunctionWrapper is callable but NOT <: Function. @@ -451,6 +451,3 @@ function _feedback_maps(n::Int, connections) end return mapped end - -Base.length(h::SecondQuantizedAlgebra.ConcreteHilbertSpace) = 1 -Base.length(h::ProductSpace) = length(h.spaces) diff --git a/src/utils.jl b/src/utils.jl index ba06847..67ea917 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -1,16 +1,3 @@ -# move to SQA -function numeric_average(op::SQA.QNumber, state::Vector; kwargs...) - op_num = sparse(to_numeric(op, state[1]; kwargs...)) - return QuantumOpticsBase.expect(op_num, state) -end -function numeric_average(avg::Average, state::Vector; kwargs...) - op = undo_average(avg) - return numeric_average(op, state; kwargs...) -end - -expect(avg::Average, state; kwargs...) = numeric_average(avg, state; kwargs...) -expect(op::SQA.QNumber, state; kwargs...) = numeric_average(op, state; kwargs...) - """ substitute_operators(op, dict::Dict; replace_adjoint=true) diff --git a/test/code_quality_test.jl b/test/code_quality_test.jl index 99e31ed..3b17619 100644 --- a/test/code_quality_test.jl +++ b/test/code_quality_test.jl @@ -1,20 +1,20 @@ using QuantumInputOutput, Test -# @testset "best practices" begin +@testset "best practices" begin using Aqua - Aqua.test_ambiguities([QuantumInputOutput]; broken=true) - Aqua.test_piracies(QuantumInputOutput; broken=true) + Aqua.test_ambiguities([QuantumInputOutput]; broken=false) + Aqua.test_piracies(QuantumInputOutput; broken=false) Aqua.test_all(QuantumInputOutput; ambiguities=false, piracies=false) -# end +end # @testset "ExplicitImports" begin using ExplicitImports @test check_no_implicit_imports(QuantumInputOutput) == nothing @test check_all_explicit_imports_via_owners(QuantumInputOutput) == nothing - @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing - @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing + @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing # TODO + @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing # TODO @test check_no_self_qualified_accesses(QuantumInputOutput) == nothing # end @@ -24,7 +24,7 @@ using QuantumInputOutput, Test rep = report_package(QuantumInputOutput) @show rep - @test_broken length(JET.get_reports(rep)) == 0 + @test length(JET.get_reports(rep)) < 74 # TODO # end # end @@ -32,6 +32,6 @@ using QuantumInputOutput, Test import QuantumInputOutput as QIO using CheckConcreteStructs - all_concrete(QIO.SLH) + # all_concrete(QIO.SLH) # TODO all_concrete(QIO.Gaussian) # end From 4bc41adf46b39917a8ba27bb3b11260a03894486 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 13:37:33 -0400 Subject: [PATCH 03/10] all ExplicitImports tests pass --- src/utils.jl | 2 +- test/code_quality_test.jl | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index 67ea917..30a136c 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -25,6 +25,6 @@ end function _extend_with_adjoint(dict::Dict) pairs_ = collect(dict) - adj_pairs = [SQA.adjoint(k) => SQA.adjoint(v) for (k, v) in pairs_] + adj_pairs = [Base.adjoint(k) => Base.adjoint(v) for (k, v) in pairs_] return Dict(vcat(pairs_, adj_pairs)) end diff --git a/test/code_quality_test.jl b/test/code_quality_test.jl index 3b17619..bd65b1e 100644 --- a/test/code_quality_test.jl +++ b/test/code_quality_test.jl @@ -8,30 +8,30 @@ using QuantumInputOutput, Test Aqua.test_all(QuantumInputOutput; ambiguities=false, piracies=false) end -# @testset "ExplicitImports" begin +@testset "ExplicitImports" begin using ExplicitImports @test check_no_implicit_imports(QuantumInputOutput) == nothing @test check_all_explicit_imports_via_owners(QuantumInputOutput) == nothing - @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing # TODO - @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing # TODO + @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing + @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing @test check_no_self_qualified_accesses(QuantumInputOutput) == nothing -# end +end -# if isempty(VERSION.prerelease) - # @testset "Code linting" begin +if isempty(VERSION.prerelease) + @testset "Code linting" begin using JET rep = report_package(QuantumInputOutput) @show rep @test length(JET.get_reports(rep)) < 74 # TODO - # end -# end + end +end # @testset "Concretely typed" begin import QuantumInputOutput as QIO using CheckConcreteStructs - # all_concrete(QIO.SLH) # TODO + all_concrete(QIO.SLH) # TODO all_concrete(QIO.Gaussian) # end From cc7924b4a17b339c82baa2c9e7f5ea374f6e10bd Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 13:47:51 -0400 Subject: [PATCH 04/10] Concretely typed pass --- test/code_quality_test.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/code_quality_test.jl b/test/code_quality_test.jl index bd65b1e..8439185 100644 --- a/test/code_quality_test.jl +++ b/test/code_quality_test.jl @@ -28,10 +28,10 @@ if isempty(VERSION.prerelease) end end -# @testset "Concretely typed" begin +@testset "Concretely typed" begin import QuantumInputOutput as QIO using CheckConcreteStructs - all_concrete(QIO.SLH) # TODO + all_concrete(QIO.SLH(1, 0, 0)) # TODO all_concrete(QIO.Gaussian) -# end +end From 55e682166c4bbedfb66c772b8d1b22fc075415ec Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 13:57:58 -0400 Subject: [PATCH 05/10] change test name --- test/runtests.jl | 2 +- test/{code_quality_test.jl => test_code_quality.jl} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename test/{code_quality_test.jl => test_code_quality.jl} (100%) diff --git a/test/runtests.jl b/test/runtests.jl index f5833aa..0a14d45 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,5 +1,5 @@ names = [ - "code_quality_test.jl", + "test_code_quality.jl", "test_SLH.jl", "test_feedback.jl", "test_translate.jl", diff --git a/test/code_quality_test.jl b/test/test_code_quality.jl similarity index 100% rename from test/code_quality_test.jl rename to test/test_code_quality.jl From b2578716d28fda8e0b119494c311488ac3bfd6a7 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 14:07:46 -0400 Subject: [PATCH 06/10] fix test all_concrete --- test/test_code_quality.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_code_quality.jl b/test/test_code_quality.jl index 8439185..06da787 100644 --- a/test/test_code_quality.jl +++ b/test/test_code_quality.jl @@ -32,6 +32,6 @@ end import QuantumInputOutput as QIO using CheckConcreteStructs - all_concrete(QIO.SLH(1, 0, 0)) # TODO + all_concrete(typeof(QIO.SLH(1, 0, 0))) # TODO all_concrete(QIO.Gaussian) end From 130b891e6b9db217b6882560247d4db1470a94a2 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 17:24:10 -0400 Subject: [PATCH 07/10] format --- src/QuantumInputOutput.jl | 6 ++---- test/test_code_quality.jl | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/QuantumInputOutput.jl b/src/QuantumInputOutput.jl index fb5d687..1bd7c73 100644 --- a/src/QuantumInputOutput.jl +++ b/src/QuantumInputOutput.jl @@ -1,11 +1,9 @@ module QuantumInputOutput -using SecondQuantizedAlgebra: - SecondQuantizedAlgebra, QSym, to_numeric +using SecondQuantizedAlgebra: SecondQuantizedAlgebra, QSym, to_numeric using QuantumOpticsBase: QuantumOpticsBase, expect, basis, dagger, sparse using QuantumOptics: QuantumOptics, timeevolution -using SymbolicUtils: - SymbolicUtils, substitute, BasicSymbolic, arguments, simplify, expand +using SymbolicUtils: SymbolicUtils, substitute, BasicSymbolic, arguments, simplify, expand using Symbolics: Symbolics, build_function using SpecialFunctions: erf using DataInterpolations: LinearInterpolation, ExtrapolationType diff --git a/test/test_code_quality.jl b/test/test_code_quality.jl index 06da787..caec107 100644 --- a/test/test_code_quality.jl +++ b/test/test_code_quality.jl @@ -3,9 +3,9 @@ using QuantumInputOutput, Test @testset "best practices" begin using Aqua - Aqua.test_ambiguities([QuantumInputOutput]; broken=false) - Aqua.test_piracies(QuantumInputOutput; broken=false) - Aqua.test_all(QuantumInputOutput; ambiguities=false, piracies=false) + Aqua.test_ambiguities([QuantumInputOutput]; broken = false) + Aqua.test_piracies(QuantumInputOutput; broken = false) + Aqua.test_all(QuantumInputOutput; ambiguities = false, piracies = false) end @testset "ExplicitImports" begin @@ -14,7 +14,7 @@ end @test check_no_implicit_imports(QuantumInputOutput) == nothing @test check_all_explicit_imports_via_owners(QuantumInputOutput) == nothing @test check_no_stale_explicit_imports(QuantumInputOutput) == nothing - @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing + @test check_all_qualified_accesses_via_owners(QuantumInputOutput) == nothing @test check_no_self_qualified_accesses(QuantumInputOutput) == nothing end From 152bdd063dabe4cb505a827fc9fd6616af3b934e Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 18:45:38 -0400 Subject: [PATCH 08/10] SQA v0.4.5 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index e6e3520..a5df224 100644 --- a/Project.toml +++ b/Project.toml @@ -32,7 +32,7 @@ OrdinaryDiffEq = "6" QuantumCumulants = "0.4" QuantumOptics = "1" QuantumOpticsBase = "0.4, 0.5" -SecondQuantizedAlgebra = "0.4.4" +SecondQuantizedAlgebra = "0.4.5" SpecialFunctions = "2" StaticArrays = "1" Symbolics = "6" From 24d7759a3a2dbaa45fe220cade8c2579fc1480d5 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Tue, 14 Apr 2026 20:12:07 -0400 Subject: [PATCH 09/10] gitignore update --- .codex | 0 .gitignore | 1 + 2 files changed, 1 insertion(+) delete mode 100644 .codex diff --git a/.codex b/.codex deleted file mode 100644 index e69de29..0000000 diff --git a/.gitignore b/.gitignore index 8b2f032..7523886 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ JuliaLocalPreferences.toml docs/src/examples/jupyter_notebooks/.ipynb_checkpoints docs/Manifest.toml benchmarks_output.json +.codex \ No newline at end of file From 8961c2b8f69d3ddfceeba6a3f4a9ad329bb20d55 Mon Sep 17 00:00:00 2001 From: ChristophHotter Date: Wed, 15 Apr 2026 10:04:39 -0400 Subject: [PATCH 10/10] update TODOs --- TODOs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/TODOs.md b/TODOs.md index d2046be..c91095f 100644 --- a/TODOs.md +++ b/TODOs.md @@ -22,16 +22,12 @@ - [ ] pulse delay - [ ] better method for u_eff and v_eff (Victor) -- [x] Formatter/SpellCheck - -- [ ] JET - -- [ ] Aqua - +- [] docu + - u_eff and v_eff theory + - development status ## Additional TODOs -- [ ] directly use gu(t) without substitution? (think about iscall) - [ ] u_eff and v_eff equation (PRA 2020, appendix) theory, API, implementation - [ ] rename translate_qo (to to_numerics ?) @@ -91,3 +87,7 @@ - [x] interaction picture - [x] general expression for A(t) - [x] two_time_corr_matrix for Ls const (see example 02-2) + +- [x] Formatter/SpellCheck +- [x] JET +- [x] Aqua \ No newline at end of file