cirq-core 1.5.0.dev20250123021547__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.dev20250123021547"
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.dev20250123021547"
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
 
@@ -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.dev20250123021547
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=u_m_cD2d_HEazuNrgNctCw4iZELrg_GWcnlaOeAL_2U,1206
8
- cirq/_version_test.py,sha256=VDv1tmDBN8bYaxwNfmiKf7uPAbAP66EmrAPvGJVRtXY,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
@@ -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
@@ -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.dev20250123021547.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1206
- cirq_core-1.5.0.dev20250123021547.dist-info/METADATA,sha256=kMZkbns_CNygokLXred5EMsE3Xh9osu8fFnFNxuqxQE,2105
1207
- cirq_core-1.5.0.dev20250123021547.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
1208
- cirq_core-1.5.0.dev20250123021547.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1209
- cirq_core-1.5.0.dev20250123021547.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,,