示例#1
0
def test_bounded_effect():
    q = cirq.NamedQubit('q')

    # If the gate isn't bounded, you get a type error.
    op0 = cirq.GateOperation(cirq.SingleQubitGate(), [q])
    assert cirq.trace_distance_bound(op0) >= 1
    op1 = cirq.GateOperation(cirq.Z**0.000001, [q])
    op1_bound = cirq.trace_distance_bound(op1)
    assert op1_bound == cirq.trace_distance_bound(cirq.Z**0.000001)
示例#2
0
def test_trace_bound():
    assert (
        cirq.trace_distance_bound(cirq.PhasedXPowGate(phase_exponent=0.25, exponent=0.001)) < 0.01
    )
    assert (
        cirq.trace_distance_bound(
            cirq.PhasedXPowGate(phase_exponent=0.25, exponent=sympy.Symbol('a'))
        )
        >= 1
    )
def test_bounded_effect():
    qubits = cirq.LineQubit.range(3)
    cy = cirq.ControlledOperation(qubits[:1], cirq.Y(qubits[1]))
    assert cirq.trace_distance_bound(cy**0.001) < 0.01
    foo = sympy.Symbol('foo')
    scy = cirq.ControlledOperation(qubits[:1], cirq.Y(qubits[1])**foo)
    assert cirq.trace_distance_bound(scy) == 1.0
    assert cirq.approx_eq(cirq.trace_distance_bound(cy), 1.0)
    mock = cirq.ControlledOperation(qubits[:1], MockGate().on(*qubits[1:]))
    assert cirq.approx_eq(cirq.trace_distance_bound(mock), 1)
示例#4
0
def test_trace_distance():
    s = cirq.X**0.25
    two_g = cirq.ParallelGate(s, 2)
    three_g = cirq.ParallelGate(s, 3)
    four_g = cirq.ParallelGate(s, 4)
    assert cirq.approx_eq(cirq.trace_distance_bound(two_g), np.sin(np.pi / 4))
    assert cirq.approx_eq(cirq.trace_distance_bound(three_g),
                          np.sin(3 * np.pi / 8))
    assert cirq.approx_eq(cirq.trace_distance_bound(four_g), 1.0)
    spg = cirq.ParallelGate(cirq.X**sympy.Symbol('a'), 4)
    assert cirq.approx_eq(cirq.trace_distance_bound(spg), 1.0)
示例#5
0
def test_trace_distance():
    foo = sympy.Symbol('foo')
    sswap = cirq.SWAP**foo
    siswap = cirq.ISWAP**foo
    # These values should have 1.0 or 0.0 directly returned
    assert cirq.trace_distance_bound(sswap) == 1.0
    assert cirq.trace_distance_bound(siswap) == 1.0
    # These values are calculated, so we use approx_eq
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.SWAP**0.3),
                          np.sin(0.3 * np.pi / 2))
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ISWAP**0), 0.0)
def test_trace_distance():
    s = cirq.X ** 0.25
    twoop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(2))
    threeop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(3))
    fourop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(4))
    assert cirq.approx_eq(cirq.trace_distance_bound(twoop), np.sin(np.pi / 4))
    assert cirq.approx_eq(cirq.trace_distance_bound(threeop), np.sin(3 * np.pi / 8))
    assert cirq.approx_eq(cirq.trace_distance_bound(fourop), 1.0)
    foo = sympy.Symbol('foo')
    spo = cirq.ParallelGateOperation(cirq.X ** foo, cirq.LineQubit.range(4))
    assert cirq.approx_eq(cirq.trace_distance_bound(spo), 1.0)
示例#7
0
def test_trace_distance():
    with cirq.testing.assert_deprecated(deadline="v0.14", count=None):
        s = cirq.X**0.25
        twoop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(2))
        threeop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(3))
        fourop = cirq.ParallelGateOperation(s, cirq.LineQubit.range(4))
        assert cirq.approx_eq(cirq.trace_distance_bound(twoop),
                              np.sin(np.pi / 4))
        assert cirq.approx_eq(cirq.trace_distance_bound(threeop),
                              np.sin(3 * np.pi / 8))
        assert cirq.approx_eq(cirq.trace_distance_bound(fourop), 1.0)
        foo = sympy.Symbol('foo')
        spo = cirq.ParallelGateOperation(cirq.X**foo, cirq.LineQubit.range(4))
        assert cirq.approx_eq(cirq.trace_distance_bound(spo), 1.0)
示例#8
0
def test_trace_distance_bound():
    assert cirq.trace_distance_bound(CExpZinGate(0.001)) < 0.01
    assert cirq.trace_distance_bound(CExpZinGate(sympy.Symbol('a'))) == 1
    assert cirq.approx_eq(cirq.trace_distance_bound(CExpZinGate(2)), 1)

    class E(cirq.EigenGate):
        def _num_qubits_(self):
            # coverage: ignore
            return 1

        def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
            return [(0, np.array([[1, 0], [0, 0]])),
                    (12, np.array([[0, 0], [0, 1]]))]

    for numerator in range(13):
        assert_has_consistent_trace_distance_bound(E()**(numerator / 12))
示例#9
0
def test_trace_distance_bound():

    class NoMethod:
        pass

    class ReturnsNotImplemented:
        def _trace_distance_bound_(self):
            return NotImplemented

    class ReturnsTwo:
        def _trace_distance_bound_(self) -> float:
            return 2.0

    class ReturnsConstant:
        def __init__(self, bound):
            self.bound = bound

        def _trace_distance_bound_(self) -> float:
            return self.bound

    assert cirq.trace_distance_bound(NoMethod()) == 1.0
    assert cirq.trace_distance_bound(ReturnsNotImplemented()) == 1.0
    assert cirq.trace_distance_bound(ReturnsTwo()) == 1.0
    assert cirq.trace_distance_bound(ReturnsConstant(0.1)) == 0.1
    assert cirq.trace_distance_bound(ReturnsConstant(0.5)) == 0.5
    assert cirq.trace_distance_bound(ReturnsConstant(1.0)) == 1.0
    assert cirq.trace_distance_bound(ReturnsConstant(2.0)) == 1.0
示例#10
0
def test_trace_distance():
    foo = sympy.Symbol('foo')
    assert cirq.trace_distance_bound(cirq.XX**foo) == 1.0
    assert cirq.trace_distance_bound(cirq.YY**foo) == 1.0
    assert cirq.trace_distance_bound(cirq.ZZ**foo) == 1.0
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.XX), 1.0)
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.YY**0), 0)
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ZZ ** (1 / 3)), np.sin(np.pi / 6))
示例#11
0
def test_protocols():
    t = sympy.Symbol('t')
    p = cirq.WaitGate(cirq.Duration(millis=5 * t))
    c = cirq.WaitGate(cirq.Duration(millis=2))
    q = cirq.LineQubit(0)

    cirq.testing.assert_implements_consistent_protocols(cirq.wait(q, nanos=0))
    cirq.testing.assert_implements_consistent_protocols(c.on(q))
    cirq.testing.assert_implements_consistent_protocols(p.on(q))

    assert cirq.has_unitary(p)
    assert cirq.has_unitary(c)
    assert cirq.is_parameterized(p)
    assert not cirq.is_parameterized(c)
    assert cirq.resolve_parameters(p, {'t': 2}) == cirq.WaitGate(cirq.Duration(millis=10))
    assert cirq.resolve_parameters(c, {'t': 2}) == c
    assert cirq.resolve_parameters_once(c, {'t': 2}) == c
    assert cirq.trace_distance_bound(p) == 0
    assert cirq.trace_distance_bound(c) == 0
    assert cirq.inverse(c) == c
    assert cirq.inverse(p) == p
    assert cirq.decompose(c.on(q)) == []
    assert cirq.decompose(p.on(q)) == []
示例#12
0
def test_bounded_effect():
    assert cirq.trace_distance_bound(CY**0.001) < 0.01
