Skip to content

Commit 8e8fd80

Browse files
WingCodepavoljuhasmhucka
authored
Add JSON serialization support for NoiseModel classes (#7396)
This adds JSON serialization support and in most cases genuine `repr` support for - cirq.contrib.noise_models.DampedReadoutNoiseModel - cirq.contrib.noise_models.DepolarizingNoiseModel - cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel - cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel - cirq.contrib.noise_models.ReadoutNoiseModel - cirq.devices.noise_properties.NoiseModelFromNoiseProperties - cirq.devices.thermal_noise_model.ThermalNoiseModel - cirq_google.experimental.noise_models.noise_models.PerQubitDepolarizingWithDampedReadoutNoiseModel Also adds `cirq.contrib.json_test_data` for test data files specific to the classes in `cirq.contrib` module. Fixes #3846 --------- Co-authored-by: Pavol Juhas <juhas@google.com> Co-authored-by: Michael Hucka <mhucka@caltech.edu> Co-authored-by: Pavol Juhas <pavol.juhas@gmail.com>
1 parent 11c769d commit 8e8fd80

30 files changed

+597
-34
lines changed

cirq-core/cirq/contrib/json.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,42 @@
33

44
from __future__ import annotations
55

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
79

810

911
def contrib_class_resolver(cirq_type: str) -> ObjectFactory | None:
1012
"""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]:
1118
from cirq.contrib.acquaintance import SwapPermutationGate
1219
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+
)
1327
from cirq.contrib.quantum_volume import QuantumVolumeResult
1428

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}
1840

1941

2042
DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver] + DEFAULT_RESOLVERS
43+
44+
_register_resolver(_class_resolver_dictionary)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"cirq_type": "DampedReadoutNoiseModel",
4+
"decay_prob": 0.3,
5+
"prepend": true
6+
},
7+
{
8+
"cirq_type": "DampedReadoutNoiseModel",
9+
"decay_prob": 0.4,
10+
"prepend": false
11+
}
12+
]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
cirq.contrib.noise_models.DampedReadoutNoiseModel(0.3, prepend=True),
3+
cirq.contrib.noise_models.DampedReadoutNoiseModel(0.4, prepend=False),
4+
]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"cirq_type": "DepolarizingNoiseModel",
4+
"depol_prob": 0.1,
5+
"prepend": false
6+
},
7+
{
8+
"cirq_type": "DepolarizingNoiseModel",
9+
"depol_prob": 0.15,
10+
"prepend": true
11+
}
12+
]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
cirq.contrib.noise_models.DepolarizingNoiseModel(0.1, prepend=False),
3+
cirq.contrib.noise_models.DepolarizingNoiseModel(0.15, prepend=True),
4+
]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"cirq_type": "DepolarizingWithDampedReadoutNoiseModel",
3+
"depol_prob": 0.1,
4+
"bitflip_prob": 0.2,
5+
"decay_prob": 0.3
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"cirq_type": "DepolarizingWithReadoutNoiseModel",
3+
"depol_prob": 0.1,
4+
"bitflip_prob": 0.2
5+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel(0.1, 0.2)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"cirq_type": "ReadoutNoiseModel",
4+
"bitflip_prob": 0.2,
5+
"prepend": true
6+
},
7+
{
8+
"cirq_type": "ReadoutNoiseModel",
9+
"bitflip_prob": 0.23,
10+
"prepend": false
11+
}
12+
]

0 commit comments

Comments
 (0)