cirq-core 1.5.0.dev20250122193351__py3-none-any.whl → 1.5.0.dev20250123022814__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cirq-core might be problematic. Click here for more details.

cirq/_version.py CHANGED
@@ -28,4 +28,4 @@ if sys.version_info < (3, 10, 0): # pragma: no cover
28
28
  'of cirq (e.g. "python -m pip install cirq==1.1.*")'
29
29
  )
30
30
 
31
- __version__ = "1.5.0.dev20250122193351"
31
+ __version__ = "1.5.0.dev20250123022814"
cirq/_version_test.py CHANGED
@@ -3,4 +3,4 @@ import cirq
3
3
 
4
4
 
5
5
  def test_version():
6
- assert cirq.__version__ == "1.5.0.dev20250122193351"
6
+ assert cirq.__version__ == "1.5.0.dev20250123022814"
cirq/circuits/circuit.py CHANGED
@@ -1769,6 +1769,7 @@ class Circuit(AbstractCircuit):
1769
1769
  together. This option does not affect later insertions into the
1770
1770
  circuit.
1771
1771
  """
1772
+ self._placement_cache: Optional[_PlacementCache] = _PlacementCache()
1772
1773
  self._moments: List['cirq.Moment'] = []
1773
1774
 
1774
1775
  # Implementation note: the following cached properties are set lazily and then
@@ -1779,9 +1780,11 @@ class Circuit(AbstractCircuit):
1779
1780
  self._is_measurement: Optional[bool] = None
1780
1781
  self._is_parameterized: Optional[bool] = None
1781
1782
  self._parameter_names: Optional[AbstractSet[str]] = None
1782
-
1783
+ if not contents:
1784
+ return
1783
1785
  flattened_contents = tuple(ops.flatten_to_ops_or_moments(contents))
1784
1786
  if all(isinstance(c, Moment) for c in flattened_contents):
1787
+ self._placement_cache = None
1785
1788
  self._moments[:] = cast(Iterable[Moment], flattened_contents)
1786
1789
  return
1787
1790
  with _compat.block_overlapping_deprecation('.*'):
@@ -1790,18 +1793,21 @@ class Circuit(AbstractCircuit):
1790
1793
  else:
1791
1794
  self.append(flattened_contents, strategy=strategy)
1792
1795
 
1793
- def _mutated(self) -> None:
1796
+ def _mutated(self, *, preserve_placement_cache=False) -> None:
1794
1797
  """Clear cached properties in response to this circuit being mutated."""
1795
1798
  self._all_qubits = None
1796
1799
  self._frozen = None
1797
1800
  self._is_measurement = None
1798
1801
  self._is_parameterized = None
1799
1802
  self._parameter_names = None
1803
+ if not preserve_placement_cache:
1804
+ self._placement_cache = None
1800
1805
 
1801
1806
  @classmethod
1802
1807
  def _from_moments(cls, moments: Iterable['cirq.Moment']) -> 'Circuit':
1803
1808
  new_circuit = Circuit()
1804
1809
  new_circuit._moments[:] = moments
1810
+ new_circuit._placement_cache = None
1805
1811
  return new_circuit
1806
1812
 
1807
1813
  def _load_contents_with_earliest_strategy(self, contents: 'cirq.OP_TREE'):
@@ -1823,27 +1829,18 @@ class Circuit(AbstractCircuit):
1823
1829
  Non-moment entries will be inserted according to the EARLIEST
1824
1830
  insertion strategy.
1825
1831
  """
1826
- # These are dicts from the qubit/key to the greatest moment index that has it.
1827
- qubit_indices: Dict['cirq.Qid', int] = {}
1828
- mkey_indices: Dict['cirq.MeasurementKey', int] = {}
1829
- ckey_indices: Dict['cirq.MeasurementKey', int] = {}
1832
+ # PlacementCache holds dicts from the qubit/key to the greatest moment index that has it.
1833
+ placement_cache = cast(_PlacementCache, self._placement_cache)
1830
1834
 
1831
1835
  # We also maintain the dict from moment index to moments/ops that go into it, for use when
1832
1836
  # building the actual moments at the end.
1833
1837
  op_lists_by_index: Dict[int, List['cirq.Operation']] = defaultdict(list)
1834
1838
  moments_by_index: Dict[int, 'cirq.Moment'] = {}
