Skip to content

Commit 684c6d1

Browse files
authored
petablint: require overriding of observable/noise placeholder parameters (#64)
So far it was allowed to not specify overrides for observable/noise parameter placeholders. Not sure why that was the case, as it is explicitly disallowed in the (current) PEtab specification. Fixes #63
1 parent 248bf73 commit 684c6d1

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

petab/measurements.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,13 @@ def assert_overrides_match_parameter_count(
289289
actual = len(split_parameter_replacement_list(
290290
row.get(OBSERVABLE_PARAMETERS, None)))
291291
# No overrides are also allowed
292-
if actual not in [0, expected]:
292+
if actual != expected:
293293
formula = observable_df.loc[row[OBSERVABLE_ID], OBSERVABLE_FORMULA]
294294
raise AssertionError(
295295
f'Mismatch of observable parameter overrides for '
296296
f'{row[OBSERVABLE_ID]} ({formula})'
297297
f'in:\n{row}\n'
298-
f'Expected 0 or {expected} but got {actual}')
298+
f'Expected {expected} but got {actual}')
299299

300300
# check noise parameters
301301
replacements = split_parameter_replacement_list(
@@ -304,10 +304,10 @@ def assert_overrides_match_parameter_count(
304304
expected = noise_parameters_count[row[OBSERVABLE_ID]]
305305

306306
# No overrides are also allowed
307-
if not (len(replacements) == 0 or len(replacements) == expected):
307+
if len(replacements) != expected:
308308
raise AssertionError(
309309
f'Mismatch of noise parameter overrides in:\n{row}\n'
310-
f'Expected 0 or {expected} but got {actual}')
310+
f'Expected {expected} but got {actual}')
311311
except KeyError:
312312
# no overrides defined, but a numerical sigma can be provided
313313
# anyways

tests/test_lint.py

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,42 +122,65 @@ def test_assert_overrides_match_parameter_count():
122122
SIMULATION_CONDITION_ID: ['condition1', 'condition1'],
123123
PREEQUILIBRATION_CONDITION_ID: ['', ''],
124124
TIME: [1.0, 2.0],
125-
OBSERVABLE_PARAMETERS: ['', ''],
126-
NOISE_PARAMETERS: ['', '']
125+
OBSERVABLE_PARAMETERS: ['', 'override1;override2'],
126+
NOISE_PARAMETERS: ['noiseParOverride', '']
127127
})
128128

129-
# No overrides
129+
# valid
130130
petab.assert_overrides_match_parameter_count(
131131
measurement_df_orig, observable_df)
132132

133-
# Sigma override
133+
# 0 noise parameters given, 1 expected
134134
measurement_df = measurement_df_orig.copy()
135-
measurement_df.loc[0, NOISE_PARAMETERS] = 'noiseParOverride'
136-
petab.assert_overrides_match_parameter_count(
137-
measurement_df, observable_df)
135+
measurement_df.loc[0, NOISE_PARAMETERS] = ''
136+
with pytest.raises(AssertionError):
137+
petab.assert_overrides_match_parameter_count(
138+
measurement_df, observable_df)
138139

140+
# 2 noise parameters given, 1 expected
141+
measurement_df = measurement_df_orig.copy()
139142
measurement_df.loc[0, NOISE_PARAMETERS] = 'noiseParOverride;oneTooMuch'
140143
with pytest.raises(AssertionError):
141144
petab.assert_overrides_match_parameter_count(
142145
measurement_df, observable_df)
143146

144-
measurement_df.loc[0, NOISE_PARAMETERS] = 'noiseParOverride'
147+
# 1 noise parameter given, 0 allowed
148+
measurement_df = measurement_df_orig.copy()
145149
measurement_df.loc[1, NOISE_PARAMETERS] = 'oneTooMuch'
146150
with pytest.raises(AssertionError):
147151
petab.assert_overrides_match_parameter_count(
148152
measurement_df, observable_df)
149153

150-
# Observable override
154+
# 0 observable parameters given, 2 expected
151155
measurement_df = measurement_df_orig.copy()
152-
measurement_df.loc[1, OBSERVABLE_PARAMETERS] = 'override1;override2'
153-
petab.assert_overrides_match_parameter_count(
154-
measurement_df, observable_df)
156+
measurement_df.loc[1, OBSERVABLE_PARAMETERS] = ''
157+
with pytest.raises(AssertionError):
158+
petab.assert_overrides_match_parameter_count(
159+
measurement_df, observable_df)
155160

161+
# 1 observable parameters given, 2 expected
162+
measurement_df = measurement_df_orig.copy()
156163
measurement_df.loc[1, OBSERVABLE_PARAMETERS] = 'oneMissing'
157164
with pytest.raises(AssertionError):
158165
petab.assert_overrides_match_parameter_count(
159166
measurement_df, observable_df)
160167

168+
# 3 observable parameters given, 2 expected
169+
measurement_df = measurement_df_orig.copy()
170+
measurement_df.loc[1, OBSERVABLE_PARAMETERS] = \
171+
'override1;override2;oneTooMuch'
172+
with pytest.raises(AssertionError):
173+
petab.assert_overrides_match_parameter_count(
174+
measurement_df, observable_df)
175+
176+
# 1 observable parameters given, 0 expected
177+
measurement_df = measurement_df_orig.copy()
178+
measurement_df.loc[0, OBSERVABLE_PARAMETERS] = \
179+
'oneTooMuch'
180+
with pytest.raises(AssertionError):
181+
petab.assert_overrides_match_parameter_count(
182+
measurement_df, observable_df)
183+
161184

162185
def test_assert_no_leading_trailing_whitespace():
163186

0 commit comments

Comments
 (0)