diff --git a/src/qiboml/models/decoding.py b/src/qiboml/models/decoding.py index 955632e..6100220 100644 --- a/src/qiboml/models/decoding.py +++ b/src/qiboml/models/decoding.py @@ -74,7 +74,7 @@ class Expectation(QuantumDecoding): def __post_init__(self): if self.observable is None: - self.observable = Z(self.nqubits, dense=True, backend=self.backend) + self.observable = Z(self.nqubits, dense=False, backend=self.backend) super().__post_init__() def __call__(self, x: Circuit) -> ndarray: diff --git a/tests/#test_models_decoding.py# b/tests/#test_models_decoding.py# new file mode 100644 index 0000000..aee2495 --- /dev/null +++ b/tests/#test_models_decoding.py# @@ -0,0 +1,56 @@ +import numpy as np +import pytest +from qibo import gates, hamiltonians +from qibo.quantum_info import random_clifford +from qibo.symbols import Z + +import qiboml.models.decoding as dec + + +def test_probabilities_layer(backend): + nqubits = 5 + qubits = np.random.choice(range(nqubits), size=(4,), replace=False) + layer = dec.Probabilities(nqubits, qubits=qubits, backend=backend) + c = random_clifford(nqubits, backend=backend) + backend.assert_allclose( + layer(c).ravel(), backend.execute_circuit(c).probabilities() + ) + + +def test_state_layer(backend): + nqubits = 5 + layer = dec.State(nqubits, backend=backend) + c = random_clifford(nqubits, backend=backend) + real, im = layer(c) + backend.assert_allclose( + (real + 1j * im).ravel(), backend.execute_circuit(c).state().ravel() + ) + + +@pytest.mark.parametrize("nshots", [None, 10000]) +@pytest.mark.parametrize("observable", [None, lambda n,b: hamiltonians.SymbolicHamiltonian(sum([Z(i) for i in range(n)]), nqubits=n, backend=b)]) +def test_expectation_layer(backend, nshots, observable): + backend.set_seed(42) + rng = np.random.default_rng(42) + nqubits = 5 + + c = random_clifford(nqubits, seed=rng, backend=backend) + if observable is not None: + observable = observable(nqubits, backend) + layer = dec.Expectation( + nqubits, + observable=observable, + nshots=nshots, + backend=backend, + ) + layer_expv = layer(c) + if observable is None: + observable = hamiltonians.Z(nqubits, dense=False, backend=backend) + expv = ( + observable.expectation(backend.execute_circuit(c).state()) + if nshots is None + else observable.expectation_from_samples( + layer.circuit.measurements[0].result.frequencies() + ) + ) + backend.assert_allclose(layer_expv, expv) diff --git a/tests/.#test_models_decoding.py b/tests/.#test_models_decoding.py new file mode 120000 index 0000000..46bc9ff --- /dev/null +++ b/tests/.#test_models_decoding.py @@ -0,0 +1 @@ +andrea@ubuntu-desktop.9199:1738047566 \ No newline at end of file