cirq-core 1.6.0.dev20250721212657__py3-none-any.whl → 1.6.0.dev20250722040433__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, 11, 0): # pragma: no cover
28
28
  'of Cirq (e.g. "python -m pip install cirq==1.5.0")'
29
29
  )
30
30
 
31
- __version__ = "1.6.0.dev20250721212657"
31
+ __version__ = "1.6.0.dev20250722040433"
cirq/_version_test.py CHANGED
@@ -3,4 +3,4 @@ import cirq
3
3
 
4
4
 
5
5
  def test_version() -> None:
6
- assert cirq.__version__ == "1.6.0.dev20250721212657"
6
+ assert cirq.__version__ == "1.6.0.dev20250722040433"
cirq/contrib/json.py CHANGED
@@ -3,18 +3,42 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from cirq.protocols.json_serialization import DEFAULT_RESOLVERS, ObjectFactory
6
+ import functools
7
+
8
+ from cirq.protocols.json_serialization import _register_resolver, DEFAULT_RESOLVERS, ObjectFactory
7
9
 
8
10
 
9
11
  def contrib_class_resolver(cirq_type: str) -> ObjectFactory | None:
10
12
  """Extend cirq's JSON API with resolvers for cirq contrib classes."""
13
+ return _class_resolver_dictionary().get(cirq_type, None)
14
+
15
+
16
+ @functools.cache
17
+ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
11
18
  from cirq.contrib.acquaintance import SwapPermutationGate
12
19
  from cirq.contrib.bayesian_network import BayesianNetworkGate
20
+ from cirq.contrib.noise_models import (
21
+ DampedReadoutNoiseModel,
22
+ DepolarizingNoiseModel,
23
+ DepolarizingWithDampedReadoutNoiseModel,
24
+ DepolarizingWithReadoutNoiseModel,
25
+ ReadoutNoiseModel,
26
+ )
13
27
  from cirq.contrib.quantum_volume import QuantumVolumeResult
14
28
 
15
- classes = [BayesianNetworkGate, QuantumVolumeResult, SwapPermutationGate]
16
- d = {cls.__name__: cls for cls in classes}
17
- return d.get(cirq_type, None)
29
+ classes = [
30
+ BayesianNetworkGate,
31
+ QuantumVolumeResult,
32
+ SwapPermutationGate,
33
+ DepolarizingNoiseModel,
34
+ ReadoutNoiseModel,
35
+ DampedReadoutNoiseModel,
36
+ DepolarizingWithReadoutNoiseModel,
37
+ DepolarizingWithDampedReadoutNoiseModel,
38
+ ]
39
+ return {cls.__name__: cls for cls in classes}
18
40
 
19
41
 
20
42
  DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver] + DEFAULT_RESOLVERS
43
+
44
+ _register_resolver(_class_resolver_dictionary)
@@ -0,0 +1,17 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Test data for JSON serialization of :mod:`cirq.contrib` objects."""
16
+
17
+ from cirq.contrib.json_test_data.spec import TestSpec as TestSpec
@@ -0,0 +1,32 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ import pathlib
17
+
18
+ import cirq
19
+ from cirq.contrib.json import _class_resolver_dictionary
20
+ from cirq.testing.json import ModuleJsonTestSpec
21
+
22
+ TestSpec = ModuleJsonTestSpec(
23
+ name="cirq.contrib",
24
+ packages=[cirq.contrib],
25
+ test_data_path=pathlib.Path(__file__).parent,
26
+ not_yet_serializable=[],
27
+ should_not_be_serialized=["Unique", "CircuitDag"],
28
+ resolver_cache=_class_resolver_dictionary(),
29
+ deprecated={},
30
+ # TODO: #7520 - create .json and .repr for these so they can be tested here
31
+ tested_elsewhere=["QuantumVolumeResult", "SwapPermutationGate", "BayesianNetworkGate"],
32
+ )
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
23
23
  import cirq
24
24
 
25
25
 
26
+ @value.value_equality()
26
27
  class DepolarizingNoiseModel(devices.NoiseModel):
27
28
  """Applies depolarizing noise to each qubit individually at the end of
28
29
  every moment.
@@ -39,9 +40,24 @@ class DepolarizingNoiseModel(devices.NoiseModel):
39
40
  prepend: If True, put noise before affected gates. Default: False.
40
41
  """
41
42
  value.validate_probability(depol_prob, 'depol prob')
43
+ self._depol_prob = depol_prob
42
44
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
43
45
  self._prepend = prepend
44
46
 
47
+ @property
48
+ def depol_prob(self):
49
+ """The depolarizing probability."""
50
+ return self._depol_prob
51
+
52
+ def _value_equality_values_(self):
53
+ return self.depol_prob, self._prepend
54
+
55
+ def __repr__(self) -> str:
56
+ return (
57
+ f'cirq.contrib.noise_models.DepolarizingNoiseModel('
58
+ f'{self.depol_prob!r}, prepend={self._prepend!r})'
59
+ )
60
+
45
61
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
46
62
  if validate_all_measurements(moment) or self.is_virtual_moment(moment): # pragma: no cover
47
63
  return moment
@@ -54,7 +70,11 @@ class DepolarizingNoiseModel(devices.NoiseModel):
54
70
  ]
55
71
  return output[::-1] if self._prepend else output
56
72
 
73
+ def _json_dict_(self) -> dict[str, object]:
74
+ return {'depol_prob': self.depol_prob, 'prepend': self._prepend}
57
75
 
76
+
77
+ @value.value_equality()
58
78
  class ReadoutNoiseModel(devices.NoiseModel):
59
79
  """NoiseModel with probabilistic bit flips preceding measurement.
60
80
 
@@ -75,9 +95,22 @@ class ReadoutNoiseModel(devices.NoiseModel):
75
95
  prepend: If True, put noise before affected gates. Default: True.
