Skip to content

Conversation

@goerz
Copy link
Member

@goerz goerz commented Jul 19, 2024

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 as mutable, 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 the check_state, check_generator, and check_operator functions.

A new QuantumPropagators.Interfaces.supports_inplace function is available to check whether a given state or operator type is suitable for in-place operations.

@goerz goerz added the breaking PRs that break compatibility label Jul 19, 2024
@goerz goerz force-pushed the inplace-interface branch from ee76580 to 650b1da Compare July 19, 2024 14:10
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 as `mutable`, 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 the `check_state`, `check_generator`, and `check_operator` functions.

A new `QuantumPropagators.Interfaces.supports_inplace` function is
available to check whether a given `state` or `operator` type is
suitable for in-place operations.
@goerz goerz force-pushed the inplace-interface branch from 650b1da to 5023b66 Compare July 21, 2024 17:53
@goerz goerz merged commit 5023b66 into master Jul 26, 2024
@goerz goerz deleted the inplace-interface branch July 26, 2024 11:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking PRs that break compatibility

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants