Implement KrausOperators and conversions #177
Draft
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.
This builds on #115 and adds a KrausOperators type which represents an abstract superoperator in the Kraus representation, along with functions to convert to/from the Superoperator and ChoiState types.
I'm opening this as a draft PR as I work through the remaining TODO items:
I had tried to figure out how to convert to KrausOperators directly from sparse superoperators using both KryolovKit and Arnoldi, however it seems tricky to do in general as for an arbitrary superoperator one cannot know a priori what its Kraus rank is without calculating it's eigenvalues. I thought it might work to ask for, say sqrt(dim) largest eigenvalues then check if the smallest of these was close to zero, however apparently Kryolov methods cannot robustly handle finding all eigenvectors associated to degenerate eigenvalues. Thus this method cannot be used to reliabely find the Kraus representation of a superoperator, even when the superoperator has small Kraus rank.