1835
1839
 
1836
- # For keeping track of length of the circuit thus far.
1837
- length = 0
1838
-
1839
1840
  # "mop" means current moment-or-operation
1840
1841
  for mop in ops.flatten_to_ops_or_moments(contents):
1841
1842
  # Identify the index of the moment to place this `mop` into.
1842
- placement_index = get_earliest_accommodating_moment_index(
1843
- mop, qubit_indices, mkey_indices, ckey_indices, length
1844
- )
1845
- length = max(length, placement_index + 1) # update the length of the circuit thus far
1846
-
1843
+ placement_index = placement_cache.append(mop)
1847
1844
  if isinstance(mop, Moment):
1848
1845
  moments_by_index[placement_index] = mop
1849
1846
  else:
@@ -1851,7 +1848,7 @@ class Circuit(AbstractCircuit):
1851
1848
 
1852
1849
  # Finally, once everything is placed, we can construct and append the actual moments for
1853
1850
  # each index.
1854
- for i in range(length):
1851
+ for i in range(placement_cache._length):
1855
1852
  if i in moments_by_index:
1856
1853
  self._moments.append(moments_by_index[i].with_operations(op_lists_by_index[i]))
1857
1854
  else:
@@ -1899,6 +1896,7 @@ class Circuit(AbstractCircuit):
1899
1896
  """Return a copy of this circuit."""
1900
1897
  copied_circuit = Circuit()
1901
1898
  copied_circuit._moments = self._moments[:]
1899
+ copied_circuit._placement_cache = None
1902
1900
  return copied_circuit
1903
1901
 
1904
1902
  # pylint: disable=function-redefined