76
96
  """
77
97
  value.validate_probability(bitflip_prob, 'bitflip prob')
98
+ self._bitflip_prob = bitflip_prob
78
99
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
79
100
  self._prepend = prepend
80
101
 
102
+ @property
103
+ def bitflip_prob(self):
104
+ """The probability of a bit-flip during measurement."""
105
+ return self._bitflip_prob
106
+
107
+ def _value_equality_values_(self):
108
+ return self.bitflip_prob, self._prepend
109
+
110
+ def __repr__(self) -> str:
111
+ p = self.bitflip_prob
112
+ return f'cirq.contrib.noise_models.ReadoutNoiseModel({p!r}, prepend={self._prepend!r})'
113
+
81
114
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
82
115
  if self.is_virtual_moment(moment):
83
116
  return moment
@@ -91,7 +124,11 @@ class ReadoutNoiseModel(devices.NoiseModel):
91
124
  return output if self._prepend else output[::-1]
92
125
  return moment
93
126
 
127
+ def _json_dict_(self) -> dict[str, object]:
128
+ return {'bitflip_prob': self.bitflip_prob, 'prepend': self._prepend}
129
+
94
130
 
131
+ @value.value_equality()
95
132
  class DampedReadoutNoiseModel(devices.NoiseModel):
96
133
  """NoiseModel with T1 decay preceding measurement.
97
134
 
@@ -112,9 +149,24 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
112
149
  prepend: If True, put noise before affected gates. Default: True.
113
150
  """
114
151
  value.validate_probability(decay_prob, 'decay_prob')
152
+ self._decay_prob = decay_prob
115
153
  self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
116
154
  self._prepend = prepend
117
155
 
156
+ @property
157
+ def decay_prob(self):
158
+ """The probability of T1 decay during measurement."""
159
+ return self._decay_prob
160
+
161
+ def _value_equality_values_(self):
162
+ return self.decay_prob, self._prepend
163
+
164
+ def __repr__(self) -> str:
165
+ return (
166
+ f'cirq.contrib.noise_models.DampedReadoutNoiseModel('
167
+ f'{self.decay_prob!r}, prepend={self._prepend!r})'
168
+ )
169
+
118
170
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
119
171
  if self.is_virtual_moment(moment):
120
172
  return moment
@@ -128,7 +180,11 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
128
180
  return output if self._prepend else output[::-1]
129
181
  return moment
130
182
 
183
+ def _json_dict_(self) -> dict[str, object]:
184
+ return {'decay_prob': self.decay_prob, 'prepend': self._prepend}
185
+
131
186
 
187
+ @value.value_equality()
132
188
  class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
133
189
  """DepolarizingNoiseModel with probabilistic bit flips preceding
134
190
  measurement.
@@ -145,15 +201,39 @@ class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
145
201
  """
146
202
  value.validate_probability(depol_prob, 'depol prob')
147
203
  value.validate_probability(bitflip_prob, 'bitflip prob')
204
+ self._depol_prob = depol_prob
205
+ self._bitflip_prob = bitflip_prob
148
206
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
149
207
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
150
208
 
209
+ @property
210
+ def depol_prob(self):
211
+ """The depolarizing probability."""
212
+ return self._depol_prob
213
+
214
+ @property
215
+ def bitflip_prob(self):
216
+ """The probability of a bit-flip during measurement."""
217
+ return self._bitflip_prob
218
+
219
+ def _value_equality_values_(self):
220
+ return self.depol_prob, self.bitflip_prob
221
+
222
+ def __repr__(self) -> str:
223
+ p = self.depol_prob
224
+ b = self.bitflip_prob
225
+ return f'cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel({p!r}, {b!r})'
226
+
151
227
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
152
228
  if validate_all_measurements(moment):
153
229
  return [circuits.Moment(self.readout_noise_gate(q) for q in system_qubits), moment]
154
230
  return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
155
231
 
232
+ def _json_dict_(self) -> dict[str, object]:
233
+ return {'depol_prob': self.depol_prob, 'bitflip_prob': self.bitflip_prob}
234
+
156
235
 
236
+ @value.value_equality()
157
237
  class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
158
238
  """DepolarizingWithReadoutNoiseModel with T1 decay preceding
159
239
  measurement.
@@ -174,10 +254,37 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
174
254
  value.validate_probability(depol_prob, 'depol prob')
175
255
  value.validate_probability(bitflip_prob, 'bitflip prob')
176
256
  value.validate_probability(decay_prob, 'decay_prob')
257
+ self._depol_prob = depol_prob
258
+ self._bitflip_prob = bitflip_prob
259
+ self._decay_prob = decay_prob
177
260
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
178
261
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
179
262
  self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
180
263
 
264
+ @property
265
+ def depol_prob(self):
266
+ """The depolarizing probability."""
267
+ return self._depol_prob
268
+
269
+ @property
270
+ def bitflip_prob(self):
271
+ """Probability of a bit-flip during measurement."""
272
+ return self._bitflip_prob
273
+
274
+ @property
275
+ def decay_prob(self):
276
+ """The probability of T1 decay during measurement."""
277
+ return self._decay_prob
278
+
279
+ def _value_equality_values_(self):
280
+ return self.depol_prob, self.bitflip_prob, self.decay_prob
281
+
282
+ def __repr__(self) -> str:
283
+ return (
284
+ 'cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel('
285
+ f'{self.depol_prob!r}, {self.bitflip_prob!r}, {self.decay_prob!r})'
286
+ )
287
+
181
288
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
182
289
  if validate_all_measurements(moment):
183
290
  return [
@@ -187,3 +294,10 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
187
294
  ]
188
295
  else:
189
296
  return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
297
+
298
+ def _json_dict_(self) -> dict[str, object]:
299
+ return {
300
+ 'depol_prob': self.depol_prob,
301
+ 'bitflip_prob': self.bitflip_prob,
302
+ 'decay_prob': self.decay_prob,
303
+ }
@@ -14,10 +14,12 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ import pytest
18
+
17
19
  import cirq
18
20
  import cirq.contrib.noise_models as ccn
19
21
  from cirq import ops
20
- from cirq.testing import assert_equivalent_op_tree
22
+ from cirq.testing import assert_equivalent_op_tree, assert_equivalent_repr
21
23
 
22
24
 
23
25
  def test_depol_noise() -> None:
