コード例 #1
0
class TestGeneratingCircuitSequence:
    @pytest.mark.parametrize(
        "repeated_circuit, different_circuit, length, position, expected_result",
        [
            (
                circuits.Circuit([circuits.X(0), circuits.Y(1)]),
                circuits.Circuit([circuits.Z(1)]),
                5,
                1,
                circuits.Circuit([
                    *[circuits.X(0), circuits.Y(1)],
                    circuits.Z(1),
                    *([circuits.X(0), circuits.Y(1)] * 3),
                ]),
            ),
            (
                circuits.Circuit([circuits.RX(0.5)(1)]),
                circuits.Circuit([circuits.CNOT(0, 2)]),
                3,
                0,
                circuits.Circuit([
                    circuits.CNOT(0, 2),
                    circuits.RX(0.5)(1),
                    circuits.RX(0.5)(1)
                ]),
            ),
            (
                circuits.Circuit([circuits.RX(0.5)(1)]),
                circuits.Circuit([circuits.CNOT(0, 2)]),
                3,
                2,
                circuits.Circuit([
                    circuits.RX(0.5)(1),
                    circuits.RX(0.5)(1),
                    circuits.CNOT(0, 2),
                ]),
            ),
        ],
    )
    def test_produces_correct_sequence(self, repeated_circuit,
                                       different_circuit, position, length,
                                       expected_result):
        actual_result = _generate_circuit_sequence(repeated_circuit,
                                                   different_circuit, length,
                                                   position)

        assert actual_result == expected_result

    @pytest.mark.parametrize("length, invalid_position", [(5, 5), (4, 6)])
    def test_raises_error_if_position_is_larger_or_equal_to_length(
            self, length, invalid_position):
        repeated_circuit = circuits.Circuit([circuits.X(0)])
        different_circuit = circuits.Circuit([circuits.Y(0)])

        with pytest.raises(ValueError):
            _generate_circuit_sequence(repeated_circuit, different_circuit,
                                       length, invalid_position)
コード例 #2
0
    def test_raises_error_if_position_is_larger_or_equal_to_length(
            self, length, invalid_position):
        repeated_circuit = circuits.Circuit([circuits.X(0)])
        different_circuit = circuits.Circuit([circuits.Y(0)])

        with pytest.raises(ValueError):
            _generate_circuit_sequence(repeated_circuit, different_circuit,
                                       length, invalid_position)
コード例 #3
0
 def test_circuit_with_only_supported_gates_is_not_changed(self):
     original_circuit = circuits.Circuit([
         circuits.X(0),
         circuits.RX(np.pi)(2),
         circuits.SWAP(3, 0),
         circuits.RY(0.5).controlled(1)(0, 2),
     ])
     assert make_circuit_qhipster_compatible(
         original_circuit) == original_circuit
コード例 #4
0
    def test_supported_gates_are_left_unchanged(self):
        supported_gate_indices = [1, 3]
        original_circuit = circuits.Circuit(
            [circuits.I(0),
             circuits.X(1),
             circuits.I(2),
             circuits.RX(0)(2)])
        compatible_circuit = make_circuit_qhipster_compatible(original_circuit)

        all(compatible_circuit.operations[i] == original_circuit.operations[i]
            for i in supported_gate_indices)
コード例 #5
0
    def test_run_circuit_and_measure_works_with_multiphase_operator(self, backend):
        params = [-0.1, 0.3, -0.5, 0.7]
        circuit = circuits.Circuit(
            [circuits.H(0), circuits.X(1), circuits.MultiPhaseOperation(params)]
        )

        measurements = backend.run_circuit_and_measure(circuit, n_samples=1000)
        counts = measurements.get_counts()
        assert len(measurements.bitstrings) == 1000
        assert all(
            bitstring in [(0, 1), (1, 1)] for bitstring in measurements.bitstrings
        )
