Skip to content

KetBraSum #3386

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

Closed
wants to merge 193 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
193 commits
Select commit Hold shift + click to select a range
bd3c8b8
Add projector class
tonybruguier Oct 3, 2020
3d876c8
attempt to address some failures
tonybruguier Oct 4, 2020
b21b531
nits
tonybruguier Oct 4, 2020
6fbda8c
nits
tonybruguier Oct 4, 2020
3b96978
nits
tonybruguier Oct 4, 2020
f797d68
nits
tonybruguier Oct 4, 2020
08b0c24
add missing coverage in test
tonybruguier Oct 4, 2020
68fefb5
Merge branch 'master' into projection
tonybruguier Oct 16, 2020
d10ea5a
Merge branch 'master' into projection
tonybruguier Oct 18, 2020
8ba55f5
Merge branch 'master' into projection
tonybruguier Oct 24, 2020
d826f8b
Address comments
tonybruguier Oct 25, 2020
3a83156
nits
tonybruguier Oct 25, 2020
7f18128
nits
tonybruguier Oct 25, 2020
d8ac239
nits
tonybruguier Oct 25, 2020
efe0ed3
Address comments
tonybruguier Oct 27, 2020
d8cb496
nits
tonybruguier Oct 27, 2020
0dd7385
mypy fix attempt
tonybruguier Oct 27, 2020
7e1eb61
Merge branch 'master' into projection
tonybruguier Oct 28, 2020
9cb3056
address reviewer's comments
tonybruguier Oct 28, 2020
09ea03f
nits
tonybruguier Oct 28, 2020
3361b2a
address comment
tonybruguier Oct 28, 2020
9506301
nits
tonybruguier Oct 28, 2020
79f841f
Merge branch 'master' into projection
tonybruguier Oct 29, 2020
b6fbd13
Merge branch 'master' into projection
tonybruguier Oct 30, 2020
9d75e1c
Merge branch 'master' into projection
tonybruguier Oct 30, 2020
d572dfc
Merge branch 'master' into projection
tonybruguier Nov 3, 2020
98482fd
Address comments
tonybruguier Nov 4, 2020
f77154c
Add check for orthogonal basis
tonybruguier Nov 4, 2020
a89fe35
nits
tonybruguier Nov 4, 2020
154a350
Address comments
tonybruguier Nov 4, 2020
be2f1d4
Merge branch 'master' into projection
tonybruguier Nov 4, 2020
80f469d
address comments
tonybruguier Nov 5, 2020
577f258
Merge branch 'master' into projection
tonybruguier Nov 5, 2020
7099cfd
nits
tonybruguier Nov 5, 2020
ed29f5b
nits
tonybruguier Nov 5, 2020
c95ab3b
nits
tonybruguier Nov 5, 2020
019547b
Merge branch 'master' into projection
tonybruguier Nov 5, 2020
9aadda2
Merge branch 'master' into projection
tonybruguier Nov 6, 2020
d5096e7
Update cirq/ops/projectors.py
tonybruguier Nov 6, 2020
b10b8ed
address comments
tonybruguier Nov 6, 2020
e82914c
nits
tonybruguier Nov 6, 2020
96f5549
nits
tonybruguier Nov 6, 2020
1763c2d
nits
tonybruguier Nov 6, 2020
c11edb6
Merge branch 'master' into projection
tonybruguier Nov 7, 2020
03c000c
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
097b7d0
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
860c660
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
e22966c
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
69068f2
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
8d21ee8
Update cirq/ops/projectors.py
tonybruguier Nov 7, 2020
ba62458
address comments
tonybruguier Nov 7, 2020
2424712
nits
tonybruguier Nov 7, 2020
f20d9d5
Merge branch 'master' into projection
tonybruguier Nov 9, 2020
28521cc
Merge branch 'master' into projection
tonybruguier Nov 10, 2020
daa4038
Merge branch 'master' into projection
tonybruguier Nov 10, 2020
fb058f6
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Nov 10, 2020
0bb39ea
Merge branch 'master' into projection
tonybruguier Nov 12, 2020
bc43a38
Merge branch 'master' into projection
tonybruguier Nov 12, 2020
a4c7df2
Merge branch 'master' into projection
tonybruguier Nov 14, 2020
2304030
Merge branch 'master' into projection
tonybruguier Nov 18, 2020
2b498b2
Merge branch 'master' into projection
tonybruguier Nov 21, 2020
364d5fe
Use STATE_VECTOR_LIKE, some cleanups
tonybruguier Nov 22, 2020
206491a
Refactor to be like Pauli
tonybruguier Nov 24, 2020
75fa3a1
Merge branch 'master' into projection
tonybruguier Nov 24, 2020
33e3028
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Nov 24, 2020
ede292c
nits
tonybruguier Nov 24, 2020
576d775
nits
tonybruguier Nov 24, 2020
e2b57d4
add tolerance to orthonormality test
tonybruguier Nov 24, 2020
dcafe0f
nits
tonybruguier Nov 24, 2020
e8d827b
nits
tonybruguier Nov 24, 2020
211eeff
Merge branch 'master' into projection
tonybruguier Nov 25, 2020
28fdf56
Multi dim bug fix + added unit test
tonybruguier Nov 25, 2020
41cd189
nits
tonybruguier Nov 25, 2020
ec8f7a6
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Nov 25, 2020
fe8032a
bugfix: Reorder the qubits by their true index + expand unit test
tonybruguier Nov 25, 2020
84b2d4c
nits
tonybruguier Nov 25, 2020
47643f8
Merge branch 'master' into projection
tonybruguier Nov 25, 2020
b640f48
nits
tonybruguier Nov 25, 2020
6b962b1
Fix bug by missing conjugation + added unit test
tonybruguier Nov 25, 2020
5a1d34d
Merge branch 'master' into projection
tonybruguier Nov 25, 2020
6be4acd
nits
tonybruguier Nov 25, 2020
ca8890f
Make sure all qids are present
tonybruguier Nov 25, 2020
a361014
Merge branch 'master' into projection
tonybruguier Nov 25, 2020
61e6461
nits
tonybruguier Nov 25, 2020
16d1453
nits
tonybruguier Nov 25, 2020
88df73b
Merge branch 'master' into projection
tonybruguier Nov 25, 2020
75a2477
Merge branch 'master' into projection
tonybruguier Nov 26, 2020
e226a7d
Support split QIDs
tonybruguier Nov 26, 2020
bf0dac3
replace with pre-computed variable
tonybruguier Nov 26, 2020
ded7a4e
nits
tonybruguier Nov 26, 2020
5a31738
nits
tonybruguier Nov 26, 2020
0624df9
add test for unchecked line
tonybruguier Nov 26, 2020
e425000
Re-instate accidently deleted new lint
tonybruguier Nov 27, 2020
5b3cef7
Merge branch 'master' into projection
tonybruguier Dec 1, 2020
53abee5
re-nit with new code formatter
tonybruguier Dec 1, 2020
e546fc6
Merge branch 'master' into projection
tonybruguier Dec 2, 2020
9d0357c
add the ability to directly specify the matrix
tonybruguier Dec 3, 2020
7a068d9
Merge branch 'master' into projection
tonybruguier Dec 3, 2020
e9ce104
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Dec 3, 2020
c297d20
undo the usage of the matrices
tonybruguier Dec 3, 2020
7a3fa0a
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Dec 3, 2020
7571951
nits
tonybruguier Dec 3, 2020
a9c4408
Merge branch 'master' into projection
tonybruguier Dec 6, 2020
a469a9d
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Dec 9, 2020
8b3b0dd
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Dec 9, 2020
f9386e6
Merge branch 'master' into projection
tonybruguier Dec 11, 2020
a533361
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Dec 11, 2020
a3e2368
Merge branch 'master' into projection
tonybruguier Dec 17, 2020
5512918
Merge branch 'master' into projection
tonybruguier Dec 19, 2020
c52f475
Rename to KetBraSum
tonybruguier Dec 20, 2020
3fe19d3
Implement witt KetBra
tonybruguier Dec 21, 2020
1cb7fa9
nits
tonybruguier Dec 21, 2020
e868614
attempt fix annotations
tonybruguier Dec 21, 2020
d10dad7
change conjugation convention
tonybruguier Dec 21, 2020
22c90d7
Merge branch 'master' into projection
tonybruguier Dec 23, 2020
34a5b92
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Dec 24, 2020
e53e644
fix typo
tonybruguier Dec 27, 2020
0e97309
Merge branch 'master' into projection
tonybruguier Dec 28, 2020
a338502
Merge branch 'master' into projection
tonybruguier Dec 28, 2020
44cff04
Merge branch 'master' into projection
tonybruguier Dec 30, 2020
4dc703f
Merge branch 'master' into projection
tonybruguier Jan 6, 2021
55485c7
Merge branch 'master' into projection
tonybruguier Jan 7, 2021
7a01c67
Merge branch 'master' into projection
tonybruguier Jan 9, 2021
4d5598b
Merge branch 'master' into projection
tonybruguier Jan 10, 2021
f764a2e
Merge branch 'master' into projection
tonybruguier Jan 11, 2021
de37e7b
Merge branch 'master' into projection
tonybruguier Jan 13, 2021
ddc581f
Merge branch 'master' into projection
tonybruguier Jan 16, 2021
a50f7ef
Merge branch 'master' into projection
tonybruguier Jan 20, 2021
35c5851
Merge branch 'master' into projection
tonybruguier Jan 21, 2021
a0b3ae5
Merge branch 'master' into projection
tonybruguier Jan 23, 2021
74e008e
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jan 26, 2021
2ce1332
Merge branch 'master' into projection
tonybruguier Jan 28, 2021
f39c9a7
Merge branch 'master' into projection
tonybruguier Jan 29, 2021
178817b
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Jan 29, 2021
4d24648
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jan 29, 2021
d3a71b9
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jan 29, 2021
3136f19
Merge branch 'master' into projection
tonybruguier Jan 30, 2021
65a57fd
Merge branch 'master' into projection
tonybruguier Feb 1, 2021
5289de4
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Feb 2, 2021
e081fbc
Merge branch 'master' into projection
tonybruguier Feb 3, 2021
c0558a6
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Feb 3, 2021
fee7ce0
Merge branch 'master' into projection
tonybruguier Feb 3, 2021
245190e
Merge branch 'master' into projection
tonybruguier Feb 4, 2021
8293730
KetBra object
tonybruguier Feb 4, 2021
d01292c
remove unused code
tonybruguier Feb 4, 2021
0bce8e1
Merge branch 'master' into projection
tonybruguier Feb 4, 2021
6c349d1
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Feb 5, 2021
74d8b6c
Merge branch 'projection' of github.com:tonybruguier/Cirq into projec…
tonybruguier Feb 5, 2021
9dfea5e
Merge branch 'master' into projection
tonybruguier Feb 7, 2021
3d800c0
Merge branch 'master' into projection
tonybruguier Feb 10, 2021
d930aa6
Merge branch 'master' into projection
tonybruguier Feb 13, 2021
c1d35f8
fix broken test
tonybruguier Feb 13, 2021
f3f50bd
Merge branch 'master' into projection
tonybruguier Feb 17, 2021
13fcecf
Merge branch 'master' into projection
tonybruguier Feb 18, 2021
e511480
Merge branch 'master' into projection
tonybruguier Feb 23, 2021
5f2d327
Merge branch 'master' into projection
tonybruguier Feb 24, 2021
471fd61
Merge branch 'master' into projection
tonybruguier Feb 25, 2021
41d0289
Merge branch 'master' into projection
tonybruguier Feb 26, 2021
8b2f75c
Merge branch 'master' into projection
tonybruguier Feb 28, 2021
13d8350
Merge branch 'master' into projection
tonybruguier Mar 2, 2021
ad569d7
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 4, 2021
0bc8307
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 7, 2021
f63f0ca
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 9, 2021
c986c80
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 10, 2021
0b0aa4d
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 12, 2021
84f5aaf
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 13, 2021
bc6a926
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 17, 2021
3deda08
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 19, 2021
a1df8c9
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 19, 2021
cb704d7
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 19, 2021
fd05074
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 20, 2021
fe9a102
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 20, 2021
b13f938
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 23, 2021
bbd8602
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 23, 2021
ae06c90
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 24, 2021
1441383
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 25, 2021
9de05ab
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 26, 2021
f084ddd
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Mar 31, 2021
b9a0882
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 2, 2021
3099d75
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 6, 2021
d730d6a
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 7, 2021
ebf5478
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 8, 2021
1c03f62
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 10, 2021
c81533c
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 13, 2021
dee3919
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 13, 2021
39020c4
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 15, 2021
1d8a119
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 20, 2021
e31ac83
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 22, 2021
7cee2f7
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Apr 23, 2021
f8e0ac6
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jun 16, 2021
9611ef0
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jul 9, 2021
e185852
Merge branch 'master' of github.com:quantumlib/Cirq into projection
tonybruguier Jul 15, 2021
e69d3f4
nit
tonybruguier Jul 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cirq-core/cirq/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@
InterchangeableQubitsGate,
ISWAP,
ISwapPowGate,
KetBra,
KetBraSum,
LinearCombinationOfGates,
LinearCombinationOfOperations,
MatrixGate,
Expand Down
2 changes: 2 additions & 0 deletions cirq-core/cirq/json_resolver_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ def two_qubit_matrix_gate(matrix):
'IdentityGate': cirq.IdentityGate,
'IdentityOperation': _identity_operation_from_dict,
'InitObsSetting': cirq.work.InitObsSetting,
'KetBra': cirq.KetBra,
'KetBraSum': cirq.KetBraSum,
'LinearDict': cirq.LinearDict,
'LineQubit': cirq.LineQubit,
'LineQid': cirq.LineQid,
Expand Down
5 changes: 5 additions & 0 deletions cirq-core/cirq/ops/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@
IdentityGate,
)