@@ -96,6 +98,26 @@ def test_readout_noise_after_moment() -> None:
96
98
  assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
97
99
 
98
100
 
101
+ @pytest.mark.parametrize(
102
+ 'model',
103
+ [
104
+ ccn.DepolarizingNoiseModel(0.1),
105
+ ccn.DepolarizingNoiseModel(0.1, prepend=False),
106
+ ccn.DepolarizingNoiseModel(0.1, prepend=True),
107
+ ccn.ReadoutNoiseModel(0.2),
108
+ ccn.ReadoutNoiseModel(0.2, prepend=False),
109
+ ccn.ReadoutNoiseModel(0.2, prepend=True),
110
+ ccn.DampedReadoutNoiseModel(0.3),
111
+ ccn.DampedReadoutNoiseModel(0.3, prepend=False),
112
+ ccn.DampedReadoutNoiseModel(0.3, prepend=True),
113
+ ccn.DepolarizingWithReadoutNoiseModel(0.1, 0.2),
114
+ ccn.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3),
115
+ ],
116
+ )
117
+ def test_repr(model) -> None:
118
+ assert_equivalent_repr(model)
119
+
120
+
99
121
  def test_readout_noise_no_prepend() -> None:
100
122
  noise_model = ccn.ReadoutNoiseModel(bitflip_prob=0.005, prepend=False)
101
123
  qubits = cirq.LineQubit.range(2)
@@ -24,7 +24,7 @@ from __future__ import annotations
24
24
  import abc
25
25
  from typing import Iterable, Sequence, TYPE_CHECKING
26
26
 
27
- from cirq import _import, devices, ops, protocols
27
+ from cirq import _import, devices, ops, protocols, value
28
28
  from cirq.devices.noise_utils import PHYSICAL_GATE_TAG
29
29
 
30
30
  circuits = _import.LazyLoader("circuits", globals(), "cirq.circuits.circuit")
@@ -41,6 +41,7 @@ class NoiseProperties(abc.ABC):
41
41
  """Construct all NoiseModels associated with this NoiseProperties."""
42
42
 
43
43
 
44
+ @value.value_equality
44
45
  class NoiseModelFromNoiseProperties(devices.NoiseModel):
45
46
  def __init__(self, noise_properties: NoiseProperties) -> None:
46
47
  """Creates a Noise Model from a NoiseProperties object that can be used with a Simulator.
@@ -54,6 +55,9 @@ class NoiseModelFromNoiseProperties(devices.NoiseModel):
54
55
  self._noise_properties = noise_properties
55
56
  self.noise_models = self._noise_properties.build_noise_models()
56
57
 
58
+ def _value_equality_values_(self):
59
+ return self._noise_properties
60
+
57
61
  def is_virtual(self, op: cirq.Operation) -> bool:
58
62
  """Returns True if an operation is virtual.
59
63
 
@@ -126,3 +130,6 @@ class NoiseModelFromNoiseProperties(devices.NoiseModel):
126
130
  combined_measure_ops.append(multi_measurements[key])
127
131
  final_moments.append(circuits.Moment(combined_measure_ops))
128
132
  return final_moments
133
+
134
+ def _json_dict_(self) -> dict[str, object]:
135
+ return {'noise_properties': self._noise_properties}
@@ -14,14 +14,21 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from typing import TYPE_CHECKING
18
+
17
19
  import cirq
20
+ import cirq.testing
18
21
  from cirq.devices.insertion_noise_model import InsertionNoiseModel
19
22
  from cirq.devices.noise_properties import NoiseModelFromNoiseProperties, NoiseProperties
20
23
  from cirq.devices.noise_utils import OpIdentifier, PHYSICAL_GATE_TAG
21
24
 
25
+ if TYPE_CHECKING:
26
+ from cirq.protocols.json_serialization import ObjectFactory
27
+
22
28
 
23
29
  # These properties are for testing purposes only - they are not representative
24
30
  # of device behavior for any existing hardware.
31
+ @cirq.value_equality
25
32
  class SampleNoiseProperties(NoiseProperties):
26
33
  def __init__(self, system_qubits: list[cirq.Qid], qubit_pairs: list[tuple[cirq.Qid, cirq.Qid]]):
27
34
  self.qubits = system_qubits
@@ -34,6 +41,16 @@ class SampleNoiseProperties(NoiseProperties):
34
41
  )
35
42
  return [add_h, add_iswap]
36
43
 
44
+ def _value_equality_values_(self):
45
+ return (self.qubits, self.qubit_pairs)
46
+
47
+ def _json_dict_(self) -> dict[str, object]:
48
+ return {'system_qubits': self.qubits, 'qubit_pairs': self.qubit_pairs}
49
+
50
+ @classmethod
51
+ def _from_json_dict_(cls, system_qubits, qubit_pairs, **kwargs):
52
+ return cls(system_qubits=system_qubits, qubit_pairs=[tuple(pair) for pair in qubit_pairs])
53
+
37
54
 
38
55
  def test_sample_model() -> None:
39
56
  q0, q1 = cirq.LineQubit.range(2)
@@ -54,3 +71,17 @@ def test_sample_model() -> None:
54
71
  cirq.Moment(cirq.H(q0), cirq.H(q1)),
55
72
  )
56
73
  assert noisy_circuit == expected_circuit
74
+
75
+
76
+ def custom_resolver(cirq_type: str) -> ObjectFactory | None:
77
+ if cirq_type == "SampleNoiseProperties":
78
+ return SampleNoiseProperties
79
+ return None
80
+
81
+
82
+ def test_noise_model_from_noise_properties_json() -> None:
83
+ q0, q1 = cirq.LineQubit.range(2)
84
+ props = SampleNoiseProperties([q0, q1], [(q0, q1), (q1, q0)])
85
+ model = NoiseModelFromNoiseProperties(props)
86
+ resolvers = [custom_resolver] + cirq.DEFAULT_RESOLVERS
87
+ cirq.testing.assert_json_roundtrip_works(model, resolvers=resolvers)
@@ -14,14 +14,14 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- import dataclasses
18
17
  import functools
19
18
  from typing import Sequence, TYPE_CHECKING
