Ejemplo n.º 1
0
def test_algorithm(circuit, iterations=(1000000)):
    """
    Tests a circuit by submitting it to both aer_simulator and PyLinalg.
    """
    linalg = PyLinalg()
    qlm_circ, _ = qiskit_to_qlm(circuit, sep_measures=True)
    test_job = qlm_circ.to_job(nbshots=0, aggregate_data=False)
    expected = linalg.submit(test_job)

    qiskit_qpu = BackendToQPU(Aer.get_backend('aer_simulator'))

    test_job.nbshots = iterations
    result = qiskit_qpu.submit(test_job)

    dist_calc = compare_results(expected, result, aggregate=False)
    distance = analyze_distance(dist_calc)
    print("Distance is {}".format(distance))
    return distance
Ejemplo n.º 2
0
    def test0_default_gates_and_qbit_reorder(self):
        """
        Tries out every default gate and check that they match
        once the Qiskit circuit is translated into a QLM circuit.
        """
        qreg1 = QuantumRegister(2)
        qreg2 = QuantumRegister(1)
        qreg3 = QuantumRegister(2)
        creg = ClassicalRegister(5)
        ocirc = QuantumCircuit(qreg1, qreg2, qreg3, creg)

        gates_1qb_0prm, gates_1qb_1prm, gates_2qb_0prm, \
            gates_2qb_1prm, gates_3qb_0prm = gen_gates(ocirc)

        for gate_op in gates_1qb_0prm:
            gate_op(qreg2[0])
        for gate_op in gates_1qb_1prm:
            gate_op(3.14, qreg2[0])
        for gate_op in gates_2qb_0prm:
            gate_op(qreg3[0], qreg1[1])
        for gate_op in gates_2qb_1prm:
            gate_op(3.14, qreg3[0], qreg1[1])
        for gate_op in gates_3qb_0prm:
            gate_op(qreg2[0], qreg3[1], qreg1[1])

        ocirc.u(3.14, 3.14, 3.14, qreg3[0])
        ocirc.r(3.14, 3.14, qreg3[0])
        ocirc.ms(3.14, [qreg1[1], qreg2[0], qreg3[0]])

        ocirc.measure(qreg1[0], creg[4])
        ocirc.measure(qreg1[1], creg[3])
        ocirc.measure(qreg2[0], creg[2])
        ocirc.measure(qreg3[0], creg[1])
        ocirc.measure(qreg3[1], creg[0])

        result = qiskit_to_qlm(ocirc)

        prog = Program()
        qubits = prog.qalloc(5)
        cbits = prog.calloc(5)
        for gate_op in PYGATES_1QB:
            prog.apply(gate_op, qubits[2])
        for gate_op in PYGATES_2QB:
            prog.apply(gate_op, qubits[3], qubits[1])

        prog.apply(SWAP.ctrl(), qubits[2], qubits[4], qubits[1])
        prog.apply(X.ctrl().ctrl(), qubits[2], qubits[4], qubits[1])
        prog.apply(U3(3.14, 3.14, 3.14), qubits[3])
        prog.apply(R(3.14, 3.14), qubits[3])
        prog.apply(MS(3.14, 3), qubits[1], qubits[2], qubits[3])

        for i in range(5):
            prog.measure(qubits[i], cbits[4 - i])

        expected = prog.to_circ()

        self.assertEqual(len(result.ops), len(expected.ops))
        for res_op, exp_op in zip(result.ops, expected.ops):
            if res_op.type == OpType.MEASURE:
                self.assertEqual(res_op, exp_op)
                continue
            result_gate_name, result_gate_params = extract_syntax(
                result.gateDic[res_op.gate], result.gateDic)
            LOGGER.debug("got gate {} with params {} on qbits {}".format(
                result_gate_name, result_gate_params, res_op.qbits))

            expected_gate_name, expected_gate_params = extract_syntax(
                expected.gateDic[exp_op.gate], expected.gateDic)
            LOGGER.debug("expected gate {} with params {} on qbits {}".format(
                expected_gate_name, expected_gate_params, exp_op.qbits))

            self.assertEqual(expected_gate_name, result_gate_name)
            self.assertEqual(expected_gate_params, result_gate_params)
            self.assertEqual(exp_op.qbits, res_op.qbits)

        LOGGER.debug("\nResults obtained:")
        qpu = BackendToQPU()
        result_job = result.to_job(nbshots=1024)
        qiskit_result = qpu.submit(result_job)
        for entry in qiskit_result.raw_data:
            LOGGER.debug("State: {}\t probability: {}".format(
                entry.state, entry.probability))

        LOGGER.debug("\nResults expected:")
        expected_job = expected.to_job(nbshots=1024)
        qlm_result = qpu.submit(expected_job)
        for entry in qlm_result.raw_data:
            LOGGER.debug("State: {}\t probability: {}".format(
                entry.state, entry.probability))

        self.assertEqual(len(qiskit_result.raw_data), len(qlm_result.raw_data))
        states_expected = [str(entry.state) for entry in qlm_result.raw_data]
        for entry in qiskit_result.raw_data:
            self.assertTrue(str(entry.state) in states_expected)
Ejemplo n.º 3
0
    def test1_abstract_variables(self):
        """
        Tests the conversion of Parameter objects from Qiskit into
        abstract Variable objects in QLM via qiskit_to_qlm.
        """
        qreg = QuantumRegister(1)
        circ = QuantumCircuit(qreg)
        param0 = Parameter("param0")
        param1 = Parameter("param1")
        param2 = Parameter("param2")
        param3 = Parameter("param3")
        param0.expr = 1
        param1.expr = 3.14
        param4 = param0 + param1 + param2 - param3
        param5 = param0 * param1 * (param2 + 4.54) * param3
        param6 = param5 * param4
        param7 = param4 / (param2 - 7)
        circ.rx(param0, 0)
        circ.rx(param1, 0)
        circ.rx(param2, 0)
        circ.rx(param3, 0)
        circ.rx(param4, 0)
        circ.rx(param5, 0)
        circ.rx(param6, 0)
        circ.rx(param7, 0)
        qlm_circ = qiskit_to_qlm(circ)
        i = 0
        for _, params, _ in qlm_circ.iterate_simple():
            for param in params:
                LOGGER.debug(param.to_thrift())
                if i == 0:
                    self.assertEqual(param.to_thrift(), "param0")
                if i == 1:
                    self.assertEqual(param.to_thrift(), "param1")
                if i == 2:
                    self.assertEqual(param.to_thrift(), "param2")
                if i == 3:
                    self.assertEqual(param.to_thrift(), "param3")
                if i == 4:
                    self.assertEqual(
                        param.to_thrift(),
                        "+ + + * -1.0 param3 param2 param0 param1")
                if i == 5:
                    self.assertEqual(
                        param.to_thrift(),
                        "* * * + 4.54 param2 param0 param1 param3")
                if i == 6:
                    self.assertEqual(
                        param.to_thrift(),
                        "* * * * + + + * -1.0 param3 param2 param0 param1 " +
                        "+ 4.54 param2 param0 param1 param3")
                if i == 7:
                    self.assertEqual(
                        param.to_thrift(),
                        "* + + + * -1.0 param3 param2 param0 param1" +
                        " ** + -7.0 param2 -1.0")
            i += 1

        prog = Program()
        qubits = prog.qalloc(1)
        var0 = prog.new_var(float, "param0")
        var1 = prog.new_var(float, "param1")
        var2 = prog.new_var(float, "param2")
        var3 = prog.new_var(float, "param3")
        var4 = var0 + var1 + var2 - var3
        var5 = var0 * var1 * (var2 + 4.54) * var3
        var6 = var5 * var4
        var7 = var4 / (var2 - 7)
        prog.apply(RX(var0), qubits[0])
        prog.apply(RX(var1), qubits[0])
        prog.apply(RX(var2), qubits[0])
        prog.apply(RX(var3), qubits[0])
        prog.apply(RX(var4), qubits[0])
        prog.apply(RX(var5), qubits[0])
        prog.apply(RX(var6), qubits[0])
        prog.apply(RX(var7), qubits[0])
        qlm_circ_expected = prog.to_circ()
        qlm_circ_expected(var0=1)
        qlm_circ_expected(var1=3.14)
        for _, params, _ in qlm_circ_expected.iterate_simple():
            for param in params:
                LOGGER.debug(param.to_thrift())