@@ -2172,20 +2170,25 @@ class Circuit(AbstractCircuit):
2172
2170
  """
2173
2171
  # limit index to 0..len(self._moments), also deal with indices smaller 0
2174
2172
  k = max(min(index if index >= 0 else len(self._moments) + index, len(self._moments)), 0)
2173
+ if strategy != InsertStrategy.EARLIEST or index != len(self._moments):
2174
+ self._placement_cache = None
2175
2175
  for moment_or_op in list(ops.flatten_to_ops_or_moments(moment_or_operation_tree)):
2176
+ if self._placement_cache:
2177
+ p = self._placement_cache.append(moment_or_op)
2178
+ elif isinstance(moment_or_op, Moment):
2179
+ p = k
2180
+ else:
2181
+ p = self._pick_or_create_inserted_op_moment_index(k, moment_or_op, strategy)
2176
2182
  if isinstance(moment_or_op, Moment):
2177
- self._moments.insert(k, moment_or_op)
2178
- k += 1
2183
+ self._moments.insert(p, moment_or_op)
2184
+ elif p == len(self._moments):
2185
+ self._moments.append(Moment(moment_or_op))
2179
2186
  else:
2180
- op = moment_or_op
2181
- p = self._pick_or_create_inserted_op_moment_index(k, op, strategy)
2182
- while p >= len(self._moments):
2183
- self._moments.append(Moment())
2184
- self._moments[p] = self._moments[p].with_operation(op)
2185
- k = max(k, p + 1)
2186
- if strategy is InsertStrategy.NEW_THEN_INLINE:
2187
- strategy = InsertStrategy.INLINE
2188
- self._mutated()
2187
+ self._moments[p] = self._moments[p].with_operation(moment_or_op)
2188
+ k = max(k, p + 1)
2189
+ if strategy is InsertStrategy.NEW_THEN_INLINE:
2190
+ strategy = InsertStrategy.INLINE
2191
+ self._mutated(preserve_placement_cache=True)
2189
2192
  return k
2190
2193
 
2191
2194
  def insert_into_range(self, operations: 'cirq.OP_TREE', start: int, end: int) -> int:
@@ -2853,7 +2856,7 @@ def get_earliest_accommodating_moment_index(
2853
2856
  Args:
2854
2857
  moment_or_operation: The moment operation in question.
2855
2858
  qubit_indices: A dictionary mapping qubits to the latest moments that address them.
2856
- mkey_indices: A dictionary mapping measureent keys to the latest moments that address them.
2859
+ mkey_indices: A dictionary mapping measurement keys to the latest moments that address them.
2857
2860
  ckey_indices: A dictionary mapping control keys to the latest moments that address them.
2858
2861
  length: The length of the circuit that we are trying to insert a moment or operation into.
2859
2862
  Should probably be equal to the maximum of the values in `qubit_indices`,
@@ -2897,7 +2900,7 @@ def get_earliest_accommodating_moment_index(
2897
2900
  if mop_ckeys:
2898
2901
  last_conflict = max(last_conflict, *[mkey_indices.get(key, -1) for key in mop_ckeys])
2899
2902
 
2900
- # The index of the moment to place this moment or operaton ("mop") into.
2903
+ # The index of the moment to place this moment or operation ("mop") into.
2901
2904
  mop_index = last_conflict + 1
2902
2905
 
2903
2906
  # Update our dicts with data from this `mop` placement. Note `mop_index` will always be greater
@@ -2910,3 +2913,52 @@ def get_earliest_accommodating_moment_index(
2910
2913
  ckey_indices[key] = mop_index
2911
2914
 
2912
2915
  return mop_index
2916
+
2917
+
2918
+ class _PlacementCache:
2919
+ """Maintains qubit and cbit indices for quick op placement.
2920
+
2921
+ Here, we keep track of the greatest moment that contains each qubit,
2922
+ measurement key, and control key, and append operations to the moment after
2923
+ the maximum of these. This avoids having to iterate backwards, checking
2924
+ each moment one at a time.
2925
+
2926
+ It is only valid for `append` operations, and if any other insert strategy
2927
+ is used, or if any operation is added to the circuit without notifying the
2928
+ cache, then the cache must be invalidated for the circuit or rebuilt from
2929
+ scratch. Future improvements may ease this restriction.
2930
+ """
2931
+
2932
+ def __init__(self) -> None:
2933
+ # These are dicts from the qubit/key to the greatest moment index that has it.
2934
+ self._qubit_indices: Dict['cirq.Qid', int] = {}
2935
+ self._mkey_indices: Dict['cirq.MeasurementKey', int] = {}
2936
+ self._ckey_indices: Dict['cirq.MeasurementKey', int] = {}
2937
+
2938
+ # For keeping track of length of the circuit thus far.
2939
+ self._length = 0
2940
+
2941
+ def append(self, moment_or_operation: Union['cirq.Moment', 'cirq.Operation']) -> int:
2942
+ """Find placement for moment/operation and update cache.
2943
+
2944
+ Determines the placement index of the provided operation, assuming
2945
+ EARLIEST (append) strategy, and assuming that the internal cache
2946
+ correctly represents the circuit. It then updates the cache and returns
2947
+ the placement index.
2948
+
2949
+ Args:
2950
+ moment_or_operation: The moment or operation to append.
2951
+
2952
+ Returns:
2953
+ The index at which the moment/operation should be placed.
2954
+ """
2955
+ # Identify the index of the moment to place this into.
2956
+ index = get_earliest_accommodating_moment_index(
2957
+ moment_or_operation,
2958
+ self._qubit_indices,
2959
+ self._mkey_indices,
2960
+ self._ckey_indices,
2961
+ self._length,
2962
+ )
2963
+ self._length = max(self._length, index + 1)
2964
+ return index
@@ -4845,18 +4845,36 @@ global phase: 0.5π
4845
4845
  def test_create_speed():
4846
4846
  # Added in https://github.com/quantumlib/Cirq/pull/5332
4847
4847
  # Previously this took ~30s to run. Now it should take ~150ms. However the coverage test can
4848
- # run this slowly, so allowing 2 sec to account for things like that. Feel free to increase the
4848
+ # run this slowly, so allowing 4 sec to account for things like that. Feel free to increase the
4849
4849
  # buffer time or delete the test entirely if it ends up causing flakes.
4850
- #
4851
- # Updated in https://github.com/quantumlib/Cirq/pull/5756
4852
- # After several tiny overtime failures of the GitHub CI Pytest MacOS (3.7)
4853
- # the timeout was increased to 4 sec. A more thorough investigation or test
4854
- # removal should be considered if this continues to time out.
4855
4850
  qs = 100
4856
4851
  moments = 500
4857
4852
  xs = [cirq.X(cirq.LineQubit(i)) for i in range(qs)]
4858
- opa = [xs[i] for i in range(qs) for _ in range(moments)]
4853
+ ops = [xs[i] for i in range(qs) for _ in range(moments)]
4854
+ t = time.perf_counter()
4855
+ c = cirq.Circuit(ops)
4856
+ duration = time.perf_counter() - t
4857
+ assert len(c) == moments
4858
+ assert duration < 4
4859
+
4860
+
4861
+ def test_append_speed():
4862
+ # Previously this took ~17s to run. Now it should take ~150ms. However the coverage test can
4863
+ # run this slowly, so allowing 5 sec to account for things like that. Feel free to increase the
4864
+ # buffer time or delete the test entirely if it ends up causing flakes.
4865
+ #
4866
+ # The `append` improvement mainly helps for deep circuits. It is less useful for wide circuits
4867
+ # because the Moment (immutable) needs verified and reconstructed each time an op is added.
4868
+ qs = 2
4869
+ moments = 10000
4870
+ xs = [cirq.X(cirq.LineQubit(i)) for i in range(qs)]
4871
+ c = cirq.Circuit()
4859
4872
  t = time.perf_counter()
4860
- c = cirq.Circuit(opa)
4873
+ # Iterating with the moments in the inner loop highlights the improvement: when filling in the
4874
+ # second qubit, we no longer have to search backwards from moment 10000 for a placement index.
4875
+ for q in range(qs):
4876
+ for _ in range(moments):
4877
+ c.append(xs[q])
4878
+ duration = time.perf_counter() - t
4861
4879
  assert len(c) == moments
4862
- assert time.perf_counter() - t < 4
4880
+ assert duration < 5
@@ -75,6 +75,7 @@ class ExecutionStrategy(metaclass=abc.ABCMeta):
75
75
  strategy = StrategyExecutorTransformer(self)
76
76
  final_circuit = strategy(input_circuit, **kwargs)
77
77
  input_circuit._moments = final_circuit._moments
78
+ input_circuit._placement_cache = final_circuit._placement_cache
78
79
  return strategy.mapping
79
80
 
80
81
 
cirq/ops/op_tree.py CHANGED
@@ -16,7 +16,6 @@
16
16
  """
