"""Backend for DDSIM Hybrid Schrodinger-Feynman Simulator."""from__future__importannotationsimporttimefromtypingimportTYPE_CHECKING,AnyifTYPE_CHECKING:fromqiskitimportQuantumCircuitfromqiskitimportQiskitErrorfromqiskit.providersimportOptionsfromqiskit.result.modelsimportExperimentResult,ExperimentResultDatafromqiskit.transpilerimportTargetfromqiskit.utils.multiprocessingimportlocal_hardware_infofrom.headerimportDDSIMHeaderfrom.pyddsimimportHybridCircuitSimulator,HybridModefrom.qasmsimulatorimportQasmSimulatorBackendfrom.targetimportDDSIMTargetBuilder
[docs]classHybridQasmSimulatorBackend(QasmSimulatorBackend):"""Python interface to MQT DDSIM Hybrid Schrodinger-Feynman Simulator."""_HSF_TARGET=Target(description="MQT DDSIM HSF Simulator Target",num_qubits=128)@staticmethoddef_add_operations_to_target(target:Target)->None:DDSIMTargetBuilder.add_0q_gates(target)DDSIMTargetBuilder.add_1q_gates(target)DDSIMTargetBuilder.add_2q_controlled_gates(target)DDSIMTargetBuilder.add_barrier(target)DDSIMTargetBuilder.add_measure(target)def__init__(self,name:str="hybrid_qasm_simulator",description:str="MQT DDSIM Hybrid Schrodinger-Feynman simulator",)->None:super().__init__(name=name,description=description)@classmethoddef_default_options(cls)->Options:returnOptions(shots=None,parameter_binds=None,simulator_seed=None,mode="amplitude",nthreads=local_hardware_info()["cpus"],)@propertydeftarget(self)->Target:returnself._HSF_TARGETdef_run_experiment(self,qc:QuantumCircuit,**options:Any)->ExperimentResult:start_time=time.time()seed=options.get("seed",-1)mode=options.get("mode","amplitude")nthreads=int(options.get("nthreads",local_hardware_info()["cpus"]))ifmode=="amplitude":hybrid_mode=HybridMode.amplitudemax_qubits=30# hard-coded 16GiB memory limitalgorithm_qubits=qc.num_qubitsifalgorithm_qubits>max_qubits:msg="Not enough memory available to simulate the circuit even on a single thread"raiseQiskitError(msg)qubit_diff=max_qubits-algorithm_qubitsnthreads=int(min(2**qubit_diff,nthreads))elifmode=="dd":hybrid_mode=HybridMode.DDelse:msg=f"Simulation mode{mode} not supported by hybrid simulator. Available modes are 'amplitude' and 'dd'."raiseQiskitError(msg)sim=HybridCircuitSimulator(qc,seed=seed,mode=hybrid_mode,nthreads=nthreads)shots=options.get("shots",1024)ifself._SHOW_STATE_VECTORandshots>0:shots=0counts=sim.simulate(shots)end_time=time.time()data=ExperimentResultData(counts={hex(int(result,2)):countforresult,countincounts.items()},statevector=Noneifnotself._SHOW_STATE_VECTORelsesim.get_vector()ifsim.get_mode()==HybridMode.DDelsesim.get_final_amplitudes(),time_taken=end_time-start_time,mode=mode,nthreads=nthreads,)returnExperimentResult(shots=shots,success=True,status="DONE",seed=seed,data=data,metadata=qc.metadata,header=DDSIMHeader(qc),)