Skip to content

Conversation

@Gavin-Rockwood
Copy link

@Gavin-Rockwood Gavin-Rockwood commented Dec 1, 2025

Checklist

Thank you for contributing to QuantumToolbox.jl! Please make sure you have finished the following tasks before opening the PR.

  • Please read Contributing to Quantum Toolbox in Julia.
  • Any code changes were done in a way that does not break public API.
  • Appropriate tests were added and tested locally by running: make test.
  • Any code changes should be julia formatted by running: make format.
  • All documents (in docs/ folder) related to code changes were updated and able to build locally by running: make docs.
  • (If necessary) the CHANGELOG.md should be updated (regarding to the code changes) and built by running: make changelog.

Request for a review after you have completed all the tasks. If you have not finished them all, you can also open a Draft Pull Request to let the others know this on-going work.

Description

Updated TimeEvolutionProblem be parametrically typed using the type of the starting state as well as expanded sesolve, mesolve and mcsolve to allow them to take in operators, superoperators and operators respectively (along with other changes to facilitate this). ssesolve and smesolve are still in progress.

Related issues or PRs

Working on #521

For a given `prob::TimeEvolutionProblem`, `prob.dims` or `getproperty(prob, :dims)` returns its `dimensions` in the type of integer-vector.
"""
struct TimeEvolutionProblem{PT<:AbstractSciMLProblem,TT<:AbstractVector,DT<:AbstractDimensions,KWT}
struct TimeEvolutionProblem{ST,PT<:AbstractSciMLProblem,TT<:AbstractVector,DT<:AbstractDimensions,KWT}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about

Suggested change
struct TimeEvolutionProblem{ST,PT<:AbstractSciMLProblem,TT<:AbstractVector,DT<:AbstractDimensions,KWT}
struct TimeEvolutionProblem{ST<:QuantumObjectType,DT<:AbstractDimensions,PT<:AbstractSciMLProblem,TT<:AbstractVector,KWT}

cause I think the type of state_type and dimensions will be used more frequently.

By the way, can you also add state_type to the docstring ?

ρt = map-> QuantumObject(vec2mat(ϕ), type = X(), dims = prob.dimensions), sol.u)
else
ρt = map-> QuantumObject(vec2mat(ϕ), type = Operator(), dims = dimensions), sol.u)
ρt = map-> QuantumObject(ϕ, type = X(), dims = prob.dimensions), sol.u)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here, just use prob.states_type

Suggested change
ρt = map-> QuantumObject(ϕ, type = X(), dims = prob.dimensions), sol.u)
ρt = map-> QuantumObject(ϕ, type = prob.states_type, dims = prob.dimensions), sol.u)

state_type = SuperOperator()
else
to_dense(_complex_float_type(T), mat2vec(ket2dm(ψ0).data))
throw(ArgumentError("Unsupported state type for ψ0 in mesolveProblem."))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is redundant cause there is no method for other state type (as you defined above).

prob = ODEProblem{getVal(inplace),FullSpecialize}(L, ρ0, tspan, params; kwargs4...)

return TimeEvolutionProblem(prob, tlist, L_evo.dimensions, (isoperket = Val(isoperket(ψ0)),))
return TimeEvolutionProblem(prob, tlist, state_type, L_evo.dimensions)#, (isoperket = Val(isoperket(ψ0)),))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can remove the comment directly

sol = solve(prob.prob, alg; kwargs...)

return _gen_mesolve_solution(sol, prob.times, prob.dimensions, prob.kwargs.isoperket)
return _gen_mesolve_solution(sol, prob)#, prob.kwargs.isoperket)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can remove the comment directly

to_dense(_complex_float_type(T), copy(state.data))
else
to_dense(T, mat2vec(ket2dm(state).data))
throw(ArgumentError("Unsupported state type for ψ0 in mesolveProblem."))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same, this is redundant

function mcsolveProblem(
H::Union{AbstractQuantumObject{Operator},Tuple},
ψ0::QuantumObject{Ket},
ψ0::QuantumObject{X},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We seldom use X here in Julia. Usually will be T or ST to represent (State) Type.

Can you also change it for the other places ?

jump_callback::TJC = ContinuousLindbladJumpCallback(),
kwargs...,
) where {TJC<:LindbladJumpCallbackType}
) where {TJC<:LindbladJumpCallbackType,ST<:Union{Ket,Operator}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) where {TJC<:LindbladJumpCallbackType,ST<:Union{Ket,Operator}}
) where {ST<:Union{Ket,Operator},TJC<:LindbladJumpCallbackType}

output_func::Union{Tuple,Nothing} = nothing,
kwargs...,
) where {TJC<:LindbladJumpCallbackType}
) where {TJC<:LindbladJumpCallbackType,ST<:Union{Ket,Operator}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) where {TJC<:LindbladJumpCallbackType,ST<:Union{Ket,Operator}}
) where {ST<:Union{Ket,Operator},TJC<:LindbladJumpCallbackType}

ensemble_prob = TimeEvolutionProblem(
EnsembleProblem(prob_mc.prob, prob_func = _prob_func, output_func = _output_func[1], safetycopy = false),
prob_mc.times,
ST(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ST(),
ψ0.type,

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was replaced with prob_mc.states_type.

normalize_states::Union{Val,Bool} = Val(true),
kwargs...,
) where {TJC<:LindbladJumpCallbackType}
) where {TJC<:LindbladJumpCallbackType} where {ST<:Union{Ket,Operator}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) where {TJC<:LindbladJumpCallbackType} where {ST<:Union{Ket,Operator}}
) where {ST<:Union{Ket,Operator},TJC<:LindbladJumpCallbackType}

ens_prob = TimeEvolutionProblem(
EnsembleProblem(prob.prob, prob_func = _prob_func, output_func = _output_func[1], safetycopy = false),
prob.times,
StateOpType(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
StateOpType(),
prob.state_type,

prob = ODEProblem{getVal(inplace),FullSpecialize}(U, ψ0, tspan, params; kwargs4...)

return TimeEvolutionProblem(prob, tlist, H_evo.dimensions)
return TimeEvolutionProblem(prob, tlist, ST(), H_evo.dimensions)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return TimeEvolutionProblem(prob, tlist, ST(), H_evo.dimensions)
return TimeEvolutionProblem(prob, tlist, ψ0.type, H_evo.dimensions)

Copy link
Author

@Gavin-Rockwood Gavin-Rockwood Dec 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is needed because psi0 gets overwritten in line 82 and is no longer a quantum object in line 93. I can leave like this or I can put a line states_type = ѱ0.data somewhere before 82.

Edit: actually that is exactly what I did for mesolve so I will do the same for sesolve and elsewhere.

)

return TimeEvolutionProblem(prob, tlist, dims, (isoperket = Val(isoperket(ψ0)),))
return TimeEvolutionProblem(prob, tlist,StateOpType(), dims, ())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return TimeEvolutionProblem(prob, tlist,StateOpType(), dims, ())
return TimeEvolutionProblem(prob, tlist,ψ0.type, dims)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to mesolve, I introduced a states_type variable that is defined during the definition of $\rho 0$.

ensemble_prob = TimeEvolutionProblem(
EnsembleProblem(prob_sme, prob_func = _prob_func, output_func = _output_func[1], safetycopy = true),
prob_sme.times,
StateOpType(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
StateOpType(),
ψ0.type,

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was replaced with prob_sme.states_type.

)

return TimeEvolutionProblem(prob, tlist, dims)
return TimeEvolutionProblem(prob, tlist, ST(), dims)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return TimeEvolutionProblem(prob, tlist, ST(), dims)
return TimeEvolutionProblem(prob, tlist, ψ0.type, dims)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to sesolve, this got updated to a states_type variable defined near the top of the function.

ensemble_prob = TimeEvolutionProblem(
EnsembleProblem(prob_sme, prob_func = _prob_func, output_func = _output_func[1], safetycopy = true),
prob_sme.times,
ST(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ST(),
ψ0.type,

Copy link
Author

@Gavin-Rockwood Gavin-Rockwood Dec 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This became prob_sme.times. (actually prob_sse, I changed it to be consistent). Though, as of right now, the only type ssesolve will take is just Ket. The there is some issue with how the problem is defined that makes it so it cannot take in matrices. Same also didn't update smesolve for the same reason.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants