Skip to content

Commit 1ed5527

Browse files
authored
Merge branch 'develop' into v2_startpoints
2 parents c4ee880 + b73e0a9 commit 1ed5527

File tree

1 file changed

+69
-6
lines changed

1 file changed

+69
-6
lines changed

petab/v2/petab1to2.py

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,8 @@ def petab_files_1to2(yaml_config: Path | str, output_dir: Path | str):
9292

9393
# Update tables
9494

95-
# parameter table:
96-
# * parameter.estimate: int -> bool
97-
parameter_df = petab_problem.parameter_df.copy()
98-
parameter_df[v1.C.ESTIMATE] = parameter_df[v1.C.ESTIMATE].apply(
99-
lambda x: str(bool(int(x))).lower()
100-
)
95+
# parameter table
96+
parameter_df = v1v2_parameter_df(petab_problem.parameter_df.copy())
10197
file = yaml_config[v2.C.PARAMETER_FILE]
10298
v2.write_parameter_df(parameter_df, get_dest_path(file))
10399

@@ -393,3 +389,70 @@ def update_noise_dist(row):
393389
df.drop(columns=[v1.C.OBSERVABLE_TRANSFORMATION], inplace=True)
394390

395391
return df
392+
393+
394+
def v1v2_parameter_df(
395+
parameter_df: pd.DataFrame,
396+
) -> pd.DataFrame:
397+
"""Convert parameter table from petab v1 to v2.
398+
399+
Do all the necessary conversions to the parameter table that can
400+
be done with the parameter table alone.
401+
"""
402+
df = parameter_df.copy().reset_index()
403+
404+
# parameter.estimate: int -> bool
405+
df[v2.C.ESTIMATE] = df[v1.C.ESTIMATE].apply(
406+
lambda x: str(bool(int(x))).lower()
407+
)
408+
409+
def update_prior(row):
410+
"""Convert prior to v2 format."""
411+
prior_type = row.get(v1.C.OBJECTIVE_PRIOR_TYPE)
412+
if pd.isna(prior_type):
413+
prior_type = v1.C.UNIFORM
414+
415+
pscale = row.get(v1.C.PARAMETER_SCALE)
416+
if pd.isna(pscale):
417+
pscale = v1.C.LIN
418+
419+
if prior_type not in v1.C.PARAMETER_SCALE_PRIOR_TYPES:
420+
return prior_type
421+
422+
new_prior_type = prior_type.removeprefix("parameterScale").lower()
423+
if pscale != v1.C.LIN:
424+
new_prior_type = f"{pscale}-{new_prior_type}"
425+
426+
if new_prior_type not in v2.C.PRIOR_DISTRIBUTIONS:
427+
raise NotImplementedError(
428+
f"PEtab v2 does not support prior type `{new_prior_type}' "
429+
f"required for parameter `{row.index}'."
430+
)
431+
432+
return new_prior_type
433+
434+
# update parameterScale*-priors
435+
if v1.C.OBJECTIVE_PRIOR_TYPE in df.columns:
436+
df[v1.C.OBJECTIVE_PRIOR_TYPE] = df.apply(update_prior, axis=1)
437+
438+
# rename objectivePrior* to prior*
439+
df.rename(
440+
columns={
441+
v1.C.OBJECTIVE_PRIOR_TYPE: v2.C.PRIOR_DISTRIBUTION,
442+
v1.C.OBJECTIVE_PRIOR_PARAMETERS: v2.C.PRIOR_PARAMETERS,
443+
},
444+
inplace=True,
445+
errors="ignore",
446+
)
447+
# some columns were dropped in PEtab v2
448+
df.drop(
449+
columns=[
450+
v1.C.INITIALIZATION_PRIOR_TYPE,
451+
v1.C.INITIALIZATION_PRIOR_PARAMETERS,
452+
v1.C.PARAMETER_SCALE,
453+
],
454+
inplace=True,
455+
errors="ignore",
456+
)
457+
458+
return df

0 commit comments

Comments
 (0)