示例#1
0
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)
示例#2
0
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))
示例#3
0
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,
    )
示例#4
0
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,
    )
示例#6
0
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}))