cirq-core 1.5.0.dev20240710220908__py3-none-any.whl → 1.5.0.dev20240712174048__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.dev20240710220908"
31
+ __version__ = "1.5.0.dev20240712174048"
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.dev20240710220908"
6
+ assert cirq.__version__ == "1.5.0.dev20240712174048"
@@ -0,0 +1,114 @@
1
+ # Copyright 2024 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
+ from collections.abc import Mapping
16
+
17
+ from typing import cast
18
+ from cirq import ops, circuits
19
+ from cirq.transformers import transformer_api
20
+ import numpy as np
21
+
22
+
23
+ def _gate_in_moment(gate: ops.Gate, moment: circuits.Moment) -> bool:
24
+ """Check whether `gate` is in `moment`."""
25
+ return any(op.gate == gate for op in moment)
26
+
27
+
28
+ @transformer_api.transformer
29
+ class DepolerizingNoiseTransformer:
30
+ """Add local depolarizing noise after two-qubit gates in a specified circuit. More specifically,
31
+ with probability p, append a random non-identity two-qubit Pauli operator after each specified
32
+ two-qubit gate.
33
+
34
+ Attrs:
35
+ p: The probability with which to add noise.
36
+ target_gate: Add depolarizing nose after this type of gate
37
+ """
38
+
39
+ def __init__(
40
+ self, p: float | Mapping[tuple[ops.Qid, ops.Qid], float], target_gate: ops.Gate = ops.CZ
41
+ ):
42
+ """Initialize the depolarizing noise transformer with some depolarizing probability and
43
+ target gate.
44
+
45
+ Args:
46
+ p: The depolarizing probability, either a single float or a mapping from pairs of qubits
47
+ to floats.
48
+ target_gate: The gate after which to add depolarizing noise.
49
+
50
+ Raises:
51
+ TypeError: If `p` is not either be a float or a mapping from sorted qubit pairs to
52
+ floats.
53
+ """
54
+
55
+ if not isinstance(p, (Mapping, float)):
56
+ raise TypeError( # pragma: no cover
57
+ "p must either be a float or a mapping from" # pragma: no cover
58
+ + "sorted qubit pairs to floats" # pragma: no cover
59
+ ) # pragma: no cover
60
+ self.p = p
61
+ self.p_func = (
62
+ (lambda _: p)
63
+ if isinstance(p, (int, float))
64
+ else (lambda pair: cast(Mapping, p).get(pair, 0.0))
65
+ )
66
+ self.target_gate = target_gate
67
+
68
+ def __call__(
69
+ self,
70
+ circuit: circuits.AbstractCircuit,
71
+ rng: np.random.Generator | None = None,
72
+ *,
73
+ context: transformer_api.TransformerContext | None = None,
74
+ ):
75
+ """Apply the transformer to the given circuit.
76
+
77
+ Args:
78
+ circuit: The circuit to add noise to.
79
+ context: Not used; to satisfy transformer API.
80
+
81
+ Returns:
82
+ The transformed circuit.
83
+ """
84
+ if rng is None:
85
+ rng = np.random.default_rng()
86
+ target_gate = self.target_gate
87
+
88
+ # add random Pauli gates with probability p after each of the specified gate
89
+ assert target_gate.num_qubits() == 2, "`target_gate` must be a two-qubit gate."
90
+ paulis = [ops.I, ops.X, ops.Y, ops.Z]
91
+ new_moments = []
92
+ for moment in circuit:
93
+ new_moments.append(moment)
94
+ if _gate_in_moment(target_gate, moment):
95
+ # add a new moment with the Paulis
96
+ target_pairs = {
97
+ tuple(sorted(op.qubits)) for op in moment.operations if op.gate == target_gate
98
+ }
99
+ added_moment_ops = []
100
+ for pair in target_pairs:
101
+ pair_sorted_tuple = (pair[0], pair[1])
102
+ p_i = self.p_func(pair_sorted_tuple)
103
+ apply = rng.choice([True, False], p=[p_i, 1 - p_i])
104
+ if apply:
105
+ choices = [
106
+ (pauli_a(pair[0]), pauli_b(pair[1]))
107
+ for pauli_a in paulis
108
+ for pauli_b in paulis
109
+ ][1:]
110
+ pauli_to_apply = rng.choice(np.array(choices, dtype=object))
111
+ added_moment_ops.append(pauli_to_apply)
112
+ if len(added_moment_ops) > 0:
113
+ new_moments.append(circuits.Moment(*added_moment_ops))
114
+ return circuits.Circuit.from_moments(*new_moments)
@@ -0,0 +1,53 @@
1
+ # Copyright 2024 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
+ from cirq import ops, circuits, devices
16
+ import cirq.transformers.noise_adding as na
17
+ import numpy as np
18
+
19
+
20
+ def test_noise_adding():
21
+ qubits = devices.LineQubit.range(4)
22
+ one_layer = circuits.Circuit(ops.CZ(*qubits[:2]), ops.CZ(*qubits[2:]))
23
+ circuit = one_layer * 10
24
+
25
+ # test that p=0 does nothing
26
+ transformed_circuit_p0 = na.DepolerizingNoiseTransformer(0.0)(circuit)
27
+ assert transformed_circuit_p0 == circuit
28
+
29
+ # test that p=1 doubles the circuit depth
30
+ transformed_circuit_p1 = na.DepolerizingNoiseTransformer(1.0)(circuit)
31
+ assert len(transformed_circuit_p1) == 20
32
+
33
+ # test that we get a deterministic result when using a specific rng
34
+ rng = np.random.default_rng(0)
35
+ transformed_circuit_p0_03 = na.DepolerizingNoiseTransformer(0.03)(circuit, rng=rng)
36
+ expected_circuit = (
37
+ one_layer * 2
38
+ + circuits.Circuit(ops.I(qubits[2]), ops.Z(qubits[3]))
39
+ + one_layer * 4
40
+ + circuits.Circuit(ops.Z(qubits[0]), ops.X(qubits[1]))
41
+ + one_layer * 4
42
+ + circuits.Circuit(ops.I(qubits[2]), ops.X(qubits[3]))
43
+ )
44
+ assert transformed_circuit_p0_03 == expected_circuit
45
+
46
+ # test that supplying a dictionary for p works
47
+ transformed_circuit_p_dict = na.DepolerizingNoiseTransformer(
48
+ {tuple(qubits[:2]): 1.0, tuple(qubits[2:]): 0.0}
49
+ )(circuit)
50
+ assert len(transformed_circuit_p_dict) == 20 # depth should be doubled
51
+ assert transformed_circuit_p_dict[1::2].all_qubits() == frozenset(
52
+ qubits[:2]
53
+ ) # no single-qubit gates get added to qubits[2:]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cirq-core
3
- Version: 1.5.0.dev20240710220908
3
+ Version: 1.5.0.dev20240712174048
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=ow3fcIM6yzwNASceUWYIGlTgHkysbg9vO85xoQgtdjs,1206
8
- cirq/_version_test.py,sha256=wmmA2WCnJ-WU8DUtbgS_wyvjUMWTnyl9B8RcZvNYxrI,147
7
+ cirq/_version.py,sha256=iUhBnaAkxANMTntlE0vtUUwIfs0DksnHzH_qxhgat2s,1206
8
+ cirq/_version_test.py,sha256=jsZSypKTqjpgtoUqQ_xhXrNpPwx3PqF0JcOJqT0-2pk,147
9
9
  cirq/conftest.py,sha256=X7yLFL8GLhg2CjPw0hp5e_dGASfvHx1-QT03aUbhKJw,1168
