Skip to content

Commit 848567d

Browse files
committed
fix
1 parent 089aa30 commit 848567d

3 files changed

Lines changed: 50 additions & 16 deletions

File tree

pypesto/objective/amici/amici_calculator.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,28 @@ def __call__(
265265
# TODO: to amici -- set sllh even if llh is nan?
266266
snllh = np.full(len(x_ids), np.nan)
267267
else:
268-
# llh to nllh, dict to array
269-
snllh = -np.array(
270-
[
271-
result["sllh"][x_id] # if x_id in res["sllh"] else 0.0
272-
for x_id in x_ids
273-
if x_id in x_dct.keys()
274-
]
275-
)
268+
try:
269+
# llh to nllh, dict to array
270+
snllh = -np.array(
271+
[
272+
result["sllh"][
273+
x_id
274+
] # if x_id in res["sllh"] else 0.0
275+
for x_id in x_ids
276+
if x_id in x_dct.keys()
277+
]
278+
)
279+
except KeyError as e:
280+
# A requested sensitivity is missing.
281+
# Probably the affected parameter is a fixed parameter
282+
# in amici instead of a sensitivity parameter
283+
# (non_estimated_parameters_as_constants=True ?).
284+
# In this case, only max(sensi_orders) == 0 is supported
285+
# unless this parameter is fixed in the pypesto problem.
286+
raise ValueError(
287+
f"Cannot compute gradient, missing entry for "
288+
f"{set(result['sllh']) - set(x_dct.keys())}."
289+
) from e
276290
if 2 in sensi_orders:
277291
if result["s2llh"] is None and np.isnan(result["llh"]):
278292
# TODO: to amici -- set s2llh even if llh is nan?

test/petab/test_petab_import.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,15 @@ def test_petab_v2_boehm():
303303
petab_problem = v2.Problem.from_yaml(
304304
models.get_problem_yaml_path(problem_id)
305305
)
306+
expected_fval_nominal = 138.22199693517703
306307

307308
# create model
308309
importer = PetabImporter(petab_problem)
309310
problem = importer.create_problem()
310311
assert problem.x_names == petab_problem.x_ids
311312
assert problem.dim == petab_problem.n_estimated == 9
312313
assert problem.dim_full == len(petab_problem.parameters) == 11
314+
# petab-non-estimated parameters are fixed in the pypesto problem
313315
assert problem.x_fixed_indices == [
314316
i for i, p in enumerate(petab_problem.parameters) if not p.estimate
315317
]
@@ -319,28 +321,46 @@ def test_petab_v2_boehm():
319321

320322
# evaluate objective at nominal parameters
321323
fval = problem.objective(np.asarray(petab_problem.x_nominal_free))
322-
assert np.isclose(fval, 138.22199693517703)
324+
assert np.isclose(fval, expected_fval_nominal)
323325

324326
# deepcopy works?
325327
problem_deepcopy = copy.deepcopy(problem)
326328
fval = problem_deepcopy.objective(np.asarray(petab_problem.x_nominal_free))
327-
assert np.isclose(fval, 138.22199693517703)
329+
assert np.isclose(fval, expected_fval_nominal)
328330

329331
# pickling works?
330332
problem_pickled = pickle.loads(pickle.dumps(problem)) # noqa: S301
331333
fval = problem_pickled.objective(np.asarray(petab_problem.x_nominal_free))
332-
assert np.isclose(fval, 138.22199693517703)
334+
assert np.isclose(fval, expected_fval_nominal)
333335

334336
# gradient works?
335337
fval, grad = problem.objective(
336338
np.asarray(petab_problem.x_nominal_free), sensi_orders=(0, 1)
337339
)
338-
assert np.isclose(fval, 138.22199693517703)
340+
assert np.isclose(fval, expected_fval_nominal)
341+
assert len(grad) == petab_problem.n_estimated
342+
343+
# fixing parameters, ...
344+
problem.unfix_parameters(petab_problem.x_fixed_indices)
345+
assert problem.dim == len(petab_problem.parameters)
346+
with pytest.raises(ValueError, match="Cannot compute gradient"):
347+
# cannot compute sensitivities for fixed parameters
348+
problem.objective(
349+
np.asarray(petab_problem.x_nominal), sensi_orders=(0, 1)
350+
)
351+
fval = problem.objective(np.asarray(petab_problem.x_nominal))
352+
assert np.isclose(fval, expected_fval_nominal)
353+
# re-fixing parameters
354+
problem.fix_parameters(
355+
petab_problem.x_fixed_indices, petab_problem.x_nominal_fixed
356+
)
357+
assert problem.dim == petab_problem.n_estimated
358+
fval, grad = problem.objective(
359+
np.asarray(petab_problem.x_nominal_free), sensi_orders=(0, 1)
360+
)
361+
assert np.isclose(fval, expected_fval_nominal)
339362
assert len(grad) == petab_problem.n_estimated
340363

341-
# TODO: fixing parameters, ...
342-
# problem.fix_parameters(...)
343-
# problem.unfix_parameters(...)
344364
# TODO mode=res/fun,
345365
# TODO hess/fim...
346366

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ extras = test,test_petab,amici,petab,emcee,dynesty,mltools,pymc,jax,fides,roadru
5353
deps =
5454
git+https://github.com/Benchmarking-Initiative/Benchmark-Models-PEtab.git@master\#subdirectory=src/python
5555
# git+https://github.com/PEtab-dev/petab_test_suite@main
56-
git+https://github.com/PEtab-dev/petab_test_suite@739b262e9e5f890d00e3bab227d248bb99ea4b66
56+
git+https://github.com/PEtab-dev/petab_test_suite@c12b9dc4e4c5585b1b83a1d6e89fd22447c46d03
5757
commands_pre =
5858
python3 -m pip uninstall -y amici
5959
#python3 -m pip install git+https://github.com/dweindl/amici.git@main\#egg=amici&subdirectory=python/sdist

0 commit comments

Comments
 (0)