[open-systems] Superoperator tensor contraction#1596
[open-systems] Superoperator tensor contraction#1596mpharrigan merged 77 commits intoquantumlib:mainfrom
Conversation
tanujkhattar
left a comment
There was a problem hiding this comment.
@mpharrigan Is this blocked on something?
@NoureldinYosri Can you please take a look?
I'll be happy to LGTM and merge it since I want to use the functionality in this PR.
| @@ -0,0 +1,68 @@ | |||
| # Copyright 2024 Google LLC | |||
There was a problem hiding this comment.
| # Copyright 2024 Google LLC | |
| # Copyright 2025 Google LLC |
| @@ -0,0 +1,82 @@ | |||
| # Copyright 2024 Google LLC | |||
There was a problem hiding this comment.
| # Copyright 2024 Google LLC | |
| # Copyright 2025 Google LLC |
| @cached_property | ||
| def signature(self) -> 'Signature': | ||
| return Signature( | ||
| [Register('q', QBit(), side=Side.LEFT), Register('c', CBit(), side=Side.RIGHT)] |
There was a problem hiding this comment.
nit: if the measurement is nondemolition measurement then the qubit can be reused. which would be simpler than allocating a new qubit in the state indicated by the classical bit.
perhabs a boolean that controls whether the qubit is LEFT or TRHOUGH can be used here?
There was a problem hiding this comment.
That is certainly a valid operation, although I'd advocate for that being its own bloq.
The current construct is simpler if you're measuring a qubit to get its bit value
|
Check out this pull request on See visual diffs & provide feedback on Jupyter Notebooks. Powered by ReviewNB |
This pull request is the third in a series for supporting open system (classical data & measurement), roadmap item #445.
This branch is based on #1590 (for my convenience; it doesn't use any of that functionality)Bloq.tensor_contract(superoperator=True)This is the new interface. It will return a 0-, 2-, or 4-dimensional tensor for constants, density matrices, and superoperators (resp) to support simulating programs with measurements and non-unitary maps. Read the docs for the indexing convention for the superoperator; but if you're really doing something with the superoperators you may want to operate on the quimb tensor network with friendly indices itself.
cbloq_to_superquimbThe workhorse of the new functionality is this function that converts a composite bloq to a tensor network that represents the density matrix and/or superoperator of the program. Some operations like measurement or discarding qubits cannot be represented in a pure-state statevector / unitary picture.
cbloq_to_superquimbstill usesBloq.my_tensorsto construct the network. It adds each tensor twice: once in the "forward" direction and again in the "backward" (adjoint) direction.DiscardIndThe
Bloq.my_tensorsmethod can now return aDiscardIndobject, which signifies that that tensor index should be discarded by tracing it out.It turns out that this simple extension lets you represent any CPTP map using the "system+environment" modeling approach.
MeasZ,DiscardThis PR includes two non-unitary maps: measuring in the Z basis and discarding a qubit or classical bit.
Manipulating quimb tensor networks
This PR makes some changes to the way we handle outer indices in the quimb tensor network. This should only be of interest to folks who use the "hands on" approach of directly manipulating the tensor networks. The changes make sense and clean up some of the docs.
The outer indices are now re-mapped to tuples of qualtran objects that actually make sense rather than keeping them as
Connections toDanglingTobjects. There is a new flagfriendly_indices=Truewhich will make the outer indices friendly strings.breaking change I renamed and made-private the
get_left_and_right_indsfunction. The original idea was to use this as a public way of getting a handle on the outer indices, but it was always tricky to use; and needed to be changed to support the new variety of outer indices present in the superoperator networks. No one should need a replacement for this function since theqtn.TensorNetworkobject outer indices now just intrinsically make sense.Non-changes
This includes the minimal set of non-unitary CPTP bloqs to support the docs notebooks.