10
10
  cirq/json_resolver_cache.py,sha256=ytePZtNZgKjOF2NiVpUTuotB-JKZmQNOFIFdvXqsxHw,13271
11
11
  cirq/py.typed,sha256=VFSlmh_lNwnaXzwY-ZuW-C2Ws5PkuDoVgBdNCs0jXJE,63
@@ -1038,6 +1038,8 @@ cirq/transformers/merge_k_qubit_gates.py,sha256=dUsswQOIHfbb6Lu37fecgrpT6_45zmDE
1038
1038
  cirq/transformers/merge_k_qubit_gates_test.py,sha256=k_ROZvUebHgPy5vsNnWNMBYU4kfIkrunPsw39ZngMwo,13920
1039
1039
  cirq/transformers/merge_single_qubit_gates.py,sha256=NRREV4Z6Ptc3mZnOUgzQePdj4H0aix17WOUwZUB7iQ8,5826
1040
1040
  cirq/transformers/merge_single_qubit_gates_test.py,sha256=SWf1Il7Bz0iUCDM7JoDG2Yxe4p2yYr2PgViQpjByFm0,9914
1041
+ cirq/transformers/noise_adding.py,sha256=Ng1JoGzSJdrA7WBAOLmM5kSGWP4bqEnQc-g9kYxePNQ,4439
1042
+ cirq/transformers/noise_adding_test.py,sha256=C0G16cj_hGWgpAYV0L7p3_p4LkD7SR99p0DJJq1fUwk,2134
1041
1043
  cirq/transformers/optimize_for_target_gateset.py,sha256=MxhFsCm2XgW3gdpNW4NGVmz1VdQvzKdNNCtVZDuZiVE,7229
1042
1044
  cirq/transformers/optimize_for_target_gateset_test.py,sha256=MgAHjsPbVtd0fl2ytRz2R-LQuhSqImtrFK5F45QXkA8,19523
1043
1045
  cirq/transformers/qubit_management_transformers.py,sha256=A7Mweu9ElLSCsy_atmgFbYlzOFXKhct5gQ5YNTjjaVU,9430
@@ -1175,8 +1177,8 @@ cirq/work/sampler.py,sha256=JEAeQQRF3bqlO9AkOf4XbrTATDI5f5JgyM_FAUCNxao,19751
1175
1177
  cirq/work/sampler_test.py,sha256=B2ZsuqGT854gQtBIAh8k0LiG9Vj5wSzcGvkxOUoTcW4,13217
1176
1178
  cirq/work/zeros_sampler.py,sha256=x1C7cup66a43n-3tm8QjhiqJa07qcJW10FxNp9jJ59Q,2356
1177
1179
  cirq/work/zeros_sampler_test.py,sha256=JIkpBBFPJe5Ba4142vzogyWyboG1Q1ZAm0UVGgOoZn8,3279
1178
- cirq_core-1.5.0.dev20240710220908.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1179
- cirq_core-1.5.0.dev20240710220908.dist-info/METADATA,sha256=8GDfDiN4H53cFOnyL9z749aiCNozOl8b8rUfcmqfL20,2007
1180
- cirq_core-1.5.0.dev20240710220908.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
1181
- cirq_core-1.5.0.dev20240710220908.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1182
- cirq_core-1.5.0.dev20240710220908.dist-info/RECORD,,
1180
+ cirq_core-1.5.0.dev20240712174048.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1181
+ cirq_core-1.5.0.dev20240712174048.dist-info/METADATA,sha256=NlXO10cYbogOnPAE1Ey5161fy8CcORzhbrcdiEYYDl8,2007
1182
+ cirq_core-1.5.0.dev20240712174048.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
1183
+ cirq_core-1.5.0.dev20240712174048.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1184
+ cirq_core-1.5.0.dev20240712174048.dist-info/RECORD,,