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)
示例#2
0
def test_gate_operation_approx_eq():
    a = [cirq.NamedQubit('r1')]
    b = [cirq.NamedQubit('r2')]

    assert cirq.approx_eq(cirq.GateOperation(cirq.XPowGate(), a),
                          cirq.GateOperation(cirq.XPowGate(), a))
    assert not cirq.approx_eq(cirq.GateOperation(cirq.XPowGate(), a),
                              cirq.GateOperation(cirq.XPowGate(), b))

    assert cirq.approx_eq(cirq.GateOperation(cirq.XPowGate(exponent=0), a),
                          cirq.GateOperation(cirq.XPowGate(exponent=1e-9), a))
    assert not cirq.approx_eq(
        cirq.GateOperation(cirq.XPowGate(exponent=0), a),
        cirq.GateOperation(cirq.XPowGate(exponent=1e-7), a))
    assert cirq.approx_eq(cirq.GateOperation(cirq.XPowGate(exponent=0), a),
                          cirq.GateOperation(cirq.XPowGate(exponent=1e-7), a),
                          atol=1e-6)
示例#3
0
def test_decompose_two_qubit_interaction_into_two_b_gates(obj: Any):
    circuit = cirq.Circuit(
        _decompose_two_qubit_interaction_into_two_b_gates(
            obj, qubits=cirq.LineQubit.range(2)))
    desired_unitary = obj if isinstance(obj, np.ndarray) else cirq.unitary(obj)
    for operation in circuit.all_operations():
        assert len(operation.qubits) < 2 or operation.gate == _B
    assert cirq.approx_eq(cirq.unitary(circuit), desired_unitary, atol=1e-6)
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_approx_eq_symbol():
    q = cirq.GridQubit(0, 0)
    s = sympy.Symbol("s")
    t = sympy.Symbol("t")

    assert not cirq.approx_eq(t + 1.51 + s, t + 1.50 + s, atol=0.005)
    assert cirq.approx_eq(t + 1.51 + s, t + 1.50 + s, atol=0.020)

    with pytest.raises(
            AttributeError,
            match="Insufficient information to decide whether expressions are "
            "approximately equal .* vs .*",
    ):
        cirq.approx_eq(t, 0.0, atol=0.005)

    symbol_1 = cirq.Circuit(cirq.rz(1.515 + s)(q))
    symbol_2 = cirq.Circuit(cirq.rz(1.510 + s)(q))
    assert cirq.approx_eq(symbol_1, symbol_2, atol=0.2)

    symbol_3 = cirq.Circuit(cirq.rz(1.510 + t)(q))
    with pytest.raises(
            AttributeError,
            match="Insufficient information to decide whether expressions are "
            "approximately equal .* vs .*",
    ):
        cirq.approx_eq(symbol_1, symbol_3, atol=0.2)
示例#6
0
def test_phased_fsim_phase_angle_symmetry(rz_angles_before, rz_angles_after):
    f = cirq.PhasedFSimGate.from_fsim_rz(np.pi / 3, np.pi / 5, rz_angles_before, rz_angles_after)
    for d in (-10, -7, -2 * np.pi, -0.2, 0, 0.1, 0.2, np.pi, 8, 20):
        rz_angles_before2 = (rz_angles_before[0] + d, rz_angles_before[1] + d)
        rz_angles_after2 = (rz_angles_after[0] - d, rz_angles_after[1] - d)
        f2 = cirq.PhasedFSimGate.from_fsim_rz(
            np.pi / 3, np.pi / 5, rz_angles_before2, rz_angles_after2
        )
        assert cirq.approx_eq(f, f2)
