Пример #1
0
    def remove_final_measurements(self):
        """Removes final measurement on all qubits if they are present.
        Deletes the ClassicalRegister that was used to store the values from these measurements
        if it is idle.
        """
        # pylint: disable=cyclic-import
        from qiskit.transpiler.passes import RemoveFinalMeasurements
        from qiskit.converters import circuit_to_dag
        dag = circuit_to_dag(self)
        remove_final_meas = RemoveFinalMeasurements()
        new_dag = remove_final_meas.run(dag)

        # Set self's cregs and instructions to match the new DAGCircuit's
        self.data.clear()
        self.cregs = list(new_dag.cregs.values())

        for node in new_dag.topological_op_nodes():
            qubits = []
            for qubit in node.qargs:
                qubits.append(new_dag.qregs[qubit.register.name][qubit.index])

            clbits = []
            for clbit in node.cargs:
                clbits.append(new_dag.cregs[clbit.register.name][clbit.index])

            # Get arguments for classical condition (if any)
            inst = node.op.copy()
            inst.condition = node.condition
            self.append(inst, qubits, clbits)
Пример #2
0
def get_width_of_circuit(circuit):
    """Get number of qubits required by the circuit"""
    remove_final_meas = RemoveFinalMeasurements()
    active_qubits = [
        qubit
        for qubit in circuit.qubits if qubit not in remove_final_meas.run(
            circuit_to_dag(circuit)).idle_wires()
    ]
    return len(active_qubits)
Пример #3
0
def randomize(qpu_name, num_of_qubits, shots, min_depth_of_circuit,
              max_depth_of_circuit, num_of_circuits, token):
    """Create randomized circuits with given properties and jobs to run them on IBM backends."""
    sim_name = 'ibmq_qasm_simulator'
    backend_sim = ibmq_handler.get_qpu(token, sim_name)
    backend_real = ibmq_handler.get_qpu(token, qpu_name)
    locations = []

    # create the given number of circuits of given width and depth
    for i in range(min_depth_of_circuit, max_depth_of_circuit + 1):
        for j in range(num_of_circuits):
            rowcount = db.session.query(Benchmark).count()
            benchmark_id = rowcount // 2
            # create randomized circuits and transpile them for both backends
            qx = random_circuit(num_qubits=num_of_qubits,
                                depth=i,
                                measure=True)
            original_number_of_multi_qubit_gates = qx.num_nonlocal_gates()
            qcircuit_sim = transpile(qx,
                                     backend=backend_sim,
                                     optimization_level=3)
            qcircuit_real = transpile(qx,
                                      backend=backend_real,
                                      optimization_level=3)
            # ensure that the width of the circuit is correctly saved in the db
            remove_final_meas = RemoveFinalMeasurements()
            active_qubits_real = [
                qubit for qubit in qcircuit_real.qubits
                if qubit not in remove_final_meas.run(
                    circuit_to_dag(qcircuit_real)).idle_wires()
            ]
            transpiled_depth_sim = qcircuit_sim.depth()
            transpiled_width_sim = qcircuit_sim.num_qubits
            transpiled_number_of_multi_qubit_gates_sim = qcircuit_sim.num_nonlocal_gates(
            )
            transpiled_depth_real = qcircuit_real.depth()
            transpiled_width_real = len(active_qubits_real)
            transpiled_number_of_multi_qubit_gates_real = qcircuit_real.num_nonlocal_gates(
            )

            location_sim = run(circuit=qcircuit_sim,
                               backend=sim_name,
                               token=token,
                               shots=shots,
                               benchmark_id=benchmark_id,
                               original_depth=i,
                               original_width=num_of_qubits,
                               original_number_of_multi_qubit_gates=
                               original_number_of_multi_qubit_gates,
                               transpiled_depth=transpiled_depth_sim,
                               transpiled_width=transpiled_width_sim,
                               transpiled_number_of_multi_qubit_gates=
                               transpiled_number_of_multi_qubit_gates_sim)

            location_real = run(circuit=qcircuit_real,
                                backend=qpu_name,
                                token=token,
                                shots=shots,
                                benchmark_id=benchmark_id,
                                original_depth=i,
                                original_width=num_of_qubits,
                                original_number_of_multi_qubit_gates=
                                original_number_of_multi_qubit_gates,
                                transpiled_depth=transpiled_depth_real,
                                transpiled_width=transpiled_width_real,
                                transpiled_number_of_multi_qubit_gates=
                                transpiled_number_of_multi_qubit_gates_real)
            location_benchmark = '/qiskit-service/api/v1.0/benchmarks/' + str(
                benchmark_id)
            locations.append({
                'result-simulator': str(location_sim),
                'result-real-backend': str(location_real),
                'result-benchmark': str(location_benchmark)
            })

    return locations