Example #1
0
def build_two_qubit_matrix(operation) -> np.ndarray:
    """Return full process tomography on two qubit operation with PyQuEST interface"""
    matrix = np.zeros((4, 4), dtype=complex)
    for co, state in enumerate([np.array([1, 0, 0, 0]),
                                np.array([0, 1, 0, 0]),
                                np.array([0, 0, 1, 0]),
                                np.array([0, 0, 0, 1]), ]):
        env = utils.createQuestEnv()()
        qubits = utils.createQureg()(2, env)
        cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
        circuit = Circuit()
        circuit += operation
        
        pyquest_call_circuit(circuit=circuit,
                             qureg=qubits,
                             classical_bit_registers=dict(),
                             classical_float_registers=dict(),
                             classical_complex_registers=dict(),
                             output_bit_register_dict=dict(),)
        for i in range(0, 4):
            out = cheat.getAmp()(qureg=qubits, index=i)
            matrix[i, co] = out
        utils.destroyQureg()(qubits, env=env)
        utils.destroyQuestEnv()(env)
    return matrix
Example #2
0
def build_one_qubit_matrix(gate, gate_args) -> np.ndarray:
    """Build one qubit matrix for tests"""
    matrix = np.zeros((2, 2), dtype=complex)
    for co, state in enumerate([np.array([1, 0]), np.array([0, 1])]):
        env = utils.createQuestEnv()()
        qubits = utils.createQureg()(1, env)
        cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
        gate()(qureg=qubits, qubit=0, **gate_args)
        for i in range(0, 2):
            cComplex = cheat.getAmp()(qureg=qubits, index=i)
            matrix[i, co] = cComplex.real + 1j * cComplex.imag
    return matrix
def test_two_qubit_errors(prob, gate_def) -> None:
    """Testing two qubit errors"""
    op = gate_def[0]
    prob = prob * gate_def[1]
    env = utils.createQuestEnv()()
    dm = utils.createDensityQureg()(2, env)
    state = np.random.random((4, 1)) + 1j * np.random.random((4, 1))
    state = state / np.linalg.norm(state)
    state_dm = state @ state.conjugate().T
    state_dm = state_dm.reshape((16, 1))
    cheat.initStateFromAmps()(dm,
                              reals=np.real(state_dm),
                              imags=np.imag(state_dm))
    op()(qureg=dm, qubit1=0, qubit2=1, probability=prob)
def test_measurement():
    """Test gate operations without free parameters with PyQuEST interface"""
    op = ops.MeasureQubit(qubit=0, readout='test', readout_index=0)
    test_dict = {'test': np.array([0, 0, 0, 0])}
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = np.array([0, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(op, qubits,
                           classical_bit_registers=test_dict,
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    utils.destroyQureg()(qubits, env=env)
    utils.destroyQuestEnv()(env)
    assert test_dict['test'][0]
def test_pragma_repeated_measurement_pyquest() -> None:
    """Test repeated measurement with PyQuEST interface"""
    op = ops.PragmaRepeatedMeasurement
    operation = op(readout='ro',
                   qubit_mapping={0: 0},
                   number_measurements=100)
    test_dict: Dict[str, List[List[bool]]] = {'ro': list(list())}
    test_dict2: Dict[str, List[bool]] = {'ro': list()}
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = 1 / np.sqrt(2) * np.array([1, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=test_dict2,
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=test_dict,)
    utils.destroyQureg()(qubits, env=env)
    utils.destroyQuestEnv()(env)
    assert len(test_dict['ro']) == 100
def test_pragma_get_occupation_probability_pyquest(init) -> None:
    """Test get occupation probability with PyQuEST interface"""
    op = ops.PragmaGetOccupationProbability
    test_dict: Dict[str, List[float]] = {'ro': [0, 0]}
    operation = op(readout='ro',
                    circuit=Circuit()
                   )
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = np.array([0, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))

    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    utils.destroyQureg()(qubits=qubits, env=env)
    utils.destroyQuestEnv()(env)
    npt.assert_array_almost_equal(test_dict['ro'], init[1])
def test_pragma_get_statevec_pyquest(init) -> None:
    """Test get state vector with PyQuEST interface"""
    op = ops.PragmaGetStateVector
    test_dict: Dict[str, List[complex]] = {'ro': [0, 0, 0, 0]}
    operation = op(readout='ro',
                   circuit=Circuit(),
                   )
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = 1 / np.sqrt(2) * np.array([1, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))

    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),)
    utils.destroyQureg()(qubits=qubits, env=env)
    utils.destroyQuestEnv()(env)
    npt.assert_array_almost_equal(test_dict['ro'], init[1], decimal=4)
def test_pragma_get_densitymatrix_pyquest() -> None:
    """Test get density matrix with PyQuEST interface"""
    op = ops.PragmaGetDensityMatrix
    test_dict: Dict[str, List[complex]] = {'ro': [0, 0, 0, 0]}
    operation = op(readout='ro',
                   circuit=Circuit()
                   )
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(1, env)
    state = 1 / np.sqrt(2) * np.array([1, 1])
    density_matrix = 1 / 2 * np.array([[1, 1], [1, 1]]).flatten()
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))

    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),)
    utils.destroyQureg()(qubits=qubits, env=env)
    utils.destroyQuestEnv()(env)
    npt.assert_array_almost_equal(test_dict['ro'], density_matrix)
