Skip to content

Commit

Permalink
test: Improve coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
andrea-pasquale committed Jun 1, 2024
1 parent 21d3b35 commit 98f4b2f
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 34 deletions.
2 changes: 1 addition & 1 deletion src/qibo/models/dbi/double_bracket.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,6 @@ def cost_expansion(self, d, n):
coef = energy_fluctuation_polynomial_expansion_coef(
self, d, n, self.ref_state
)
else:
else: # pragma: no cover
raise ValueError(f"Cost function {self.cost} not recognized.")
return coef
25 changes: 4 additions & 21 deletions src/qibo/models/dbi/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,11 @@ def generate_pauli_index(nqubits, order):
"""
if order == 1:
return list(range(nqubits))
elif order > 1:
else:
indices = list(range(nqubits))
return indices + [
comb for i in range(2, order + 1) for comb in combinations(indices, i)
]
else:
raise ValueError("Order must be a positive integer")


def generate_pauli_operator_dict(
Expand Down Expand Up @@ -134,17 +132,6 @@ def generate_pauli_operator_dict(
return {index: operator for index, operator in zip(pauli_index, pauli_operators)}


def diagonal_min_max(matrix: np.array):
"""
Generate a diagonal matrix D with the same diagonal elements as `matrix` but with minimum and maximum values.
(may be deprecated as a useful ansatz for D)
"""
L = int(np.log2(matrix.shape[0]))
D = np.linspace(np.min(np.diag(matrix)), np.max(np.diag(matrix)), 2**L)
D = np.diag(D)
return D


def generate_pauli_operators(nqubits, symbols_pauli, positions, backend=None):
# generate matrix of an nqubit-pauli operator with `symbols_pauli` at `positions`
if isinstance(positions, int):
Expand Down Expand Up @@ -182,10 +169,6 @@ def params_to_diagonal_operator(
backend = _check_backend(backend)
if parameterization is ParameterizationTypes.pauli:
# raise error if dimension mismatch
if len(params) != len(pauli_operator_dict):
raise ValueError(
f"Dimension of params ({len(params)}) mismatches the given parameterization order ({pauli_parameterization_order})"
)
d = sum(
[
backend.to_numpy(params[i])
Expand All @@ -197,9 +180,9 @@ def params_to_diagonal_operator(
d = np.zeros((len(params), len(params)))
for i in range(len(params)):
d[i, i] = backend.to_numpy(params[i])
else:
raise ValueError(f"Parameterization type not recognized.")
if normalize:

# TODO: write proper tests for normalize=True
if normalize: # pragma: no cover
d = d / np.linalg.norm(d)
return d

Expand Down
20 changes: 16 additions & 4 deletions src/qibo/models/dbi/utils_dbr_strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,18 @@ def select_best_dbr_generator(
"""
if scheduling is None:
scheduling = dbi_object.scheduling
norms_off_diagonal_restriction = [dbi_object.off_diagonal_norm] * (len(d_list) + 1)
optimal_steps = np.zeros(len(d_list) + 1)
flip_list = np.ones(len(d_list) + 1)

if compare_canonical:
norms_off_diagonal_restriction = [dbi_object.off_diagonal_norm] * (
len(d_list) + 1
)
optimal_steps = np.zeros(len(d_list) + 1)
flip_list = np.ones(len(d_list) + 1)
else:
norms_off_diagonal_restriction = [dbi_object.off_diagonal_norm] * (len(d_list))
optimal_steps = np.zeros(len(d_list))
flip_list = np.ones(len(d_list))

for i, d in enumerate(d_list):
# prescribed step durations
dbi_eval = deepcopy(dbi_object)
Expand Down Expand Up @@ -208,7 +217,10 @@ def gradient_descent(
backend = _check_backend(backend)

nqubits = dbi_object.nqubits
if parameterization is ParameterizationTypes.pauli and pauli_operator_dict is None:
# TODO: write tests where this condition applies
if (
parameterization is ParameterizationTypes.pauli and pauli_operator_dict is None
): # pragma: no cover
pauli_operator_dict = generate_pauli_operator_dict(
nqubits=nqubits, parameterization_order=pauli_parameterization_order
)
Expand Down
25 changes: 17 additions & 8 deletions tests/test_models_dbi.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,10 @@ def test_least_squares(backend):
assert dbi.least_squares(d=d) < initial_potential


@pytest.mark.parametrize("compare_canonical", [True, False])
@pytest.mark.parametrize("step", [None, 1e-3])
@pytest.mark.parametrize("nqubits", [2, 3])
def test_select_best_dbr_generator(backend, nqubits):
def test_select_best_dbr_generator(backend, nqubits, step, compare_canonical):
h0 = random_hermitian(2**nqubits, backend=backend, seed=seed)
dbi = DoubleBracketIteration(
Hamiltonian(nqubits, h0, backend=backend),
Expand All @@ -183,13 +185,16 @@ def test_select_best_dbr_generator(backend, nqubits):
Z_ops = list(generate_local_Z.values())
for _ in range(NSTEPS):
dbi, idx, step, flip_sign = select_best_dbr_generator(
dbi, Z_ops, compare_canonical=True
dbi,
Z_ops,
compare_canonical=compare_canonical,
step=step,
)
assert dbi.off_diagonal_norm < initial_off_diagonal_norm


def test_params_to_diagonal_operator(backend):
nqubits = 3
nqubits = 2
pauli_operator_dict = generate_pauli_operator_dict(
nqubits, parameterization_order=1, backend=backend
)
Expand All @@ -207,16 +212,19 @@ def test_params_to_diagonal_operator(backend):
),
)
operator_element = params_to_diagonal_operator(
params, nqubits=nqubits, parameterization=ParameterizationTypes.computational
params,
nqubits=nqubits,
parameterization=ParameterizationTypes.computational,
)
for i in range(len(params)):
backend.assert_allclose(
backend.cast(backend.to_numpy(operator_element).diagonal())[i], params[i]
)


@pytest.mark.parametrize("nqubits", [3])
def test_gradient_descent(backend, nqubits):
@pytest.mark.parametrize("order", [1, 2])
def test_gradient_descent(backend, order):
nqubits = 2
h0 = random_hermitian(2**nqubits, seed=seed, backend=backend)
dbi = DoubleBracketIteration(
Hamiltonian(nqubits, h0, backend=backend),
Expand All @@ -227,7 +235,7 @@ def test_gradient_descent(backend, nqubits):
initial_off_diagonal_norm = dbi.off_diagonal_norm
pauli_operator_dict = generate_pauli_operator_dict(
nqubits,
parameterization_order=1,
parameterization_order=order,
backend=backend,
)
pauli_operators = list(pauli_operator_dict.values())
Expand All @@ -242,6 +250,7 @@ def test_gradient_descent(backend, nqubits):
d_coef_pauli,
ParameterizationTypes.pauli,
pauli_operator_dict=pauli_operator_dict,
pauli_parameterization_order=order,
)
assert loss_hist_pauli[-1] < initial_off_diagonal_norm

Expand All @@ -254,4 +263,4 @@ def test_gradient_descent(backend, nqubits):
) = gradient_descent(
dbi, NSTEPS, d_coef_computational_partial, ParameterizationTypes.computational
)
assert loss_hist_computational_partial[-1] < loss_hist_pauli[-1]
assert loss_hist_computational_partial[-1] < initial_off_diagonal_norm

0 comments on commit 98f4b2f

Please sign in to comment.