20
19
 
21
20
  import numpy as np
22
21
  import sympy
23
22
 
24
- from cirq import devices, ops, protocols, qis
23
+ from cirq import devices, ops, protocols, qis, value
24
+ from cirq._compat import proper_repr
25
25
  from cirq._import import LazyLoader
26
26
  from cirq.devices.noise_utils import PHYSICAL_GATE_TAG
27
27
 
@@ -130,19 +130,16 @@ def _decoherence_matrix(
130
130
  return rate_matrix
131
131
 
132
132
 
133
- def _as_rate_dict(
134
- rate_or_dict: float | dict[cirq.Qid, float] | None, qubits: set[cirq.Qid]
135
- ) -> dict[cirq.Qid, float]:
136
- """Convert float or None input into dictionary form.
137
-
138
- This method also ensures that no qubits are missing from dictionary keys.
139
- """
133
+ def _get_rate_for_qubit(
134
+ rate_or_dict: float | dict[cirq.Qid, float] | None, qubit: cirq.Qid
135
+ ) -> float:
136
+ """Convert supported rate specification values in ThermalNoiseModel to a float."""
140
137
  if rate_or_dict is None:
141
- return {q: 0.0 for q in qubits}
138
+ return 0.0
142
139
  elif isinstance(rate_or_dict, dict):
143
- return {**{q: 0.0 for q in qubits}, **rate_or_dict}
140
+ return rate_or_dict.get(qubit, 0.0)
144
141
  else:
145
- return {q: rate_or_dict for q in qubits}
142
+ return rate_or_dict
146
143
 
147
144
 
148
145
  def _validate_rates(qubits: set[cirq.Qid], rates: dict[cirq.Qid, np.ndarray]) -> None:
@@ -160,7 +157,7 @@ def _validate_rates(qubits: set[cirq.Qid], rates: dict[cirq.Qid, np.ndarray]) ->
160
157
  )
161
158
 
162
159
 
163
- @dataclasses.dataclass
160
+ @value.value_equality
164
161
  class ThermalNoiseModel(devices.NoiseModel):
165
162
  """NoiseModel representing simulated thermalization of a qubit.
166
163
 
@@ -214,24 +211,55 @@ class ThermalNoiseModel(devices.NoiseModel):
214
211
  """
215
212
  rate_dict = {}
216
213
 
217
- heat_rate_GHz = _as_rate_dict(heat_rate_GHz, qubits)
218
- cool_rate_GHz = _as_rate_dict(cool_rate_GHz, qubits)
219
- dephase_rate_GHz = _as_rate_dict(dephase_rate_GHz, qubits)
220
-
221
- for q in qubits:
222
- gamma_h = heat_rate_GHz[q]
223
- gamma_c = cool_rate_GHz[q]
224
- gamma_phi = dephase_rate_GHz[q]
225
-
214
+ # let us have reproducible sorted order in the rate_matrix_GHz dictionary
215
+ for q in sorted(qubits):
216
+ gamma_h = _get_rate_for_qubit(heat_rate_GHz, q)
217
+ gamma_c = _get_rate_for_qubit(cool_rate_GHz, q)
218
+ gamma_phi = _get_rate_for_qubit(dephase_rate_GHz, q)
226
219
  rate_dict[q] = _decoherence_matrix(gamma_c, gamma_phi, gamma_h, q.dimension)
227
220
 
228
221
  _validate_rates(qubits, rate_dict)
229
222
  self.gate_durations_ns: dict[type, float] = gate_durations_ns
230
223
  self.rate_matrix_GHz: dict[cirq.Qid, np.ndarray] = rate_dict
224
+ self._heat_rate_GHz = heat_rate_GHz
225
+ self._cool_rate_GHz = cool_rate_GHz
226
+ self._dephase_rate_GHz = dephase_rate_GHz
231
227
  self.require_physical_tag: bool = require_physical_tag
232
228
  self.skip_measurements: bool = skip_measurements
233
229
  self._prepend = prepend
234
230
 
231
+ def _value_equality_values_(self):
232
+ gate_durations_ns_tuple = tuple(
233
+ sorted(self.gate_durations_ns.items(), key=lambda x: str(x[0]))
234
+ )
235
+ rate_matrix_GHz_tuple = tuple(
236
+ sorted((q, tuple(m.flat)) for q, m in self.rate_matrix_GHz.items())
237
+ )
238
+ return (
239
+ gate_durations_ns_tuple,
240
+ rate_matrix_GHz_tuple,
241
+ self.require_physical_tag,
242
+ self.skip_measurements,
243
+ self._prepend,
244
+ )
245
+
246
+ def __repr__(self) -> str:
247
+ rate_args_repr = []
248
+ if self._heat_rate_GHz is not None:
249
+ rate_args_repr.append(f"heat_rate_GHz={proper_repr(self._heat_rate_GHz)}, ")
250
+ if self._cool_rate_GHz is not None:
251
+ rate_args_repr.append(f"cool_rate_GHz={proper_repr(self._cool_rate_GHz)}, ")
252
+ if self._dephase_rate_GHz is not None:
253
+ rate_args_repr.append(f"dephase_rate_GHz={proper_repr(self._dephase_rate_GHz)}, ")
254
+ return (
255
+ "cirq.devices.ThermalNoiseModel("
256
+ f"qubits={set(self.rate_matrix_GHz.keys())!r}, "
257
+ f"gate_durations_ns={proper_repr(self.gate_durations_ns)}, "
258
+ f"{''.join(rate_args_repr)}"
259
+ f"require_physical_tag={self.require_physical_tag!r}, "
260
+ f"skip_measurements={self.skip_measurements!r}, prepend={self._prepend!r})"
261
+ )
262
+
235
263
  def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
236
264
  if not moment.operations:
237
265
  return [moment]
@@ -283,3 +311,45 @@ class ThermalNoiseModel(devices.NoiseModel):
283
311
  return [moment]
284
312
  output = [moment, moment_module.Moment(noise_ops)]
285
313
  return output[::-1] if self._prepend else output