from cirq.ops.ketbrasum import (
KetBra,
KetBraSum,
)

from cirq.ops.global_phase_op import (
GlobalPhaseOperation,
)
Expand Down
225 changes: 225 additions & 0 deletions cirq-core/cirq/ops/ketbrasum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
from typing import (
Any,
Dict,
Iterable,
Mapping,
List,
Optional,
Tuple,
TYPE_CHECKING,
TypeVar,
Union,
)

import numpy as np

from cirq import linalg, value
from cirq.ops import raw_types
from cirq.qis import states
from cirq.qis import STATE_VECTOR_LIKE

if TYPE_CHECKING:
import cirq
from cirq import protocols

KetBraKey = TypeVar('KetBraKey', bound=Union[raw_types.Qid, Tuple[raw_types.Qid]])


def qid_shape_from_ket_bra_key(ket_bra_key: KetBraKey):
if isinstance(ket_bra_key, tuple):
return [qid.dimension for qid in ket_bra_key]
else:
return [ket_bra_key.dimension]


def get_dims_from_qid_map(qid_map: Mapping[raw_types.Qid, int]):
dims = sorted([(i, qid.dimension) for qid, i in qid_map.items()])
return [x[1] for x in dims]


def get_qid_indices(qid_map: Mapping[raw_types.Qid, int], ket_bra_key: KetBraKey):
if isinstance(ket_bra_key, raw_types.Qid):
qid = ket_bra_key
if qid not in qid_map:
raise ValueError(f"Missing qid: {qid}")
return [qid_map[qid]]
else:
idx = []
for qid in ket_bra_key:
if qid not in qid_map:
raise ValueError(f"Missing qid: {qid}")
idx.append(qid_map[qid])
return idx