def test_pragma_get_pauli_prod_measurement_pyquest(init) -> None:
    """Test measuring product of pauli operators with PyQuEST interface"""
    test_dict: Dict[str, List[float]] = {'ro': [0, 0, 0, 0]}

    op = ops.PragmaGetPauliProduct

    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = init[0]
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    operation = op(readout='ro',
                   qubit_paulis=init[2],
                   circuit=Circuit())

    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    npt.assert_array_almost_equal(test_dict['ro'], init[1])
    utils.destroyQureg()(qubits, env=env)
    utils.destroyQuestEnv()(env)
Example #10
0
def build_two_qubit_matrix_target(gate, gate_args, control=None) -> np.ndarray:
    """Build two qubit matrix with target for tests"""
    matrix = np.zeros((4, 4), dtype=complex)
    for co, state in enumerate([
            np.array([1, 0, 0, 0]),
            np.array([0, 1, 0, 0]),
            np.array([0, 0, 1, 0]),
            np.array([0, 0, 0, 1]),
    ]):
        env = utils.createQuestEnv()()
        if control is None:
            qubits = utils.createQureg()(2, env)
            cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
            gate()(qureg=qubits,
                   target_qubit_1=0,
                   target_qubit_2=1,
                   **gate_args)
        elif control is True:
            qubits = utils.createQureg()(3, env)
            control_array = np.array([0, 1])
            cheat.initStateFromAmps()(qubits,
                                      np.real(np.kron(control_array, state)),
                                      np.imag(np.kron(control_array, state)))
            gate()(qureg=qubits,
                   target_qubit_1=0,
                   target_qubit_2=1,
                   control=2,
                   **gate_args)
        else:
            qubits = utils.createQureg()(3, env)
            control_array = np.array([1, 0])
            cheat.initStateFromAmps()(qubits,
                                      np.real(np.kron(control_array, state)),
                                      np.imag(np.kron(control_array, state)))
            gate()(qureg=qubits,
                   target_qubit_1=0,
                   target_qubit_2=1,
                   control=2,
                   **gate_args)
        for i in range(0, 4):
            if control is None:
                cComplex = cheat.getAmp()(qureg=qubits, index=i)
                matrix[i, co] = cComplex.real + 1j * cComplex.imag
            elif control is True:
                cComplex = cheat.getAmp()(qureg=qubits, index=i + 4)
                matrix[i, co] = cComplex.real + 1j * cComplex.imag
            else:
                cComplex = cheat.getAmp()(qureg=qubits, index=i)
                matrix[i, co] = cComplex.real + 1j * cComplex.imag
    return matrix