314
+
315
+ def _json_dict_(self) -> dict[str, object]:
316
+ qubits = sorted(self.rate_matrix_GHz.keys())
317
+
318
+ return {
319
+ 'qubits': qubits,
320
+ 'gate_durations_ns': {
321
+ protocols.json_cirq_type(k): v for k, v in self.gate_durations_ns.items()
322
+ },
323
+ 'heat_rate_GHz': [_get_rate_for_qubit(self._heat_rate_GHz, q) for q in qubits],
324
+ 'cool_rate_GHz': [_get_rate_for_qubit(self._cool_rate_GHz, q) for q in qubits],
325
+ 'dephase_rate_GHz': [_get_rate_for_qubit(self._dephase_rate_GHz, q) for q in qubits],
326
+ 'require_physical_tag': self.require_physical_tag,
327
+ 'skip_measurements': self.skip_measurements,
328
+ 'prepend': self._prepend,
329
+ }
330
+
331
+ @classmethod
332
+ def _from_json_dict_(
333
+ cls,
334
+ qubits,
335
+ gate_durations_ns,
336
+ heat_rate_GHz,
337
+ cool_rate_GHz,
338
+ dephase_rate_GHz,
339
+ require_physical_tag,
340
+ skip_measurements,
341
+ prepend,
342
+ **kwargs,
343
+ ):
344
+ return cls(
345
+ qubits=set(qubits),
346
+ gate_durations_ns={
347
+ protocols.cirq_type_from_json(k): v for k, v in gate_durations_ns.items()
348
+ },
349
+ heat_rate_GHz=dict(zip(qubits, heat_rate_GHz)),
350
+ cool_rate_GHz=dict(zip(qubits, cool_rate_GHz)),
351
+ dephase_rate_GHz=dict(zip(qubits, dephase_rate_GHz)),
352
+ require_physical_tag=require_physical_tag,
353
+ skip_measurements=skip_measurements,
354
+ prepend=prepend,
355
+ )
@@ -342,3 +342,22 @@ def test_noisy_moment_two_qubit():
342
342
  [9.87330937e-01, 0, 0, 9.95013725e-01],
343
343
  ],
344
344
  )
345
+
346
+
347
+ def test_repr():
348
+ q0 = cirq.LineQubit(0)
349
+ model = ThermalNoiseModel(
350
+ qubits={q0},
351
+ gate_durations_ns={cirq.ZPowGate: 5.0},
352
+ heat_rate_GHz={q0: 1e-5},
353
+ cool_rate_GHz={q0: 1e-4},
354
+ dephase_rate_GHz={q0: 2e-4},
355
+ require_physical_tag=False,
356
+ skip_measurements=False,
357
+ )
358
+ cirq.testing.assert_equivalent_repr(model)
359
+ # optional rate arguments are skipped when unspecified
360
+ s1 = repr(ThermalNoiseModel(qubits={q0}, gate_durations_ns={cirq.ZPowGate: 5.0}))
361
+ assert 'heat_rate_GHz' not in s1
362
+ assert 'cool_rate_GHz' not in s1
363
+ assert 'dephase_rate_GHz' not in s1
@@ -48,7 +48,7 @@ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
48
48
  import pandas as pd
49
49
 
50
50
  import cirq
51
- from cirq.devices import InsertionNoiseModel
51
+ from cirq.devices import InsertionNoiseModel, NoiseModelFromNoiseProperties, ThermalNoiseModel
52
52
  from cirq.devices.noise_model import _NoNoiseModel
53
53
  from cirq.experiments import GridInteractionLayer
54
54
  from cirq.ops import raw_types
@@ -175,6 +175,7 @@ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
175
175
  'NamedQubit': cirq.NamedQubit,
176
176
  'NamedQid': cirq.NamedQid,
177
177
  'NoIdentifierQubit': cirq.testing.NoIdentifierQubit,
178
+ 'NoiseModelFromNoiseProperties': NoiseModelFromNoiseProperties,
178
179
  'ObservableMeasuredResult': cirq.work.ObservableMeasuredResult,
179
180
  'OpIdentifier': cirq.OpIdentifier,
180
181
  'ParamResolver': cirq.ParamResolver,
@@ -226,6 +227,7 @@ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
226
227
  'SympyCondition': cirq.SympyCondition,
227
228
  'TaggedOperation': cirq.TaggedOperation,
228
229
  'TensoredConfusionMatrices': cirq.TensoredConfusionMatrices,
230
+ 'ThermalNoiseModel': ThermalNoiseModel,
229
231
  'TiltedSquareLattice': cirq.TiltedSquareLattice,
230
232
  'ThreeQubitDiagonalGate': cirq.ThreeQubitDiagonalGate,
231
233
  'TrialResult': cirq.ResultDict, # keep support for Cirq < 0.11.
@@ -52,6 +52,7 @@ TESTED_MODULES: dict[str, _ModuleDeprecation | None] = {
52
52
  'cirq_ionq': None,
53
53
  'cirq_google': None,
54
54
  'cirq_pasqal': None,
55
+ f'cirq{"."}contrib': None,
55
56
  'cirq.protocols': None,
56
57
  'non_existent_should_be_fine': None,
57
58
  }
@@ -0,0 +1,32 @@
1
+ {
2
+ "cirq_type": "ThermalNoiseModel",
3
+ "qubits": [
4
+ {
5
+ "cirq_type": "LineQubit",
6
+ "x": 0
7
+ },
8
+ {
9
+ "cirq_type": "LineQubit",
10
+ "x": 1
11
+ }
12
+ ],
13
+ "gate_durations_ns": {
14
+ "ZPowGate": 5.0,
15
+ "CZPowGate": 12.0
16
+ },
17
+ "heat_rate_GHz": [
18
+ 1e-05,
19
+ 1e-05
20
+ ],
21
+ "cool_rate_GHz": [
22
+ 0.0001,
23
+ 0.00015
24
+ ],
25
+ "dephase_rate_GHz": [
26
+ 0.0002,
27
+ 0.0002
28
+ ],
29
+ "require_physical_tag": false,
30
+ "skip_measurements": false,
31
+ "prepend": false
32
+ }
@@ -0,0 +1 @@
1
+ cirq.devices.ThermalNoiseModel(qubits={cirq.LineQubit(0), cirq.LineQubit(1)}, gate_durations_ns={cirq.ops.common_gates.ZPowGate: 5.0,cirq.ops.common_gates.CZPowGate: 12.0}, heat_rate_GHz=1e-05, cool_rate_GHz={cirq.LineQubit(0): 0.0001,cirq.LineQubit(1): 0.00015}, dephase_rate_GHz=0.0002, require_physical_tag=False, skip_measurements=False, prepend=False)
@@ -166,15 +166,17 @@ TestSpec = ModuleJsonTestSpec(
166
166
  'ParamMappingType',
167
167
  # utility:
168
168
  'CliffordSimulator',
169
- 'NoiseModelFromNoiseProperties',
170
169
  'Simulator',
171
170
  'StabilizerSampler',
172
171
  'DEFAULT_RESOLVERS',
173
172
  ],