示例#13
0
def test_tagged_operation_forwards_protocols():
    """The results of all protocols applied to an operation with a tag should
    be equivalent to the result without tags.
    """
    q1 = cirq.GridQubit(1, 1)
    q2 = cirq.GridQubit(1, 2)
    h = cirq.H(q1)
    tag = 'tag1'
    tagged_h = cirq.H(q1).with_tags(tag)

    np.testing.assert_equal(cirq.unitary(tagged_h), cirq.unitary(h))
    assert cirq.has_unitary(tagged_h)
    assert cirq.decompose(tagged_h) == cirq.decompose(h)
    assert cirq.pauli_expansion(tagged_h) == cirq.pauli_expansion(h)
    assert cirq.equal_up_to_global_phase(h, tagged_h)
    assert np.isclose(cirq.channel(h), cirq.channel(tagged_h)).all()

    assert cirq.measurement_key(cirq.measure(q1, key='blah').with_tags(tag)) == 'blah'

    parameterized_op = cirq.XPowGate(exponent=sympy.Symbol('t'))(q1).with_tags(tag)
    assert cirq.is_parameterized(parameterized_op)
    resolver = cirq.study.ParamResolver({'t': 0.25})
    assert cirq.resolve_parameters(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)
    assert cirq.resolve_parameters_once(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)

    y = cirq.Y(q1)
    tagged_y = cirq.Y(q1).with_tags(tag)
    assert tagged_y ** 0.5 == cirq.YPowGate(exponent=0.5)(q1)
    assert tagged_y * 2 == (y * 2)
    assert 3 * tagged_y == (3 * y)
    assert cirq.phase_by(y, 0.125, 0) == cirq.phase_by(tagged_y, 0.125, 0)
    controlled_y = tagged_y.controlled_by(q2)
    assert controlled_y.qubits == (
        q2,
        q1,
    )
    assert isinstance(controlled_y, cirq.Operation)
    assert not isinstance(controlled_y, cirq.TaggedOperation)

    clifford_x = cirq.SingleQubitCliffordGate.X(q1)
    tagged_x = cirq.SingleQubitCliffordGate.X(q1).with_tags(tag)
    assert cirq.commutes(clifford_x, clifford_x)
    assert cirq.commutes(tagged_x, clifford_x)
    assert cirq.commutes(clifford_x, tagged_x)
    assert cirq.commutes(tagged_x, tagged_x)

    assert cirq.trace_distance_bound(y ** 0.001) == cirq.trace_distance_bound(
        (y ** 0.001).with_tags(tag)
    )

    flip = cirq.bit_flip(0.5)(q1)
    tagged_flip = cirq.bit_flip(0.5)(q1).with_tags(tag)
    assert cirq.has_mixture(tagged_flip)
    assert cirq.has_channel(tagged_flip)

    flip_mixture = cirq.mixture(flip)
    tagged_mixture = cirq.mixture(tagged_flip)
    assert len(tagged_mixture) == 2
    assert len(tagged_mixture[0]) == 2
    assert len(tagged_mixture[1]) == 2
    assert tagged_mixture[0][0] == flip_mixture[0][0]
    assert np.isclose(tagged_mixture[0][1], flip_mixture[0][1]).all()
    assert tagged_mixture[1][0] == flip_mixture[1][0]
    assert np.isclose(tagged_mixture[1][1], flip_mixture[1][1]).all()

    qubit_map = {q1: 'q1'}
    qasm_args = cirq.QasmArgs(qubit_id_map=qubit_map)
    assert cirq.qasm(h, args=qasm_args) == cirq.qasm(tagged_h, args=qasm_args)

    cirq.testing.assert_has_consistent_apply_unitary(tagged_h)
示例#14
0
def test_trace_distance():
    foo = sympy.Symbol('foo')
    sx = cirq.X**foo
    sy = cirq.Y**foo
    sz = cirq.Z**foo
    sh = cirq.H**foo
    scx = cirq.CX**foo
    scz = cirq.CZ**foo
    sswap = cirq.SWAP**foo
    siswap = cirq.ISWAP**foo
    # These values should have 1.0 or 0.0 directly returned
    assert cirq.trace_distance_bound(sx) == 1.0
    assert cirq.trace_distance_bound(sy) == 1.0
    assert cirq.trace_distance_bound(sz) == 1.0
    assert cirq.trace_distance_bound(scx) == 1.0
    assert cirq.trace_distance_bound(scz) == 1.0
    assert cirq.trace_distance_bound(sswap) == 1.0
    assert cirq.trace_distance_bound(siswap) == 1.0
    assert cirq.trace_distance_bound(sh) == 1.0
    assert cirq.trace_distance_bound(cirq.I) == 0.0
    # These values are calculated, so we use approx_eq
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.X), 1.0)
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.Y**-1), 1.0)
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.Z**0.5),
                          np.sin(np.pi / 4))
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.H**0.25),
                          np.sin(np.pi / 8))
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.CX**2), 0.0)
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.CZ**(1 / 9)),
                          np.sin(np.pi / 18))
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.SWAP**0.3),
                          np.sin(0.3 * np.pi / 2))
    assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ISWAP**0), 0.0)
