[pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci
This commit is contained in:
pre-commit-ci[bot]
2025-09-09 11:17:49 +00:00
parent 641277c62b
commit 064cff6b33

View File

@@ -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,34 +169,39 @@ 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)
else: else:
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.
@@ -247,16 +254,16 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
coeffs_list.append(coeff) coeffs_list.append(coeff)
return operators_list, sites_list, coeffs_list return operators_list, sites_list, coeffs_list
def _group_by_tuples(self, A, B, C): def _group_by_tuples(self, A, B, C):
""" """
Groups the elements of B and C by the unique tuples in A. Groups the elements of B and C by the unique tuples in A.
Parameters: Parameters:
A (list of tuples): key tuples (can contain duplicates) A (list of tuples): key tuples (can contain duplicates)
B (list): values aligned with A B (list): values aligned with A
C (list): values aligned with A C (list): values aligned with A
Returns: Returns:
(A_new, B_new, C_new): (A_new, B_new, C_new):
A_new: list of unique tuples A_new: list of unique tuples