Example #1
0
def test_idiv():
    p = cirq.MutableDensePauliString('XYZ', coefficient=2)
    p /= 2
    assert p == cirq.MutableDensePauliString('XYZ')

    with pytest.raises(TypeError):
        p /= object()
Example #2
0
def test_symbolic():
    t = sympy.Symbol('t')
    r = sympy.Symbol('r')
    p = cirq.MutableDensePauliString('XYZ', coefficient=t)
    assert p * r == cirq.DensePauliString('XYZ', coefficient=t * r)
    p *= r
    assert p == cirq.MutableDensePauliString('XYZ', coefficient=t * r)
    p /= r
    assert p == cirq.MutableDensePauliString('XYZ', coefficient=t)
Example #3
0
 def table(*rows: str) -> List[cirq.MutableDensePauliString]:
     coefs = {'i': 1j, '-': -1, '+': 1}
     return [
         cirq.MutableDensePauliString(row[1:].replace('.', 'I'),
                                      coefficient=coefs[row[0]])
         for row in rows
     ]
Example #4
0
def test_protocols():
    t = sympy.Symbol('t')

    cirq.testing.assert_implements_consistent_protocols(
        cirq.DensePauliString('Y'))
    cirq.testing.assert_implements_consistent_protocols(
        -cirq.DensePauliString('Z'))
    cirq.testing.assert_implements_consistent_protocols(
        1j * cirq.DensePauliString('X'))
    cirq.testing.assert_implements_consistent_protocols(
        2 * cirq.DensePauliString('X'))
    cirq.testing.assert_implements_consistent_protocols(
        t * cirq.DensePauliString('XYIZ'))
    cirq.testing.assert_implements_consistent_protocols(
        cirq.DensePauliString('XYIZ', coefficient=t + 2))
    cirq.testing.assert_implements_consistent_protocols(
        -cirq.DensePauliString('XYIZ'))
    cirq.testing.assert_implements_consistent_protocols(
        cirq.MutableDensePauliString('XYIZ', coefficient=-1))

    # Unitarity and shape.
    assert cirq.has_unitary(1j * cirq.DensePauliString('X'))
    assert not cirq.has_unitary(2j * cirq.DensePauliString('X'))
    assert not cirq.has_unitary(cirq.DensePauliString('X') * t)
    p = -cirq.DensePauliString('XYIZ')
    assert cirq.num_qubits(p) == len(p) == 4

    # Parameterization.
    x = cirq.DensePauliString('X')
    assert not cirq.is_parameterized(x)
    assert not cirq.is_parameterized(x * 2)
    assert cirq.is_parameterized(x * t)
    assert cirq.resolve_parameters(x * t, {'t': 2}) == x * 2
    assert cirq.resolve_parameters(x * 3, {'t': 2}) == x * 3
Example #5
0
def test_init():
    mask = np.array([0, 3, 1, 2], dtype=np.uint8)
    p = cirq.DensePauliString(coefficient=2, pauli_mask=mask)
    m = cirq.MutableDensePauliString(coefficient=3, pauli_mask=mask)
    assert p.coefficient == 2
    assert m.coefficient == 3
    np.testing.assert_allclose(p.pauli_mask, [0, 3, 1, 2])
    np.testing.assert_allclose(m.pauli_mask, [0, 3, 1, 2])

    # The non-mutable initializer makes a copy.
    assert m.pauli_mask is mask
    assert p.pauli_mask is not mask
    mask[:] = 0
    assert m.pauli_mask[2] == 0
    assert p.pauli_mask[2] == 1

    # Copies and converts non-uint8 arrays.
    p2 = cirq.DensePauliString(coefficient=2, pauli_mask=[1, 2, 3])
    m2 = cirq.DensePauliString(coefficient=2, pauli_mask=[1, 2, 3])
    assert p2.pauli_mask.dtype == m2.pauli_mask.dtype == np.uint8
    assert list(p2.pauli_mask) == list(m2.pauli_mask) == [1, 2, 3]

    # Mixed types.
    assert cirq.DensePauliString([1, 'X',
                                  cirq.X]) == cirq.DensePauliString('XXX')
    with pytest.raises(TypeError, match='Expected a cirq.PAULI_GATE_LIKE'):
        _ = cirq.DensePauliString([object()])
def test_protocols():
    t = sympy.Symbol('t')
    cirq.testing.assert_implements_consistent_protocols(
        cirq.DensePauliString('Y'))
    cirq.testing.assert_implements_consistent_protocols(
        -cirq.DensePauliString('Z'))
    cirq.testing.assert_implements_consistent_protocols(
        1j * cirq.DensePauliString('X'))
    cirq.testing.assert_implements_consistent_protocols(
        2 * cirq.DensePauliString('X'))
    cirq.testing.assert_implements_consistent_protocols(
        t * cirq.DensePauliString('XYIZ'),
        ignore_decompose_to_default_gateset=True)
    cirq.testing.assert_implements_consistent_protocols(
        cirq.DensePauliString('XYIZ', coefficient=t + 2),
        ignore_decompose_to_default_gateset=True)
    cirq.testing.assert_implements_consistent_protocols(
        -cirq.DensePauliString('XYIZ'))
    cirq.testing.assert_implements_consistent_protocols(
        cirq.MutableDensePauliString('XYIZ', coefficient=-1))

    # Unitarity and shape.
    assert cirq.has_unitary(1j * cirq.DensePauliString('X'))
    assert not cirq.has_unitary(2j * cirq.DensePauliString('X'))
    assert not cirq.has_unitary(cirq.DensePauliString('X') * t)
    p = -cirq.DensePauliString('XYIZ')
    assert cirq.num_qubits(p) == len(p) == 4
