From a7574192b63d40c5636da5ebcce022ec75beccf1 Mon Sep 17 00:00:00 2001 From: vinitha-balachandran Date: Tue, 6 Feb 2024 17:54:24 +0800 Subject: [PATCH] renamed function 'eval' to 'dense_vector_tn_qu' --- src/qibotn/eval_qu.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/qibotn/eval_qu.py diff --git a/src/qibotn/eval_qu.py b/src/qibotn/eval_qu.py new file mode 100644 index 0000000..9dc639c --- /dev/null +++ b/src/qibotn/eval_qu.py @@ -0,0 +1,49 @@ +import numpy as np +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'): + nqubits = circuit.nqubits + gate_opt = {} + if is_mps: + tncirc = qtn.CircuitMPS(nqubits, psi0=psi0) + gate_opt["method"] = method + gate_opt["cutoff"] = cutoff + gate_opt["cutoff_mode"] = cutoff_mode + else: + tncirc = qtn.Circuit(nqubits, psi0=psi0) + + for gate in circuit.queue: + tncirc.apply_gate( + gate.name, + *gate.parameters, + *gate.qubits, + parametrize=False if is_mps else (len(gate.parameters) > 0), + **gate_opt + ) + + 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 dense_vector_tn_qu(qasm: str, init_state, is_mps, backend="numpy"): + """Evaluate QASM with Quimb + + backend (quimb): numpy, cupy, jax. Passed to ``opt_einsum``. + + """ + circuit = QiboCircuit.from_qasm(qasm) + if init_state is not None: + init_state = init_state_tn(circuit.nqubits, init_state) + circ_quimb = from_qibo(circuit, is_mps, psi0=init_state) + interim = circ_quimb.psi.full_simplify(seq="DRC") + amplitudes = interim.to_dense(backend=backend).flatten() + + return amplitudes