示例#7
0
def test_periodic_value_approx_eq_boundary():
    assert cirq.approx_eq(cirq.PeriodicValue(0.0, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.2)
    assert cirq.approx_eq(cirq.PeriodicValue(0.1, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.3)
    assert cirq.approx_eq(cirq.PeriodicValue(1.9, 2.0), cirq.PeriodicValue(0.1, 2.0), atol=0.3)
    assert not cirq.approx_eq(cirq.PeriodicValue(0.1, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.1)
    assert cirq.approx_eq(cirq.PeriodicValue(0, 1.0), cirq.PeriodicValue(0.5, 1.0), atol=0.6)
    assert not cirq.approx_eq(cirq.PeriodicValue(0, 1.0), cirq.PeriodicValue(0.5, 1.0), atol=0.1)
    assert cirq.approx_eq(cirq.PeriodicValue(0.4, 1.0), cirq.PeriodicValue(0.6, 1.0), atol=0.3)
示例#8
0
def test_periodic_value_approx_eq_basic():
    assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.0, 2.0), atol=0.1)
    assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.3)
    assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.1)
    assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.0, 2.2), atol=0.3)
    assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.0, 2.2), atol=0.1)
    assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.2), atol=0.3)
    assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.2), atol=0.1)
def test_approx_eq_primitives():
    assert not cirq.approx_eq(1, 2, atol=1e-01)
    assert cirq.approx_eq(1.0, 1.0 + 1e-10, atol=1e-09)
    assert not cirq.approx_eq(1.0, 1.0 + 1e-10, atol=1e-11)
    assert cirq.approx_eq(0.0, 1e-10, atol=1e-09)
    assert not cirq.approx_eq(0.0, 1e-10, atol=1e-11)
    assert cirq.approx_eq(complex(1, 1), complex(1.1, 1.2), atol=0.3)
    assert not cirq.approx_eq(complex(1, 1), complex(1.1, 1.2), atol=0.1)
def test_approx_eq_list():
    assert cirq.approx_eq([], [], atol=0.0)
    assert not cirq.approx_eq([], [[]], atol=0.0)
    assert cirq.approx_eq([1, 1], [1, 1], atol=0.0)
    assert not cirq.approx_eq([1, 1], [1, 1, 1], atol=0.0)
    assert not cirq.approx_eq([1, 1], [1], atol=0.0)
    assert cirq.approx_eq([1.1, 1.2, 1.3], [1, 1, 1], atol=0.4)
    assert not cirq.approx_eq([1.1, 1.2, 1.3], [1, 1, 1], atol=0.2)
示例#11
0
def test_create_circuits_initial_trapping(layout_type: type) -> None:
    layout = layout_type(size=4)
    parameters = _create_test_parameters(
        layout,
        initial_state=IndependentChainsInitialState(
            up=UniformTrappingPotential(particles=2),
            down=GaussianTrappingPotential(particles=2,
                                           center=0.2,
                                           sigma=0.3,
                                           scale=0.4)))

    initial, _, _ = create_circuits(parameters, trotter_steps=0)

    up1, up2, up3, up4 = layout.up_qubits
    down1, down2, down3, down4 = layout.down_qubits

    expected = cirq.Circuit([
        cirq.Moment(cirq.X(up1), cirq.X(up2), cirq.X(down1), cirq.X(down2)),
        cirq.Moment(
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.7322795271987699).on(up2, up3),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.7502896835888355).on(
                                        down2, down3),
        ),
        cirq.Moment((cirq.Z**0.0).on(up3), (cirq.Z**0.0).on(down3)),
        cirq.Moment(
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.564094216848975).on(up1, up2),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5768514417132005).on(
                                        down1, down2),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5640942168489748).on(up3, up4),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5973464819433905).on(
                                        down3, down4),
        ),
        cirq.Moment(
            (cirq.Z**0.0).on(up2),
            (cirq.Z**0.0).on(down2),
            (cirq.Z**0.0).on(up4),
            (cirq.Z**0.0).on(down4),
        ),
        cirq.Moment(
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.26772047280123007).on(
                                        up2, up3),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.2994619470606122).on(
                                        down2, down3),
        ),
        cirq.Moment((cirq.Z**0.0).on(up3), (cirq.Z**0.0).on(down3)),
    ])

    assert cirq.approx_eq(initial, expected)