コード例 #6
0
    def test_identity_gates_are_replaced_with_zero_angle_rotation(self):
        identity_gate_indices = [0, 2]
        original_circuit = circuits.Circuit(
            [circuits.I(0),
             circuits.X(1),
             circuits.I(2),
             circuits.RX(0)(2)])
        compatible_circuit = make_circuit_qhipster_compatible(original_circuit)

        assert all(compatible_circuit.operations[i].gate == circuits.RX(0)
                   and compatible_circuit.operations[i].qubit_indices ==
                   original_circuit.operations[i].qubit_indices
                   for i in identity_gate_indices)
コード例 #7
0
class TestConvertingCircuitToSimplifiedQasm:
    @pytest.mark.parametrize(
        "circuit, expected_qasm",
        [
            (circuits.Circuit(), "0\n"),
            (
                circuits.Circuit([circuits.X(0),
                                  circuits.Y(2),
                                  circuits.Z(1)]),
                "\n".join(["3", "X 0", "Y 2", "Z 1"]),
            ),
            (
                circuits.Circuit([circuits.X(0), circuits.Z(4)]),
                "\n".join(["5", "X 0", "Z 4"]),
            ),
            (
                circuits.Circuit([circuits.X(4), circuits.Z(0)]),
                "\n".join(["5", "X 4", "Z 0"]),
            ),
            (
                circuits.Circuit([circuits.X(4),
                                  circuits.CNOT(0, 3)]),
                "\n".join(["5", "X 4", "CNOT 0 3"]),
            ),
            (
                circuits.Circuit([circuits.RX(np.pi)(1),
                                  circuits.RZ(0.5)(3)]),
                "\n".join([
                    "4", "Rx 3.14159265358979311600 1",
                    "Rz 0.50000000000000000000 3"
                ]),
            ),
        ],
    )
    def test_converting_circuit_to_qasm_emits_correct_string(
            self, circuit, expected_qasm):
        assert convert_to_simplified_qasm(circuit) == expected_qasm
コード例 #8
0
class TestQulacs(QuantumSimulatorTests):
    @pytest.mark.parametrize(
        "circuit, target_wavefunction",
        [
            (
                circuits.Circuit(
                    [
                        circuits.H(0),
                        circuits.H(1),
                        circuits.MultiPhaseOperation([-0.1, 0.3, -0.5, 0.7]),
                        circuits.X(0),
                        circuits.X(0),
                    ]
                ),
                np.exp(1j * np.array([-0.1, 0.3, -0.5, 0.7])) / 2,
            ),
            (
                circuits.Circuit(
                    [
                        circuits.H(0),
                        circuits.H(1),
                        circuits.MultiPhaseOperation([-0.1, 0.3, -0.5, 0.7]),
                        circuits.MultiPhaseOperation([-0.2, 0.1, -0.2, -0.3]),
                        circuits.X(0),
                        circuits.X(0),
                    ]
                ),
                np.exp(1j * np.array([-0.3, 0.4, -0.7, 0.4])) / 2,
            ),
            (
                circuits.Circuit(
                    [
                        circuits.MultiPhaseOperation([-0.1, 0.3, -0.5, 0.7]),
                    ]
                ),
                np.array([np.exp(-0.1j), 0, 0, 0]),
            ),
            (
                circuits.Circuit(
                    [
                        circuits.H(0),
                        circuits.MultiPhaseOperation([-0.1, 0.3, -0.5, 0.7]),
                    ]
                ),
                np.array([np.exp(-0.1j), np.exp(0.3j), 0, 0]) / np.sqrt(2),
            ),
        ],
    )
    def test_get_wavefunction_works_with_multiphase_operator(
        self, backend, circuit, target_wavefunction
    ):
        wavefunction = backend.get_wavefunction(circuit)

        np.testing.assert_almost_equal(wavefunction, target_wavefunction)

    def test_run_circuit_and_measure_works_with_multiphase_operator(self, backend):
        params = [-0.1, 0.3, -0.5, 0.7]
        circuit = circuits.Circuit(
            [circuits.H(0), circuits.X(1), circuits.MultiPhaseOperation(params)]
        )

        measurements = backend.run_circuit_and_measure(circuit, n_samples=1000)
        counts = measurements.get_counts()
        assert len(measurements.bitstrings) == 1000
        assert all(
            bitstring in [(0, 1), (1, 1)] for bitstring in measurements.bitstrings
        )