Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly define the in-place vs not-in-place interface #80

Merged
merged 1 commit into from
Jul 26, 2024

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
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 merged commit 5023b66 into master Jul 26, 2024
2 of 3 checks passed
@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.

1 participant