示例#15
0
def test_trace_bound():
    assert cirq.trace_distance_bound(cg.ExpWGate(half_turns=.001)) < 0.01
    assert cirq.trace_distance_bound(
        cg.ExpWGate(half_turns=cirq.Symbol('a'))) >= 1
示例#16
0
def test_single_qubit_trace_distance_bound():
    x = cirq.SingleQubitMatrixGate(np.array([[0, 1], [1, 0]]))
    x2 = cirq.SingleQubitMatrixGate(
        np.array([[1, 1j], [1j, 1]]) * np.sqrt(0.5))
    assert cirq.trace_distance_bound(x) >= 1
    assert cirq.trace_distance_bound(x2) >= 0.5
示例#17
0
def test_bounded_effect():
    assert cirq.trace_distance_bound(CY**0.001) < 0.01
    assert cirq.approx_eq(cirq.trace_distance_bound(CCH), 1.0)
    assert cirq.approx_eq(cirq.trace_distance_bound(CRestricted), 1.0)
    foo = sympy.Symbol('foo')
    assert cirq.trace_distance_bound(cirq.ControlledGate(cirq.X**foo)) == 1
示例#18
0
def test_trace_distance_bound():
    class NoMethod:
        pass

    class ReturnsNotImplemented:
        def _trace_distance_bound_(self):
            return NotImplemented

    class ReturnsTwo:
        def _trace_distance_bound_(self) -> float:
            return 2.0

    class ReturnsConstant:
        def __init__(self, bound):
            self.bound = bound

        def _trace_distance_bound_(self) -> float:
            return self.bound

    x = cirq.SingleQubitMatrixGate(cirq.unitary(cirq.X))
    cx = cirq.TwoQubitMatrixGate(cirq.unitary(cirq.CX))
    cxh = cirq.TwoQubitMatrixGate(cirq.unitary(cirq.CX**0.5))

    assert np.isclose(cirq.trace_distance_bound(x),
                      cirq.trace_distance_bound(cirq.X))
    assert np.isclose(cirq.trace_distance_bound(cx),
                      cirq.trace_distance_bound(cirq.CX))
    assert np.isclose(cirq.trace_distance_bound(cxh),
                      cirq.trace_distance_bound(cirq.CX**0.5))
    assert cirq.trace_distance_bound(NoMethod()) == 1.0
    assert cirq.trace_distance_bound(ReturnsNotImplemented()) == 1.0
    assert cirq.trace_distance_bound(ReturnsTwo()) == 1.0
    assert cirq.trace_distance_bound(ReturnsConstant(0.1)) == 0.1
    assert cirq.trace_distance_bound(ReturnsConstant(0.5)) == 0.5
    assert cirq.trace_distance_bound(ReturnsConstant(1.0)) == 1.0
    assert cirq.trace_distance_bound(ReturnsConstant(2.0)) == 1.0
示例#19
0
def test_trace_distance_bound():
    assert cirq.trace_distance_bound(CExpZinGate(0.001)) < 0.01
    assert cirq.trace_distance_bound(CExpZinGate(cirq.Symbol('a'))) >= 1
def test_bounded_effect():
    qubits = cirq.LineQubit.range(2)
    cy = cirq.ControlledOperation(qubits[0], cirq.Y(qubits[1]))
    assert cirq.trace_distance_bound(cy**0.001) < 0.01
示例#21
0
def test_trace_bound():
    assert cirq.trace_distance_bound(cg.ExpWGate(exponent=.001)) < 0.01
    assert cirq.trace_distance_bound(cg.ExpWGate(
        exponent=cirq.Symbol('a'))) >= 1