@@ -401,6 +401,57 @@ def test_parameter_posterior_requires_bounds_or_prior():
401401 assert "net1_ps" in issue .message
402402
403403
404+ def _add_observable_consuming_nn_output (problem ):
405+ """Add an observable whose formula references an NN output directly."""
406+ problem .add_mapping ("net1_output2" , "net1.outputs[0][1]" )
407+ problem .add_observable ("fitness_obs" , "net1_output2" , noise_formula = "0.05" )
408+ problem .add_measurement (
409+ "fitness_obs" , time = 1 , measurement = 1 , experiment_id = "e1"
410+ )
411+ return problem
412+
413+
414+ def test_nn_output_in_observable_formula_not_required_parameter ():
415+ """NN outputs consumed by an observable formula are not parameter table
416+ entries -- PEtab SciML explicitly allows an NN output in a formula."""
417+ from petab .v2 .lint import get_required_parameters_for_parameter_table
418+
419+ problem = _add_observable_consuming_nn_output (_get_test_problem ())
420+
421+ assert "net1_output2" not in get_required_parameters_for_parameter_table (
422+ problem
423+ )
424+ assert problem .validate () == []
425+
426+
427+ def test_nn_output_in_noise_formula_not_required_parameter ():
428+ """Same for noise formulas."""
429+ from petab .v2 .lint import get_required_parameters_for_parameter_table
430+
431+ problem = _get_test_problem ()
432+ problem .add_mapping ("net1_output2" , "net1.outputs[0][1]" )
433+ problem .observable_tables [0 ]["B_obs" ].noise_formula = "net1_output2"
434+
435+ assert "net1_output2" not in get_required_parameters_for_parameter_table (
436+ problem
437+ )
438+ assert problem .validate () == []
439+
440+
441+ def test_genuinely_missing_output_parameter_still_reported ():
442+ """The NN-output carve-out does not mask real missing parameters."""
443+ problem = _add_observable_consuming_nn_output (_get_test_problem ())
444+ # `scale` is not an NN entity and is not in the parameter table.
445+ problem .observable_tables [0 ][
446+ "fitness_obs"
447+ ].formula = "scale * net1_output2"
448+
449+ results = problem .validate ()
450+ assert results .has_errors ()
451+ assert any ("scale" in issue .message for issue in results )
452+ assert not any ("net1_output2" in issue .message for issue in results )
453+
454+
404455# ---------------------------------------------------------------------------
405456# Full-problem integration
406457# ---------------------------------------------------------------------------
0 commit comments