Developing smif

smif is under active development at github.com/nismod/smif

Install

The smif codebase is contained in src/smif.

Install the library in develop mode using the command:

python setup.py develop

If you also wish to use the GUI while using smif in develop mode, you’ll need to navigate to the src/smif/app folder and run the commands:

npm install
npm run build

Testing

We use pytest for testing, with tests under tests/ matching the module and class structure of smif/.

Install requirements for testing:

pip install -r test-requirements.txt

Run tests:

python setup.py test

Versioning

smif is currently pre-1.0, so API and usage are liable to change. After releasing a first major version, we intend to follow semantic versioning, with major versions for any incompatible changes to the public API.

Releases

smif is deployed as a package on the Python Package Index, PyPI. A full guide to packaging and distributing projects is available online.

Deployment to PyPI is handled by Travis CI.

To make a release, create an annotated tag, and submit a pull request:

git tag -a v0.2.0       # create annotated tag (will need a message)
git describe            # show current commit in relation to tags

You’ll need to specify you tag to push either using the --tags flag or the tag name:

git push upstream master --tags
git push upstream v0.2.0        # alternatively

Conventions

The numpydoc docstring conventions are used for inline documentation, which is used to generate the module reference documentation visible at readthedocs and which can also be generated by running python setup.py docs

Linting is handled by pre-commit hooks, which can be installed from the root of the repository using:

pre-commit install

Module import relationship diagram

smif module/submodule diagram

Class diagrams

smif class diagram

Decision - simulation class interaction/interface design

UML for smif decision and simulation interaction

Data flow

Locating the data required by a particular simulation model could become complicated. A data input may be provided as scenario data or as the output from another model. Scenario data vary between model runs as different scenarios are explored. Model outputs vary between model runs and possibly within model runs, as coupled models iterate to find stable solutions to loops in the dependency graph or as decision algorithms run multiple simulations to explore possible interventions.

The two abstractions introduced are a DataInterface and a DataHandle. A DataInterface has responsibility for accessing and persisting data and results, for example to a file system or database. A DataHandle has responsibility for directing a simulation model’s requests to the correct dataset, given the modelrun, requesting model, particular spatial or temporal resolution, and current iteration state. The containing layers - ModelRun, SosModel, ModelSet - must incrementally add and update details when creating a specialised DataHandle to pass in to each simulation model.

Sequence diagram for smif data flow

This class diagram show part of the API to DataInterface and the smaller API to DataHandle which internally makes use of DataHandle’s private attributes.

Class diagram for smif DataHandle / DataInterface composition