示例#12
0
def test_diagonal_exponent():
    diagonal_angles = [2, 3, 5, 7]
    diagonal_gate = cirq.TwoQubitDiagonalGate(diagonal_angles)

    sqrt_diagonal_gate = diagonal_gate ** 0.5

    expected_angles = [prime / 2 for prime in diagonal_angles]
    assert cirq.approx_eq(sqrt_diagonal_gate, cirq.TwoQubitDiagonalGate(expected_angles))

    assert cirq.pow(cirq.TwoQubitDiagonalGate(diagonal_angles), "test", None) is None
示例#13
0
def test_decompose_two_qubit_interaction_into_four_fsim_gates_equivalence(
    obj: Any, fsim_gate: cirq.FSimGate
):
    qubits = obj.qubits if isinstance(obj, cirq.Operation) else cirq.LineQubit.range(2)
    circuit = cirq.decompose_two_qubit_interaction_into_four_fsim_gates(obj, fsim_gate=fsim_gate)
    desired_unitary = obj if isinstance(obj, np.ndarray) else cirq.unitary(obj)
    for operation in circuit.all_operations():
        assert len(operation.qubits) < 2 or operation.gate == fsim_gate
    assert len(circuit) <= 4 * 3 + 5
    assert cirq.approx_eq(circuit.unitary(qubit_order=qubits), desired_unitary, atol=1e-6)
示例#14
0
 def test_binding_and_exporting_parametrized_circuit_results_in_equivalent_circuit(
         self, zquantum_circuit, cirq_circuit):
     bound = zquantum_circuit.bind(EXAMPLE_PARAM_VALUES)
     bound_converted = export_to_cirq(bound)
     ref_bound = cirq.resolve_parameters(
         cirq_circuit, {
             **EXAMPLE_PARAM_VALUES, sympy.pi: 3.14
         })
     assert cirq.approx_eq(bound_converted, ref_bound), (
         f"Converted circuit:\n{bound_converted}\n isn't equal to\n{ref_bound}"
     )
示例#15
0
 def _approx_eq_or_symbol(self, lhs: Any, rhs: Any) -> bool:
     lhs = lhs if isinstance(lhs, tuple) else (lhs, )
     rhs = rhs if isinstance(rhs, tuple) else (rhs, )
     assert len(lhs) == len(rhs)
     for l, r in zip(lhs, rhs):
         is_parameterized = cirq.is_parameterized(
             l) or cirq.is_parameterized(r)
         if (is_parameterized and not self.allow_symbols) or (
                 not is_parameterized
                 and not cirq.approx_eq(l, r, atol=self.atol)):
             return False
     return True
示例#16
0
def test_simulate_expectation_values(dtype):
    # Compare with test_expectation_from_state_vector_two_qubit_states
    # in file: cirq/ops/linear_combinations_test.py
    q0, q1 = cirq.LineQubit.range(2)
    psum1 = cirq.Z(q0) + 3.2 * cirq.Z(q1)
    psum2 = -1 * cirq.X(q0) + 2 * cirq.X(q1)
    c1 = cirq.Circuit(cirq.I(q0), cirq.X(q1))
    simulator = cirq.Simulator(dtype=dtype)
    result = simulator.simulate_expectation_values(c1, [psum1, psum2])
    assert cirq.approx_eq(result[0], -2.2, atol=1e-6)
    assert cirq.approx_eq(result[1], 0, atol=1e-6)

    c2 = cirq.Circuit(cirq.H(q0), cirq.H(q1))
    result = simulator.simulate_expectation_values(c2, [psum1, psum2])
    assert cirq.approx_eq(result[0], 0, atol=1e-6)
    assert cirq.approx_eq(result[1], 1, atol=1e-6)

    psum3 = cirq.Z(q0) + cirq.X(q1)
    c3 = cirq.Circuit(cirq.I(q0), cirq.H(q1))
    result = simulator.simulate_expectation_values(c3, psum3)
    assert cirq.approx_eq(result[0], 2, atol=1e-6)