def pyquest_call_operation(
        operation: Any,
        qureg: tqureg,
        classical_bit_registers: Dict[str, List[bool]],
        classical_float_registers: Dict[str, List[float]],
        classical_complex_registers: Dict[str, List[complex]],
        output_bit_register_dict: Dict[str, List[List[bool]]],
) -> None:
    """Execute the qoqo operation with PyQuEST

    Args:
        operation: The qoqo operation that is executed
        qureg: The quantum register pyquest_cffi operates on
        classical_bit_registers: Dictionary or registers (lists) containing bit readout values
        classical_float_registers: Dictionary or registers (lists) containing float readout values
        classical_complex_registers: Dictionary or registers (lists)
                                     containing complex readout values
        output_bit_register_dict: Dictionary or lists of registers (lists)
                              containing a register for each repetition of the circuit

    Raises:
        RuntimeError: Operation not in PyQuEST backend
    """
    tags = operation.tags()
    if 'RotateZ' in tags:
        operation = cast(ops.RotateZ, operation)
        qops.rotateZ()(qureg=qureg, qubit=operation.qubit(), theta=operation.theta().float())
    elif 'RotateX' in tags:
        operation = cast(ops.RotateX, operation)
        qops.rotateX()(qureg=qureg, qubit=operation.qubit(), theta=operation.theta().float())
    elif 'RotateY' in tags:
        operation = cast(ops.RotateY, operation)
        qops.rotateY()(qureg=qureg, qubit=operation.qubit(), theta=operation.theta().float())
    elif 'SqrtISwap' in tags:
        operation = cast(ops.SqrtISwap, operation)
        qops.sqrtISwap()(qureg=qureg, control=operation.control(), qubit=operation.target())
    elif 'CNOT' in tags:
        operation = cast(ops.CNOT, operation)
        qops.controlledNot()(qureg=qureg, control=operation.control(), qubit=operation.target())
    elif 'InvSqrtISwap' in tags:
        operation = cast(ops.InvSqrtISwap, operation)
        qops.invSqrtISwap()(qureg=qureg, control=operation.control(), qubit=operation.target())
    elif 'Hadamard' in tags:
        operation = cast(ops.Hadamard, operation)
        qops.hadamard()(qureg=qureg, qubit=operation.qubit())
    elif 'PauliX' in tags:
        operation = cast(ops.PauliX, operation)
        qops.pauliX()(qureg=qureg, qubit=operation.qubit())
    elif 'PauliY' in tags:
        operation = cast(ops.PauliY, operation)
        qops.pauliY()(qureg=qureg, qubit=operation.qubit())
    elif 'PauliZ' in tags:
        operation = cast(ops.PauliZ, operation)
        qops.pauliZ()(qureg=qureg, qubit=operation.qubit())
    elif 'SGate' in tags:
        operation = cast(ops.SGate, operation)
        qops.sGate()(qureg=qureg, qubit=operation.qubit())
    elif 'TGate' in tags:
        operation = cast(ops.TGate, operation)
        qops.tGate()(qureg=qureg, qubit=operation.qubit())
    elif 'SqrtPauliX' in tags:
        qops.rotateX()(qureg=qureg, qubit=operation.qubit(), theta=np.pi / 2)
    elif 'InvSqrtPauliX' in tags:
        qops.rotateX()(qureg=qureg, qubit=operation.qubit(), theta=-np.pi / 2)
    elif 'ControlledPhaseShift' in tags:
        qops.controlledPhaseShift()(qureg=qureg, control=operation.control(),
                                    qubit=operation.target(), theta=operation.theta().float())
    elif 'ControlledPauliY' in tags:
        qops.controlledPauliY()(qureg=qureg, control=operation.control(),
                                qubit=operation.target())
    elif 'ControlledPauliZ' in tags:
        qops.controlledPhaseFlip()(qureg=qureg, control=operation.control(),
                                   qubit=operation.target())
    elif 'RotateAroundSphericalAxis' in tags:
        qops.rotateAroundSphericalAxis()(
            qureg=qureg, qubit=operation.qubit(), theta=operation.theta().float(),
            spherical_theta=operation.spherical_theta().float(),
            spherical_phi=operation.spherical_phi().float())
    elif 'SingleQubitGateOperation' in tags:
        qops.compactUnitary()(qubit=operation.qubit(),
                              qureg=qureg,
                              alpha=operation.alpha_r().float() + 1j * operation.alpha_i().float(),
                              beta=operation.beta_r().float() + 1j * operation.beta_i().float())
    elif 'TwoQubitGateOperation' in tags:
        qops.twoQubitUnitary()(qureg=qureg, target_qubit_2=operation.control(),
                               target_qubit_1=operation.target(), matrix=operation.unitary_matrix())
    elif 'PragmaRepeatedMeasurement' in tags:
        _execute_PragmaRepeatedMeasurement(
            operation, qureg,
            classical_bit_registers,
            output_bit_register_dict,
        )
    elif 'PragmaDamping' in tags:
        qops.mixDamping()(
            qureg=qureg, qubit=operation.qubit(), probability=operation.probability().float())
    elif 'PragmaDepolarising' in tags:
        qops.mixDepolarising()(
            qureg=qureg, qubit=operation.qubit(), probability=operation.probability().float())
    elif 'PragmaDephasing' in tags:
        qops.mixDephasing()(
            qureg=qureg, qubit=operation.qubit(), probability=operation.probability().float())
    elif 'PragmaSetStateVector' in tags:
        vector = operation.statevector()
        qcheat.initStateFromAmps()(qureg=qureg, reals=np.real(vector), imags=np.imag(vector))
    elif 'PragmaSetDensityMatrix' in tags:
        density_matrix = operation.density_matrix()
        # dim = int(np.round(np.sqrt(density_matrix.shape[0])))
        # density_matrix = density_matrix.reshape((dim, dim))
        qcheat.initStateFromAmps()(
            qureg=qureg, reals=np.real(density_matrix), imags=np.imag(density_matrix))
    elif 'PragmaRandomNoise' in tags:
        _execute_PragmaRandomNoise(
            operation, qureg,
        )
    elif 'PragmaActiveReset' in tags:
        _execute_PragmaActiveReset(
            operation, qureg,
        )
    elif 'MeasureQubit' in tags:
        _execute_MeasureQubit(
            operation, qureg, classical_bit_registers,
        )
    elif 'InputDefinition' in tags:
        if operation.name() in classical_float_registers.keys():
            classical_float_registers = operation.input()
    elif 'Definition' in tags:
        pass
    elif 'PragmaGetPauliProduct' in tags:
        _execute_GetPauliProduct(
            operation, qureg,
            classical_float_registers,
        )
    elif 'PragmaGetStateVector' in tags:
        _execute_GetStateVector(
            operation, qureg,
            classical_complex_registers,
        )
    elif 'PragmaGetDensityMatrix' in tags:
        _execute_GetStateVector(
            operation, qureg,
            classical_complex_registers,
        )
    elif 'PragmaGetOccupationProbability' in tags:
        _execute_GetOccupationProbability(
            operation, qureg,
            classical_float_registers,
        )
    elif 'PragmaGetRotatedOccupationProbability' in tags:
        _execute_GetOccupationProbability(
            operation, qureg,
            classical_float_registers,
        )
    elif 'PragmaConditional' in tags:
        cast(ops.PragmaConditional, operation)
        if operation.condition_register() not in classical_bit_registers.keys():
            raise RuntimeError(
                "Conditional register {} not found in classical bit registers".format(
                    operation.condition_register()))
        if classical_bit_registers[operation.condition_register()][operation.condition_index()]:
            pyquest_call_circuit(
                circuit=operation.circuit(),
                qureg=qureg,
                classical_bit_registers=classical_bit_registers,
                classical_float_registers=classical_float_registers,
                classical_complex_registers=classical_complex_registers,
                output_bit_register_dict=output_bit_register_dict,
            )
    elif any(pragma in tags for pragma in _ALLOWED_PRAGMAS):
        pass
    else:
        raise RuntimeError('Operation not in PyQuEST backend')
def test_pragma_get_pauli_product_pyquest() -> None:
    """Test repeated measurement with PyQuEST interface"""

    operation = ops.PragmaGetPauliProduct(readout='ro',
                                          qubit_paulis={0: 3},
                                          circuit=Circuit()
                                          )
    test_dict: Dict[str, List[float]] = {'ro': [0.0]}
    env = utils.createQuestEnv()()
    qubits = utils.createQureg()(2, env)
    state = np.array([1, 0, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    assert test_dict['ro'][0] == 1

    test_dict = {'ro': list()}
    state = np.array([0, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)

    assert test_dict['ro'][0] == -1

    test_dict = {'ro': list()}
    state = 1 / np.sqrt(2) * np.array([1, 1, 0, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    assert test_dict['ro'][0] == 0

    operation = ops.PragmaGetPauliProduct(readout='ro',
                                          qubit_paulis={0: 3, 1: 3},
                                          circuit=Circuit()
                                          )
    test_dict = {'ro': list()}
    state = 1 / np.sqrt(2) * np.array([0, 1, 1, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    assert np.isclose(test_dict['ro'][0], -1)

    test_dict = {'ro': list()}
    state = 1 / np.sqrt(2) * np.array([0, 1, -1, 0])
    cheat.initStateFromAmps()(qubits, np.real(state), np.imag(state))
    pyquest_call_operation(operation=operation, qureg=qubits, classical_bit_registers=dict(),
                           classical_float_registers=test_dict,
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    assert np.isclose(test_dict['ro'][0], -1)

    utils.destroyQureg()(qubits=qubits, env=env)
    utils.destroyQuestEnv()(env)