Support PEtab SciML problems and enable linting#482
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #482 +/- ##
==========================================
- Coverage 75.29% 75.17% -0.12%
==========================================
Files 62 62
Lines 6946 7086 +140
Branches 1229 1254 +25
==========================================
+ Hits 5230 5327 +97
- Misses 1245 1277 +32
- Partials 471 482 +11 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
dilpath
left a comment
There was a problem hiding this comment.
Thanks! Overall it would be good to try to separate as much of the SciML things into separate files or subdirectory if possible. This will help later on when we design a nicer extension interface for libpetab-python, I think. It will also help with maintenance immediately.
| #: Nominal value. | ||
| nominal_value: Annotated[ | ||
| float | None, BeforeValidator(_convert_nan_to_none) | ||
| float | Literal["array"] | None, BeforeValidator(_convert_nan_to_none) |
There was a problem hiding this comment.
Maybe add some # PEtab SciML supports arrays comment here, otherwise a non-SciML user/dev might wonder why "array" is permitted
| return sum(p.estimate for p in self.parameters) | ||
|
|
||
|
|
||
| class Hybridization(BaseModel): |
There was a problem hiding this comment.
Move SciML-specific things to a separate file or subdirectory e.g. sciml/core.py and import them here? Just for organization; might help to keep SciML things as separate as possible. e.g. do not import petab_sciml here, rather only in the separated file.
Nevermind this if it will lead to circular imports etc.
| config: ProblemConfig = None, | ||
| ): | ||
| from ..v2.lint import default_validation_tasks | ||
| from ..v2.lint import default_validation_tasks, sciml_validation_tasks |
There was a problem hiding this comment.
Also this, import from ..v2.sciml.lint for example, for separation.
| def add_hybridization(self, target_id: str, target_value: str): | ||
| """Add a SciML hybridization table entry to the problem. | ||
|
|
||
| If there are more than one hybridization tables, the hybridization |
There was a problem hiding this comment.
| If there are more than one hybridization tables, the hybridization | |
| If there is more than one hybridization table, the hybridization |
| """Add a SciML hybridization table entry to the problem. | ||
|
|
||
| If there are more than one hybridization tables, the hybridization | ||
| is added to the last one. |
There was a problem hiding this comment.
| is added to the last one. | |
| is added to the last table. |
| for mapping in problem.mappings: | ||
| # petabEntityId is not referenced in any model | ||
| for model in problem.models: | ||
| if model.has_entity_with_id(mapping.petab_id): | ||
| messages.append( | ||
| f"`{mapping.petab_id}` is used in the mapping " | ||
| "table and referenced directly in the model " | ||
| f"`{model.model_id}`." | ||
| ) |
There was a problem hiding this comment.
The spec currently says that the petabEntityId can be the same as a modelEntityId, hence the petabEntityIds can appear in the model, right? @dweindl what do you think?
The petabEntityId may be the same as the modelEntityId, but it must not be used to alias an entity that already has a valid PEtab identifier. This restriction is to avoid unnecessary complexity in the PEtab problem files.
There was a problem hiding this comment.
There is some discussion of this here PEtab-dev/PEtab#669
| if culprits := (hyb_target_vals & nn_input_ids): | ||
| messages.append( | ||
| "The following neural net inputs were used as target values " | ||
| f"in the Hybridization tbale: `{culprits}`. Please simplify." |
There was a problem hiding this comment.
| f"in the Hybridization tbale: `{culprits}`. Please simplify." | |
| f"in the Hybridization table: `{culprits}`." |
| # Add petab ids from mapping table if they are used for aliasing | ||
| for mapping in problem.mappings: | ||
| if mapping.model_id and mapping.model_id in parameter_ids.keys(): | ||
| if mapping.petab_id not in invalid: | ||
| parameter_ids[mapping.petab_id] = None | ||
| # An aliased model id is not a valid parameter id | ||
| if mapping.model_id and mapping.model_id in parameter_ids: | ||
| del parameter_ids[mapping.model_id] |
There was a problem hiding this comment.
As above, I think it's OK to map a model ID to a PEtab ID in the mapping table as long as it's not an alias, i.e. only in the special case where petabEntityId == modelEntityId. I think the reason for this in the spec is for support use of the mapping table for annotation, i.e. via additional user-defined annotation columns.
WIP