def test_approx_eq_uses__eq__():
    assert cirq.approx_eq(C(0), C(0), atol=0.0)
    assert not cirq.approx_eq(C(1), C(2), atol=0.0)
    assert cirq.approx_eq([C(0)], [C(0)], atol=0.0)
    assert not cirq.approx_eq([C(1)], [C(2)], atol=0.0)
    assert cirq.approx_eq(complex(0, 0), 0, atol=0.0)
    assert cirq.approx_eq(0, complex(0, 0), atol=0.0)
示例#18
0
def test_convert_to_ion_gates():
    q0 = cirq.GridQubit(0, 0)
    q1 = cirq.GridQubit(0, 1)
    op = cirq.CNOT(q0, q1)
    circuit = cirq.Circuit()

    with pytest.raises(TypeError):
        cirq.ion.ConvertToIonGates().convert_one(circuit)

    with pytest.raises(TypeError):
        cirq.ion.ConvertToIonGates().convert_one(NoUnitary().on(q0))

    no_unitary_op = NoUnitary().on(q0)
    assert cirq.ion.ConvertToIonGates(ignore_failures=True).convert_one(no_unitary_op) == [
        no_unitary_op
    ]

    rx = cirq.ion.ConvertToIonGates().convert_one(OtherX().on(q0))
    rop = cirq.ion.ConvertToIonGates().convert_one(op)
    assert cirq.approx_eq(rx, [cirq.PhasedXPowGate(phase_exponent=1.0).on(cirq.GridQubit(0, 0))])
    assert cirq.approx_eq(
        rop,
        [
            cirq.ry(np.pi / 2).on(op.qubits[0]),
            cirq.ms(np.pi / 4).on(op.qubits[0], op.qubits[1]),
            cirq.rx(-1 * np.pi / 2).on(op.qubits[0]),
            cirq.rx(-1 * np.pi / 2).on(op.qubits[1]),
            cirq.ry(-1 * np.pi / 2).on(op.qubits[0]),
        ],
    )

    rcnot = cirq.ion.ConvertToIonGates().convert_one(OtherCNOT().on(q0, q1))
    assert cirq.approx_eq(
        [op for op in rcnot if len(op.qubits) > 1],
        [cirq.ms(-0.5 * np.pi / 2).on(q0, q1)],
        atol=1e-4,
    )
    assert cirq.allclose_up_to_global_phase(
        cirq.unitary(cirq.Circuit(rcnot)), cirq.unitary(OtherCNOT().on(q0, q1))
    )
def test_approx_eq_mixed_primitives():
    assert cirq.approx_eq(complex(1, 1e-10), 1, atol=1e-09)
    assert not cirq.approx_eq(complex(1, 1e-4), 1, atol=1e-09)
    assert cirq.approx_eq(complex(1, 1e-10), 1.0, atol=1e-09)
    assert not cirq.approx_eq(complex(1, 1e-8), 1.0, atol=1e-09)
    assert cirq.approx_eq(1, 1.0 + 1e-10, atol=1e-9)
    assert not cirq.approx_eq(1, 1.0 + 1e-10, atol=1e-11)
示例#20
0
def test_single_qubit_matrix_to_native_gates_known():
    actual = cirq.single_qubit_matrix_to_phased_x_z(np.array([[0, 1], [1, 0]]),
                                                    atol=0.01)
    assert cirq.approx_eq(actual, [cirq.PhasedXPowGate(phase_exponent=1.0)],
                          atol=1e-9)

    actual = cirq.single_qubit_matrix_to_phased_x_z(np.array([[0, -1j],
                                                              [1j, 0]]),
                                                    atol=0.01)
    assert cirq.approx_eq(actual, [cirq.Y], atol=1e-9)

    actual = cirq.single_qubit_matrix_to_phased_x_z(np.array([[1, 0], [0,
                                                                       -1]]),
                                                    atol=0.01)
    assert cirq.approx_eq(actual, [cirq.Z], atol=1e-9)

    actual = cirq.single_qubit_matrix_to_phased_x_z(np.array([[1, 0], [0,
                                                                       1j]]),
                                                    atol=0.01)
    assert cirq.approx_eq(actual, [cirq.Z**0.5], atol=1e-9)

    actual = cirq.single_qubit_matrix_to_phased_x_z(np.array([[1, 0], [0,
                                                                       -1j]]),
                                                    atol=0.01)
    assert cirq.approx_eq(actual, [cirq.Z**-0.5], atol=1e-9)

    actual = cirq.single_qubit_matrix_to_phased_x_z(
        np.array([[1, 1], [1, -1]]) * np.sqrt(0.5), atol=0.001)
    assert cirq.approx_eq(
        actual,
        [cirq.PhasedXPowGate(phase_exponent=-0.5, exponent=0.5), cirq.Z**-1],
        atol=1e-9)
