cirq-core 1.5.0.dev20250317215005__py3-none-any.whl → 1.5.0.dev20250318031515__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.dev20250317215005"
31
+ __version__ = "1.5.0.dev20250318031515"
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.dev20250317215005"
6
+ assert cirq.__version__ == "1.5.0.dev20250318031515"
cirq/circuits/moment.py CHANGED
@@ -49,7 +49,7 @@ if TYPE_CHECKING:
49
49
  import cirq
50
50
 
51
51
  # Lazy imports to break circular dependencies.
52
- circuits = LazyLoader("circuits", globals(), "cirq.circuits.circuit")
52
+ circuit = LazyLoader("circuit", globals(), "cirq.circuits.circuit")
53
53
  op_tree = LazyLoader("op_tree", globals(), "cirq.ops.op_tree")
54
54
  text_diagram_drawer = LazyLoader(
55
55
  "text_diagram_drawer", globals(), "cirq.circuits.text_diagram_drawer"
@@ -525,7 +525,7 @@ class Moment:
525
525
  return cls.from_ops(*operations)
526
526
 
527
527
  def __add__(self, other: 'cirq.OP_TREE') -> 'cirq.Moment':
528
- if isinstance(other, circuits.AbstractCircuit):
528
+ if isinstance(other, circuit.AbstractCircuit):
529
529
  return NotImplemented # Delegate to Circuit.__radd__.
530
530
  return self.with_operations(other)
531
531
 
@@ -659,37 +659,26 @@ class Moment:
659
659
  return diagram.render()
660
660
 
661
661
  def _commutes_(self, other: Any, *, atol: float = 1e-8) -> Union[bool, NotImplementedType]:
662
- """Determines whether Moment commutes with the Operation.
662
+ """Determines whether Moment commutes with the other Moment or Operation.
663
663
 
664
664
  Args:
665
- other: An Operation object. Other types are not implemented yet.
666
- In case a different type is specified, NotImplemented is
667
- returned.
665
+ other: An Operation or Moment object to test for commutativity.
668
666
  atol: Absolute error tolerance. If all entries in v1@v2 - v2@v1
669
667
  have a magnitude less than this tolerance, v1 and v2 can be
670
668
  reported as commuting. Defaults to 1e-8.
671
669
 
672
670
  Returns:
673
- True: The Moment and Operation commute OR they don't have shared
674
- quibits.
671
+ True: The Moment commutes with Moment or Operation OR they don't
672
+ have shared qubits.
675
673
  False: The two values do not commute.
676
674
  NotImplemented: In case we don't know how to check this, e.g.
677
- the parameter type is not supported yet.
675
+ the parameter type is not supported or commutativity cannot be
676
+ determined.
678
677
  """
679
- if not isinstance(other, ops.Operation):
678
+ if not isinstance(other, (ops.Operation, Moment)):
680
679
  return NotImplemented
681
-
682
- other_qubits = set(other.qubits)
683
- for op in self.operations:
684
- if not other_qubits.intersection(set(op.qubits)):
685
- continue
686
-
687
- commutes = protocols.commutes(op, other, atol=atol, default=NotImplemented)
688
-
689
- if not commutes or commutes is NotImplemented:
690
- return commutes
691
-
692
- return True
680
+ other_operations = other.operations if isinstance(other, Moment) else (other,)
681
+ return raw_types._operations_commutes_impl(self.operations, other_operations, atol=atol)
693
682
 
694
683
 
695
684
  class _SortByValFallbackToType:
@@ -680,7 +680,7 @@ def test_text_diagram_does_not_depend_on_insertion_order():
680
680
  assert str(m1) == str(m2)
681
681
 
682
682
 
683
- def test_commutes():
683
+ def test_commutes_moment_and_operation():
684
684
  a = cirq.NamedQubit('a')
685
685
  b = cirq.NamedQubit('b')
686
686
  c = cirq.NamedQubit('c')
@@ -688,7 +688,7 @@ def test_commutes():
688
688
 
689
689
  moment = cirq.Moment([cirq.X(a), cirq.Y(b), cirq.H(c)])
690
690
 
691
- assert NotImplemented == cirq.commutes(moment, a, default=NotImplemented)
691
+ assert cirq.commutes(moment, a, default=None) is None
692
692
 
693
693
  assert cirq.commutes(moment, cirq.X(a))
694
694
  assert cirq.commutes(moment, cirq.Y(b))
@@ -700,6 +700,101 @@ def test_commutes():
700
700
  assert not cirq.commutes(moment, cirq.H(b))
701
701
  assert not cirq.commutes(moment, cirq.X(c))
702
702
 
703
+ # Empty moment commutes with everything
704
+ moment = cirq.Moment()
705
+ assert cirq.commutes(moment, cirq.X(a))
706
+ assert cirq.commutes(moment, cirq.measure(b))
707
+
708
+ # Two qubit operation
709
+ moment = cirq.Moment(cirq.Z(a), cirq.Z(b))
710
+ assert cirq.commutes(moment, cirq.XX(a, b))
711
+
712
+
713
+ def test_commutes_moment_and_moment():
714
+ a = cirq.NamedQubit('a')
715
+ b = cirq.NamedQubit('b')
716
+ c = cirq.NamedQubit('c')
717
+
718
+ # Test cases where individual operations don't commute but moments do
719
+ # Two Z gates (Z⊗Z) commutes with RXX even though individual Z's don't
720
+ assert not cirq.commutes(cirq.Moment(cirq.Z(a)), cirq.Moment(cirq.XX(a, b)))
721
+ assert cirq.commutes(cirq.Moment(cirq.Z(a), cirq.Z(b)), cirq.Moment(cirq.XX(a, b)))
722
+
723
+ # Moments that do not commute if acting on same qubits
724
+ assert cirq.commutes(cirq.Moment(cirq.X(a)), cirq.Moment(cirq.Y(b)))
725
+ assert not cirq.commutes(cirq.Moment(cirq.X(a)), cirq.Moment(cirq.Y(a)))
726
+
727
+ # Moments commute with themselves
728
+ assert cirq.commutes(
729
+ cirq.Moment([cirq.X(a), cirq.Y(b), cirq.H(c)]),
730
+ cirq.Moment([cirq.X(a), cirq.Y(b), cirq.H(c)]),
731
+ )
732
+
733
+
734
+ def test_commutes_moment_with_controls():
735
+ a, b = cirq.LineQubit.range(2)
736
+ assert cirq.commutes(
737
+ cirq.Moment(cirq.measure(a, key='k0')), cirq.Moment(cirq.X(b).with_classical_controls('k1'))
738
+ )
739
+ assert cirq.commutes(
740
+ cirq.Moment(cirq.X(b).with_classical_controls('k1')), cirq.Moment(cirq.measure(a, key='k0'))
741
+ )
742
+ assert cirq.commutes(
743
+ cirq.Moment(cirq.X(a).with_classical_controls('k0')),
744
+ cirq.Moment(cirq.H(b).with_classical_controls('k0')),
745
+ )
746
+ assert cirq.commutes(
747
+ cirq.Moment(cirq.X(a).with_classical_controls('k0')),
748
+ cirq.Moment(cirq.X(a).with_classical_controls('k0')),
749
+ )
750
+ assert not cirq.commutes(
751
+ cirq.Moment(cirq.measure(a, key='k0')), cirq.Moment(cirq.X(b).with_classical_controls('k0'))
752
+ )
753
+ assert not cirq.commutes(
754
+ cirq.Moment(cirq.X(b).with_classical_controls('k0')), cirq.Moment(cirq.measure(a, key='k0'))
755
+ )
756
+ assert not cirq.commutes(
757
+ cirq.Moment(cirq.X(a).with_classical_controls('k0')),
758
+ cirq.Moment(cirq.H(a).with_classical_controls('k0')),
759
+ )
760
+
761
+
762
+ def test_commutes_moment_and_moment_comprehensive():
763
+ a, b, c, d = cirq.LineQubit.range(4)
764
+
765
+ # Basic Z⊗Z commuting with XX at different angles
766
+ m1 = cirq.Moment([cirq.Z(a), cirq.Z(b)])
767
+ m2 = cirq.Moment([cirq.XXPowGate(exponent=0.5)(a, b)])
768
+ assert cirq.commutes(m1, m2)
769
+
770
+ # Disjoint qubit sets
771
+ m1 = cirq.Moment([cirq.X(a), cirq.Y(b)])
772
+ m2 = cirq.Moment([cirq.Z(c), cirq.H(d)])
773
+ assert cirq.commutes(m1, m2)
774
+
775
+ # Mixed case - some commute individually, some as group
776
+ m1 = cirq.Moment([cirq.Z(a), cirq.Z(b), cirq.X(c)])
777
+ m2 = cirq.Moment([cirq.XXPowGate(exponent=0.5)(a, b), cirq.X(c)])
778
+ assert cirq.commutes(m1, m2)
779
+
780
+ # Non-commuting case: X on first qubit, Z on second with XX gate
781
+ m1 = cirq.Moment([cirq.X(a), cirq.Z(b)])
782
+ m2 = cirq.Moment([cirq.XX(a, b)])
783
+ assert not cirq.commutes(m1, m2)
784
+
785
+ # Complex case requiring unitary calculation - non-commuting case
786
+ m1 = cirq.Moment([cirq.Z(a), cirq.Z(b), cirq.Z(c)])
787
+ m2 = cirq.Moment([cirq.XXPowGate(exponent=0.5)(a, b), cirq.X(c)])
788
+ assert not cirq.commutes(m1, m2) # Z⊗Z⊗Z doesn't commute with XX⊗X
789
+
790
+
791
+ def test_commutes_handles_non_unitary_operation():
792
+ a = cirq.NamedQubit('a')
793
+ op_damp_a = cirq.AmplitudeDampingChannel(gamma=0.1).on(a)
794
+ assert cirq.commutes(cirq.Moment(cirq.X(a)), op_damp_a, default=None) is None
795
+ assert cirq.commutes(cirq.Moment(cirq.X(a)), cirq.Moment(op_damp_a), default=None) is None
796
+ assert cirq.commutes(cirq.Moment(op_damp_a), cirq.Moment(op_damp_a))
797
+
703
798
 
704
799
  def test_transform_qubits():
705
800
  a, b = cirq.LineQubit.range(2)
cirq/ops/raw_types.py CHANGED
@@ -688,41 +688,7 @@ class Operation(metaclass=abc.ABCMeta):
688
688
  """Determine if this Operation commutes with the object"""
689
689
  if not isinstance(other, Operation):
690
690
  return NotImplemented
691
-
692
- self_keys = protocols.measurement_key_objs(self)
693
- other_keys = protocols.measurement_key_objs(other)
694
- if (
695
- not self_keys.isdisjoint(other_keys)
696
- or not protocols.control_keys(self).isdisjoint(other_keys)
697
- or not protocols.control_keys(other).isdisjoint(self_keys)
698
- ):
699
- return False
700
-
701
- if hasattr(other, 'qubits') and set(self.qubits).isdisjoint(other.qubits):
702
- return True
703
-
704
- from cirq import circuits
705
-
706
- # Remove the classical controls to validate the quantum commutativity. This can be done
707
- # because during execution, the two operations will either both be run, in which case they
708
- # behave like the suboperations, so if the suboperations commute then these commute. Or
709
- # one of them is cold in which case it behaves like the identity, which always commutes.
710
- self_raw = self.without_classical_controls()
711
- other_raw = other.without_classical_controls()
712
- circuit12 = circuits.Circuit(self_raw, other_raw)
713
- circuit21 = circuits.Circuit(other_raw, self_raw)
714
-
715
- # Don't create gigantic matrices.
716
- shape = protocols.qid_shape_protocol.qid_shape(circuit12)
717
- if np.prod(shape, dtype=np.int64) > 2**10:
718
- return NotImplemented # pragma: no cover
719
-
720
- m12 = protocols.unitary_protocol.unitary(circuit12, default=None)
721
- m21 = protocols.unitary_protocol.unitary(circuit21, default=None)
722
- if m12 is None or m21 is None:
723
- return NotImplemented
724
-
725
- return np.allclose(m12, m21, atol=atol)
691
+ return _operations_commutes_impl([self], [other], atol=atol)
726
692
 
727
693
  @property
728
694
  def classical_controls(self) -> FrozenSet['cirq.Condition']:
@@ -1112,3 +1078,78 @@ def _validate_qid_shape(val: Any, qubits: Sequence['cirq.Qid']) -> None:
1112
1078
  raise ValueError(
1113
1079
  f'Duplicate qids for <{val!r}>. Expected unique qids but got <{qubits!r}>.'
1114
1080
  )
1081
+
1082
+
1083
+ def _operations_commutes_impl(
1084
+ ops1: Collection[Operation], ops2: Collection[Operation], *, atol: float
1085
+ ) -> Union[bool, NotImplementedType]:
1086
+ """Determine if two collections of non-overlapping Operations commute.
1087
+
1088
+ This function implements the commutes protocol for the Operation and Moment classes
1089
+ and is not intended for other use.
1090
+
1091
+ Args:
1092
+ ops1: The first collection of operations. It is assumed each operation
1093
+ acts on different qubits, i.e., the operations can form a Moment.
1094
+ ops2: The second collection of operations to be checked for commutation
1095
+ with `ops1`. It is assumed each operation acts on different qubits,
1096
+ i.e., the operations can form a Moment.
1097
+ atol: Absolute error tolerance. If all entries in ops1@ops2 - ops2@ops1
1098
+ have a magnitude less than this tolerance, ops1 and ops2 are considered
1099
+ to commute.
1100
+
1101
+ Returns:
1102
+ True: `ops1` and `ops2` commute (or approximately commute).
1103
+ False: `ops1` and `ops2` do not commute.
1104
+ NotImplemented: The commutativity cannot be determined here.
1105
+ """
1106
+ ops1_keys = frozenset(k for op in ops1 for k in protocols.measurement_key_objs(op))
1107
+ ops2_keys = frozenset(k for op in ops2 for k in protocols.measurement_key_objs(op))
1108
+ ops1_control_keys = frozenset(k for op in ops1 for k in protocols.control_keys(op))
1109
+ ops2_control_keys = frozenset(k for op in ops2 for k in protocols.control_keys(op))
1110
+ if (
1111
+ not ops1_keys.isdisjoint(ops2_keys)
1112
+ or not ops1_control_keys.isdisjoint(ops2_keys)
1113
+ or not ops2_control_keys.isdisjoint(ops1_keys)
1114
+ ):
1115
+ return False
1116
+
1117
+ ops1_qubits = frozenset().union(*(op.qubits for op in ops1))
1118
+ ops2_qubits = frozenset().union(*(op.qubits for op in ops2))
1119
+ if ops1_qubits.isdisjoint(ops2_qubits):
1120
+ return True
1121
+
1122
+ from cirq import circuits
1123
+
1124
+ # Remove the classical controls to validate the quantum commutativity. This can be done
1125
+ # because during execution, the two operations will either both be run, in which case they
1126
+ # behave like the suboperations, so if the suboperations commute then these commute. Or
1127
+ # one of them is cold in which case it behaves like the identity, which always commutes.
1128
+ shared_qubits = ops1_qubits.intersection(ops2_qubits)
1129
+ ops1_raw = [
1130
+ op.without_classical_controls() for op in ops1 if not shared_qubits.isdisjoint(op.qubits)
1131
+ ]
1132
+ ops2_raw = [
1133
+ op.without_classical_controls() for op in ops2 if not shared_qubits.isdisjoint(op.qubits)
1134
+ ]
1135
+ moment1 = circuits.Moment(ops1_raw)
1136
+ moment2 = circuits.Moment(ops2_raw)
1137
+
1138
+ # shortcut if we have equal moments
1139
+ if moment1 == moment2:
1140
+ return True
1141
+
1142
+ circuit12 = circuits.Circuit(moment1, moment2)
1143
+ circuit21 = circuits.Circuit(moment2, moment1)
1144
+
1145
+ # Don't create gigantic matrices.
1146
+ shape = protocols.qid_shape_protocol.qid_shape(circuit12)
1147
+ if np.prod(shape, dtype=np.int64) > 2**10:
1148
+ return NotImplemented # pragma: no cover
1149
+
1150
+ m12 = protocols.unitary_protocol.unitary(circuit12, default=None)
1151
+ m21 = protocols.unitary_protocol.unitary(circuit21, default=None)
1152
+ if m12 is None or m21 is None:
1153
+ return NotImplemented
1154
+
1155
+ return np.allclose(m12, m21, atol=atol)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cirq-core
3
- Version: 1.5.0.dev20250317215005
3
+ Version: 1.5.0.dev20250318031515
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=tkbu8D3yiI9Pir-kgQJ7-TEVu3eXTGnlGkWICv9jO44,1206
8
- cirq/_version_test.py,sha256=9arpKQDlMNNIaGPtZOoX70FSoyo627zSLkcZ2MJ6enY,147
7
+ cirq/_version.py,sha256=1rDc_Ds5yDVJYk5-ThsuTbQEIRp3wO2VfuiPYOckCxU,1206
8
+ cirq/_version_test.py,sha256=oaX9pelu0JTLxk6lLoc9nf4q9MwE26XTKFka7yffd4I,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
@@ -24,8 +24,8 @@ cirq/circuits/frozen_circuit.py,sha256=qSbLHqIszCbVipNZQy4N829v_mWf8N2926cYRzpxG
24
24
  cirq/circuits/frozen_circuit_test.py,sha256=rHyii8hLhOQ6jdA8dC1OcYPGnyeBC4uY5Q53XspkkCk,4133
25
25
  cirq/circuits/insert_strategy.py,sha256=JU_KPe74P3OpbVQei5iDPgEpOjpts5JFKXU5Xy1QYHE,3211
26
26
  cirq/circuits/insert_strategy_test.py,sha256=LVtUECfTe59tYO2piuD1kCA6lhI7ioerF7tp2cQ3bnk,1136
27
- cirq/circuits/moment.py,sha256=Sv1Xxo1LIChH0Da2iHegbthOWd2Ibq0fsnj5ZrqqEkQ,26191
28
- cirq/circuits/moment_test.py,sha256=oNHNXhiPEoCKbzeh16tRwiW1qZWlg4X2O_uiVDP1D58,27375
27
+ cirq/circuits/moment.py,sha256=eFlncWc5o72RuvzwQBE-q40I2LGuhN-AELRE93Lc4U0,25997
28
+ cirq/circuits/moment_test.py,sha256=672QcwLSTuuJzXIISH9UyMIOX89aYZZD3odvhyzhxLo,31116
29
29
  cirq/circuits/optimization_pass.py,sha256=uw3ne0-ebZo6GNjwfQMuQ3b5u9RCgyaXRfhpbljlxao,6468
30
30
  cirq/circuits/optimization_pass_test.py,sha256=eQB0NBJ9EvqjgSFGQMgaHIh5niQhksdnvqSXhsj3nOg,5947
31
31
  cirq/circuits/qasm_output.py,sha256=fHbD2OeRzC0ZIvpN551JMaXDMTih7z9ZUIeCY6zQDQU,13090
@@ -360,7 +360,7 @@ cirq/ops/qubit_order_or_list.py,sha256=WVnhQcOYCgAhiB4t47Kji-pN1tnvs--X5deCQwwGV
360
360
  cirq/ops/qubit_order_test.py,sha256=B9xMIxlaI7YjRUNA6AkHJuUCFejGYw-lT7ZaSl31yTU,4238
361
361
  cirq/ops/random_gate_channel.py,sha256=gKDqZa6AwdCIuuh2UOvO5oxCdGRDOInA7fI3ZLQ-LTY,5121
362
362
  cirq/ops/random_gate_channel_test.py,sha256=U3EAaAlCZkgFIYxqwcSkPsaVGrKA2PSeG_DK2ou--AE,8606
363
- cirq/ops/raw_types.py,sha256=pBnjIMgnX5426rzC6KQuUSbI3VL1iLAjpFrsqSygjtY,42092
363
+ cirq/ops/raw_types.py,sha256=tKfLpWWbfJT9p9oqG2bJBBX-OuRzZYgGvbFlhYk3oxo,43854
364
364
  cirq/ops/raw_types_test.py,sha256=U2sAzc6DjpOmgHafGv94VJXqZHm7J898khmJoHAawHQ,33940
365
365
  cirq/ops/state_preparation_channel.py,sha256=PjVtoLbjBAy_XqnFAY40Am-NifeuCFVVLW6RJxph5sQ,4778
366
366
  cirq/ops/state_preparation_channel_test.py,sha256=yKUvLw_ft6cvIgRJcFQ779wZS-V6V-pzQq-rZRWdCmU,5922
@@ -1204,8 +1204,8 @@ cirq/work/sampler.py,sha256=bE5tmVkcR6cZZMLETxDfHehdsYUMbx2RvBeIBetehI4,19187
1204
1204
  cirq/work/sampler_test.py,sha256=hL2UWx3dz2ukZVNxWftiKVvJcQoLplLZdQm-k1QcA40,13282
1205
1205
  cirq/work/zeros_sampler.py,sha256=x1C7cup66a43n-3tm8QjhiqJa07qcJW10FxNp9jJ59Q,2356
1206
1206
  cirq/work/zeros_sampler_test.py,sha256=JIkpBBFPJe5Ba4142vzogyWyboG1Q1ZAm0UVGgOoZn8,3279
1207
- cirq_core-1.5.0.dev20250317215005.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1208
- cirq_core-1.5.0.dev20250317215005.dist-info/METADATA,sha256=xzp4QTAnzrsi2LZkdtS3P7U6Og3qcBP9RrWtQ9I8DTQ,4817
1209
- cirq_core-1.5.0.dev20250317215005.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
1210
- cirq_core-1.5.0.dev20250317215005.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1211
- cirq_core-1.5.0.dev20250317215005.dist-info/RECORD,,
1207
+ cirq_core-1.5.0.dev20250318031515.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1208
+ cirq_core-1.5.0.dev20250318031515.dist-info/METADATA,sha256=KEJD-shPtgKuKrVh-T1d_I_3lnC-HFnpKRerqnnseBo,4817
1209
+ cirq_core-1.5.0.dev20250318031515.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
1210
+ cirq_core-1.5.0.dev20250318031515.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1211
+ cirq_core-1.5.0.dev20250318031515.dist-info/RECORD,,