def test_init(): p = cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.5) assert p.sub_gate is cirq.X assert p.probability == 0.5 with pytest.raises(ValueError, match='probability'): _ = cirq.RandomGateChannel(sub_gate=cirq.X, probability=2) with pytest.raises(ValueError, match='probability'): _ = cirq.RandomGateChannel(sub_gate=cirq.X, probability=-1)
def test_consistent_protocols(): cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=1)) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=0)) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=sympy.Symbol('x') / 2)) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.5))
def test_eq(): eq = cirq.testing.EqualsTester() q = cirq.LineQubit(0) eq.add_equality_group( cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.5), cirq.X.with_probability(0.5)) # Each field matters for equality. eq.add_equality_group(cirq.Y.with_probability(0.5)) eq.add_equality_group(cirq.X.with_probability(0.25)) # `with_probability(1)` doesn't wrap eq.add_equality_group(cirq.X, cirq.X.with_probability(1)) eq.add_equality_group( cirq.X.with_probability(1).on(q), cirq.X.on(q).with_probability(1), cirq.X(q), ) # `with_probability` with `on`. eq.add_equality_group( cirq.X.with_probability(0.5).on(q), cirq.X.on(q).with_probability(0.5), ) # Flattening. eq.add_equality_group( cirq.RandomGateChannel(sub_gate=cirq.Z, probability=0.25), cirq.RandomGateChannel(sub_gate=cirq.RandomGateChannel( sub_gate=cirq.Z, probability=0.5), probability=0.5), cirq.Z.with_probability(0.5).with_probability(0.5), cirq.Z.with_probability(0.25), ) # Supports approximate equality. assert cirq.approx_eq( cirq.X.with_probability(0.5), cirq.X.with_probability(0.50001), atol=1e-2, ) assert not cirq.approx_eq( cirq.X.with_probability(0.5), cirq.X.with_probability(0.50001), atol=1e-8, )
def test_setters_deprecated(): gate = cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.1) with cirq.testing.assert_deprecated('mutators', deadline='v0.15'): gate.sub_gate = cirq.Y assert gate.sub_gate == cirq.Y with cirq.testing.assert_deprecated('mutators', deadline='v0.15'): gate.probability = 0.2 assert gate.probability == 0.2
def test_consistent_protocols(): cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=1), ignore_decompose_to_default_gateset=True, ) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=0), ignore_decompose_to_default_gateset=True, ) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=sympy.Symbol('x') / 2), ignore_decompose_to_default_gateset=True, ) cirq.testing.assert_implements_consistent_protocols( cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.5), ignore_decompose_to_default_gateset=True, )
def test_parameterizable(resolve_fn): a = sympy.Symbol('a') cy = cirq.ControlledGate(cirq.Y) cya = cirq.ControlledGate(cirq.YPowGate(exponent=a)) assert cirq.is_parameterized(cya) assert not cirq.is_parameterized(cy) assert resolve_fn(cya, cirq.ParamResolver({'a': 1})) == cy cchan = cirq.ControlledGate( cirq.RandomGateChannel(sub_gate=cirq.PhaseDampingChannel(0.1), probability=a)) with pytest.raises(ValueError, match='Cannot control channel'): resolve_fn(cchan, cirq.ParamResolver({'a': 0.1}))
def test_parameterizable(resolve_fn): a = sympy.Symbol('a') qubits = cirq.LineQubit.range(3) cz = cirq.ControlledOperation(qubits[:1], cirq.Z(qubits[1])) cza = cirq.ControlledOperation(qubits[:1], cirq.ZPowGate(exponent=a)(qubits[1])) assert cirq.is_parameterized(cza) assert not cirq.is_parameterized(cz) assert resolve_fn(cza, cirq.ParamResolver({'a': 1})) == cz cchan = cirq.ControlledOperation( [qubits[0]], cirq.RandomGateChannel(sub_gate=cirq.PhaseDampingChannel(0.1), probability=a)(qubits[1]), ) with pytest.raises(ValueError, match='Cannot control channel'): resolve_fn(cchan, cirq.ParamResolver({'a': 0.1}))