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)
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)
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
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)
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 )
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)
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
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 )