def test_approx_eq_special_numerics():
    assert not cirq.approx_eq(float('nan'), 0, atol=0.0)
    assert not cirq.approx_eq(float('nan'), float('nan'), atol=0.0)
    assert not cirq.approx_eq(float('inf'), float('-inf'), atol=0.0)
    assert not cirq.approx_eq(float('inf'), 5, atol=0.0)
    assert not cirq.approx_eq(float('inf'), 0, atol=0.0)
    assert cirq.approx_eq(float('inf'), float('inf'), atol=0.0)
示例#22
0
def test_approx_eq():
    assert cirq.approx_eq(cirq.Z**0.1, cirq.Z**0.2, atol=0.3)
    assert not cirq.approx_eq(cirq.Z**0.1, cirq.Z**0.2, atol=0.05)
    assert cirq.approx_eq(cirq.Y**0.1, cirq.Y**0.2, atol=0.3)
    assert not cirq.approx_eq(cirq.Y**0.1, cirq.Y**0.2, atol=0.05)
    assert cirq.approx_eq(cirq.X**0.1, cirq.X**0.2, atol=0.3)
    assert not cirq.approx_eq(cirq.X**0.1, cirq.X**0.2, atol=0.05)
示例#23
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
    # 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(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))
示例#24
0
def test_depolarizing_channel_eq():
    a = cirq.depolarize(p=0.0099999)
    b = cirq.depolarize(p=0.01)
    c = cirq.depolarize(0.0)

    assert cirq.approx_eq(a, b, atol=1e-2)

    et = cirq.testing.EqualsTester()

    et.make_equality_group(lambda: c)
    et.add_equality_group(cirq.depolarize(0.1))
    et.add_equality_group(cirq.depolarize(0.9))
    et.add_equality_group(cirq.depolarize(1.0))
示例#25
0
def test_generalized_amplitude_damping_channel_eq():
    a = cirq.generalized_amplitude_damp(0.0099999, 0.01)
    b = cirq.generalized_amplitude_damp(0.01, 0.0099999)

    assert cirq.approx_eq(a, b, atol=1e-2)

    et = cirq.testing.EqualsTester()
    c = cirq.generalized_amplitude_damp(0.0, 0.0)
    et.make_equality_group(lambda: c)
    et.add_equality_group(cirq.generalized_amplitude_damp(0.1, 0.0))
    et.add_equality_group(cirq.generalized_amplitude_damp(0.0, 0.1))
    et.add_equality_group(cirq.generalized_amplitude_damp(0.6, 0.4))
    et.add_equality_group(cirq.generalized_amplitude_damp(0.8, 0.2))
示例#26
0
def test_approx_eq():
    assert cirq.approx_eq(
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.3),
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.3),
        atol=1e-4,
    )
    assert not cirq.approx_eq(
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.4),
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.3),
        atol=1e-4,
    )
    assert cirq.approx_eq(
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.4),
        cirq.PhasedXPowGate(phase_exponent=0.1, exponent=0.2,
                            global_shift=0.3),
        atol=0.2,
    )
示例#27
0
def test_phase_flip_channel_eq():
    a = cirq.phase_flip(0.0099999)
    b = cirq.phase_flip(0.01)
    c = cirq.phase_flip(0.0)

    assert cirq.approx_eq(a, b, atol=1e-2)

    et = cirq.testing.EqualsTester()
    et.make_equality_group(lambda: c)
    et.add_equality_group(cirq.phase_flip(0.1))
    et.add_equality_group(cirq.phase_flip(0.4))
    et.add_equality_group(cirq.phase_flip(0.6))
    et.add_equality_group(cirq.phase_flip(0.8))
