Updates to test file and library file to keep module and testing
functions separate. The Config file needs to be reviewed to either change it to json or other formats.
This commit is contained in:
@@ -1,13 +1,8 @@
|
|||||||
import re
|
import re
|
||||||
import copy
|
|
||||||
from timeit import default_timer as timer
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import quimb as qu
|
import quimb as qu
|
||||||
import quimb.tensor as qtn
|
import quimb.tensor as qtn
|
||||||
|
import numpy as np
|
||||||
import qibo
|
|
||||||
from qibo.models import QFT as qibo_qft
|
|
||||||
|
|
||||||
|
|
||||||
def get_gate_params(operation):
|
def get_gate_params(operation):
|
||||||
@@ -189,6 +184,7 @@ def init_state_tn(nqubits, init_state_sv, tn_lib="quimb"):
|
|||||||
def tn_circ_eval(nqubits, qasm_circ, init_state, swaps=True, tn_lib="quimb",
|
def tn_circ_eval(nqubits, qasm_circ, init_state, swaps=True, tn_lib="quimb",
|
||||||
backend='numpy'):
|
backend='numpy'):
|
||||||
if tn_lib == "quimb":
|
if tn_lib == "quimb":
|
||||||
|
|
||||||
circ_quimb = qasm_QFT(nqubits, qasm_circ, swaps, psi0=init_state)
|
circ_quimb = qasm_QFT(nqubits, qasm_circ, swaps, psi0=init_state)
|
||||||
interim = circ_quimb.psi.full_simplify(seq="DRC")
|
interim = circ_quimb.psi.full_simplify(seq="DRC")
|
||||||
result = interim.to_dense(backend=backend).flatten()
|
result = interim.to_dense(backend=backend).flatten()
|
||||||
@@ -198,36 +194,12 @@ def tn_circ_eval(nqubits, qasm_circ, init_state, swaps=True, tn_lib="quimb",
|
|||||||
assert False, "Unsupported tensor network library"
|
assert False, "Unsupported tensor network library"
|
||||||
|
|
||||||
|
|
||||||
def eval_QI_qft(nqubits, backend="numpy", qibo_backend="qibojit", with_swaps=True):
|
def eval_QI_qft(nqubits, qasm_circ, init_state, backend="numpy", swaps=True):
|
||||||
# backend (quimb): numpy, cupy, jax. Passed to ``opt_einsum``.
|
# backend (quimb): numpy, cupy, jax. Passed to ``opt_einsum``.
|
||||||
# qibo_backend: qibojit, qibotf, tensorflow, numpy
|
|
||||||
|
|
||||||
# generate random statevector as initial state
|
|
||||||
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())
|
|
||||||
init_state_quimb = copy.deepcopy(init_state)
|
|
||||||
|
|
||||||
# Qibo circuit
|
|
||||||
# qibo.set_backend(backend=qibo_backend, platform="numba")
|
|
||||||
qibo.set_backend(backend=qibo_backend, platform="numpy")
|
|
||||||
|
|
||||||
start = timer()
|
|
||||||
circ_qibo = qibo_qft(nqubits, with_swaps)
|
|
||||||
amplitudes_reference = np.array(circ_qibo(init_state))
|
|
||||||
end = timer()
|
|
||||||
qibo_qft_time = end - start
|
|
||||||
qasm_circ = circ_qibo.to_qasm()
|
|
||||||
|
|
||||||
#####################################################################
|
|
||||||
# Quimb circuit
|
# Quimb circuit
|
||||||
init_state_MPS = init_state_tn(nqubits=nqubits,
|
init_state_mps = init_state_tn(nqubits=nqubits, init_state_sv=init_state)
|
||||||
init_state_sv=init_state_quimb)
|
|
||||||
|
|
||||||
# construct quimb qft circuit
|
|
||||||
start = timer()
|
|
||||||
amplitudes = tn_circ_eval(nqubits=nqubits, qasm_circ=qasm_circ,
|
amplitudes = tn_circ_eval(nqubits=nqubits, qasm_circ=qasm_circ,
|
||||||
init_state=init_state_MPS, swaps=with_swaps,
|
init_state=init_state_mps, swaps=swaps,
|
||||||
tn_lib="quimb")
|
tn_lib="quimb")
|
||||||
end = timer()
|
return amplitudes
|
||||||
quimb_qft_time = end - start
|
|
||||||
assert np.allclose(amplitudes, amplitudes_reference, atol=1e-06)
|
|
||||||
@@ -1,6 +1,27 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
import qibo
|
||||||
|
from qibo.models import QFT
|
||||||
|
import numpy as np
|
||||||
|
import copy
|
||||||
|
from timeit import default_timer as timer
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
|
|
||||||
|
def init_state_sv(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())
|
||||||
|
# An unmodified init_state has to be converted to tn format
|
||||||
|
init_state_for_tn = copy.deepcopy(init_state)
|
||||||
|
return init_state, init_state_for_tn
|
||||||
|
|
||||||
|
|
||||||
|
def qibo_qft(nqubits, init_state, swaps):
|
||||||
|
circ_qibo = QFT(nqubits, swaps)
|
||||||
|
state_vec = np.array(circ_qibo(init_state))
|
||||||
|
return circ_qibo, state_vec
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("nqubits", [1, 2, 5, 10])
|
@pytest.mark.parametrize("nqubits", [1, 2, 5, 10])
|
||||||
@@ -8,4 +29,27 @@ def test_eval(nqubits: int):
|
|||||||
os.environ["QUIMB_NUM_PROCS"] = str(os.cpu_count())
|
os.environ["QUIMB_NUM_PROCS"] = str(os.cpu_count())
|
||||||
from qibotn import qasm_quimb
|
from qibotn import qasm_quimb
|
||||||
|
|
||||||
result = qasm_quimb.eval_QI_qft(nqubits)
|
init_state_qibo, init_state_for_tn = init_state_sv(nqubits=nqubits)
|
||||||
|
|
||||||
|
# Test qibo
|
||||||
|
qibo.set_backend(backend=config.qibo['backend'], \
|
||||||
|
platform=config.qibo['platform'])
|
||||||
|
start_time = timer()
|
||||||
|
qibo_circ, result_sv = qibo_qft(nqubits, init_state=init_state_qibo, \
|
||||||
|
swaps=config.qibo['swaps'])
|
||||||
|
end_time = timer()
|
||||||
|
qibo_time = end_time - start_time
|
||||||
|
|
||||||
|
# Convert to qasm for other backends
|
||||||
|
qasm_circ = qibo_circ.to_qasm()
|
||||||
|
|
||||||
|
# Test quimb
|
||||||
|
start_time = timer()
|
||||||
|
result_tn = qasm_quimb.eval_QI_qft(nqubits=nqubits, qasm_circ=qasm_circ, \
|
||||||
|
init_state=init_state_for_tn, backend=config.quimb['backend'], \
|
||||||
|
swaps=config.quimb['swaps'])
|
||||||
|
end_time = timer()
|
||||||
|
quimb_time = end_time - start_time
|
||||||
|
|
||||||
|
assert np.allclose(result_sv, result_tn), \
|
||||||
|
"Resulting dense vectors do not match"
|
||||||
|
|||||||
Reference in New Issue
Block a user