174
173
  deprecated={},
175
174
  tested_elsewhere=[
175
+ # Tested in cirq.devices.noise_properties_test module, because
176
+ # serde test uses a non-public SampleNoiseProperties class.
177
+ 'NoiseModelFromNoiseProperties',
176
178
  # SerializableByKey does not follow common serialization rules.
177
179
  # It is tested separately in test_context_serialization.
178
- 'SerializableByKey'
180
+ 'SerializableByKey',
179
181
  ],
180
182
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cirq-core
3
- Version: 1.6.0.dev20250721212657
3
+ Version: 1.6.0.dev20250722040433
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,10 +4,10 @@ cirq/_compat_test.py,sha256=emXpdD5ZvwLRlFAoQB8YatmZyU3b4e9jg6FppMTUhkU,33900
4
4
  cirq/_doc.py,sha256=BrnoABo1hk5RgB3Cgww4zLHUfiyFny0F1V-tOMCbdaU,2909
5
5
  cirq/_import.py,sha256=ixBu4EyGl46Ram2cP3p5eZVEFDW5L2DS-VyTjz4N9iw,8429
6
6
  cirq/_import_test.py,sha256=oF4izzOVZLc7NZ0aZHFcGv-r01eiFFt_JORx_x7_D4s,1089
7
- cirq/_version.py,sha256=oKI_Ebte66Mc7O62NRWMD5tC6qXWK7rEMmfUCmDrkXo,1206
8
- cirq/_version_test.py,sha256=5kidWwva2m6D_V7MWpMSxAcfnDgKKmXQy-R2nrbrO5A,155
7
+ cirq/_version.py,sha256=plnCZFSbWJaIamttoW4NByhOoJdhoCyrqJEHKJ37hwA,1206
8
+ cirq/_version_test.py,sha256=9KAtcFqzeXTp7mlnfEO0YP55nBQ6N8eUQq55_wFsgjg,155
9
9
  cirq/conftest.py,sha256=wSDKNdIQRDfLnXvOCWD3erheOw8JHRhdfQ53EyTUIXg,1239
10
- cirq/json_resolver_cache.py,sha256=hYyG53VJeV61X0oukK5ndZYega8lkL2FyaL1m0j6h5M,13556
10
+ cirq/json_resolver_cache.py,sha256=A5DIgFAY1hUNt9vai_C3-gGBv24116CJMzQxMcXOax4,13726
11
11
  cirq/py.typed,sha256=VFSlmh_lNwnaXzwY-ZuW-C2Ws5PkuDoVgBdNCs0jXJE,63
12
12
  cirq/circuits/__init__.py,sha256=HKunqRpZoDmjy1IiK9Cn84MTGT84_PMeQ5VDCPafcWk,1335
13
13
  cirq/circuits/_block_diagram_drawer.py,sha256=OpIupxl6plGVaLkU13RqYGELAlHAIy56tV6qjg51Yws,9489
@@ -33,7 +33,7 @@ cirq/circuits/qasm_output_test.py,sha256=e2TsMMVZLzyCYh6U3umPtusxmeiLJDunmsgFRa5
33
33
  cirq/circuits/text_diagram_drawer.py,sha256=G2fJcoyUP0ikrhTluFo4lULCEXKJI0dai5lBtHm0f14,16485
34
34
  cirq/circuits/text_diagram_drawer_test.py,sha256=YBe8zT7BDENoR-gA3l77mtRj6vxY3kVVZ4FqBO_WwsY,11031
35
35
  cirq/contrib/__init__.py,sha256=DSA8bHVvPSivnEtLS2WmAa89pzGxK8u2MyMHwpJ3HSM,1121
36
- cirq/contrib/json.py,sha256=U7mSvxAITKkeXVqN3hCyTVGM2Mzb2chxdU3tXp6Q0c8,827
36
+ cirq/contrib/json.py,sha256=7qE7iFEH5jWII3ZaIHjnitt3k-MULDxZ-0TFIQ4nJSQ,1473
37
37
  cirq/contrib/json_test.py,sha256=9wJb-N1Sv_Epz548el6g6iZYB5VgPk2eOBHYur0V0ho,1178
38
38
  cirq/contrib/acquaintance/__init__.py,sha256=hIRO807ywD3L5xwIPROAOq5FFnel9uXcQCw1uYBlNhg,3215
39
39
  cirq/contrib/acquaintance/bipartite.py,sha256=9BusD-thMIfOEZeDuUEBnZUJoOJ8bc-DzNJTVMOrVR8,6494
@@ -84,9 +84,11 @@ cirq/contrib/graph_device/uniform_graph_device_test.py,sha256=M7cxp4UEbhTf-kdVUc
84
84
  cirq/contrib/hacks/__init__.py,sha256=C1uZ1J79EG0dmPxj29mnjdfx6aRU6moz6QAD9PFGUYM,584
85
85
  cirq/contrib/hacks/disable_validation.py,sha256=cOqo4QUtbDu1PAOUCQRjT8EKE_AImbQr2rwGi0AOO0k,1530
86
86
  cirq/contrib/hacks/disable_validation_test.py,sha256=sz319WQwkSvkAUr913lhlrh1NM7-ozMffb3MxCjbwgY,1755
