Esempio n. 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
def _execute_GetOccupationProbability(
        operation: Union[
            ops.PragmaGetOccupationProbability],
        qureg: tqureg,
        classical_float_registers: Dict[str, List[float]],
) -> None:
    tags = operation.tags()
    quest_obj = qcheat.getOccupationProbability()
    if 'PragmaGetRotatedOccupationProbability' in tags:
        N = qureg.numQubitsRepresented
        env = qutils.createQuestEnv()()
        if qureg.isDensityMatrix:
            workspace = qutils.createDensityQureg()(N, env)
        else:
            workspace = qutils.createQureg()(N, env)
        qutils.cloneQureg()(workspace, qureg)
        if operation.circuit() is not None:
            pyquest_call_circuit(
                circuit=operation.circuit(),
                qureg=workspace,
                classical_bit_registers=dict(),
                classical_float_registers=dict(),
                classical_complex_registers=dict(),
                output_bit_register_dict=dict(),)
        occ_probabilities = np.real(quest_obj(qureg=workspace))
        qutils.destroyQureg()(qubits=workspace, env=env)
        del workspace
        qutils.destroyQuestEnv()(env)
        del env
    else:
        occ_probabilities = np.real(quest_obj(qureg=qureg, ))

    classical_float_registers[operation.readout()] = occ_probabilities
def test_noise_operators(init, gate_time, rate):
    """Test PRAGMA operators applying noise with PyQuEST interface"""
    op = init[0]

    (Gate_time, Rate, q0) = ('gate_time',
                             'rate', 0)
    operation = op(qubit=q0, gate_time=Gate_time, rate=Rate)
    substitution_dict = {'gate_time': gate_time, 'rate': rate}
    operation = operation.substitute_parameters(substitution_dict)
    env = utils.createQuestEnv()()
    qureg = utils.createDensityQureg()(1, env)
    cheat.initPlusState()(qureg=qureg)
    init[2](qureg=qureg, probability=operation.probability().float(), qubit=0)
    density_matrix_ref = cheat.getDensityMatrix()(qureg)
    test_dict = {'ro': list()}

    cheat.initPlusState()(qureg)
    pyquest_call_operation(operation=operation.substitute_parameters(substitution_dict),
                           qureg=qureg,
                           classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),
                           )

    density_matrix_test = cheat.getDensityMatrix()(qureg)

    npt.assert_array_almost_equal(density_matrix_ref, density_matrix_test)

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)

    operation = operation.substitute_parameters(substitution_dict)

    env = utils.createQuestEnv()()
    qureg = utils.createDensityQureg()(1, env)
    cheat.initPlusState()(qureg=qureg)
    init[2](qureg=qureg, probability=operation.probability().float(), qubit=0)
    density_matrix_ref = cheat.getDensityMatrix()(qureg)

    cheat.initPlusState()(qureg)
    pyquest_call_operation(operation=operation, qureg=qureg, classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),)

    density_matrix_test = cheat.getDensityMatrix()(qureg)

    npt.assert_array_almost_equal(density_matrix_ref, density_matrix_test)

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)
def test_random_noise_operator(gate_time, depolarisation_rate, dephasing_rate):
    """Test PRAGMA operators applying random noise (stochastic unravelling) with PyQuEST interface"""
    op = ops.PragmaRandomNoise
    test_dict = {'ro': list()}

    (Gate_time, depol_Rate, dephasing_Rate) = ('gate_time',
                                               'depolarisation_rate',
                                               'dephasing_rate',
                                               )
    operation = op(qubit=0, gate_time=Gate_time,
                   depolarising_rate=depol_Rate, dephasing_rate=dephasing_Rate)

    substitution_dict = {'gate_time': gate_time,
                         'depolarisation_rate': depolarisation_rate,
                         'dephasing_rate': dephasing_rate}
    env = utils.createQuestEnv()()
    qureg = utils.createQureg()(1, env)
    state_vec_ref = cheat.getStateVector()(qureg)
    pyquest_call_operation(operation=operation.substitute_parameters(substitution_dict),
                           qureg=qureg,
                           classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),
                           )
    if gate_time == 0 or (dephasing_rate == 0 and depolarisation_rate == 0):
        state_vec = cheat.getStateVector()(qureg)
        npt.assert_array_almost_equal(state_vec_ref, state_vec)

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)

    operation.substitute_parameters(substitution_dict)

    env = utils.createQuestEnv()()
    qureg = utils.createQureg()(1, env)
    state_vec_ref = cheat.getStateVector()(qureg)
    pyquest_call_operation(operation=operation.substitute_parameters(substitution_dict),
                           qureg=qureg, classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=test_dict,
                           output_bit_register_dict=dict(),)
    if gate_time == 0 or (dephasing_rate == 0 and depolarisation_rate == 0):
        state_vec = cheat.getStateVector()(qureg)
        npt.assert_array_almost_equal(state_vec_ref, state_vec)

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)
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]
Esempio n. 6
0
def _execute_GetPauliProduct(
    operation: ops.PragmaGetPauliProduct,
    qureg: tqureg,
    classical_float_registers: Dict[str, List[float]],
) -> None:

    if operation.qubit_paulis == {}:
        classical_float_registers[operation.readout()] = [
            1.0,
        ]
        return None
    N = qureg.numQubitsRepresented
    env = qutils.createQuestEnv()()
    if qureg.isDensityMatrix:
        workspace = qutils.createDensityQureg()(N, env)
        workspace_pp = qutils.createDensityQureg()(N, env)
    else:
        workspace = qutils.createQureg()(N, env)
        workspace_pp = qutils.createQureg()(N, env)
    qutils.cloneQureg()(workspace, qureg)
    if operation.circuit() is not None:
        pyquest_call_circuit(
            circuit=operation.circuit(),
            qureg=workspace,
            classical_bit_registers=dict(),
            classical_float_registers=dict(),
            classical_complex_registers=dict(),
            output_bit_register_dict=dict(),
        )
    qubits = list()
    paulis = list()
    for qubit, pauli in operation.qubit_paulis().items():
        qubits.append(qubit)
        paulis.append(pauli)
    pp = qcheat.calcExpecPauliProd().call_interactive(qureg=workspace,
                                                      qubits=qubits,
                                                      paulis=paulis,
                                                      workspace=workspace_pp)
    qutils.destroyQureg()(qubits=workspace_pp, env=env)
    qutils.destroyQureg()(qubits=workspace, env=env)
    del workspace
    qutils.destroyQuestEnv()(env)
    del env
    classical_float_registers[operation.readout()] = [
        pp,
    ]
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)
def test_set_qureg():
    """Test set qureg PRAGMA with PyQuEST interface"""
    env = utils.createQuestEnv()()
    qureg_density = utils.createDensityQureg()(2, env)
    qureg_wave = utils.createQureg()(2, env)
    cheat.initBlankState()(qureg=qureg_density)
    cheat.initBlankState()(qureg=qureg_wave)

    density_start = cheat.getDensityMatrix()(qureg_density)
    wave_start = cheat.getStateVector()(qureg_wave)

    set_wave = np.array([2, 1, 0, 1], dtype=complex)
    set_density = np.array([[1, 0, 2, 0],
                            [0, 2, 3, 3],
                            [3, 1, 0, 0],
                            [0, 1, 2, 0]], dtype=complex)

    pyquest_call_operation(operation=ops.PragmaSetStateVector(set_wave),
                           qureg=qureg_wave,
                           classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)
    pyquest_call_operation(operation=ops.PragmaSetDensityMatrix(set_density),
                           qureg=qureg_density,
                           classical_bit_registers=dict(),
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),)

    npt.assert_array_equal(density_start, [[0] * 4] * 4)
    npt.assert_array_equal(wave_start, [0] * 4)
    npt.assert_array_equal(set_wave, cheat.getStateVector()(qureg_wave))
    npt.assert_array_equal(set_density, cheat.getDensityMatrix()(qureg_density))

    utils.destroyQureg().call_interactive(qureg_wave, env)
    utils.destroyQureg().call_interactive(qureg_density, env)
    utils.destroyQuestEnv().call_interactive(env)
Esempio n. 13
0
def test_QuReg() -> None:
    """Testing the creation, cloning, destruction and reporting of a QuReg"""
    env = utils.createQuestEnv()()
    wave_qureg = utils.createQureg()(num_qubits=2, env=env)
    cheat.initZeroState()(qureg=wave_qureg)
    density_qureg = utils.createDensityQureg()(num_qubits=2, env=env)
    cheat.initZeroState()(qureg=density_qureg)
    cloned_qureg = utils.createCloneQureg()(qureg=density_qureg, env=env)
    cheat.initZeroState()(qureg=cloned_qureg)

    try:
        [wave_string, density_string, cloned_string] = ['', '', '']
        cheat.getEnvironmentString()(env=env,
                                     qureg=wave_qureg,
                                     string=wave_string)
        cheat.getEnvironmentString()(env=env,
                                     qureg=density_qureg,
                                     string=density_string)
        cheat.getEnvironmentString()(env=env,
                                     qureg=cloned_qureg,
                                     string=cloned_string)
        assert cloned_string == density_string
        cheat.getEnvironmentString()(env=env,
                                     qureg=cloned_qureg,
                                     string=cloned_string)
        assert cloned_string == wave_string
    except NotImplementedError:
        pass  # getEnvironmentString unittest not implemented

    assert wave_qureg.isDensityMatrix == False
    assert density_qureg.isDensityMatrix == True
    assert cloned_qureg.isDensityMatrix == True
    assert np.all(cheat.getDensityMatrix()(
        qureg=density_qureg) == cheat.getDensityMatrix()(qureg=cloned_qureg))
    assert not np.all(cheat.getStateVector()(
        qureg=wave_qureg) == cheat.getDensityMatrix()(qureg=cloned_qureg))

    npt.assert_raises(TypeError, utils.cloneQureg(), cloned_qureg, wave_qureg)

    to_be_cloned = utils.createDensityQureg()(num_qubits=3, env=env)
    cheat.initZeroState()(qureg=to_be_cloned)
    clone_into = utils.createDensityQureg()(num_qubits=3, env=env)
    cheat.initZeroState()(qureg=clone_into)
    utils.cloneQureg()(clone_into, to_be_cloned)
    assert clone_into.isDensityMatrix == True

    result_type_list = ['', '', '']
    argument_type_list = [[''], [''], ['']]
    for qureg in [wave_qureg, density_qureg, cloned_qureg]:
        utils.reportQuregParams()(qureg=qureg)
        utils.reportState()(qureg=qureg)
        utils.reportStateToScreen()(qureg=qureg, env=env)
        result_type_list[0] = utils.reportQuregParams().restype
        argument_type_list[0] = utils.reportQuregParams().argtype
        result_type_list[1] = utils.reportState().restype
        argument_type_list[1] = utils.reportState().argtype
        result_type_list[2] = utils.reportStateToScreen().restype
        argument_type_list[2] = utils.reportStateToScreen().argtype

    npt.assert_array_equal(result_type_list, ["void", "void", "void"])
    npt.assert_equal(argument_type_list,
                     [["Qureg"], ["Qureg"], ["Qureg", "QuESTEnv", "int"]])

    for qureg in [wave_qureg, density_qureg, cloned_qureg]:
        utils.destroyQureg()(env=env, qubits=qureg)
def test_conditional_pragma():
    """Test PRAGMA conditional operation"""
    test_dict = {'ro': [False, False],
                 'cond': [True, False]}

    circuit0 = Circuit()
    circuit0 += ops.PauliX(qubit=0)
    circuit0 += ops.MeasureQubit(readout='ro', qubit=0, readout_index=0)

    circuit1 = Circuit()
    circuit1 += ops.PauliX(qubit=1)
    circuit1 += ops.MeasureQubit(readout='ro', qubit=1, readout_index=1)

    operation = ops.PragmaConditional(
        condition_register='cond',
        condition_index=0,
        circuit=circuit0)

    env = utils.createQuestEnv()()
    qureg = utils.createQureg()(2, env)
    test_dict = {'ro': [False, False],
                 'cond': [True, False]}
    pyquest_call_operation(operation=operation,
                           qureg=qureg,
                           classical_bit_registers=test_dict,
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),
                           )

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)

    assert test_dict['ro'] == [True, False]

    operation = ops.PragmaConditional(
        condition_register='cond',
        condition_index=0,
        circuit=circuit1)

    env = utils.createQuestEnv()()
    qureg = utils.createQureg()(2, env)
    test_dict = {'ro': [False, False],
                 'cond': [True, False]}
    pyquest_call_operation(operation=operation,
                           qureg=qureg,
                           classical_bit_registers=test_dict,
                           classical_float_registers=dict(),
                           classical_complex_registers=dict(),
                           output_bit_register_dict=dict(),
                           )

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)

    assert test_dict['ro'] == [False, True]

    operation = ops.PragmaConditional(
        condition_register='not_in',
        condition_index=0,
        circuit=circuit1)


    env = utils.createQuestEnv()()
    qureg = utils.createQureg()(2, env)
    with pytest.raises(RuntimeError):
        pyquest_call_operation(operation=operation,
                               qureg=qureg,
                               classical_bit_registers=dict(),
                               classical_float_registers=dict(),
                               classical_complex_registers=test_dict,
                               output_bit_register_dict=dict(),
                               )

    utils.destroyQureg().call_interactive(qureg, env)
    utils.destroyQuestEnv().call_interactive(env)
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)