[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
This commit is contained in:
@@ -1,16 +1,16 @@
|
|||||||
import re
|
import re
|
||||||
|
import warnings
|
||||||
from collections import Counter, defaultdict
|
from collections import Counter, defaultdict
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import quimb.tensor as qtn
|
|
||||||
import quimb as qu
|
import quimb as qu
|
||||||
|
import quimb.tensor as qtn
|
||||||
from qibo.backends import NumpyBackend
|
from qibo.backends import NumpyBackend
|
||||||
from qibo.config import raise_error
|
from qibo.config import raise_error
|
||||||
from qibo.result import QuantumState
|
from qibo.result import QuantumState
|
||||||
|
|
||||||
from qibotn.backends.abstract import QibotnBackend
|
from qibotn.backends.abstract import QibotnBackend
|
||||||
from qibotn.result import TensorNetworkResult
|
from qibotn.result import TensorNetworkResult
|
||||||
import warnings
|
|
||||||
|
|
||||||
|
|
||||||
class QuimbBackend(QibotnBackend, NumpyBackend):
|
class QuimbBackend(QibotnBackend, NumpyBackend):
|
||||||
@@ -48,7 +48,7 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
self.max_bond_dimension = max_bond_dimension
|
self.max_bond_dimension = max_bond_dimension
|
||||||
self.n_most_frequent_states = n_most_frequent_states
|
self.n_most_frequent_states = n_most_frequent_states
|
||||||
|
|
||||||
def setup_backend_specifics(self, qimb_backend="numpy", optimizer='auto-hq'):
|
def setup_backend_specifics(self, qimb_backend="numpy", optimizer="auto-hq"):
|
||||||
"""Setup backend specifics.
|
"""Setup backend specifics.
|
||||||
Args:
|
Args:
|
||||||
qimb_backend: str
|
qimb_backend: str
|
||||||
@@ -119,9 +119,7 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
frequencies = Counter(circ_quimb.sample(nshots))
|
frequencies = Counter(circ_quimb.sample(nshots))
|
||||||
main_frequencies = {
|
main_frequencies = {
|
||||||
state: count
|
state: count
|
||||||
for state, count in frequencies.most_common(
|
for state, count in frequencies.most_common(self.n_most_frequent_states)
|
||||||
self.n_most_frequent_states
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
computational_states = list(main_frequencies.keys())
|
computational_states = list(main_frequencies.keys())
|
||||||
amplitudes = {
|
amplitudes = {
|
||||||
@@ -134,7 +132,11 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
frequencies = None
|
frequencies = None
|
||||||
measured_probabilities = None
|
measured_probabilities = None
|
||||||
|
|
||||||
statevector = circ_quimb.to_dense(backend=self.backend, optimize=self.optimizer) if return_array else None
|
statevector = (
|
||||||
|
circ_quimb.to_dense(backend=self.backend, optimize=self.optimizer)
|
||||||
|
if return_array
|
||||||
|
else None
|
||||||
|
)
|
||||||
return TensorNetworkResult(
|
return TensorNetworkResult(
|
||||||
nqubits=circuit.nqubits,
|
nqubits=circuit.nqubits,
|
||||||
backend=self,
|
backend=self,
|
||||||
@@ -167,18 +169,22 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
# for computing them in a single contraction. This does not work with CircuitMPS for some now
|
# for computing them in a single contraction. This does not work with CircuitMPS for some now
|
||||||
# for Quimb 1.11.1
|
# for Quimb 1.11.1
|
||||||
operators_list, sites_list, coeffs_list = self._qiboobs_to_quimbobs(observable)
|
operators_list, sites_list, coeffs_list = self._qiboobs_to_quimbobs(observable)
|
||||||
sites_list_grouped, operators_list_grouped, coeffs_list_grouped = self._group_by_tuples(sites_list, operators_list, coeffs_list)
|
sites_list_grouped, operators_list_grouped, coeffs_list_grouped = (
|
||||||
|
self._group_by_tuples(sites_list, operators_list, coeffs_list)
|
||||||
|
)
|
||||||
|
|
||||||
if self.ansatz == "MPS":
|
if self.ansatz == "MPS":
|
||||||
if len(sites_list)-len(sites_list_grouped) > 10:
|
if len(sites_list) - len(sites_list_grouped) > 10:
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"More than 10 local operators on the same sites are not being grouped as this is not compatible with CircuitMPS. Expected value computation can be more efficient without an MPS ansatz."
|
"More than 10 local operators on the same sites are not being grouped as this is not compatible with CircuitMPS. Expected value computation can be more efficient without an MPS ansatz."
|
||||||
)
|
)
|
||||||
circ_ansatz = (qtn.circuit.CircuitMPS)
|
circ_ansatz = qtn.circuit.CircuitMPS
|
||||||
circ = circ_ansatz.from_openqasm2_str(circuit.to_qasm())
|
circ = circ_ansatz.from_openqasm2_str(circuit.to_qasm())
|
||||||
expectation_value = 0.0
|
expectation_value = 0.0
|
||||||
for ops, sites, coeffs in zip(operators_list, sites_list, coeffs_list):
|
for ops, sites, coeffs in zip(operators_list, sites_list, coeffs_list):
|
||||||
exp_values = circ.local_expectation(ops, where=sites, backend=self.backend, optimize=self.optimizer)
|
exp_values = circ.local_expectation(
|
||||||
|
ops, where=sites, backend=self.backend, optimize=self.optimizer
|
||||||
|
)
|
||||||
expectation_value += np.dot(coeffs, exp_values)
|
expectation_value += np.dot(coeffs, exp_values)
|
||||||
return np.real(expectation_value)
|
return np.real(expectation_value)
|
||||||
|
|
||||||
@@ -186,15 +192,16 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
circ_ansatz = qtn.circuit.Circuit
|
circ_ansatz = qtn.circuit.Circuit
|
||||||
circ = circ_ansatz.from_openqasm2_str(circuit.to_qasm())
|
circ = circ_ansatz.from_openqasm2_str(circuit.to_qasm())
|
||||||
expectation_value = 0.0
|
expectation_value = 0.0
|
||||||
for ops, sites, coeffs in zip(operators_list_grouped, sites_list_grouped, coeffs_list_grouped):
|
for ops, sites, coeffs in zip(
|
||||||
exp_values = circ.local_expectation(ops, where=sites, backend=self.backend, optimize=self.optimizer)
|
operators_list_grouped, sites_list_grouped, coeffs_list_grouped
|
||||||
|
):
|
||||||
|
exp_values = circ.local_expectation(
|
||||||
|
ops, where=sites, backend=self.backend, optimize=self.optimizer
|
||||||
|
)
|
||||||
expectation_value += np.dot(coeffs, exp_values)
|
expectation_value += np.dot(coeffs, exp_values)
|
||||||
return np.real(expectation_value)
|
return np.real(expectation_value)
|
||||||
|
|
||||||
def _qiboobs_to_quimbobs(
|
def _qiboobs_to_quimbobs(self, hamiltonian):
|
||||||
self,
|
|
||||||
hamiltonian
|
|
||||||
):
|
|
||||||
"""
|
"""
|
||||||
Convert a Qibo SymbolicHamiltonian into a Quimb-compatible decomposition.
|
Convert a Qibo SymbolicHamiltonian into a Quimb-compatible decomposition.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user