Skip to content

Commit

Permalink
feat: test for observable default value
Browse files Browse the repository at this point in the history
  • Loading branch information
BrunoLiegiBastonLiegi committed Jan 28, 2025
1 parent fb2984e commit 8f49487
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/qiboml/models/decoding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
56 changes: 56 additions & 0 deletions tests/#test_models_decoding.py#
Original file line number Diff line number Diff line change
@@ -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)
1 change: 1 addition & 0 deletions tests/.#test_models_decoding.py

0 comments on commit 8f49487

Please sign in to comment.