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 +1 -1
- cirq/_version_test.py +1 -1
- cirq/contrib/json.py +28 -4
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +114 -0
- cirq/contrib/noise_models/noise_models_test.py +23 -1
- cirq/devices/noise_properties.py +8 -1
- cirq/devices/noise_properties_test.py +31 -0
- cirq/devices/thermal_noise_model.py +92 -22
- cirq/devices/thermal_noise_model_test.py +19 -0
- cirq/json_resolver_cache.py +3 -1
- cirq/protocols/json_serialization_test.py +1 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +4 -2
- {cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/METADATA +1 -1
- {cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/RECORD +21 -17
- {cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/WHEEL +0 -0
- {cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/top_level.txt +0 -0
cirq/_version.py
CHANGED
cirq/_version_test.py
CHANGED
cirq/contrib/json.py
CHANGED
|
@@ -3,18 +3,42 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
|
|
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 = [
|
|
16
|
-
|
|
17
|
-
|
|
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)
|
cirq/devices/noise_properties.py
CHANGED
|
@@ -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
|
|
134
|
-
rate_or_dict: float | dict[cirq.Qid, float] | None,
|
|
135
|
-
) ->
|
|
136
|
-
"""Convert
|
|
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
|
|
138
|
+
return 0.0
|
|
142
139
|
elif isinstance(rate_or_dict, dict):
|
|
143
|
-
return
|
|
140
|
+
return rate_or_dict.get(qubit, 0.0)
|
|
144
141
|
else:
|
|
145
|
-
return
|
|
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
|
-
@
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
cirq/json_resolver_cache.py
CHANGED
|
@@ -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.
|
|
@@ -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
|
)
|
{cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cirq-core
|
|
3
|
-
Version: 1.6.0.
|
|
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
|
{cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/RECORD
RENAMED
|
@@ -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=
|
|
8
|
-
cirq/_version_test.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
89
|
-
cirq/contrib/noise_models/noise_models_test.py,sha256=
|
|
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=
|
|
174
|
-
cirq/devices/noise_properties_test.py,sha256=
|
|
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=
|
|
180
|
-
cirq/devices/thermal_noise_model_test.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
1224
|
-
cirq_core-1.6.0.
|
|
1225
|
-
cirq_core-1.6.0.
|
|
1226
|
-
cirq_core-1.6.0.
|
|
1227
|
-
cirq_core-1.6.0.
|
|
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,,
|
{cirq_core-1.6.0.dev20250721212657.dist-info → cirq_core-1.6.0.dev20250722040433.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|