@value.value_equality
class KetBra:
def __init__(
self,
ket: Optional[STATE_VECTOR_LIKE] = None,
bra: Optional[STATE_VECTOR_LIKE] = None,
ket_bra_list: Optional[List[Tuple[STATE_VECTOR_LIKE, STATE_VECTOR_LIKE]]] = None,
):

if ket_bra_list is not None:
self.ket_bra_list = ket_bra_list
else:
self.ket_bra_list = []
if ket is not None and bra is not None:
self.ket_bra_list.append(
(
ket,
bra,
)
)

def KetBra(self, ket: STATE_VECTOR_LIKE, bra: STATE_VECTOR_LIKE):
self.ket_bra_list.append(
(
ket,
bra,
)
)
return self

def __iter__(self):
return iter(self.ket_bra_list)

def _json_dict_(self) -> Dict[str, Any]:
return {
'cirq_type': self.__class__.__name__,
'ket_bra_list': [list(ket_bra) for ket_bra in self.ket_bra_list],
}

@classmethod
def _from_json_dict_(cls, ket_bra_list, **kwargs):
ket_bra_list = [tuple(ket_bra) for ket_bra in ket_bra_list]
return cls(ket_bra_list=ket_bra_list)

def _value_equality_values_(self) -> Any:
return tuple(self.ket_bra_list)


