Merge branch 'cuQuantum_cuTensorNet' of https://github.com/qiboteam/qibotn into cuQuantum_cuTensorNet

This commit is contained in:
tankya2
2023-02-22 10:24:24 +08:00
9 changed files with 348 additions and 137 deletions

View File

@@ -1,13 +1,28 @@
import argparse
from timeit import default_timer as timer
from qibotn import quimb as qiboquimb
from QiboCircuitConvertor import QiboCircuitToEinsum
from cuquantum import contract
import cupy as cp
from qibo.models import *
from timeit import default_timer as timer
from qibo.models import QFT
def parser():
parser = argparse.ArgumentParser()
parser.add_argument(
"--nqubits", default=10, type=int, help="Number of quibits in the circuits."
)
return parser.parse_args()
def main(args: argparse.Namespace):
print("Testing for %d nqubits" % (args.nqubits))
qiboquimb.eval(args.nqubits, args.qasm_circ, args.init_state)
def parser_cuquantum():
parser = argparse.ArgumentParser()
parser.add_argument(
"--nqubits", default=10, type=int, help="Number of quibits in the circuits."
@@ -42,7 +57,7 @@ def run_bench(task, label):
return result
def main(args: argparse.Namespace):
def main_cuquantum(args: argparse.Namespace):
print("Testing for %d nqubits" % (args.nqubits))
nqubits = args.nqubits
circuit_name = args.circuit

39
src/qibotn/quimb.py Normal file
View File

@@ -0,0 +1,39 @@
import numpy as np
import quimb.tensor as qtn
from qibo.models import Circuit as QiboCircuit
def from_qibo(circuit: QiboCircuit, psi0=None):
nqubits = circuit.nqubits
tncirc = qtn.Circuit(nqubits, psi0=psi0)
for gate in circuit.queue:
tncirc.apply_gate(
gate.name,
*gate.parameters,
*gate.qubits,
parametrize=len(gate.parameters) > 0
)
return tncirc
def init_state_tn(nqubits, init_state_sv):
dims = tuple(2 * np.ones(nqubits, dtype=int))
return qtn.tensor_1d.MatrixProductState.from_dense(init_state_sv, dims)
def eval(qasm: str, init_state, backend="numpy"):
"""Evaluate QASM with Quimb
backend (quimb): numpy, cupy, jax. Passed to ``opt_einsum``.
"""
circuit = QiboCircuit.from_qasm(qasm)
init_state_mps = init_state_tn(circuit.nqubits, init_state)
circ_quimb = from_qibo(circuit, psi0=init_state_mps)
interim = circ_quimb.psi.full_simplify(seq="DRC")
amplitudes = interim.to_dense(backend=backend).flatten()
return amplitudes