17
17
 
18
18
  from typing import Callable, Iterable, Iterator, NoReturn, Union, TYPE_CHECKING
19
- from typing_extensions import Protocol
20
19
 
21
20
  from cirq._doc import document
22
21
  from cirq._import import LazyLoader
@@ -28,32 +27,7 @@ if TYPE_CHECKING:
28
27
  moment = LazyLoader("moment", globals(), "cirq.circuits.moment")
29
28
 
30
29
 
31
- class OpTree(Protocol):
32
- """The recursive type consumed by circuit builder methods.
33
-
34
- An OpTree is a type protocol, satisfied by anything that can be recursively
35
- flattened into Operations. We also define the Union type OP_TREE which
36
- can be an OpTree or just a single Operation.
37
-
38
- For example:
39
- - An Operation is an OP_TREE all by itself.
40
- - A list of operations is an OP_TREE.
41
- - A list of tuples of operations is an OP_TREE.
42
- - A list with a mix of operations and lists of operations is an OP_TREE.
43
- - A generator yielding operations is an OP_TREE.
44
-
45
- Note: once mypy supports recursive types this could be defined as an alias:
46
-
47
- OP_TREE = Union[Operation, Iterable['OP_TREE']]
48
-
49
- See: https://github.com/python/mypy/issues/731
50
- """
51
-
52
- def __iter__(self) -> Iterator[Union[Operation, 'OpTree']]:
53
- pass
54
-
55
-
56
- OP_TREE = Union[Operation, OpTree]
30
+ OP_TREE = Union[Operation, Iterable['OP_TREE']]
57
31
  document(
58
32
  OP_TREE,
59
33
  """An operation or nested collections of operations.
@@ -19,7 +19,7 @@ Based on:
19
19
  Synthesis of Quantum Logic Circuits. Tech. rep. 2006,
20
20
  https://arxiv.org/abs/quant-ph/0406176
21
21
  """
22
- from typing import List, Callable, TYPE_CHECKING
22
+ from typing import Callable, Iterable, List, TYPE_CHECKING
23
23
 
24
24
  from scipy.linalg import cossin
25
25
 
@@ -38,12 +38,11 @@ from cirq.circuits.frozen_circuit import FrozenCircuit
38
38
 
39
39
  if TYPE_CHECKING:
40
40
  import cirq
41
- from cirq.ops import op_tree
42
41
 
43
42
 
44
43
  def quantum_shannon_decomposition(
45
44
  qubits: 'List[cirq.Qid]', u: np.ndarray, atol: float = 1e-8
46
- ) -> 'op_tree.OpTree':
45
+ ) -> Iterable['cirq.Operation']:
47
46
  """Decomposes n-qubit unitary 1-q, 2-q and GlobalPhase gates, preserving global phase.
48
47
 
49
48
  The gates used are CX/YPow/ZPow/CNOT/GlobalPhase/CZ/PhasedXZGate/PhasedXPowGate.
@@ -141,7 +140,7 @@ def quantum_shannon_decomposition(
141
140
  yield from _msb_demuxer(qubits, u1, u2)
142
141
 
143
142
 
144
- def _single_qubit_decomposition(qubit: 'cirq.Qid', u: np.ndarray) -> 'op_tree.OpTree':
143
+ def _single_qubit_decomposition(qubit: 'cirq.Qid', u: np.ndarray) -> Iterable['cirq.Operation']:
145
144
  """Decomposes single-qubit gate, and returns list of operations, keeping phase invariant.
