65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
from benchmarks.libraries import abstract
|
|
|
|
|
|
class Qiskit(abstract.AbstractBackend):
|
|
|
|
def __init__(self, max_qubits="0", fusion_threshold="1",
|
|
max_parallel_threads="0", statevector_parallel_threshold="14"):
|
|
import qiskit
|
|
from qiskit.providers.aer import StatevectorSimulator
|
|
self.name = "qiskit"
|
|
self.__version__ = qiskit.__version__
|
|
self.max_qubits = int(max_qubits)
|
|
self.sim_options = dict(
|
|
max_parallel_threads=int(max_parallel_threads),
|
|
statevector_parallel_threshold=int(statevector_parallel_threshold),
|
|
fusion_enable=self.max_qubits > 0,
|
|
fusion_max_qubit=self.max_qubits,
|
|
fusion_threshold=int(fusion_threshold),
|
|
precision="double"
|
|
)
|
|
self.simulator = StatevectorSimulator(**self.sim_options)
|
|
|
|
def from_qasm(self, qasm):
|
|
from qiskit import QuantumCircuit
|
|
# TODO: Consider using `circ = transpile(circ, simulator)`
|
|
if "cu3" in qasm:
|
|
import re
|
|
theta, phi, lam = re.findall(r"cu3\((.*)\)", qasm)[0].split(",")
|
|
gamma = - (float(phi) + float(lam)) / 2
|
|
qasm = re.sub(rf"cu3\((.*)\)",
|
|
f"cu({theta},{phi},{lam},{gamma})",
|
|
qasm)
|
|
return QuantumCircuit.from_qasm_str(qasm)
|
|
|
|
def __call__(self, circuit):
|
|
result = self.simulator.run(circuit).result()
|
|
return result.get_statevector(circuit)
|
|
|
|
def get_precision(self):
|
|
return self.sim_options.get("precision")
|
|
|
|
def set_precision(self, precision):
|
|
from qiskit.providers.aer import StatevectorSimulator
|
|
self.sim_options["precision"] = precision
|
|
self.simulator = StatevectorSimulator(**self.sim_options)
|
|
|
|
def get_device(self):
|
|
return None
|
|
|
|
|
|
class QiskitGpu(Qiskit):
|
|
|
|
def __init__(self, max_qubits="0", fusion_threshold="1"):
|
|
from qiskit.providers.aer import StatevectorSimulator
|
|
super().__init__(max_qubits)
|
|
self.name = "qiskit-gpu"
|
|
self.sim_options = dict(
|
|
device="GPU",
|
|
fusion_enable=self.max_qubits > 0,
|
|
fusion_max_qubit=self.max_qubits,
|
|
fusion_threshold=int(fusion_threshold),
|
|
precision="double"
|
|
)
|
|
self.simulator = StatevectorSimulator(**self.sim_options)
|