Exemple #1
0
def polyPauliRotation(nb_vars_max=15):
    from unqomp.examples.polynomialpaulirot import makesQiskitPolyPauliRot
    from unqomp.examples.polynomialpaulirot import makesPolyPauliRot
    from qiskit.circuit.library import PolynomialPauliRotations
    #from unqomp.examples.mcx import makeQiskitMCRY

    nb_vars_t4 = []
    nb_qb_qi4 = []
    nb_qb_mi4 = []
    nb_gates_qi4 = []
    nb_gates_mi4 = []
    nb_qb_bq4 = []
    nb_gates_bq4 = []

    coeffs = [1 for i in range(nb_vars_max)]

    for nb_vars in range(3, nb_vars_max):
        circuit1 = makesPolyPauliRot(
            7, coeffs[:nb_vars]).circuitWithUncomputation()

        qiskitMCX = makesQiskitPolyPauliRot(7, coeffs[:nb_vars])

        buggyQi = PolynomialPauliRotations(7, coeffs[:nb_vars])

        nb_vars_t4.append(nb_vars)
        #qiskit
        nb_qb_qi4.append(qiskitMCX.num_qubits)
        nb_gates_qi4.append(qiskitMCX.decompose().decompose().decompose().
                            decompose().decompose().count_ops())

        #bad qiskit
        nb_qb_bq4.append(buggyQi.num_qubits)
        nb_gates_bq4.append(buggyQi.decompose().decompose().decompose().
                            decompose().decompose().count_ops())

        #mine
        nb_qb_mi4.append(circuit1.num_qubits)
        nb_gates_mi4.append(circuit1.decompose().decompose().decompose().
                            decompose().decompose().count_ops())

        with open('evaluation/plot_values/polynomialpaulirotation.csv',
                  'w') as f:
            sys.stdout = f  # Change the standard output to the file we created.
            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_t4)):
                print(nb_vars_t4[i], ";", nb_qb_qi4[i], ";",
                      nb_gates_qi4[i]['u3'] + nb_gates_qi4[i]['cx'], ";",
                      nb_gates_qi4[i]['cx'], ";", nb_qb_mi4[i], ";",
                      nb_gates_mi4[i]['u3'] + nb_gates_mi4[i]['cx'], ";",
                      nb_gates_mi4[i]['cx'], ";", nb_qb_bq4[i], ";",
                      nb_gates_bq4[i]['u3'] + nb_gates_bq4[i]['cx'], ";",
                      nb_gates_bq4[i]['cx'])
            sys.stdout = original_stdout  # Reset the standard output to its original value
Exemple #2
0
    def test_polynomial_function(self, coeffs, num_state_qubits):
        """Test the polynomial rotation."""
        def poly(x):
            res = sum(coeff * x**i for i, coeff in enumerate(coeffs))
            return res

        polynome = PolynomialPauliRotations(num_state_qubits, [2 * coeff for coeff in coeffs])
        self.assertFunctionIsCorrect(polynome, poly)
Exemple #3
0
def ppr(relative_numbers):
    from unqomp.examples.polynomialpaulirot import makesPolyPauliRot, makesQiskitPolyPauliRot
    from qiskit.circuit.library import PolynomialPauliRotations

    coeffs = [1,2,3,4,5,4,1,2,3,4,5]
    n = 8

    circuit1 = makesPolyPauliRot(8, coeffs).circuitWithUncomputation()

    qcirc = PolynomialPauliRotations(num_state_qubits=8, coeffs=coeffs)
    print('PolynomialPauliR with regression bug  ; ', end = '')

    #qiskit
    nb_qb_qi = qcirc.num_qubits
    nb_gates_qi = qcirc.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']) + ' ; ', end = '')

    #qiskit++
    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
    qiskitMCX = makesQiskitPolyPauliRot(n, coeffs)
    nb_qb_qi = qiskitMCX.num_qubits
    nb_gates_qi = qiskitMCX.decompose().decompose().decompose().decompose().decompose().count_ops()
    print('PolynomialPauliR *, 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'])
    def build(self, qc, q, q_target, q_ancillas=None, reverse=0):
        r"""Build the circuit.

        Args:
            qc (QuantumCircuit): quantum circuit
            q (list): list of qubits (has to be same length as self.num_state_qubits)
            q_target (Qubit): qubit to be rotated. The algorithm is successful when
                this qubit is in the \|1> state
            q_ancillas (list): list of ancilla qubits (or None if none needed)
            reverse (int): if 1, apply with reversed list of qubits
                           (i.e. q_n as q_0, q_n-1 as q_1, etc).
        """
        instr = PolynomialPauliRotations(
            num_state_qubits=self.num_state_qubits,
            coeffs=self.px,
            basis=self.basis,
            reverse=reverse).to_instruction()
        # pylint:disable=unnecessary-comprehension
        qr = [qi for qi in q] + [q_target]
        if q_ancillas:
            qr += [qi for qi in q_ancillas[:self.required_ancillas()]]
        qc.append(instr, qr)
Exemple #5
0
    def test_polynomial_rotations_mutability(self):
        """Test the mutability of the linear rotations circuit."""

        polynomial_rotations = PolynomialPauliRotations()

        with self.subTest(msg='missing number of state qubits'):
            with self.assertRaises(AttributeError):  # no state qubits set
                print(polynomial_rotations.draw())

        with self.subTest(msg='default setup, just setting number of state qubits'):
            polynomial_rotations.num_state_qubits = 2
            self.assertFunctionIsCorrect(polynomial_rotations, lambda x: x / 2)

        with self.subTest(msg='setting non-default values'):
            polynomial_rotations.coeffs = [0, 1.2 * 2, 0.4 * 2]
            self.assertFunctionIsCorrect(polynomial_rotations, lambda x: 1.2 * x + 0.4 * x ** 2)

        with self.subTest(msg='changing of all values'):
            polynomial_rotations.num_state_qubits = 4
            polynomial_rotations.coeffs = [1 * 2, 0, 0, -0.5 * 2]
            self.assertFunctionIsCorrect(polynomial_rotations, lambda x: 1 - 0.5 * x**3)