Merge pull request #27 from qiboteam/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
# See https://pre-commit.com/hooks.html for more hooks
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.4.0
|
rev: v4.5.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
@@ -11,15 +11,15 @@ repos:
|
|||||||
- id: check-merge-conflict
|
- id: check-merge-conflict
|
||||||
- id: debug-statements
|
- id: debug-statements
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 23.1.0
|
rev: 24.2.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
- repo: https://github.com/pycqa/isort
|
- repo: https://github.com/pycqa/isort
|
||||||
rev: 5.12.0
|
rev: 5.13.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: isort
|
- id: isort
|
||||||
args: ["--profile", "black"]
|
args: ["--profile", "black"]
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
rev: v3.3.1
|
rev: v3.15.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
|
|||||||
5
setup.py
5
setup.py
@@ -1,6 +1,7 @@
|
|||||||
from setuptools import setup, find_packages
|
|
||||||
import re
|
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import re
|
||||||
|
|
||||||
|
from setuptools import find_packages, setup
|
||||||
|
|
||||||
HERE = pathlib.Path(__file__).parent.absolute()
|
HERE = pathlib.Path(__file__).parent.absolute()
|
||||||
PACKAGE = "qibotn"
|
PACKAGE = "qibotn"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import cupy as cp
|
import cupy as cp
|
||||||
from cuquantum.cutensornet.experimental import contract_decompose
|
|
||||||
from cuquantum import contract
|
from cuquantum import contract
|
||||||
|
from cuquantum.cutensornet.experimental import contract_decompose
|
||||||
|
|
||||||
|
|
||||||
def initial(num_qubits, dtype):
|
def initial(num_qubits, dtype):
|
||||||
|
|||||||
@@ -94,8 +94,7 @@ class QiboCircuitToEinsum:
|
|||||||
required_shape = self.op_shape_from_qubits(len(gate_qubits))
|
required_shape = self.op_shape_from_qubits(len(gate_qubits))
|
||||||
self.gate_tensors.append(
|
self.gate_tensors.append(
|
||||||
(
|
(
|
||||||
cp.asarray(gate.matrix(), dtype=self.dtype).reshape(
|
cp.asarray(gate.matrix(), dtype=self.dtype).reshape(required_shape),
|
||||||
required_shape),
|
|
||||||
gate_qubits,
|
gate_qubits,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import cupy as cp
|
import cupy as cp
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from cuquantum import cutensornet as cutn
|
from cuquantum import cutensornet as cutn
|
||||||
|
|
||||||
|
from qibotn.MPSUtils import apply_gate, initial
|
||||||
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
||||||
from qibotn.MPSUtils import initial, apply_gate
|
|
||||||
|
|
||||||
|
|
||||||
class QiboCircuitToMPS:
|
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 contract
|
||||||
from cuquantum import cutensornet as cutn
|
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.mps_contraction_helper import MPSContractionHelper
|
||||||
|
from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum
|
||||||
|
from qibotn.QiboCircuitToMPS import QiboCircuitToMPS
|
||||||
|
|
||||||
|
|
||||||
def eval(qibo_circ, datatype):
|
def eval(qibo_circ, datatype):
|
||||||
@@ -49,7 +50,7 @@ def eval_tn_MPI(qibo_circ, datatype, n_samples=8):
|
|||||||
|
|
||||||
return result, rank
|
return result, rank
|
||||||
|
|
||||||
|
|
||||||
def eval_mps(qibo_circ, gate_algo, datatype):
|
def eval_mps(qibo_circ, gate_algo, datatype):
|
||||||
myconvertor = QiboCircuitToMPS(qibo_circ, gate_algo, dtype=datatype)
|
myconvertor = QiboCircuitToMPS(qibo_circ, gate_algo, dtype=datatype)
|
||||||
mps_helper = MPSContractionHelper(myconvertor.num_qubits)
|
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:
|
class MPSContractionHelper:
|
||||||
|
|||||||
@@ -3,8 +3,14 @@ import quimb.tensor as qtn
|
|||||||
from qibo.models import Circuit as QiboCircuit
|
from qibo.models import Circuit as QiboCircuit
|
||||||
|
|
||||||
|
|
||||||
def from_qibo(circuit: QiboCircuit, is_mps: False, psi0=None, method='svd',
|
def from_qibo(
|
||||||
cutoff=1e-6, cutoff_mode='abs'):
|
circuit: QiboCircuit,
|
||||||
|
is_mps: False,
|
||||||
|
psi0=None,
|
||||||
|
method="svd",
|
||||||
|
cutoff=1e-6,
|
||||||
|
cutoff_mode="abs",
|
||||||
|
):
|
||||||
nqubits = circuit.nqubits
|
nqubits = circuit.nqubits
|
||||||
gate_opt = {}
|
gate_opt = {}
|
||||||
if is_mps:
|
if is_mps:
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
from timeit import default_timer as timer
|
from timeit import default_timer as timer
|
||||||
|
|
||||||
import config
|
import config
|
||||||
import numpy as np
|
|
||||||
import cupy as cp
|
import cupy as cp
|
||||||
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
import qibo
|
import qibo
|
||||||
from qibo.models import QFT
|
from qibo.models import QFT
|
||||||
@@ -35,18 +35,14 @@ def test_eval(nqubits: int, dtype="complex128"):
|
|||||||
import qibotn.cutn
|
import qibotn.cutn
|
||||||
|
|
||||||
# Test qibo
|
# Test qibo
|
||||||
qibo.set_backend(backend=config.qibo.backend,
|
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||||
platform=config.qibo.platform)
|
qibo_time, (qibo_circ, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True))
|
||||||
qibo_time, (qibo_circ, result_sv) = time(
|
|
||||||
lambda: qibo_qft(nqubits, swaps=True))
|
|
||||||
|
|
||||||
# Test Cuquantum
|
# Test Cuquantum
|
||||||
cutn_time, result_tn = time(
|
cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, dtype).flatten())
|
||||||
lambda: qibotn.cutn.eval(qibo_circ, dtype).flatten())
|
|
||||||
|
|
||||||
assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time
|
assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time
|
||||||
assert np.allclose(
|
assert np.allclose(result_sv, result_tn), "Resulting dense vectors do not match"
|
||||||
result_sv, result_tn), "Resulting dense vectors do not match"
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gpu
|
@pytest.mark.gpu
|
||||||
@@ -62,25 +58,25 @@ def test_mps(nqubits: int, dtype="complex128"):
|
|||||||
import qibotn.cutn
|
import qibotn.cutn
|
||||||
|
|
||||||
# Test qibo
|
# Test qibo
|
||||||
qibo.set_backend(backend=config.qibo.backend,
|
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||||
platform=config.qibo.platform)
|
|
||||||
|
|
||||||
qibo_time, (circ_qibo, result_sv) = time(
|
qibo_time, (circ_qibo, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True))
|
||||||
lambda: qibo_qft(nqubits, swaps=True))
|
|
||||||
|
|
||||||
result_sv_cp = cp.asarray(result_sv)
|
result_sv_cp = cp.asarray(result_sv)
|
||||||
|
|
||||||
# Test of MPS
|
# Test of MPS
|
||||||
gate_algo = {'qr_method': False,
|
gate_algo = {
|
||||||
'svd_method': {
|
"qr_method": False,
|
||||||
'partition': 'UV',
|
"svd_method": {
|
||||||
'abs_cutoff': 1e-12,
|
"partition": "UV",
|
||||||
}}
|
"abs_cutoff": 1e-12,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
cutn_time, result_tn = time(
|
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(
|
print(f"State vector difference: {abs(result_tn - result_sv_cp).max():0.3e}")
|
||||||
f"State vector difference: {abs(result_tn - result_sv_cp).max():0.3e}")
|
|
||||||
|
|
||||||
assert cp.allclose(result_tn, result_sv_cp)
|
assert cp.allclose(result_tn, result_sv_cp)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import copy
|
import copy
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import config
|
import config
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pytest
|
import pytest
|
||||||
@@ -8,8 +9,7 @@ from qibo.models import QFT
|
|||||||
|
|
||||||
|
|
||||||
def create_init_state(nqubits):
|
def create_init_state(nqubits):
|
||||||
init_state = np.random.random(2**nqubits) + \
|
init_state = np.random.random(2**nqubits) + 1j * np.random.random(2**nqubits)
|
||||||
1j * np.random.random(2**nqubits)
|
|
||||||
init_state = init_state / np.sqrt((np.abs(init_state) ** 2).sum())
|
init_state = init_state / np.sqrt((np.abs(init_state) ** 2).sum())
|
||||||
return init_state
|
return init_state
|
||||||
|
|
||||||
@@ -20,8 +20,10 @@ def qibo_qft(nqubits, init_state, swaps):
|
|||||||
return circ_qibo, state_vec
|
return circ_qibo, state_vec
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("nqubits, tolerance, is_mps",
|
@pytest.mark.parametrize(
|
||||||
[(1, 1e-6, True), (2, 1e-6, False), (5, 1e-3, True), (10, 1e-3, False)])
|
"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):
|
def test_eval(nqubits: int, tolerance: float, is_mps: bool):
|
||||||
# hack quimb to use the correct number of processes
|
# hack quimb to use the correct number of processes
|
||||||
# TODO: remove completely, or at least delegate to the backend
|
# 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)
|
init_state_tn = copy.deepcopy(init_state)
|
||||||
|
|
||||||
# Test qibo
|
# Test qibo
|
||||||
qibo.set_backend(backend=config.qibo.backend,
|
qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform)
|
||||||
platform=config.qibo.platform)
|
# qibo_time, (qibo_circ, result_sv) = time(
|
||||||
#qibo_time, (qibo_circ, result_sv) = time(
|
# lambda: qibo_qft(nqubits, init_state, swaps=True)
|
||||||
#lambda: qibo_qft(nqubits, init_state, swaps=True)
|
# )
|
||||||
#)
|
qibo_circ, result_sv = qibo_qft(nqubits, init_state, swaps=True)
|
||||||
qibo_circ, result_sv= qibo_qft(nqubits, init_state, swaps=True)
|
|
||||||
|
|
||||||
|
|
||||||
# Convert to qasm for other backends
|
# Convert to qasm for other backends
|
||||||
qasm_circ = qibo_circ.to_qasm()
|
qasm_circ = qibo_circ.to_qasm()
|
||||||
|
|
||||||
# Test quimb
|
# Test quimb
|
||||||
result_tn = qibotn.quimb.eval(
|
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,
|
assert np.allclose(
|
||||||
atol=tolerance), "Resulting dense vectors do not match"
|
result_sv, result_tn, atol=tolerance
|
||||||
|
), "Resulting dense vectors do not match"
|
||||||
|
|||||||
Reference in New Issue
Block a user