Properly define the in-place vs not-in-place interface #80
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We support both mutating and non-mutating propagators. Mutation is better for large Hilbert spaces. Non-mutation is better for small Hilbert spaces (
StaticArrays
!) or when trying to use automatic differentiation.There are some subtleties in finding the correct abstraction. It is not as simple as using the built-in
ismutable
for states or operators and making decisions based on that: Anytime we use custom structs, unless that struct is explicitly defined asmutable
, it is considered immutable. However, we can still use in-place propagation, mutating the mutable components of that struct.Instead of overloading
ismutable
, we define the in-place or not-in-place interface explicitly via the required behavior guaranteed by thecheck_state
,check_generator
, andcheck_operator
functions.A new
QuantumPropagators.Interfaces.supports_inplace
function is available to check whether a givenstate
oroperator
type is suitable for in-place operations.