コード例 #1
0
def mcry(relative_numbers):
    from unqomp.ancillaallocation import AncillaCircuit
    from qiskit import QuantumRegister, QuantumCircuit
    from unqomp.examples.mcx import makeQiskitMCRY

    n = 12
    ctrls = QuantumRegister(n, 'ctrls')
    target = QuantumRegister(1, 'target')
    circuit1 = AncillaCircuit(ctrls, target)
    circuit1.mcry(2.0, ctrls, target)
    circuit1 = circuit1.circuitWithUncomputation()

    qiskitMCRY = makeQiskitMCRY(2.0, n)
    
    print('MCRY with regression bug  ; ', end = '')
   
    #qiskit buggy
    ctrls2 = QuantumRegister(n, 'ctrls')
    target2 = QuantumRegister(1, 'target')
    anc = QuantumRegister(n - 2, 'anc')
    circuit2 = QuantumCircuit(ctrls2, target2, anc)
    circuit2.mcry(2.0, ctrls2,target2[0], anc, mode = 'basic')
    nb_qb_qi = circuit2.num_qubits
    nb_gates_qi = circuit2.decompose().decompose().decompose().decompose().decompose().count_ops()
    if not relative_numbers:
        print(str(nb_qb_qi) + ' ; ' + str(nb_gates_qi['cx'] + nb_gates_qi['u3']) + ' ; ' + str(nb_gates_qi['cx']) + str(' ; '), end = '')

    nb_qb_mi = circuit1.num_qubits
    nb_gates_mi = circuit1.decompose().decompose().decompose().decompose().decompose().count_ops()
    if not relative_numbers:
        print(str(nb_qb_mi) + ' ; ' + str(nb_gates_mi['cx'] + nb_gates_mi['u3']) + ' ; ' + str(nb_gates_mi['cx']))

    if relative_numbers:
        print_relative_vals(nb_qb_qi, nb_gates_qi['cx'], nb_gates_qi['u3'], nb_qb_mi, nb_gates_mi['cx'], nb_gates_mi['u3'])

    #qiskit with bug fixed
    nb_qb_qi = qiskitMCRY.num_qubits
    nb_gates_qi = qiskitMCRY.decompose().decompose().decompose().decompose().decompose().count_ops()
    print('MCRY *, regression bug fixed  ; ', end = '')
    if not relative_numbers:
        print(str(nb_qb_qi) + ' ; ' + str(nb_gates_qi['cx'] + nb_gates_qi['u3']) + ' ; '+ str(nb_gates_qi['cx']) + str(' ; '), end = '')
        print(str(nb_qb_mi) + ' ; ' + str(nb_gates_mi['cx'] + nb_gates_mi['u3']) + ' ; ' + str(nb_gates_mi['cx']))
    else:
        print_relative_vals(nb_qb_qi, nb_gates_qi['cx'], nb_gates_qi['u3'], nb_qb_mi, nb_gates_mi['cx'], nb_gates_mi['u3'])
コード例 #2
0
def mcry(nb_vars_max=40):
    from unqomp.ancillaallocation import AncillaCircuit
    from qiskit import QuantumRegister, QuantumCircuit
    from unqomp.examples.mcx import makeQiskitMCRY

    nb_vars_t = []
    nb_qb_qi = []
    nb_qb_mi = []
    nb_qb_bq = []
    nb_gates_qi = []
    nb_gates_mi = []
    nb_gates_bq = []

    for nb_vars in range(3, nb_vars_max, 1):
        n = nb_vars
        ctrls = QuantumRegister(n, 'ctrls')
        target = QuantumRegister(1, 'target')
        circuit1 = AncillaCircuit(ctrls, target)
        circuit1.mcry(0.2, ctrls, target)
        circuit1 = circuit1.circuitWithUncomputation()

        qiskitMCX = makeQiskitMCRY(0.2, n)

        nb_vars_t.append(nb_vars)
        #qiskit
        nb_qb_qi.append(qiskitMCX.num_qubits)
        nb_gates_qi.append(qiskitMCX.decompose().decompose().decompose().
                           decompose().decompose().count_ops())

        #mine
        nb_qb_mi.append(circuit1.num_qubits)
        nb_gates_mi.append(circuit1.decompose().decompose().decompose().
                           decompose().decompose().count_ops())

        #qiskit buggy
        if n < 15:
            ctrls2 = QuantumRegister(n, 'ctrls')
            target2 = QuantumRegister(1, 'target')
            anc = QuantumRegister(n - 2, 'anc')
            circuit2 = QuantumCircuit(ctrls2, target2, anc)
            circuit2.mcry(0.2, ctrls2, target2[0], anc, mode='basic')
            nb_qb_bq.append(circuit2.num_qubits)
            nb_gates_bq.append(circuit2.decompose().decompose().decompose().
                               decompose().decompose().count_ops())
        else:
            nb_qb_bq.append(0)
            nb_gates_bq.append({'u3': 0, 'cx': 0})

    with open('evaluation/plot_values/mcry.csv', 'w') as f:
        sys.stdout = f
        print(
            "input size; n_qb Qiskit without regression bug; n_gates Qiskit without regression bug; n_cx_gates Qiskitwithout regression bug;  n_qb Unqomp; n_gates Unqomp ; n_cx_gates Uncomp; n_qb Qiskit with regression bug; n_gates Qiskit with regression bug ; n_cx_gates Qiskit with regression bug"
        )
        for i in range(len(nb_vars_t)):
            print(nb_vars_t[i], ";", nb_qb_qi[i], ";",
                  nb_gates_qi[i]['u3'] + nb_gates_qi[i]['cx'], ";",
                  nb_gates_qi[i]['cx'], ";", nb_qb_mi[i], ";",
                  nb_gates_mi[i]['u3'] + nb_gates_mi[i]['cx'], ";",
                  nb_gates_mi[i]['cx'], ";", nb_qb_bq[i], ";",
                  nb_gates_bq[i]['u3'] + nb_gates_bq[i]['cx'], ";",
                  nb_gates_bq[i]['cx'])
        sys.stdout = original_stdout
コード例 #3
0
def makesPolyPauliRot(num_state_qubits=None, coeffs=None):
    # basis is y
    degree = len(coeffs) - 1

    qr_state = QuantumRegister(num_state_qubits, name='state')
    qr_target = QuantumRegister(1, name='target')

    def _get_rotation_coefficients():
        """Compute the coefficient of each monomial.

        Returns:
            A dictionary with pairs ``{control_state: rotation angle}`` where ``control_state``
            is a tuple of ``0`` or ``1`` bits.
        """
        # determine the control states
        all_combinations = list(product([0, 1], repeat=num_state_qubits))
        valid_combinations = []
        for combination in all_combinations:
            if 0 < sum(combination) <= degree:
                valid_combinations += [combination]

        rotation_coeffs = {
            control_state: 0
            for control_state in valid_combinations
        }

        # compute the coefficients for the control states
        for i, coeff in enumerate(coeffs[1:]):
            i += 1  # since we skip the first element we need to increase i by one

            # iterate over the multinomial coefficients
            for comb, num_combs in _multinomial_coefficients(
                    num_state_qubits, i).items():
                control_state = ()
                power = 1
                for j, qubit in enumerate(comb):
                    if qubit > 0:  # means we control on qubit i
                        control_state += (1, )
                        power *= 2**(j * qubit)
                    else:
                        control_state += (0, )

                # Add angle
                rotation_coeffs[control_state] += coeff * num_combs * power

        return rotation_coeffs

    circuit = AncillaCircuit(qr_state, qr_target)
    rotation_coeffs = _get_rotation_coefficients()

    circuit.ry(coeffs[0], qr_target)

    for c in rotation_coeffs:
        qr_control = []
        for i, _ in enumerate(c):
            if c[i] > 0:
                qr_control.append(qr_state[i])

        # apply controlled rotations
        if len(qr_control) > 1:
            circuit.mcry(rotation_coeffs[c], qr_control, qr_target)
        elif len(qr_control) == 1:
            circuit.cry(rotation_coeffs[c], qr_control[0], qr_target)

    return circuit