Skip to content

Commit

Permalink
feat: updated to Biosimulators-utils 0.1.114: organized options, adde…
Browse files Browse the repository at this point in the history
…d option to control logging; added Python package to specs; added fonts to Docker image
  • Loading branch information
jonrkarr committed Sep 1, 2021
1 parent a9fedfa commit b760351
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 71 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Base OS
FROM ghcr.io/biosimulators/biosimulators_pysces/pysces_base:latest

ARG VERSION=0.1.19
ARG VERSION=0.1.20
ARG SIMULATOR_VERSION="0.9.9"

# metadata
Expand Down
5 changes: 5 additions & 0 deletions Dockerfile-base
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,8 @@ RUN apt-get update -y \
gfortran \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists

# fonts for matplotlib
RUN apt-get update -y \
&& apt-get install -y --no-install-recommends libfreetype6 \
&& rm -rf /var/lib/apt/lists/*
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ docker run \
```

## Documentation
Documentation is available at https://biosimulators.github.io/Biosimulators_PySCeS/.
Documentation is available at https://docs.biosimulators.org/Biosimulators_PySCeS/.

## License
This package is released under the [MIT license](LICENSE).
Expand Down
4 changes: 4 additions & 0 deletions biosimulators.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
},
"operatingSystemType": "Linux"
},
"pythonApi": {
"package": "biosimulators-pysces",
"module": "biosimulators_pysces"
},
"authors": [
{
"firstName": "Brett",
Expand Down
2 changes: 1 addition & 1 deletion biosimulators_pysces/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '0.1.19'
__version__ = '0.1.20'
63 changes: 25 additions & 38 deletions biosimulators_pysces/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from .data_model import KISAO_ALGORITHM_MAP
from biosimulators_utils.combine.exec import exec_sedml_docs_in_archive
from biosimulators_utils.config import get_config
from biosimulators_utils.config import get_config, Config # noqa: F401
from biosimulators_utils.log.data_model import CombineArchiveLog, TaskLog # noqa: F401
from biosimulators_utils.viz.data_model import VizFormat # noqa: F401
from biosimulators_utils.report.data_model import ReportFormat, VariableResults, SedDocumentResults # noqa: F401
Expand All @@ -34,11 +34,7 @@
__all__ = ['exec_sedml_docs_in_combine_archive', 'exec_sed_task']


def exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
return_results=False,
report_formats=None, plot_formats=None,
bundle_outputs=None, keep_individual_outputs=None,
raise_exceptions=True):
def exec_sedml_docs_in_combine_archive(archive_filename, out_dir, config=None):
""" Execute the SED tasks defined in a COMBINE/OMEX archive and save the outputs
Args:
Expand All @@ -50,13 +46,6 @@ def exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
* HDF5: directory in which to save a single HDF5 file (``{ out_dir }/reports.h5``),
with reports at keys ``{ relative-path-to-SED-ML-file-within-archive }/{ report.id }`` within the HDF5 file
return_results (:obj:`bool`, optional): whether to return the result of each output of each SED-ML file
report_formats (:obj:`list` of :obj:`ReportFormat`, optional): report format (e.g., csv or h5)
plot_formats (:obj:`list` of :obj:`VizFormat`, optional): report format (e.g., pdf)
bundle_outputs (:obj:`bool`, optional): if :obj:`True`, bundle outputs into archives for reports and plots
keep_individual_outputs (:obj:`bool`, optional): if :obj:`True`, keep individual output files
raise_exceptions (:obj:`bool`, optional): whether to raise exceptions
Returns:
:obj:`tuple`:
Expand All @@ -66,31 +55,28 @@ def exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
sed_doc_executer = functools.partial(exec_sed_doc, exec_sed_task)
return exec_sedml_docs_in_archive(sed_doc_executer, archive_filename, out_dir,
apply_xml_model_changes=True,
return_results=return_results,
report_formats=report_formats,
plot_formats=plot_formats,
bundle_outputs=bundle_outputs,
keep_individual_outputs=keep_individual_outputs,
raise_exceptions=raise_exceptions)
config=config)


def exec_sed_task(task, variables, log=None):
def exec_sed_task(task, variables, log=None, config=None):
''' Execute a task and save its results
Args:
task (:obj:`Task`): task
variables (:obj:`list` of :obj:`Variable`): variables that should be recorded
log (:obj:`TaskLog`, optional): log for the task
config (:obj:`Config`, optional): BioSimulators common configuration
Returns:
:obj:`tuple`:
:obj:`VariableResults`: results of variables
:obj:`TaskLog`: log
'''
config = get_config()
config = config or get_config()

log = log or TaskLog()
if config.LOG and not log:
log = TaskLog()

model = task.model
sim = task.simulation
Expand Down Expand Up @@ -131,7 +117,7 @@ def exec_sed_task(task, variables, log=None):

# Load the algorithm specified by `simulation.algorithm.kisao_id`
sim = task.simulation
algorithm_substitution_policy = get_algorithm_substitution_policy()
algorithm_substitution_policy = get_algorithm_substitution_policy(config=config)
exec_kisao_id = get_preferred_substitute_algorithm_by_ids(
sim.algorithm.kisao_id, KISAO_ALGORITHM_MAP.keys(),
substitution_policy=algorithm_substitution_policy)
Expand Down Expand Up @@ -185,7 +171,7 @@ def exec_sed_task(task, variables, log=None):
# override algorithm choice if there are events
if integrator['id'] == 'LSODA' and model.__events__:
model.mode_integrator = 'CVODE'
substitution_policy = get_algorithm_substitution_policy()
substitution_policy = get_algorithm_substitution_policy(config=config)
if (
ALGORITHM_SUBSTITUTION_POLICY_LEVELS[substitution_policy]
>= ALGORITHM_SUBSTITUTION_POLICY_LEVELS[AlgorithmSubstitutionPolicy.SIMILAR_VARIABLES]
Expand Down Expand Up @@ -260,21 +246,22 @@ def exec_sed_task(task, variables, log=None):
os.chdir(cwd)

# log action
log.algorithm = 'KISAO_0000019' if model.mode_integrator == 'CVODE' else 'KISAO_0000088'

arguments = {}
for key, val in model.__settings__.items():
if model.mode_integrator == 'CVODE':
if key.startswith('cvode_'):
arguments[key] = val
else:
if key.startswith('lsoda_'):
arguments[key] = val
if config.LOG:
log.algorithm = 'KISAO_0000019' if model.mode_integrator == 'CVODE' else 'KISAO_0000088'

arguments = {}
for key, val in model.__settings__.items():
if model.mode_integrator == 'CVODE':
if key.startswith('cvode_'):
arguments[key] = val
else:
if key.startswith('lsoda_'):
arguments[key] = val

log.simulator_details = {
'method': model.Simulate.__module__ + '.' + model.Simulate.__name__,
'arguments': arguments,
}
log.simulator_details = {
'method': model.Simulate.__module__ + '.' + model.Simulate.__name__,
'arguments': arguments,
}

# return results and log
return variable_results, log
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
biosimulators_utils[sbml,logging] >= 0.1.104
biosimulators_utils[sbml,logging] >= 0.1.114
kisao
numpy
pysces
60 changes: 31 additions & 29 deletions tests/test_core_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from biosimulators_utils.combine import data_model as combine_data_model
from biosimulators_utils.combine.exceptions import CombineArchiveExecutionError
from biosimulators_utils.combine.io import CombineArchiveWriter
from biosimulators_utils.config import get_config
from biosimulators_utils.report import data_model as report_data_model
from biosimulators_utils.report.io import ReportReader
from biosimulators_utils.simulator.exceptions import AlgorithmDoesNotSupportModelFeatureException
Expand Down Expand Up @@ -160,7 +161,7 @@ def test_exec_sed_task_error_handling(self):
task.model.source = os.path.join(os.path.dirname(__file__), 'fixtures', 'biomd0000000002.xml')

task.simulation.algorithm.kisao_id = 'KISAO_0000448'
with self.assertRaisesRegex(AlgorithmCannotBeSubstitutedException, 'No algorithm can be substituted'):
with self.assertRaisesRegex(AlgorithmCannotBeSubstitutedException, 'Algorithms cannot be substituted'):
core.exec_sed_task(task, variables)
task.simulation.algorithm.kisao_id = 'KISAO_0000088'

Expand Down Expand Up @@ -237,13 +238,15 @@ def test_exec_sedml_docs_in_combine_archive_successfully(self):
doc, archive_filename = self._build_combine_archive()

out_dir = os.path.join(self.dirname, 'out')
core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
report_formats=[
report_data_model.ReportFormat.h5,
report_data_model.ReportFormat.csv,
],
bundle_outputs=True,
keep_individual_outputs=True)

config = get_config()
config.REPORT_FORMATS = [report_data_model.ReportFormat.h5, report_data_model.ReportFormat.csv]
config.BUNDLE_OUTPUTS = True
config.KEEP_INDIVIDUAL_OUTPUTS = True

_, log = core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir, config=config)
if log.exception:
raise log.exception

self._assert_combine_archive_outputs(doc, out_dir)

Expand Down Expand Up @@ -409,6 +412,11 @@ def test_algorithm_substitution(self):

out_dir = self.dirname

config = get_config()
config.REPORT_FORMATS = [report_data_model.ReportFormat.h5, report_data_model.ReportFormat.csv]
config.BUNDLE_OUTPUTS = True
config.KEEP_INDIVIDUAL_OUTPUTS = True

# NONE
env = {'ALGORITHM_SUBSTITUTION_POLICY': 'NONE'}

Expand All @@ -422,13 +430,9 @@ def pysces_model(filename):
with mock.patch.dict(os.environ, env):
with mock.patch('pysces.model', side_effect=pysces_model):
with self.assertRaises(CombineArchiveExecutionError):
core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
report_formats=[
report_data_model.ReportFormat.h5,
report_data_model.ReportFormat.csv,
],
bundle_outputs=True,
keep_individual_outputs=True)
_, log = core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir, config=config)
if log.exception:
raise log.exception

# SAME FRAMEWORK
env = {'ALGORITHM_SUBSTITUTION_POLICY': 'SIMILAR_VARIABLES'}
Expand All @@ -437,26 +441,24 @@ def pysces_model(filename):
with mock.patch.object(pysces.PyscesModel.PysMod, 'Simulate', side_effect=Exception('Stop')):
with self.assertRaisesRegex(CombineArchiveExecutionError, 'Stop$'):
with self.assertWarns(AlgorithmSubstitutedWarning):
core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
report_formats=[
report_data_model.ReportFormat.h5,
report_data_model.ReportFormat.csv,
],
bundle_outputs=True,
keep_individual_outputs=True)
_, log = core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir, config=config)
if log.exception:
raise log.exception

def test_exec_sedml_docs_in_combine_archive_with_all_algorithms(self):
for alg in gen_algorithms_from_specs(os.path.join(os.path.dirname(__file__), '..', 'biosimulators.json')).values():
doc, archive_filename = self._build_combine_archive(algorithm=alg)

out_dir = os.path.join(self.dirname, alg.kisao_id)
core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir,
report_formats=[
report_data_model.ReportFormat.h5,
report_data_model.ReportFormat.csv,
],
bundle_outputs=True,
keep_individual_outputs=True)

config = get_config()
config.REPORT_FORMATS = [report_data_model.ReportFormat.h5, report_data_model.ReportFormat.csv]
config.BUNDLE_OUTPUTS = True
config.KEEP_INDIVIDUAL_OUTPUTS = True

_, log = core.exec_sedml_docs_in_combine_archive(archive_filename, out_dir, config=config)
if log.exception:
raise log.exception
self._assert_combine_archive_outputs(doc, out_dir)

def test_raw_cli(self):
Expand Down

0 comments on commit b760351

Please sign in to comment.