@value.value_equality
class KetBraSum:
"""A generic operation specified as a list of |ket><bra|.

The matrix is specified as a dictionary of qubits to IDs. The IDs are
specified as |ket><bra|. Note that the matrix is not necessarily unitary,
nor necessarily a idempotent (a projection). It is up to the caller to
ensure that it makes sense to use the object.
"""

def __init__(
self,
ket_bra_dict: Dict[KetBraKey, KetBra],
):
"""Contructor for KetBraSum

Args:
ket_bra_dict: a dictionary of Qdit tuples to a list of |ket><bra|
which express the operation to apply
"""
self._ket_bra_dict = ket_bra_dict

def _ket_bra_dict_(self) -> Dict[KetBraKey, KetBra]:
return self._ket_bra_dict

def _op_matrix(self, ket_bra_key: KetBraKey) -> np.ndarray:
# TODO(tonybruguier): Speed up computation when the ket and bra are
# encoded as integers. This probably means not calling this function at
# all, as encoding a matrix with a single non-zero entry is not
# efficient.
qid_shape = qid_shape_from_ket_bra_key(ket_bra_key)

P = 0
for ket_bra in self._ket_bra_dict[ket_bra_key]:
ket = states.to_valid_state_vector(ket_bra[0], qid_shape=qid_shape)
bra = states.to_valid_state_vector(ket_bra[1], qid_shape=qid_shape).conj()
P = P + np.einsum('i,j->ij', ket, bra)

