[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
This commit is contained in:
5
setup.py
5
setup.py
@@ -1,6 +1,7 @@
|
||||
from setuptools import setup, find_packages
|
||||
import re
|
||||
import pathlib
|
||||
import re
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
HERE = pathlib.Path(__file__).parent.absolute()
|
||||
PACKAGE = "qibotn"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import cupy as cp
|
||||
from cuquantum.cutensornet.experimental import contract_decompose
|
||||
from cuquantum import contract
|
||||
from cuquantum.cutensornet.experimental import contract_decompose
|
||||
|
||||
|
||||
def initial(num_qubits, dtype):
|
||||
|
||||
@@ -94,8 +94,7 @@ class QiboCircuitToEinsum:
|
||||
required_shape = self.op_shape_from_qubits(len(gate_qubits))
|
||||
self.gate_tensors.append(
|
||||
(
|
||||
cp.asarray(gate.matrix(), dtype=self.dtype).reshape(
|
||||
required_shape),
|
||||
cp.asarray(gate.matrix(), dtype=self.dtype).reshape(required_shape),
|
||||
gate_qubits,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import cupy as cp
|
||||
import numpy as np
|
||||
|
||||
from cuquantum import cutensornet as cutn
|
||||
|
||||
from qibotn.MPSUtils import apply_gate, initial
|
||||
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
||||
from qibotn.MPSUtils import initial, apply_gate
|
||||
|
||||
|
||||
class QiboCircuitToMPS:
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
||||
import multiprocessing
|
||||
|
||||
import cupy as cp
|
||||
from cupy.cuda.runtime import getDeviceCount
|
||||
from cuquantum import contract
|
||||
from cuquantum import cutensornet as cutn
|
||||
import multiprocessing
|
||||
from cupy.cuda.runtime import getDeviceCount
|
||||
import cupy as cp
|
||||
|
||||
from qibotn.QiboCircuitToMPS import QiboCircuitToMPS
|
||||
from qibotn.mps_contraction_helper import MPSContractionHelper
|
||||
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
||||
from qibotn.QiboCircuitToMPS import QiboCircuitToMPS
|
||||
|
||||
|
||||
def eval(qibo_circ, datatype):
|
||||
@@ -49,7 +50,7 @@ def eval_tn_MPI(qibo_circ, datatype, n_samples=8):
|
||||
|
||||
return result, rank
|
||||
|
||||
|
||||
|
||||
def eval_mps(qibo_circ, gate_algo, datatype):
|
||||
myconvertor = QiboCircuitToMPS(qibo_circ, gate_algo, dtype=datatype)
|
||||
mps_helper = MPSContractionHelper(myconvertor.num_qubits)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from cuquantum import contract, contract_path, CircuitToEinsum, tensor
|
||||
from cuquantum import CircuitToEinsum, contract, contract_path, tensor
|
||||
|
||||
|
||||
class MPSContractionHelper:
|
||||
|
||||
@@ -3,8 +3,14 @@ import quimb.tensor as qtn
|
||||
from qibo.models import Circuit as QiboCircuit
|
||||
|
||||
|
||||
def from_qibo(circuit: QiboCircuit, is_mps: False, psi0=None, method='svd',
|
||||
cutoff=1e-6, cutoff_mode='abs'):
|
||||
def from_qibo(
|
||||
circuit: QiboCircuit,
|
||||
is_mps: False,
|
||||
psi0=None,
|
||||
method="svd",
|
||||
cutoff=1e-6,
|
||||
cutoff_mode="abs",
|
||||
):
|
||||
nqubits = circuit.nqubits
|
||||
gate_opt = {}
|
||||
if is_mps:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from timeit import default_timer as timer
|
||||
|
||||
import config
|
||||
import numpy as np
|
||||
import cupy as cp
|
||||
import numpy as np
|
||||
import pytest
|
||||
import qibo
|
||||
from qibo.models import QFT
|
||||
@@ -35,18 +35,14 @@ def test_eval(nqubits: int, dtype="complex128"):
|
||||
import qibotn.cutn
|
||||
|
||||
# Test qibo
|
||||
qibo.set_backend(backend=config.qibo.backend,
|
||||
platform=config.qibo.platform)
|
||||
qibo_time, (qibo_circ, result_sv) = time(
|
||||
lambda: qibo_qft(nqubits, swaps=True))
|
||||
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||
qibo_time, (qibo_circ, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True))
|
||||
|
||||
# Test Cuquantum
|
||||
cutn_time, result_tn = time(
|
||||
lambda: qibotn.cutn.eval(qibo_circ, dtype).flatten())
|
||||
cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, dtype).flatten())
|
||||
|
||||
assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time
|
||||
assert np.allclose(
|
||||
result_sv, result_tn), "Resulting dense vectors do not match"
|
||||
assert np.allclose(result_sv, result_tn), "Resulting dense vectors do not match"
|
||||
|
||||
|
||||
@pytest.mark.gpu
|
||||
@@ -62,25 +58,25 @@ def test_mps(nqubits: int, dtype="complex128"):
|
||||
import qibotn.cutn
|
||||
|
||||
# Test qibo
|
||||
qibo.set_backend(backend=config.qibo.backend,
|
||||
platform=config.qibo.platform)
|
||||
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||
|
||||
qibo_time, (circ_qibo, result_sv) = time(
|
||||
lambda: qibo_qft(nqubits, swaps=True))
|
||||
qibo_time, (circ_qibo, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True))
|
||||
|
||||
result_sv_cp = cp.asarray(result_sv)
|
||||
|
||||
# Test of MPS
|
||||
gate_algo = {'qr_method': False,
|
||||
'svd_method': {
|
||||
'partition': 'UV',
|
||||
'abs_cutoff': 1e-12,
|
||||
}}
|
||||
gate_algo = {
|
||||
"qr_method": False,
|
||||
"svd_method": {
|
||||
"partition": "UV",
|
||||
"abs_cutoff": 1e-12,
|
||||
},
|
||||
}
|
||||
|
||||
cutn_time, result_tn = time(
|
||||
lambda: qibotn.cutn.eval_mps(circ_qibo, gate_algo, dtype).flatten())
|
||||
lambda: qibotn.cutn.eval_mps(circ_qibo, gate_algo, dtype).flatten()
|
||||
)
|
||||
|
||||
print(
|
||||
f"State vector difference: {abs(result_tn - result_sv_cp).max():0.3e}")
|
||||
print(f"State vector difference: {abs(result_tn - result_sv_cp).max():0.3e}")
|
||||
|
||||
assert cp.allclose(result_tn, result_sv_cp)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import copy
|
||||
import os
|
||||
|
||||
import config
|
||||
import numpy as np
|
||||
import pytest
|
||||
@@ -8,8 +9,7 @@ from qibo.models import QFT
|
||||
|
||||
|
||||
def create_init_state(nqubits):
|
||||
init_state = np.random.random(2**nqubits) + \
|
||||
1j * np.random.random(2**nqubits)
|
||||
init_state = np.random.random(2**nqubits) + 1j * np.random.random(2**nqubits)
|
||||
init_state = init_state / np.sqrt((np.abs(init_state) ** 2).sum())
|
||||
return init_state
|
||||
|
||||
@@ -20,8 +20,10 @@ def qibo_qft(nqubits, init_state, swaps):
|
||||
return circ_qibo, state_vec
|
||||
|
||||
|
||||
@pytest.mark.parametrize("nqubits, tolerance, is_mps",
|
||||
[(1, 1e-6, True), (2, 1e-6, False), (5, 1e-3, True), (10, 1e-3, False)])
|
||||
@pytest.mark.parametrize(
|
||||
"nqubits, tolerance, is_mps",
|
||||
[(1, 1e-6, True), (2, 1e-6, False), (5, 1e-3, True), (10, 1e-3, False)],
|
||||
)
|
||||
def test_eval(nqubits: int, tolerance: float, is_mps: bool):
|
||||
# hack quimb to use the correct number of processes
|
||||
# TODO: remove completely, or at least delegate to the backend
|
||||
@@ -33,22 +35,20 @@ def test_eval(nqubits: int, tolerance: float, is_mps: bool):
|
||||
init_state_tn = copy.deepcopy(init_state)
|
||||
|
||||
# Test qibo
|
||||
qibo.set_backend(backend=config.qibo.backend,
|
||||
platform=config.qibo.platform)
|
||||
#qibo_time, (qibo_circ, result_sv) = time(
|
||||
#lambda: qibo_qft(nqubits, init_state, swaps=True)
|
||||
#)
|
||||
qibo_circ, result_sv= qibo_qft(nqubits, init_state, swaps=True)
|
||||
|
||||
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||
# qibo_time, (qibo_circ, result_sv) = time(
|
||||
# lambda: qibo_qft(nqubits, init_state, swaps=True)
|
||||
# )
|
||||
qibo_circ, result_sv = qibo_qft(nqubits, init_state, swaps=True)
|
||||
|
||||
# Convert to qasm for other backends
|
||||
qasm_circ = qibo_circ.to_qasm()
|
||||
|
||||
# Test quimb
|
||||
result_tn = qibotn.quimb.eval(
|
||||
qasm_circ, init_state_tn, is_mps, backend=config.quimb.backend
|
||||
)
|
||||
|
||||
qasm_circ, init_state_tn, is_mps, backend=config.quimb.backend
|
||||
)
|
||||
|
||||
assert np.allclose(result_sv, result_tn,
|
||||
atol=tolerance), "Resulting dense vectors do not match"
|
||||
assert np.allclose(
|
||||
result_sv, result_tn, atol=tolerance
|
||||
), "Resulting dense vectors do not match"
|
||||
|
||||
Reference in New Issue
Block a user