"""Sampler implementation using QasmSimulatorBackend."""from__future__importannotationsimportmathfromtypingimportTYPE_CHECKING,Any,Mapping,Sequence,Unionfromqiskit.primitivesimportSamplerResultfromqiskit.primitives.samplerimportSamplerasQiskitSamplerfromqiskit.resultimportQuasiDistribution,Resultfrommqt.ddsim.qasmsimulatorimportQasmSimulatorBackendifTYPE_CHECKING:fromqiskit.circuitimportParameterfromqiskit.circuit.parameterexpressionimportParameterValueTypeParameters=Union[Mapping[Parameter,ParameterValueType],Sequence[ParameterValueType]]
[docs]classSampler(QiskitSampler):# type: ignore[misc]_BACKEND=QasmSimulatorBackend()def__init__(self,*,options:dict[str,Any]|None=None,)->None:"""Initialize a new DDSIM Sampler Args: options: Default options. """super().__init__(options=options)@propertydefbackend(self)->QasmSimulatorBackend:returnself._BACKEND@propertydefnum_circuits(self)->int:"""The number of circuits stored in the sampler."""returnlen(self._circuits)def_call(self,circuits:Sequence[int],parameter_values:Sequence[Parameters],**run_options:Any,)->SamplerResult:"""Runs DDSIM backend Args: circuits: List of circuit indices to simulate parameter_values: List of parameters associated with those circuits run_options: Additional run options. Returns: The result of the sampling process. """result=self.backend.run([self._circuits[i]foriincircuits],parameter_values,**run_options).result()returnself._postprocessing(result,circuits)@staticmethoddef_postprocessing(result:Result,circuits:Sequence[int])->SamplerResult:"""Converts counts into quasi-probability distributions Args: result: Result from DDSIM backend circuits: List of circuit indices Returns: The result of the sampling process. """counts=result.get_counts()ifnotisinstance(counts,list):counts=[counts]shots=sum(counts[0].values())metadata:list[dict[str,Any]]=[{"shots":shots}for_inrange(len(circuits))]probabilities=[QuasiDistribution({k:v/shotsfork,vincount.items()},shots=shots,stddev_upper_bound=1/math.sqrt(shots),)forcountincounts]returnSamplerResult(probabilities,metadata)