return P

def matrix(self, ket_bra_keys: Optional[Iterable[KetBraKey]] = None) -> Iterable[np.ndarray]:
ket_bra_keys = self._ket_bra_dict.keys() if ket_bra_keys is None else ket_bra_keys
factors = []
for ket_bra_key in ket_bra_keys:
if ket_bra_key not in self._ket_bra_dict.keys():
qid_shape = qid_shape_from_ket_bra_key(ket_bra_key)
factors.append(np.eye(np.prod(qid_shape)))
else:
factors.append(self._op_matrix(ket_bra_key))
return linalg.kron(*factors)

def expectation_from_state_vector(
self,
state_vector: np.ndarray,
qid_map: Mapping[raw_types.Qid, int],
*,
atol: float = 1e-7,
check_preconditions: bool = True,
) -> float:
dims = get_dims_from_qid_map(qid_map)
state_vector = state_vector.reshape(dims)

for ket_bra_key in self._ket_bra_dict.keys():
idx = get_qid_indices(qid_map, ket_bra_key)
op_dims = qid_shape_from_ket_bra_key(ket_bra_key)
nr = len(idx)

P = self._op_matrix(ket_bra_key)
P = np.reshape(P, op_dims * 2)

state_vector = np.tensordot(P, state_vector, axes=(range(nr, 2 * nr), idx))
state_vector = np.moveaxis(state_vector, range(nr), idx)

state_vector = np.reshape(state_vector, np.prod(dims))
return np.dot(state_vector, state_vector.conj())

def expectation_from_density_matrix(
self,
state: np.ndarray,
qid_map: Mapping[raw_types.Qid, int],
*,
atol: float = 1e-7,
check_preconditions: bool = True,
) -> float:
dims = get_dims_from_qid_map(qid_map)
state = state.reshape(dims * 2)

for ket_bra_key in self._ket_bra_dict.keys():
idx = get_qid_indices(qid_map, ket_bra_key)
op_dims = qid_shape_from_ket_bra_key(ket_bra_key)
nr = len(idx)

P = self._op_matrix(ket_bra_key)
P = np.reshape(P, op_dims * 2)

state = np.tensordot(P, state, axes=(range(nr, 2 * nr), idx))
state = np.moveaxis(state, range(nr), idx)
state = np.tensordot(state, P.T.conj(), axes=([len(dims) + i for i in idx], range(nr)))
state = np.moveaxis(state, range(-nr, 0), [len(dims) + i for i in idx])

state = np.reshape(state, [np.prod(dims)] * 2)
return np.trace(state)

def __repr__(self) -> str:
return f"cirq.KetBraSum(ket_bra_dict={self._ket_bra_dict})"

def _json_dict_(self) -> Dict[str, Any]:
encoded_dict = {k: [(t[0], t[1]) for t in v] for k, v in self._ket_bra_dict.items()}
return {
'cirq_type': self.__class__.__name__,
# JSON requires mappings to have string keys.
'ket_bra_dict': list(encoded_dict.items()),
}

@classmethod
def _from_json_dict_(cls, ket_bra_dict, **kwargs):
encoded_dict = dict(ket_bra_dict)
return cls(ket_bra_dict={k: [tuple(t) for t in v] for k, v in encoded_dict.items()})

def _value_equality_values_(self) -> Any:
ket_bra_dict = sorted(self._ket_bra_dict.items())
encoded_dict = {k: tuple([(t[0], t[1]) for t in v]) for k, v in ket_bra_dict}
return tuple(encoded_dict.items())
Loading