def test_idiv(): p = cirq.MutableDensePauliString('XYZ', coefficient=2) p /= 2 assert p == cirq.MutableDensePauliString('XYZ') with pytest.raises(TypeError): p /= object()
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)
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 ]
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
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
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]))
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
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),