Example #7
0
def test_immutable_eq():
    eq = cirq.testing.EqualsTester()

    # Immutables
    eq.make_equality_group(
        lambda: cirq.DensePauliString(coefficient=2, pauli_mask=[1]))
    eq.add_equality_group(
        lambda: cirq.DensePauliString(coefficient=3, pauli_mask=[1]))
    eq.make_equality_group(
        lambda: cirq.DensePauliString(coefficient=2, pauli_mask=[]))
    eq.add_equality_group(
        lambda: cirq.DensePauliString(coefficient=2, pauli_mask=[0]))
    eq.make_equality_group(
        lambda: cirq.DensePauliString(coefficient=2, pauli_mask=[2]))

    # Mutables
    eq.make_equality_group(
        lambda: cirq.MutableDensePauliString(coefficient=2, pauli_mask=[1]))
    eq.add_equality_group(
        lambda: cirq.MutableDensePauliString(coefficient=3, pauli_mask=[1]))
    eq.make_equality_group(
        lambda: cirq.MutableDensePauliString(coefficient=2, pauli_mask=[]))
    eq.make_equality_group(
        lambda: cirq.MutableDensePauliString(coefficient=2, pauli_mask=[2]))
Example #8
0
def test_copy():
    p = -cirq.DensePauliString('XYZ')
    m = cirq.MutableDensePauliString('XYZ', coefficient=-1)

    # Immutable copies.
    assert p.copy() is p
    assert p.frozen() is p
    assert p.mutable_copy() is not p
    assert p.mutable_copy() == m

    # Mutable copies.
    assert m.copy() is not m
    assert m.copy() == m
    assert m.frozen() == p
    assert m.mutable_copy() is not m
    assert m.mutable_copy() == m

    # Copy immutable with modifications.
    assert p.copy(coefficient=-1) is p
    assert p.copy(coefficient=-2) is not p
    assert p.copy(coefficient=-2) == -2 * cirq.DensePauliString('XYZ')
    assert p.copy(coefficient=-2,
                  pauli_mask=[3]) == -2 * cirq.DensePauliString('Z')

    # Copy mutable with modifications.
    assert m.copy(coefficient=-1) is not m
    assert m.copy(coefficient=-2) is not m
    assert m.copy(coefficient=-2) == cirq.MutableDensePauliString(
        'XYZ', coefficient=-2)
    assert m.copy(coefficient=-2,
                  pauli_mask=[2]) == cirq.MutableDensePauliString(
                      'Y', coefficient=-2)

    # Aliasing of the mask attribute when copying with modifications.
    mask = np.array([1, 2, 3], dtype=np.uint8)
    assert cirq.MutableDensePauliString(mask).copy().pauli_mask is not mask
    assert cirq.MutableDensePauliString(mask).copy(
        pauli_mask=mask).pauli_mask is mask
    assert cirq.MutableDensePauliString('XYZ').copy(
        pauli_mask=mask).pauli_mask is mask
Example #9
0
                       global_shift=0).on(Q0)),
     # TODO: even the following doesn't work because theta gets
     #       multiplied by 1/pi.
     #       https://github.com/quantumlib/Cirq/issues/2014
     # cirq.Circuit(cirq.Rx(sympy.Symbol('theta')).on(Q0)),
 ],
 'ConstantQubitNoiseModel':
 cirq.ConstantQubitNoiseModel(cirq.X),
 'Duration':
 cirq.Duration(picos=6),
 'DensePauliString':
 cirq.DensePauliString('XYZI', coefficient=1j),
 'DepolarizingChannel':
 cirq.DepolarizingChannel(0.5),
 'MutableDensePauliString':
 cirq.MutableDensePauliString('XXZZ', coefficient=-2),
 'FREDKIN':
 cirq.FREDKIN,
 'FSimGate':
 cirq.FSimGate(theta=0.123, phi=.456),
 'Foxtail':
 cirq.google.Foxtail,
 'GateOperation': [
     cirq.CCNOT(*cirq.LineQubit.range(3)),
     cirq.CCZ(*cirq.LineQubit.range(3)),
     cirq.CNOT(*cirq.LineQubit.range(2)),
     cirq.CSWAP(*cirq.LineQubit.range(3)),
     cirq.CZ(*cirq.LineQubit.range(2))
 ],
 'GeneralizedAmplitudeDampingChannel':
 cirq.GeneralizedAmplitudeDampingChannel(0.1, 0.2),