87
+ cirq/contrib/json_test_data/__init__.py,sha256=y4pe0VWiQAa4PmWikB3XKFVgiuJWspUzW9ugDUYq8C8,723
88
+ cirq/contrib/json_test_data/spec.py,sha256=9Q_-qZkFM6S0bMFzyt-Bv2lPrHaUxltPmYCsn-wTxrs,1182
87
89
  cirq/contrib/noise_models/__init__.py,sha256=O3wvaQ6kyNZzwsCnMMZvr2EyS76LpO9xnVZ69a2obv0,957
88
- cirq/contrib/noise_models/noise_models.py,sha256=3uiZh9xXSr_Q29vHnJlMRBiYdgwd2kyAfXD74Tt2pP4,7754
89
- cirq/contrib/noise_models/noise_models_test.py,sha256=LRYFQx_-zHb205RnlVKSnpSZOx_KG6Me7_5sW-_S9m8,10744
90
+ cirq/contrib/noise_models/noise_models.py,sha256=roHyBEIvD-WqjOhY8bRi5nzz0lycp3Ny19mr6W0zWsU,11332
91
+ cirq/contrib/noise_models/noise_models_test.py,sha256=htDTYcWeMtgtLIo_4DaTIidoHCxPMVIAKtS80R4OmDs,11472
90
92
  cirq/contrib/paulistring/__init__.py,sha256=1k2_MYLTMPn8AFoJvSgpN-F-6xgmDjKXRhb-FdDsFoQ,1761
91
93
  cirq/contrib/paulistring/clifford_optimize.py,sha256=VMdivMpQnPQhgqtasce6dOPGx6x6eIZ6Z4f1H666j-I,7859
92
94
  cirq/contrib/paulistring/clifford_optimize_test.py,sha256=8FFLg9gb1HmHHMdXPa-vCr1zyxvgdlciRH8qyfTWQRw,3964
@@ -170,14 +172,14 @@ cirq/devices/named_topologies.py,sha256=CNoMG2xhisUgssSdngzr8VpA5YBPjpVhw4dtXxKA
170
172
  cirq/devices/named_topologies_test.py,sha256=opABh1NgkfubHF4sCCTAxmFHLZXVZIgdKrZLQefd-AE,4854
171
173
  cirq/devices/noise_model.py,sha256=teJNj25_tLTu_8_6fkKNyFAVnaRH6actJFXbhIJCHMY,11239
172
174
  cirq/devices/noise_model_test.py,sha256=0kLY4lksbfBz1pAuSXQWBw8xSnwVrfXqlxrUbsaUuUg,9412
173
- cirq/devices/noise_properties.py,sha256=g6Joc444K4WRwAYQGGP_rIah0nIxxJQ3WJmE8JsgbXo,5105
174
- cirq/devices/noise_properties_test.py,sha256=UU3JXgDEckm-XTVeEW-LoonrJbst7qw4ahAH42n_cYY,2353
175
+ cirq/devices/noise_properties.py,sha256=pXsTxgj2J6RcJ1uWUYdczUTBMn6ThtvucijNEgbrzQg,5321
176
+ cirq/devices/noise_properties_test.py,sha256=0g0_UP70FE0mU-SySOu-MX6jnuR7XH0Y0QOjZMO8HqA,3418
175
177
  cirq/devices/noise_utils.py,sha256=73B1o22072RhsNdo7_t_A-pa7Sub62ff4VpvNt0Ewdk,7155
176
178
  cirq/devices/noise_utils_test.py,sha256=Pn_BO0c5Ky9FJk384FXh_BkXXYe1V7GWIBgxsaoB9as,2099
177
179
  cirq/devices/superconducting_qubits_noise_properties.py,sha256=pQYEs6KupGW1lOQ5Tt8CEI0vdJ3sh94uTrVZHXosRmk,8142
178
180
  cirq/devices/superconducting_qubits_noise_properties_test.py,sha256=Ld7ft0Vr4V69egdL67WKAdDF6vNXc2-SLPzx0u2ph2E,12200
179
- cirq/devices/thermal_noise_model.py,sha256=LIGlA6ikYWqbh-759RqXPMDMpCV2uKHT_pRLfMCGkYM,11535
180
- cirq/devices/thermal_noise_model_test.py,sha256=vgloNkmkNes_pn0D50-LD2RUcsMJey7EN8Wm6Nc-d5U,12282
181
+ cirq/devices/thermal_noise_model.py,sha256=TSOKMP1GSVS2FVzFGGt6_Rqd-0Dx4tnvMv6Yf_1YTk0,14426
182
+ cirq/devices/thermal_noise_model_test.py,sha256=F4PtsTxhM-FyA1E_VDgg7e3TjuKeN7sGCdvHi31RxWk,12914
181
183
  cirq/devices/unconstrained_device.py,sha256=wa94uVzaCPb1jmG3h6hSGJQggSuCvEK8wekkGXCOx_Q,1551
182
184
  cirq/devices/unconstrained_device_test.py,sha256=J8vABVWWywQuX6Jlo5Y0pWTh6VZRatdmjdBL6u0kZKk,1083
183
185
  cirq/experiments/__init__.py,sha256=3y8FX6Edh_mEFJ7AWjhDurnSLxuEt0_edqL7CitCrTQ,3777
@@ -411,7 +413,7 @@ cirq/protocols/hash_from_pickle_test.py,sha256=H1V2cy-gtbKhhewZPSI7kcNqgpkS5luF7
411
413
  cirq/protocols/inverse_protocol.py,sha256=tHaY8-dfd0SD59v3DZ_zpwz7lwFrraPExEnIgn1T0RI,3965
412
414
  cirq/protocols/inverse_protocol_test.py,sha256=5RoZfSRzBvpGpLdg1XKYdB6qy-GkDvZsATUvxdFrLJ0,2067
413
415
  cirq/protocols/json_serialization.py,sha256=z7Yu2vsNabRkdeYyIuNCoXATHkrOGreTRShNyN0Fjuc,24520