146
145
 
147
146
  Args:
@@ -186,7 +185,7 @@ def _single_qubit_decomposition(qubit: 'cirq.Qid', u: np.ndarray) -> 'op_tree.Op
186
185
 
187
186
  def _msb_demuxer(
188
187
  demux_qubits: 'List[cirq.Qid]', u1: np.ndarray, u2: np.ndarray
189
- ) -> 'op_tree.OpTree':
188
+ ) -> Iterable['cirq.Operation']:
190
189
  """Demultiplexes a unitary matrix that is multiplexed in its most-significant-qubit.
191
190
 
192
191
  Decomposition structure:
@@ -249,7 +248,7 @@ def _nth_gray(n: int) -> int:
249
248
 
250
249
  def _multiplexed_cossin(
251
250
  cossin_qubits: 'List[cirq.Qid]', angles: List[float], rot_func: Callable = ops.ry
252
- ) -> 'op_tree.OpTree':
251
+ ) -> Iterable['cirq.Operation']:
253
252
  """Performs a multiplexed rotation over all qubits in this unitary matrix,
254
253
 
255
254
  Uses ry and rz multiplexing for quantum shannon decomposition
@@ -196,37 +196,16 @@ def _map_operations_impl(
196
196
  return mapped_ops
197
197
 
198
198
  new_moments: List[List['cirq.Operation']] = []
199
-
200
- # Keep track of the latest time index for each qubit, measurement key, and control key.
201
- qubit_time_index: Dict['cirq.Qid', int] = {}
202
- measurement_time_index: Dict['cirq.MeasurementKey', int] = {}
203
- control_time_index: Dict['cirq.MeasurementKey', int] = {}
204
-
205
- # New mapped operations in the current moment should be inserted after `last_moment_time_index`.
206
- last_moment_time_index = -1
207
-
208
199
  for idx, moment in enumerate(circuit):
209
- if wrap_in_circuit_op:
210
- new_moments.append([])
200
+ curr_moments: List[List['cirq.Operation']] = [[]] if wrap_in_circuit_op else []
201
+ placement_cache = circuits.circuit._PlacementCache()
211
202
  for op in moment:
212
203
  mapped_ops = apply_map_func(op, idx)
213
-
214
204
  for mapped_op in mapped_ops:
215
- # Identify the earliest moment that can accommodate this op.
216
- placement_index = circuits.circuit.get_earliest_accommodating_moment_index(
217
- mapped_op, qubit_time_index, measurement_time_index, control_time_index
218
- )
219
- placement_index = max(placement_index, last_moment_time_index + 1)
220
- new_moments.extend([[] for _ in range(placement_index - len(new_moments) + 1)])
221
- new_moments[placement_index].append(mapped_op)
222
- for qubit in mapped_op.qubits:
223
- qubit_time_index[qubit] = placement_index
224
- for key in protocols.measurement_key_objs(mapped_op):
225
- measurement_time_index[key] = placement_index
226
- for key in protocols.control_keys(mapped_op):
227
- control_time_index[key] = placement_index
228
-
229
- last_moment_time_index = len(new_moments) - 1
205
+ placement_index = placement_cache.append(mapped_op)
206
+ curr_moments.extend([[] for _ in range(placement_index - len(curr_moments) + 1)])
207
+ curr_moments[placement_index].append(mapped_op)
208
+ new_moments.extend(curr_moments)
230
209
 
231
210
  return _create_target_circuit_type([circuits.Moment(moment) for moment in new_moments], circuit)
232
211
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cirq-core
3
- Version: 1.5.0.dev20250122193351
3
+ Version: 1.5.0.dev20250123022814
4
4
  Summary: A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits.
5
5
  Home-page: http://github.com/quantumlib/cirq
6
6
  Author: The Cirq Developers
@@ -4,8 +4,8 @@ cirq/_compat_test.py,sha256=Qq3ZcfgD-Nb81cEppQdJqhAyrVqXKtfXZYGXT0p-Wh0,34718
4
4
  cirq/_doc.py,sha256=yDyWUD_2JDS0gShfGRb-rdqRt9-WeL7DhkqX7np0Nko,2879
5
5
  cirq/_import.py,sha256=p9gMHJscbtDDkfHOaulvd3Aer0pwUF5AXpL89XR8dNw,8402
6
6
  cirq/_import_test.py,sha256=6K_v0riZJXOXUphHNkGA8MY-JcmGlezFaGmvrNhm3OQ,1015
7
- cirq/_version.py,sha256=WFhJmgYICxtpdKSoM9Ddzu3ntb_okVm0AooNMz81zBE,1206
8
- cirq/_version_test.py,sha256=h5jubeUTqzv-sokoqfTg1Fz-9jU9O4F8vV9KQ88ThCs,147
7
+ cirq/_version.py,sha256=MiLgjEo202Qv-ygfNGqCcnJpmTcjZ4eQLLB5agkLPEc,1206
8
+ cirq/_version_test.py,sha256=g6UUmNCvxGNzi-tf6ybG2bVSS1Q_F47Od5ycp5zbPkA,147
9
9
  cirq/conftest.py,sha256=X7yLFL8GLhg2CjPw0hp5e_dGASfvHx1-QT03aUbhKJw,1168
10
10
  cirq/json_resolver_cache.py,sha256=p-vEOa-8GQ2cFIAdze-kd6C1un1uRvtujVPljVKaHBg,13557
11
11
  cirq/py.typed,sha256=VFSlmh_lNwnaXzwY-ZuW-C2Ws5PkuDoVgBdNCs0jXJE,63
@@ -16,10 +16,10 @@ cirq/circuits/_box_drawing_character_data.py,sha256=QLoCXwcLL7091RdxEKO259goxt4R
16
16
  cirq/circuits/_box_drawing_character_data_test.py,sha256=XO94z0piwZRHaNZHTf-5tKHQ4MKcDruMeRIKdT8GbYA,1624
17
17
  cirq/circuits/_bucket_priority_queue.py,sha256=hxFuii2fKD8G6EKT_aVLEsA7FmSfqFXPwIbA0KsoSC4,6745
18
18
  cirq/circuits/_bucket_priority_queue_test.py,sha256=t6u_hG7K2e2WKWrgCsKxNRtp4ghKwiCrp0_WSY0W25k,5288
19
- cirq/circuits/circuit.py,sha256=mSchbaJudEfwqpLj6x0He54d8GhyiE7nqA2RTx8Zw6c,115851
19
+ cirq/circuits/circuit.py,sha256=nbWC95tzQlm69JmvFJdJMwzDOia_s0pah8tH4i9u1Ug,118173
20
20
  cirq/circuits/circuit_operation.py,sha256=MaQ6fPt1HctEE31fVaUDtl9MqOmoTyt3m2HYeGCdIaM,35440
21
21
  cirq/circuits/circuit_operation_test.py,sha256=7ezTwTY2RaAchjfXOJythVrxs6Rom317gC0AUBe0GVM,45259
22
- cirq/circuits/circuit_test.py,sha256=1YMXK7wHcct-HK7MKH8lE63pQQ80-jCghVAsG0DsXpU,160524
22
+ cirq/circuits/circuit_test.py,sha256=BZjwavIekWR2hgG1yV0Acgt7-Q05cOjugozrLgYdx7k,161268
23
23
  cirq/circuits/frozen_circuit.py,sha256=qSbLHqIszCbVipNZQy4N829v_mWf8N2926cYRzpxGqE,9243
24
24
  cirq/circuits/frozen_circuit_test.py,sha256=rHyii8hLhOQ6jdA8dC1OcYPGnyeBC4uY5Q53XspkkCk,4133
25
25
  cirq/circuits/insert_strategy.py,sha256=L0OLXuo24TtBfdJGOAG2PsVDMrbvQl4iN5lUk6IPuyo,2851
@@ -40,7 +40,7 @@ cirq/contrib/acquaintance/bipartite.py,sha256=iEElNihoQ0m1pt5f0bPOIubPnRqqbPJSEh
40
40
  cirq/contrib/acquaintance/bipartite_test.py,sha256=hjdJfjDsd2pnUdpph5n9kTWEclSvocsAEmnTbBT21Ak,15648
41
41
  cirq/contrib/acquaintance/devices.py,sha256=1hWW9_WF5TZQXFMu9-yXNTk3GfSETyjikNboPQvPYWk,3031
42
42
  cirq/contrib/acquaintance/devices_test.py,sha256=icl_9SOp8PuZu7msfW5H7zP7_-zfTwTjyPPkajDu-w4,1088
43
- cirq/contrib/acquaintance/executor.py,sha256=cdj8U9Wiv8HAupU_hezEaMbeFSq1nMgqPfWrk-8XsrI,8609
43
+ cirq/contrib/acquaintance/executor.py,sha256=ZGPWcEVYAdkqA9rvECsp7WFgxYC_wAvfE6HKNqzT7AM,8681
44
44
  cirq/contrib/acquaintance/executor_test.py,sha256=ir-LKuQTfHm5WCcjmLriJ8qCT89YnltLpFx89Q3bF_I,7837
45
45
  cirq/contrib/acquaintance/gates.py,sha256=YSsxvvyXQQOsEOr9lKdy0s00w6EAN7mWbu3Y0zjHEU8,13545
46
46
  cirq/contrib/acquaintance/gates_test.py,sha256=5FVX7zAtZSUqDPNsXk_Wm7LwDmHIApzgNhjAIX1IQBM,15010
@@ -321,7 +321,7 @@ cirq/ops/mixed_unitary_channel.py,sha256=k3O4ovH3bFs1WnAZc647IgCK8thC5JnTGxsCzjB
321
321
  cirq/ops/mixed_unitary_channel_test.py,sha256=x8LIAea2KcutNupnRJ_cLy1kmxhbUh3K3BkZtg3OkKQ,5058
322
322
  cirq/ops/named_qubit.py,sha256=niAsH7m32n3lEVIcy1nnVDPkPqk6PY2qlriz7mzgZmk,10006
323
323
  cirq/ops/named_qubit_test.py,sha256=mtJVRe4JzFSNckMQJSGCj1P0VBtpGh--6YxKbIEE3TQ,5221
324
- cirq/ops/op_tree.py,sha256=iXsIFcQCciU7C9SiPxhd_zrp4TBGCsmnqxKDjUl1aEo,6159
324
+ cirq/ops/op_tree.py,sha256=7hcyqhuK41Rg3vDPvRPkCn6G6a_shvmxEQvnYiQfbDw,5277
325
325
  cirq/ops/op_tree_test.py,sha256=h4phqrxQwYAfyu8o4f_fLi3WP2kdVuzWqrSCWGLHo_c,5575
326
326
  cirq/ops/parallel_gate.py,sha256=duCtDht-HRlYM3V7JmFnB_l2rx5PRqAwyRMjug9kvnM,6318
327
327
  cirq/ops/parallel_gate_test.py,sha256=M6o3AyXFQrwyiOTtGxlYH09TbHdjtTxCuMjmn-ALnn0,6298
@@ -1075,7 +1075,7 @@ cirq/transformers/synchronize_terminal_measurements.py,sha256=p061MYYglY6HhWYYkF
1075
1075
  cirq/transformers/synchronize_terminal_measurements_test.py,sha256=VTiw5S3s_Y31qR7ME8Mzv50LdJ_6M3DOtgwvtziQzPI,7742
1076
1076
  cirq/transformers/transformer_api.py,sha256=f95sfOr-KYXLt4yxAaFXoG0-oEc8IKApzG4pyXsm3YY,16956
1077
1077
  cirq/transformers/transformer_api_test.py,sha256=f-Vup0VCUvTqJKm5kWHf6xet7sFTerLMGYzJHy8Rc5s,13045
1078
- cirq/transformers/transformer_primitives.py,sha256=ZiQjYLfksI8ZxqvTvhUN0R9X1WvKEYwAo6NymoKGvzw,37658
1078
+ cirq/transformers/transformer_primitives.py,sha256=LbGM_d5xqa1BR-juA08r4FkeWK9JqSU9yISeu4u6WkI,36661
1079
1079
  cirq/transformers/transformer_primitives_test.py,sha256=5N23aI-DGRBj2T6Xd7VUiLBXWU6pgNsvmjZXJ3wwous,41725
1080
1080
  cirq/transformers/analytical_decompositions/__init__.py,sha256=hMsoQSQtSvEn5mNohSvGPjsmf58VN4jzmIFnchVhZi8,3760
1081
1081
  cirq/transformers/analytical_decompositions/clifford_decomposition.py,sha256=DsuuP91pm2dX0CO4rWwmJAJyAfuXMcA1UJK0g8krp7k,6726
@@ -1086,7 +1086,7 @@ cirq/transformers/analytical_decompositions/cphase_to_fsim.py,sha256=RDg0wzYa_YX
1086
1086
  cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py,sha256=bwZa0BDclAd1sX3bD-GdNF2MO5DtH7mw2YLppEK0LG0,5568
1087
1087
  cirq/transformers/analytical_decompositions/pauli_string_decomposition.py,sha256=bU9IoY0igVZTmF_wsTdTxAfqPKWyqZ14Gt2AJoK5D_4,4524
1088
1088
  cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py,sha256=qpFODpCJrE9piYLWR1FzweTn3v80EvLCV-PP2fbHcoE,2112
1089
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py,sha256=beW4G_yE2lGNQEGbItwEa_w7lx0ECmGFZ7bCvMfk3bg,11768
1089
+ cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py,sha256=ZN6qKTdGs-ZLM8uIYhs3iGBQSAkj6_CjqFNiI_EZwBI,11785
1090
1090
  cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py,sha256=E7NM5NzNUVwlTcgzDs18tmnybA4DUVvGl9y6_Geikss,7685
1091
1091
  cirq/transformers/analytical_decompositions/single_qubit_decompositions.py,sha256=iAPdMwHKM1B3mJtQWH-iNjR-VkzhkUDFC23f8kjXY6M,8436
1092
1092
  cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py,sha256=4GfU6wctBoG-OVFqFOE08xymd5dXzY-doE8ZNpsKohI,12308
@@ -1202,8 +1202,8 @@ cirq/work/sampler.py,sha256=bE5tmVkcR6cZZMLETxDfHehdsYUMbx2RvBeIBetehI4,19187
1202
1202
  cirq/work/sampler_test.py,sha256=hL2UWx3dz2ukZVNxWftiKVvJcQoLplLZdQm-k1QcA40,13282
1203
1203
  cirq/work/zeros_sampler.py,sha256=x1C7cup66a43n-3tm8QjhiqJa07qcJW10FxNp9jJ59Q,2356
1204
1204
  cirq/work/zeros_sampler_test.py,sha256=JIkpBBFPJe5Ba4142vzogyWyboG1Q1ZAm0UVGgOoZn8,3279
1205
- cirq_core-1.5.0.dev20250122193351.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1206
- cirq_core-1.5.0.dev20250122193351.dist-info/METADATA,sha256=CgeMBbwsI8eAcEZR-fru-N4jHXdUTXfxB9qoPBt4yJM,2105
1207
- cirq_core-1.5.0.dev20250122193351.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
1208
- cirq_core-1.5.0.dev20250122193351.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1209
- cirq_core-1.5.0.dev20250122193351.dist-info/RECORD,,
1205
+ cirq_core-1.5.0.dev20250123022814.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1206
+ cirq_core-1.5.0.dev20250123022814.dist-info/METADATA,sha256=l3DTeYXoz7dLV4htqmUW3xdKr0kGjVt8VtvEEHHXBas,2105
1207
+ cirq_core-1.5.0.dev20250123022814.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
1208
+ cirq_core-1.5.0.dev20250123022814.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1209
+ cirq_core-1.5.0.dev20250123022814.dist-info/RECORD,,