Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cirq-core/cirq/contrib/noise_models/noise_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ def noisy_moment(self, moment: 'cirq.Moment', system_qubits: Sequence['cirq.Qid'
return moment

return [
moment,
circuits.Moment(
self.qubit_noise_gate(q).with_tags(ops.VirtualTag()) for q in system_qubits
),
moment,
]


Expand Down Expand Up @@ -141,7 +141,7 @@ def __init__(self, depol_prob: float, bitflip_prob: float):
def noisy_moment(self, moment: 'cirq.Moment', system_qubits: Sequence['cirq.Qid']):
if validate_all_measurements(moment):
return [circuits.Moment(self.readout_noise_gate(q) for q in system_qubits), moment]
return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
return [circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits), moment]


class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
Expand Down Expand Up @@ -176,4 +176,4 @@ def noisy_moment(self, moment: 'cirq.Moment', system_qubits: Sequence['cirq.Qid'
moment,
]
else:
return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
return [circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits), moment]
40 changes: 20 additions & 20 deletions cirq-core/cirq/contrib/noise_models/noise_models_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ def test_depol_noise():
noise_model = ccn.DepolarizingNoiseModel(depol_prob=0.005)
qubits = cirq.LineQubit.range(2)
moment = cirq.Moment([cirq.X(qubits[0]), cirq.Y(qubits[1])])
noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
assert len(noisy_mom) == 2
assert noisy_mom[0] == moment
for g in noisy_mom[1]:
noisy_moment = noise_model.noisy_moment(moment, system_qubits=qubits)
assert len(noisy_moment) == 2
assert noisy_moment[1] == moment
for g in noisy_moment[0]:
assert isinstance(g.gate, cirq.DepolarizingChannel)


# Composes depolarization noise with readout noise.
def test_readout_noise_after_moment():
def test_readout_noise_before_moment():
program = cirq.Circuit()
qubits = cirq.LineQubit.range(3)
program.append(
Expand All @@ -53,21 +53,21 @@ def test_readout_noise_after_moment():

# Insert channels explicitly
true_noisy_program = cirq.Circuit()
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append(
[cirq.BitFlipChannel(0.05).on(q).with_tags(ops.VirtualTag()) for q in qubits]
)
Expand All @@ -82,7 +82,7 @@ def test_readout_noise_after_moment():


# Composes depolarization, damping, and readout noise (in that order).
def test_decay_noise_after_moment():
def test_decay_noise_before_moment():
program = cirq.Circuit()
qubits = cirq.LineQubit.range(3)
program.append(
Expand All @@ -107,21 +107,21 @@ def test_decay_noise_after_moment():

# Insert channels explicitly
true_noisy_program = cirq.Circuit()
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q).with_tags(ops.VirtualTag()) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append(
[cirq.AmplitudeDampingChannel(0.02).on(q).with_tags(ops.VirtualTag()) for q in qubits]
)
Expand All @@ -139,7 +139,7 @@ def test_decay_noise_after_moment():


# Test the aggregate noise models.
def test_aggregate_readout_noise_after_moment():
def test_aggregate_readout_noise_before_moment():
program = cirq.Circuit()
qubits = cirq.LineQubit.range(3)
program.append(
Expand All @@ -160,21 +160,21 @@ def test_aggregate_readout_noise_after_moment():

# Insert channels explicitly
true_noisy_program = cirq.Circuit()
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.BitFlipChannel(0.05).on(q) for q in qubits])
true_noisy_program.append(
[
Expand All @@ -186,7 +186,7 @@ def test_aggregate_readout_noise_after_moment():
assert_equivalent_op_tree(true_noisy_program, noisy_circuit)


def test_aggregate_decay_noise_after_moment():
def test_aggregate_decay_noise_before_moment():
program = cirq.Circuit()
qubits = cirq.LineQubit.range(3)
program.append(
Expand All @@ -209,21 +209,21 @@ def test_aggregate_decay_noise_after_moment():

# Insert channels explicitly
true_noisy_program = cirq.Circuit()
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append([cirq.H(qubits[0])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.CNOT(qubits[0], qubits[1])])
true_noisy_program.append(
[cirq.DepolarizingChannel(0.01).on(q) for q in qubits],
strategy=cirq.InsertStrategy.NEW_THEN_INLINE,
)
true_noisy_program.append([cirq.CNOT(qubits[1], qubits[2])])
true_noisy_program.append([cirq.AmplitudeDampingChannel(0.02).on(q) for q in qubits])
true_noisy_program.append([cirq.BitFlipChannel(0.05).on(q) for q in qubits])
true_noisy_program.append(
Expand Down
3 changes: 2 additions & 1 deletion cirq-core/cirq/devices/insertion_noise_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,15 @@ class InsertionNoiseModel(devices.NoiseModel):
qubits and A does not) then the first one appering in this dict
will match.
prepend: whether to add the new moment before the current one.
Defaults to True.
require_physical_tag: whether to only apply noise to operations tagged
with PHYSICAL_GATE_TAG.
"""

ops_added: Dict[noise_utils.OpIdentifier, 'cirq.Operation'] = dataclasses.field(
default_factory=dict
)
prepend: bool = False
prepend: bool = True
require_physical_tag: bool = True

def noisy_moment(
Expand Down
20 changes: 10 additions & 10 deletions cirq-core/cirq/devices/insertion_noise_model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,24 @@ def test_insertion_noise():
model = InsertionNoiseModel(
{op_id0: cirq.T(q0), op_id1: cirq.H(q1)}, require_physical_tag=False
)
assert not model.prepend
assert model.prepend

moment_0 = cirq.Moment(cirq.X(q0), cirq.X(q1))
assert model.noisy_moment(moment_0, system_qubits=[q0, q1]) == [
moment_0,
cirq.Moment(cirq.T(q0)),
moment_0,
]

moment_1 = cirq.Moment(cirq.Z(q0), cirq.Z(q1))
assert model.noisy_moment(moment_1, system_qubits=[q0, q1]) == [
moment_1,
cirq.Moment(cirq.H(q1)),
moment_1,
]

moment_2 = cirq.Moment(cirq.X(q0), cirq.Z(q1))
assert model.noisy_moment(moment_2, system_qubits=[q0, q1]) == [
moment_2,
cirq.Moment(cirq.T(q0), cirq.H(q1)),
moment_2,
]

moment_3 = cirq.Moment(cirq.Z(q0), cirq.X(q1))
Expand All @@ -56,9 +56,9 @@ def test_colliding_noise_qubits():

moment_0 = cirq.Moment(cirq.CZ(q0, q1), cirq.CZ(q2, q3))
assert model.noisy_moment(moment_0, system_qubits=[q0, q1, q2, q3]) == [
moment_0,
cirq.Moment(cirq.CNOT(q1, q2)),
cirq.Moment(cirq.CNOT(q1, q2)),
moment_0,
]


Expand All @@ -67,13 +67,13 @@ def test_prepend():
op_id0 = OpIdentifier(cirq.XPowGate, q0)
op_id1 = OpIdentifier(cirq.ZPowGate, q1)
model = InsertionNoiseModel(
{op_id0: cirq.T(q0), op_id1: cirq.H(q1)}, prepend=True, require_physical_tag=False
{op_id0: cirq.T(q0), op_id1: cirq.H(q1)}, prepend=False, require_physical_tag=False
)

moment_0 = cirq.Moment(cirq.X(q0), cirq.Z(q1))
assert model.noisy_moment(moment_0, system_qubits=[q0, q1]) == [
cirq.Moment(cirq.T(q0), cirq.H(q1)),
moment_0,
cirq.Moment(cirq.T(q0), cirq.H(q1)),
]


Expand All @@ -86,8 +86,8 @@ def test_require_physical_tag():

moment_0 = cirq.Moment(cirq.X(q0).with_tags(PHYSICAL_GATE_TAG), cirq.Z(q1))
assert model.noisy_moment(moment_0, system_qubits=[q0, q1]) == [
moment_0,
cirq.Moment(cirq.T(q0)),
moment_0,
]


Expand All @@ -102,7 +102,7 @@ def test_supertype_matching():
)

moment_0 = cirq.Moment(cirq.Rx(rads=1).on(q0))
assert model.noisy_moment(moment_0, system_qubits=[q0]) == [moment_0, cirq.Moment(cirq.S(q0))]
assert model.noisy_moment(moment_0, system_qubits=[q0]) == [cirq.Moment(cirq.S(q0)), moment_0]

moment_1 = cirq.Moment(cirq.Y(q0))
assert model.noisy_moment(moment_1, system_qubits=[q0]) == [moment_1, cirq.Moment(cirq.T(q0))]
assert model.noisy_moment(moment_1, system_qubits=[q0]) == [cirq.Moment(cirq.T(q0)), moment_1]
2 changes: 1 addition & 1 deletion cirq-core/cirq/devices/noise_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,10 @@ def noisy_moment(self, moment: 'cirq.Moment', system_qubits: Sequence['cirq.Qid'
if self.is_virtual_moment(moment):
return moment
return [
moment,
moment_module.Moment(
[self.qubit_noise_gate(q).with_tags(ops.VirtualTag()) for q in system_qubits]
),
moment,
]

def _json_dict_(self):
Expand Down
6 changes: 3 additions & 3 deletions cirq-core/cirq/devices/noise_model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,12 @@ def test_constant_qubit_noise():
actual = damp_all.noisy_moments([cirq.Moment([cirq.X(a)]), cirq.Moment()], [a, b, c])
expected = [
[
cirq.Moment([cirq.X(a)]),
cirq.Moment(d.with_tags(ops.VirtualTag()) for d in [damp(a), damp(b), damp(c)]),
cirq.Moment([cirq.X(a)]),
],
[
cirq.Moment(),
cirq.Moment(d.with_tags(ops.VirtualTag()) for d in [damp(a), damp(b), damp(c)]),
cirq.Moment(),
],
]
assert actual == expected
Expand All @@ -137,12 +137,12 @@ def test_noise_composition():
actual_sz = cirq.Circuit(noise_z.noisy_moments(circuit_s.moments, [a, b, c]))

expected_circuit = cirq.Circuit(
cirq.Moment([cirq.S(a), cirq.S(b), cirq.S(c)]),
cirq.Moment([cirq.X(a)]),
cirq.Moment([cirq.S(a), cirq.S(b), cirq.S(c)]),
cirq.Moment([cirq.Y(b)]),
cirq.Moment([cirq.S(a), cirq.S(b), cirq.S(c)]),
cirq.Moment([cirq.H(c)]),
cirq.Moment([cirq.S(a), cirq.S(b), cirq.S(c)]),
)

# All of the gates will be the same, just out of order. Merging fixes this.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,6 @@ def build_noise_models(self) -> List['cirq.NoiseModel']:
noise_utils.OpIdentifier(ops.MeasurementGate, qubit)
] = ops.generalized_amplitude_damp(p, gamma).on(qubit)

noise_models.append(
devices.InsertionNoiseModel(ops_added=added_measure_errors, prepend=True)
)
noise_models.append(devices.InsertionNoiseModel(ops_added=added_measure_errors))

return noise_models
Loading