示例#28
0
def test_pauli_sum_pow():
    identity = cirq.PauliSum.from_pauli_strings(
        [cirq.PauliString(coefficient=1)])
    psum1 = cirq.X(q0) + cirq.Y(q0)
    assert psum1**2 == psum1 * psum1
    assert psum1**2 == 2 * identity

    psum2 = cirq.X(q0) + cirq.Y(q1)
    assert psum2**2 == cirq.PauliString(
        cirq.I(q0)) + 2 * cirq.X(q0) * cirq.Y(q1) + cirq.PauliString(cirq.I(q1))

    psum3 = cirq.X(q0) * cirq.Z(q1) + 1.3 * cirq.Z(q0)
    sqd = cirq.PauliSum.from_pauli_strings(
        [2.69 * cirq.PauliString(cirq.I(q0))])
    assert cirq.approx_eq(psum3**2, sqd, atol=1e-8)

    psum4 = cirq.X(q0) * cirq.Z(q1) + 1.3 * cirq.Z(q1)
    sqd2 = cirq.PauliSum.from_pauli_strings(
        [2.69 * cirq.PauliString(cirq.I(q0)), 2.6 * cirq.X(q0)])
    assert cirq.approx_eq(psum4**2, sqd2, atol=1e-8)

    for psum in [psum1, psum2, psum3, psum4]:
        assert cirq.approx_eq(psum**0, identity)
示例#29
0
def test_create_circuits_initial_single_particle(layout_type: type) -> None:
    layout = layout_type(size=4)
    parameters = _create_test_parameters(
        layout,
        initial_state=IndependentChainsInitialState(
            up=UniformSingleParticle(),
            down=PhasedGaussianSingleParticle(k=0.2, sigma=0.4, position=0.6)))

    initial, _, _ = create_circuits(parameters, trotter_steps=0)

    up1, up2, up3, up4 = layout.up_qubits
    down1, down2, down3, down4 = layout.down_qubits

    expected = cirq.Circuit([
        cirq.Moment(
            cirq.X(up2),
            cirq.X(down2),
        ),
        cirq.Moment(
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5).on(up2, up3),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5550026943884815).on(
                                        down2, down3),
        ),
        cirq.Moment(
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.5).on(up3, up4),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=0.5).on(up1, up2),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=-0.42338370832577876).on(
                                        down3, down4),
            cirq.PhasedISwapPowGate(phase_exponent=0.25,
                                    exponent=0.3609629722553269).on(
                                        down1, down2),
        ),
        cirq.Moment(
            (cirq.Z**0.0).on(up3),
            (cirq.Z**0.0).on(up4),
            (cirq.Z**0.0).on(up1),
            (cirq.Z**0.0).on(up2),
            (cirq.Z**0.004244131815783875).on(down3),
            (cirq.Z**0.02546479089470326).on(down4),
            (cirq.Z**-0.03819718634205488).on(down1),
            (cirq.Z**-0.016976527263135508).on(down2),
        ),
    ])

    assert cirq.approx_eq(initial, expected)
示例#30
0
def test_approx_eq_periodic():
    assert cirq.approx_eq(CExpZinGate(1.5), CExpZinGate(5.5), atol=1e-9)
    assert cirq.approx_eq(CExpZinGate(1.5), CExpZinGate(9.5), atol=1e-9)
    assert cirq.approx_eq(CExpZinGate(-2.5), CExpZinGate(1.5), atol=1e-9)
    assert not cirq.approx_eq(CExpZinGate(0), CExpZinGate(1.5), atol=1e-9)

    # The tests below do not work with usual canonical exponent comparison.
    assert cirq.approx_eq(CExpZinGate(0 - 1e-10), CExpZinGate(0), atol=1e-9)
    assert cirq.approx_eq(CExpZinGate(0), CExpZinGate(4 - 1e-10), atol=1e-9)