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)
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)
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