414
- cirq/protocols/json_serialization_test.py,sha256=bQELcU7hZ55rBk-sqxwsiotTOId4EWpUztsD6rwqb1g,27841
416
+ cirq/protocols/json_serialization_test.py,sha256=An57W8eBWaUF4kKOCos2UlHzNiILnUJvqmZLmwZ_6MA,27872
415
417
  cirq/protocols/kraus_protocol.py,sha256=ptiRkEnDgBnEdxobs6wZdZsOAhVzF6bhhSHuNqLKFJo,9250
416
418
  cirq/protocols/kraus_protocol_test.py,sha256=51eJ3r3Kx10rG-1hPjcfcODeUO3PFQmwU9ATMnhTWDw,5495
417
419
  cirq/protocols/measurement_key_protocol.py,sha256=JU7XbZfR7o6Wcv5qRJisp3ZAWwW9Fx7OHtxNMrWtZoQ,13351
@@ -769,6 +771,8 @@ cirq/protocols/json_test_data/TaggedOperation.json,sha256=aAOHhS4FRqMMoWW6gBXt94
769
771
  cirq/protocols/json_test_data/TaggedOperation.repr,sha256=gTNiZlRQ2MVpAVsJTmvIZ1cyMDZQWe0KuP8mf97D0LE,85
770
772
  cirq/protocols/json_test_data/TensoredConfusionMatrices.json,sha256=Irb4yYzbuvaraH4VI0geh5FM1G7ieEkt0msF9XY3QbY,828
771
773
  cirq/protocols/json_test_data/TensoredConfusionMatrices.repr,sha256=UnEJkd9BUy501X3zY3UDdXkn-Aj8ZT76qh4YcBOEPMI,535
774
+ cirq/protocols/json_test_data/ThermalNoiseModel.json,sha256=3Pe4purDYGL-rVC1VjM3QKew1qUKOVDDVgqJJPL-b3E,478
775
+ cirq/protocols/json_test_data/ThermalNoiseModel.repr,sha256=q6n8SxiVO4V2PCv8HsE3WVN2RhfXOdST7zaDbt1vxeo,357
772
776
  cirq/protocols/json_test_data/ThreeQubitDiagonalGate.json,sha256=Giy1bSDyP88AxpvTuHUIf_ikXhO2XpDLO6XZs2SxrZk,147
773
777
  cirq/protocols/json_test_data/ThreeQubitDiagonalGate.repr,sha256=pBPE3IfuWgPtebLWcqpTguUrZ--j-hS1PDTTC7KB1hI,90
774
778
  cirq/protocols/json_test_data/TiltedSquareLattice.json,sha256=A7hGSskEasyAu-o3PBsRlFzFrRgpPOuuaFRNGns08F8,69
@@ -858,7 +862,7 @@ cirq/protocols/json_test_data/pandas.Index.json_inward,sha256=KENE3PlSxmtMdnikuJ
858
862
  cirq/protocols/json_test_data/pandas.Index.repr_inward,sha256=2YnQUO58RGFGvuVjmR57v25YIvPAnTgVYh0jeQYhXHo,52
859
863
  cirq/protocols/json_test_data/pandas.MultiIndex.json,sha256=pF6YdRE3Qjhsf8CeGEZQvX5AWHAWaMNQF6c661Sqrxg,233
860
864
  cirq/protocols/json_test_data/pandas.MultiIndex.repr,sha256=g4q-1zFWYG8T7IAI0anQ5aMHSFlGF2CJsAoYdZzbGa8,80
861
- cirq/protocols/json_test_data/spec.py,sha256=DPG_98SJgYX2VZRNKGjm3EOiSppYpKbKIOBebVj1Elw,5651
865
+ cirq/protocols/json_test_data/spec.py,sha256=qy_Wy5gf96KNz23jwcfJ8wtynnXNP0WbIcC6qS-_5BY,5791
862
866
  cirq/protocols/json_test_data/sympy.Add.json,sha256=fVilRXllnMRnQcXuoU06IlwZOWK9Kwim1t6Q_s6z97g,1000
863
867
  cirq/protocols/json_test_data/sympy.Add.repr,sha256=9L_05ZlcrFpo8QoExFAAO_kEEpc7SSqGyp0vudkRlsU,228
864
868
  cirq/protocols/json_test_data/sympy.And.json,sha256=eaM07ihBPjZbn44gRIy6TbXeEwblF-QN32Jb1ATAQ5Q,178
@@ -1220,8 +1224,8 @@ cirq/work/sampler.py,sha256=rxbMWvrhu3gfNSBjZKozw28lLKVvBAS_1EGyPdYe8Xg,19041
1220
1224
  cirq/work/sampler_test.py,sha256=SsMrRvLDYELyOAWLKISjkdEfrBwLYWRsT6D8WrsLM3Q,13533
1221
1225
  cirq/work/zeros_sampler.py,sha256=Fs2JWwq0n9zv7_G5Rm-9vPeHUag7uctcMOHg0JTkZpc,2371
1222
1226
  cirq/work/zeros_sampler_test.py,sha256=lQLgQDGBLtfImryys2HzQ2jOSGxHgc7-koVBUhv8qYk,3345
1223
- cirq_core-1.6.0.dev20250721212657.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1224
- cirq_core-1.6.0.dev20250721212657.dist-info/METADATA,sha256=oAZ_OK9p7g-zY3Hy0efUTJ_KxvJC25qgMoSDg--kJzA,4857
1225
- cirq_core-1.6.0.dev20250721212657.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1226
- cirq_core-1.6.0.dev20250721212657.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1227
- cirq_core-1.6.0.dev20250721212657.dist-info/RECORD,,
1227
+ cirq_core-1.6.0.dev20250722040433.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1228
+ cirq_core-1.6.0.dev20250722040433.dist-info/METADATA,sha256=4x1la6647P0LD6kFxQCVBGV7dFeZ7Hg-WsDL_qv612k,4857
1229
+ cirq_core-1.6.0.dev20250722040433.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1230
+ cirq_core-1.6.0.dev20250722040433.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1231
+ cirq_core-1.6.0.dev20250722040433.dist-info/RECORD,,