Git Product home page Git Product logo

wsi's Introduction

Welcome to WSIMOD

WSIMOD stands for the Water Systems Integrated Modelling framework.

The terrestrial water cycle is a highly interconnected system where the movement of water is affected by physical and human processes. Thus, environmental models may become inaccurate if they do not provide a complete picture of the water cycle, missing out on unexpected opportunities and omitting impacts that arise from complex interactions. WSIMOD is a modelling framework to integrate these different processes. It provides a message passing interface to enable different subsystem models to communicate water flux and water quality information between each other, and self-contained representations of the key parts of the water cycle (rivers, reservoirs, urban and rural hydrological catchments, treatment plants, and pipe networks). We created WSIMOD to enable a user greater flexibility in setting up their water cycle models, motivated by the abundance of non-textbook water systems that we have experienced in industry collaboration. The WSIMOD Python package provides tutorials and examples to help modellers create nodes, connect them with arcs, and create simulations.

You can access our documentation below or at https://imperialcollegelondon.github.io/wsi.

Requires: Python 3 (tested on versions >=3.7), tqdm, PyYAML, dill

Optional requirements to run demos: Pandas, GeoPandas, Matplotlib, Shapely

Please consider contributing and note the code of conduct

If you use WSIMOD, please make sure to cite.

Table Of Contents

The documentation follows the best practice for project documentation as described by Daniele Procida in the Diátaxis documentation framework and consists of:

  1. About

  2. Installation

  3. Tutorials

  4. How-To Guides

  5. Component library

  6. API reference

  7. Quickstart

  8. Coverage

Installation

Install WSIMOD directly from GitHub

pip install https://github.com/ImperialCollegeLondon/wsi/archive/refs/heads/main.zip

Use [demos] to include the demos and tutorials.

pip install https://github.com/ImperialCollegeLondon/wsi/archive/refs/heads/main.zip
pip install wsimod[demos]

If you want to make changes to WSIMOD you can download/clone this folder, navigate to it, and run:

pip install -e .[dev]

or (with demos)

pip install -e .[dev,demos]

How to cite WSIMOD

DOI

If you would like to use our software, please cite it using the following:

Dobson, B., Liu, L. and Mijic, A. (2023) ‘Water Systems Integrated Modelling framework, WSIMOD: A Python package for integrated modelling of water quality and quantity across the water cycle’, Journal of Open Source Software. The Open Journal, 8(83), p. 4996. doi: 10.21105/joss.04996.

Find the bibtex citation below:

@article{Dobson2023,
        doi = {10.21105/joss.04996},
        url = {https://doi.org/10.21105/joss.04996},
        year = {2023},
        publisher = {The Open Journal},
        volume = {8},
        number = {83},
        pages = {4996},
        author = {Barnaby Dobson and Leyang Liu and Ana Mijic},
        title = {Water Systems Integrated Modelling framework, WSIMOD: A Python package for integrated modelling of water quality and quantity across the water cycle},
        journal = {Journal of Open Source Software}
        }

Acknowledgements

WSIMOD was developed by Barnaby Dobson and Leyang Liu. Theoretical support was provided by Ana Mijic. Testing the WSIMOD over a variety of applications has been performed by Fangjun Peng, Vladimir Krivstov and Samer Muhandes. Software development support was provided by Imperial College's Research Software Engineering service, in particular from Diego Alonso and Dan Davies.

We are incredibly grateful for the detailed software reviews provided by Taher Chegini and Joshua Larsen and editing by Chris Vernon. Their suggestions have significantly improved WSIMOD.

The design of WSIMOD was significantly influenced by CityDrain3, OpenMI, Belete, Voinov and Laniak, (2017), and smif.

We acknowledge funding from the CAMELLIA project (Community Water Management for a Liveable London), funded by the Natural Environment Research Council (NERC) under grant NE/S003495/1.

wsi's People

Contributors

barneydobson avatar dalonsoa avatar liuly12 avatar tsmbland avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

wsi's Issues

Enable overrides in `Land` node

@liuly12 OK I've finished the example for how to do this in the WTW/WWTW node see: #70

We'll use this issue to discuss any additions required for the Land node override behaviour, which will of course be the most complex. Feel free to make a branch and PR when you're ready. Though possibly we will want to have multiple branches for the different surfaces - I'm easy.

Enable overrides

An issue to keep track of all the different things that (may) need apply_overrides behaviour defined for (linked with #66 and #54)

  • Node
  • WTW/WWTW
  • FWTW [Under review]
  • Land #71 [Under reivew]
  • NutrientPool #71 [Under reivew]
  • Catchment [No additional parameters to be updated]
  • Demand (and subclasses) [Under review]
  • Distribution (and subclasses) [Under review]
  • Sewer [Under review]
  • Storage (and subclasses) [Wait to be merged]
  • Waste - not necessary

Enable overrides in `Model`

# Initialise nodes
# Initialise arcs
# And then...
model.add_overrides(data.get("overrides", {}))

# And in Model
def add_overrides(self, config: Dict):
    for node in config.get("nodes", {}):
        type_ = node.pop("type_")
        name = node.pop("name")
        self.nodes_type[type_][name].apply_overrides(node)

    for arc in config.get("arcs", {}):
        name = arc.pop("name")
        self.arcs[name].apply_overrides(arc)

The node.apply_overrides and arc.apply_overrides will be the methods that will call the appropriate setters to ensure that any side effects of modifying those parameters are taken care of.

apply_overrides should be a method (not an abstract one) of the base class for nodes and arcs that will do nothing unless it is overridden. This way, only those specific nodes that can be overridden will need to have this method (and the relevant setters) implemented.

class Node:
    def apply_overrides(self, config: Dict):
        pass

class Arc:
    def apply_overrides(self, config: Dict):
        pass

In terms of how this can be done from a practical point of view, I would open issues for:

  1. Implement the above overriden logic. Should be harmless and backwards compatible with any existing code and config files.
  2. Identify which nodes/arcs have parameters that are worth to be overriden and open an issue for each of those nodes/arcs, indicating which parameters need such override. Watch out for recursive calls! You might need some hidden internal attributes that can be set directly and only use the setters in the overrides:
class MyNode:
    def __init__(...):
        # Does not use the setter
        self._some_param = get_default_some_param(...)

    @property 
    def some_param(self):
        return self._some_param

    @some_param.setter 
    def some_param(self, value):
        if not value:
            return
        # Some complex logic
        self._some_param = ...
        # More logic here

    def apply_overrides(self, config: Dict):
        self.some_param = config.pop("some_param", None)
        ...

Originally posted by @dalonsoa in #54 (comment)

Publish docs fails in GitHub actions

It seems to complain about no installing tabulate, but there's no clue on why it needs that package, to start with. As far as I can tell, it is not manually installed when running things locally.

Log of the failed run.
2024-01-19T13:55:58.6609689Z Requested labels: ubuntu-latest
2024-01-19T13:55:58.6609971Z Job defined at: ImperialCollegeLondon/wsi/.github/workflows/publish.yml@refs/tags/v0.4.0
2024-01-19T13:55:58.6610060Z Waiting for a runner to pick up this job...
2024-01-19T13:55:58.9576497Z Job is waiting for a hosted runner to come online.
2024-01-19T13:56:01.6786240Z Job is about to start running on the hosted runner: GitHub Actions 2 (hosted)
2024-01-19T13:56:03.6624707Z Current runner version: '2.311.0'
2024-01-19T13:56:03.6649081Z ##[group]Operating System
2024-01-19T13:56:03.6649871Z Ubuntu
2024-01-19T13:56:03.6650230Z 22.04.3
2024-01-19T13:56:03.6650549Z LTS
2024-01-19T13:56:03.6650963Z ##[endgroup]
2024-01-19T13:56:03.6651352Z ##[group]Runner Image
2024-01-19T13:56:03.6651741Z Image: ubuntu-22.04
2024-01-19T13:56:03.6652198Z Version: 20240116.3.0
2024-01-19T13:56:03.6653202Z Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20240116.3/images/ubuntu/Ubuntu2204-Readme.md
2024-01-19T13:56:03.6654643Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20240116.3
2024-01-19T13:56:03.6655529Z ##[endgroup]
2024-01-19T13:56:03.6655937Z ##[group]Runner Image Provisioner
2024-01-19T13:56:03.6656412Z 2.0.324.1
2024-01-19T13:56:03.6656772Z ##[endgroup]
2024-01-19T13:56:03.6658927Z ##[group]GITHUB_TOKEN Permissions
2024-01-19T13:56:03.6660618Z Actions: write
2024-01-19T13:56:03.6661060Z Checks: write
2024-01-19T13:56:03.6661677Z Contents: write
2024-01-19T13:56:03.6662158Z Deployments: write
2024-01-19T13:56:03.6662516Z Discussions: write
2024-01-19T13:56:03.6662963Z Issues: write
2024-01-19T13:56:03.6663315Z Metadata: read
2024-01-19T13:56:03.6663691Z Packages: write
2024-01-19T13:56:03.6664107Z Pages: write
2024-01-19T13:56:03.6664501Z PullRequests: write
2024-01-19T13:56:03.6664915Z RepositoryProjects: write
2024-01-19T13:56:03.6665471Z SecurityEvents: write
2024-01-19T13:56:03.6665898Z Statuses: write
2024-01-19T13:56:03.6666279Z ##[endgroup]
2024-01-19T13:56:03.6668365Z Secret source: Actions
2024-01-19T13:56:03.6668936Z Prepare workflow directory
2024-01-19T13:56:03.7296792Z Prepare all required actions
2024-01-19T13:56:03.7454859Z Getting action download info
2024-01-19T13:56:03.9624170Z Download action repository 'actions/checkout@v4' (SHA:b4ffde65f46336ab88eb53be808477a3936bae11)
2024-01-19T13:56:04.0708827Z Download action repository 'actions/setup-python@v5' (SHA:0a5c61591373683505ea898e09a3ea4f39ef2b9c)
2024-01-19T13:56:04.2802836Z Complete job name: publish-docs
2024-01-19T13:56:04.3715295Z ##[group]Run actions/checkout@v4
2024-01-19T13:56:04.3715973Z with:
2024-01-19T13:56:04.3716410Z   repository: ImperialCollegeLondon/wsi
2024-01-19T13:56:04.3717110Z   token: ***
2024-01-19T13:56:04.3717594Z   ssh-strict: true
2024-01-19T13:56:04.3718034Z   persist-credentials: true
2024-01-19T13:56:04.3718457Z   clean: true
2024-01-19T13:56:04.3718930Z   sparse-checkout-cone-mode: true
2024-01-19T13:56:04.3719446Z   fetch-depth: 1
2024-01-19T13:56:04.3719795Z   fetch-tags: false
2024-01-19T13:56:04.3720262Z   show-progress: true
2024-01-19T13:56:04.3720689Z   lfs: false
2024-01-19T13:56:04.3721004Z   submodules: false
2024-01-19T13:56:04.3721495Z   set-safe-directory: true
2024-01-19T13:56:04.3721930Z ##[endgroup]
2024-01-19T13:56:04.5300075Z Syncing repository: ImperialCollegeLondon/wsi
2024-01-19T13:56:04.5302268Z ##[group]Getting Git version info
2024-01-19T13:56:04.5303150Z Working directory is '/home/runner/work/wsi/wsi'
2024-01-19T13:56:04.5304413Z [command]/usr/bin/git version
2024-01-19T13:56:04.5304865Z git version 2.43.0
2024-01-19T13:56:04.5318923Z ##[endgroup]
2024-01-19T13:56:04.5336529Z Temporarily overriding HOME='/home/runner/work/_temp/d3e302eb-aae4-45b4-850b-c591e993d6bf' before making global git config changes
2024-01-19T13:56:04.5338095Z Adding repository directory to the temporary git global config as a safe directory
2024-01-19T13:56:04.5342213Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/wsi/wsi
2024-01-19T13:56:04.5378039Z Deleting the contents of '/home/runner/work/wsi/wsi'
2024-01-19T13:56:04.5383931Z ##[group]Initializing the repository
2024-01-19T13:56:04.5387377Z [command]/usr/bin/git init /home/runner/work/wsi/wsi
2024-01-19T13:56:04.5450338Z hint: Using 'master' as the name for the initial branch. This default branch name
2024-01-19T13:56:04.5452110Z hint: is subject to change. To configure the initial branch name to use in all
2024-01-19T13:56:04.5454202Z hint: of your new repositories, which will suppress this warning, call:
2024-01-19T13:56:04.5456197Z hint: 
2024-01-19T13:56:04.5457391Z hint: 	git config --global init.defaultBranch <name>
2024-01-19T13:56:04.5458464Z hint: 
2024-01-19T13:56:04.5459700Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
2024-01-19T13:56:04.5461358Z hint: 'development'. The just-created branch can be renamed via this command:
2024-01-19T13:56:04.5462484Z hint: 
2024-01-19T13:56:04.5463017Z hint: 	git branch -m <name>
2024-01-19T13:56:04.5463714Z Initialized empty Git repository in /home/runner/work/wsi/wsi/.git/
2024-01-19T13:56:04.5471745Z [command]/usr/bin/git remote add origin https://github.com/ImperialCollegeLondon/wsi
2024-01-19T13:56:04.5503426Z ##[endgroup]
2024-01-19T13:56:04.5504191Z ##[group]Disabling automatic garbage collection
2024-01-19T13:56:04.5506198Z [command]/usr/bin/git config --local gc.auto 0
2024-01-19T13:56:04.5534763Z ##[endgroup]
2024-01-19T13:56:04.5535591Z ##[group]Setting up auth
2024-01-19T13:56:04.5540218Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
2024-01-19T13:56:04.5569412Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2024-01-19T13:56:04.5861434Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
2024-01-19T13:56:04.5891288Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
2024-01-19T13:56:04.6138445Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
2024-01-19T13:56:04.6174111Z ##[endgroup]
2024-01-19T13:56:04.6175949Z ##[group]Fetching the repository
2024-01-19T13:56:04.6185805Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +3038e6a79ccb6f62f3c5f4c32b2aa7a5b0fa0241:refs/tags/v0.4.0
2024-01-19T13:56:05.4486924Z From https://github.com/ImperialCollegeLondon/wsi
2024-01-19T13:56:05.4488830Z  * [new ref]         3038e6a79ccb6f62f3c5f4c32b2aa7a5b0fa0241 -> v0.4.0
2024-01-19T13:56:05.4513838Z ##[endgroup]
2024-01-19T13:56:05.4514742Z ##[group]Determining the checkout info
2024-01-19T13:56:05.4515984Z ##[endgroup]
2024-01-19T13:56:05.4516968Z ##[group]Checking out the ref
2024-01-19T13:56:05.4520039Z [command]/usr/bin/git checkout --progress --force refs/tags/v0.4.0
2024-01-19T13:56:05.5120561Z Note: switching to 'refs/tags/v0.4.0'.
2024-01-19T13:56:05.5121425Z 
2024-01-19T13:56:05.5122084Z You are in 'detached HEAD' state. You can look around, make experimental
2024-01-19T13:56:05.5123326Z changes and commit them, and you can discard any commits you make in this
2024-01-19T13:56:05.5124545Z state without impacting any branches by switching back to a branch.
2024-01-19T13:56:05.5125095Z 
2024-01-19T13:56:05.5125470Z If you want to create a new branch to retain commits you create, you may
2024-01-19T13:56:05.5126262Z do so (now or later) by using -c with the switch command. Example:
2024-01-19T13:56:05.5126672Z 
2024-01-19T13:56:05.5126899Z   git switch -c <new-branch-name>
2024-01-19T13:56:05.5127235Z 
2024-01-19T13:56:05.5127419Z Or undo this operation with:
2024-01-19T13:56:05.5127652Z 
2024-01-19T13:56:05.5127799Z   git switch -
2024-01-19T13:56:05.5128014Z 
2024-01-19T13:56:05.5128316Z Turn off this advice by setting config variable advice.detachedHead to false
2024-01-19T13:56:05.5129063Z 
2024-01-19T13:56:05.5129285Z HEAD is now at 3038e6a Update version
2024-01-19T13:56:05.5131284Z ##[endgroup]
2024-01-19T13:56:05.5167305Z [command]/usr/bin/git log -1 --format='%H'
2024-01-19T13:56:05.5190435Z '3038e6a79ccb6f62f3c5f4c32b2aa7a5b0fa0241'
2024-01-19T13:56:05.5524943Z ##[group]Run actions/setup-python@v5
2024-01-19T13:56:05.5525549Z with:
2024-01-19T13:56:05.5525915Z   python-version: 3.11
2024-01-19T13:56:05.5526490Z   check-latest: false
2024-01-19T13:56:05.5527091Z   token: ***
2024-01-19T13:56:05.5527465Z   update-environment: true
2024-01-19T13:56:05.5527823Z   allow-prereleases: false
2024-01-19T13:56:05.5528277Z ##[endgroup]
2024-01-19T13:56:05.7110757Z ##[group]Installed versions
2024-01-19T13:56:05.7188594Z Successfully set up CPython (3.11.7)
2024-01-19T13:56:05.7190069Z ##[endgroup]
2024-01-19T13:56:05.7374048Z ##[group]Run pip install -r requirements-doc.txt
2024-01-19T13:56:05.7374677Z �[36;1mpip install -r requirements-doc.txt�[0m
2024-01-19T13:56:05.7442927Z shell: /usr/bin/bash -e {0}
2024-01-19T13:56:05.7443500Z env:
2024-01-19T13:56:05.7443943Z   pythonLocation: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:05.7444566Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.11.7/x64/lib/pkgconfig
2024-01-19T13:56:05.7445276Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:05.7445855Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:05.7446496Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:05.7447038Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.7/x64/lib
2024-01-19T13:56:05.7447565Z ##[endgroup]
2024-01-19T13:56:06.4308169Z Collecting asttokens==2.4.1 (from -r requirements-doc.txt (line 7))
2024-01-19T13:56:06.4960679Z   Downloading asttokens-2.4.1-py2.py3-none-any.whl.metadata (5.2 kB)
2024-01-19T13:56:06.5252268Z Collecting attrs==23.1.0 (from -r requirements-doc.txt (line 9))
2024-01-19T13:56:06.5325659Z   Downloading attrs-23.1.0-py3-none-any.whl (61 kB)
2024-01-19T13:56:06.5495821Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 kB 4.5 MB/s eta 0:00:00
2024-01-19T13:56:06.5751676Z Collecting babel==2.13.1 (from -r requirements-doc.txt (line 14))
2024-01-19T13:56:06.5822965Z   Downloading Babel-2.13.1-py3-none-any.whl.metadata (1.6 kB)
2024-01-19T13:56:06.6081990Z Collecting beautifulsoup4==4.12.2 (from -r requirements-doc.txt (line 16))
2024-01-19T13:56:06.6215180Z   Downloading beautifulsoup4-4.12.2-py3-none-any.whl (142 kB)
2024-01-19T13:56:06.6354894Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 143.0/143.0 kB 11.3 MB/s eta 0:00:00
2024-01-19T13:56:06.6652476Z Collecting bleach==6.1.0 (from -r requirements-doc.txt (line 18))
2024-01-19T13:56:06.6725613Z   Downloading bleach-6.1.0-py3-none-any.whl.metadata (30 kB)
2024-01-19T13:56:06.7020806Z Collecting certifi==2023.7.22 (from -r requirements-doc.txt (line 20))
2024-01-19T13:56:06.7093201Z   Downloading certifi-2023.7.22-py3-none-any.whl.metadata (2.2 kB)
2024-01-19T13:56:06.7875234Z Collecting charset-normalizer==3.3.2 (from -r requirements-doc.txt (line 25))
2024-01-19T13:56:06.7948458Z   Downloading charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (33 kB)
2024-01-19T13:56:06.8275884Z Collecting click==8.1.7 (from -r requirements-doc.txt (line 27))
2024-01-19T13:56:06.8348926Z   Downloading click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
2024-01-19T13:56:06.8619083Z Collecting click-plugins==1.1.1 (from -r requirements-doc.txt (line 33))
2024-01-19T13:56:06.8693780Z   Downloading click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)
2024-01-19T13:56:06.8897468Z Collecting cligj==0.7.2 (from -r requirements-doc.txt (line 35))
2024-01-19T13:56:06.8970691Z   Downloading cligj-0.7.2-py3-none-any.whl (7.1 kB)
2024-01-19T13:56:06.9247145Z Collecting colorama==0.4.6 (from -r requirements-doc.txt (line 37))
2024-01-19T13:56:06.9323661Z   Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
2024-01-19T13:56:06.9530412Z Collecting comm==0.2.0 (from -r requirements-doc.txt (line 41))
2024-01-19T13:56:06.9607343Z   Downloading comm-0.2.0-py3-none-any.whl.metadata (3.7 kB)
2024-01-19T13:56:07.0225142Z Collecting contourpy==1.2.0 (from -r requirements-doc.txt (line 43))
2024-01-19T13:56:07.0303832Z   Downloading contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.8 kB)
2024-01-19T13:56:07.0586689Z Collecting cycler==0.12.1 (from -r requirements-doc.txt (line 45))
2024-01-19T13:56:07.0668679Z   Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)
2024-01-19T13:56:07.1657458Z Collecting debugpy==1.8.0 (from -r requirements-doc.txt (line 47))
2024-01-19T13:56:07.1730734Z   Downloading debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.0 kB)
2024-01-19T13:56:07.1962820Z Collecting decorator==5.1.1 (from -r requirements-doc.txt (line 49))
2024-01-19T13:56:07.2035273Z   Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)
2024-01-19T13:56:07.2244674Z Collecting defusedxml==0.7.1 (from -r requirements-doc.txt (line 51))
2024-01-19T13:56:07.2318273Z   Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 kB)
2024-01-19T13:56:07.2543952Z Collecting dill==0.3.7 (from -r requirements-doc.txt (line 53))
2024-01-19T13:56:07.2616023Z   Downloading dill-0.3.7-py3-none-any.whl.metadata (9.9 kB)
2024-01-19T13:56:07.2834406Z Collecting executing==2.0.1 (from -r requirements-doc.txt (line 57))
2024-01-19T13:56:07.2906032Z   Downloading executing-2.0.1-py2.py3-none-any.whl.metadata (9.0 kB)
2024-01-19T13:56:07.3141547Z Collecting fastjsonschema==2.18.1 (from -r requirements-doc.txt (line 59))
2024-01-19T13:56:07.3213395Z   Downloading fastjsonschema-2.18.1-py3-none-any.whl.metadata (2.0 kB)
2024-01-19T13:56:07.3825305Z Collecting fiona==1.9.5 (from -r requirements-doc.txt (line 61))
2024-01-19T13:56:07.3904634Z   Downloading fiona-1.9.5-cp311-cp311-manylinux2014_x86_64.whl.metadata (49 kB)
2024-01-19T13:56:07.3954690Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 49.7/49.7 kB 12.9 MB/s eta 0:00:00
2024-01-19T13:56:07.5029936Z Collecting fonttools==4.44.0 (from -r requirements-doc.txt (line 63))
2024-01-19T13:56:07.5118369Z   Downloading fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (153 kB)
2024-01-19T13:56:07.5264987Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 153.6/153.6 kB 11.5 MB/s eta 0:00:00
2024-01-19T13:56:07.5575908Z Collecting geopandas==0.14.0 (from -r requirements-doc.txt (line 65))
2024-01-19T13:56:07.5645447Z   Downloading geopandas-0.14.0-py3-none-any.whl.metadata (1.5 kB)
2024-01-19T13:56:07.5843134Z Collecting ghp-import==2.1.0 (from -r requirements-doc.txt (line 67))
2024-01-19T13:56:07.5915113Z   Downloading ghp_import-2.1.0-py3-none-any.whl (11 kB)
2024-01-19T13:56:07.6324058Z Collecting griffe==0.36.9 (from -r requirements-doc.txt (line 69))
2024-01-19T13:56:07.6409773Z   Downloading griffe-0.36.9-py3-none-any.whl.metadata (6.1 kB)
2024-01-19T13:56:07.6649038Z Collecting idna==3.4 (from -r requirements-doc.txt (line 71))
2024-01-19T13:56:07.6721720Z   Downloading idna-3.4-py3-none-any.whl (61 kB)
2024-01-19T13:56:07.6776683Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.5/61.5 kB 14.4 MB/s eta 0:00:00
2024-01-19T13:56:07.7233001Z Collecting ipykernel==6.26.0 (from -r requirements-doc.txt (line 73))
2024-01-19T13:56:07.7338498Z   Downloading ipykernel-6.26.0-py3-none-any.whl.metadata (6.3 kB)
2024-01-19T13:56:07.7911704Z Collecting ipython==8.17.2 (from -r requirements-doc.txt (line 75))
2024-01-19T13:56:07.7984142Z   Downloading ipython-8.17.2-py3-none-any.whl.metadata (6.0 kB)
2024-01-19T13:56:07.8257526Z Collecting jedi==0.19.1 (from -r requirements-doc.txt (line 77))
2024-01-19T13:56:07.8331391Z   Downloading jedi-0.19.1-py2.py3-none-any.whl.metadata (22 kB)
2024-01-19T13:56:07.8610861Z Collecting jinja2==3.1.2 (from -r requirements-doc.txt (line 79))
2024-01-19T13:56:07.8681744Z   Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
2024-01-19T13:56:07.8793858Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 13.4 MB/s eta 0:00:00
2024-01-19T13:56:07.9155258Z Collecting jsonschema==4.19.2 (from -r requirements-doc.txt (line 85))
2024-01-19T13:56:07.9239792Z   Downloading jsonschema-4.19.2-py3-none-any.whl.metadata (7.9 kB)
2024-01-19T13:56:07.9473861Z Collecting jsonschema-specifications==2023.7.1 (from -r requirements-doc.txt (line 87))
2024-01-19T13:56:07.9578972Z   Downloading jsonschema_specifications-2023.7.1-py3-none-any.whl.metadata (2.8 kB)
2024-01-19T13:56:07.9985996Z Collecting jupyter-client==8.6.0 (from -r requirements-doc.txt (line 89))
2024-01-19T13:56:08.0059213Z   Downloading jupyter_client-8.6.0-py3-none-any.whl.metadata (8.3 kB)
2024-01-19T13:56:08.0387855Z Collecting jupyter-core==5.5.0 (from -r requirements-doc.txt (line 93))
2024-01-19T13:56:08.0549045Z   Downloading jupyter_core-5.5.0-py3-none-any.whl.metadata (3.4 kB)
2024-01-19T13:56:08.0737773Z Collecting jupyterlab-pygments==0.2.2 (from -r requirements-doc.txt (line 100))
2024-01-19T13:56:08.0906286Z   Downloading jupyterlab_pygments-0.2.2-py2.py3-none-any.whl (21 kB)
2024-01-19T13:56:08.1257693Z Collecting jupytext==1.15.2 (from -r requirements-doc.txt (line 102))
2024-01-19T13:56:08.1337859Z   Downloading jupytext-1.15.2-py3-none-any.whl.metadata (9.7 kB)
2024-01-19T13:56:08.1790738Z Collecting kiwisolver==1.4.5 (from -r requirements-doc.txt (line 104))
2024-01-19T13:56:08.1862402Z   Downloading kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.4 kB)
2024-01-19T13:56:08.2073927Z Collecting latexcodec==2.0.1 (from -r requirements-doc.txt (line 106))
2024-01-19T13:56:08.2153863Z   Downloading latexcodec-2.0.1-py2.py3-none-any.whl (18 kB)
2024-01-19T13:56:08.2434398Z Collecting markdown==3.5.1 (from -r requirements-doc.txt (line 108))
2024-01-19T13:56:08.2519103Z   Downloading Markdown-3.5.1-py3-none-any.whl.metadata (7.1 kB)
2024-01-19T13:56:08.2807880Z Collecting markdown-it-py==3.0.0 (from -r requirements-doc.txt (line 115))
2024-01-19T13:56:08.2879309Z   Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)
2024-01-19T13:56:08.3315959Z Collecting markupsafe==2.1.3 (from -r requirements-doc.txt (line 119))
2024-01-19T13:56:08.3388561Z   Downloading MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)
2024-01-19T13:56:08.4507007Z Collecting matplotlib==3.8.1 (from -r requirements-doc.txt (line 125))
2024-01-19T13:56:08.4596292Z   Downloading matplotlib-3.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.8 kB)
2024-01-19T13:56:08.4794274Z Collecting matplotlib-inline==0.1.6 (from -r requirements-doc.txt (line 127))
2024-01-19T13:56:08.4865083Z   Downloading matplotlib_inline-0.1.6-py3-none-any.whl (9.4 kB)
2024-01-19T13:56:08.5084173Z Collecting mdit-py-plugins==0.4.0 (from -r requirements-doc.txt (line 131))
2024-01-19T13:56:08.5157628Z   Downloading mdit_py_plugins-0.4.0-py3-none-any.whl.metadata (2.7 kB)
2024-01-19T13:56:08.5349651Z Collecting mdurl==0.1.2 (from -r requirements-doc.txt (line 133))
2024-01-19T13:56:08.5421007Z   Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB)
2024-01-19T13:56:08.5642244Z Collecting mergedeep==1.3.4 (from -r requirements-doc.txt (line 135))
2024-01-19T13:56:08.5713748Z   Downloading mergedeep-1.3.4-py3-none-any.whl (6.4 kB)
2024-01-19T13:56:08.5957731Z Collecting mistune==3.0.2 (from -r requirements-doc.txt (line 137))
2024-01-19T13:56:08.6028792Z   Downloading mistune-3.0.2-py3-none-any.whl.metadata (1.7 kB)
2024-01-19T13:56:08.6323379Z Collecting mkdocs==1.5.3 (from -r requirements-doc.txt (line 139))
2024-01-19T13:56:08.6417190Z   Downloading mkdocs-1.5.3-py3-none-any.whl.metadata (6.2 kB)
2024-01-19T13:56:08.6618949Z Collecting mkdocs-autorefs==0.5.0 (from -r requirements-doc.txt (line 149))
2024-01-19T13:56:08.6691246Z   Downloading mkdocs_autorefs-0.5.0-py3-none-any.whl.metadata (4.0 kB)
2024-01-19T13:56:08.6912754Z Collecting mkdocs-bibtex==2.11.0 (from -r requirements-doc.txt (line 153))
2024-01-19T13:56:08.7004787Z   Downloading mkdocs-bibtex-2.11.0.tar.gz (19 kB)
2024-01-19T13:56:08.7107523Z   Installing build dependencies: started
2024-01-19T13:56:10.2775660Z   Installing build dependencies: finished with status 'done'
2024-01-19T13:56:10.2781797Z   Getting requirements to build wheel: started
2024-01-19T13:56:10.4175393Z   Getting requirements to build wheel: finished with status 'done'
2024-01-19T13:56:10.4212143Z   Installing backend dependencies: started
2024-01-19T13:56:12.0114460Z   Installing backend dependencies: finished with status 'done'
2024-01-19T13:56:12.0120226Z   Preparing metadata (pyproject.toml): started
2024-01-19T13:56:12.6536102Z   Preparing metadata (pyproject.toml): finished with status 'done'
2024-01-19T13:56:12.6736883Z Collecting mkdocs-coverage==1.0.0 (from -r requirements-doc.txt (line 155))
2024-01-19T13:56:12.6859574Z   Downloading mkdocs_coverage-1.0.0-py3-none-any.whl.metadata (3.0 kB)
2024-01-19T13:56:12.7074962Z Collecting mkdocs-gen-files==0.5.0 (from -r requirements-doc.txt (line 157))
2024-01-19T13:56:12.7146537Z   Downloading mkdocs_gen_files-0.5.0-py3-none-any.whl (8.4 kB)
2024-01-19T13:56:12.7388447Z Collecting mkdocs-jupyter==0.24.6 (from -r requirements-doc.txt (line 159))
2024-01-19T13:56:12.7471340Z   Downloading mkdocs_jupyter-0.24.6-py3-none-any.whl.metadata (9.4 kB)
2024-01-19T13:56:12.8332915Z Collecting mkdocs-material==9.4.8 (from -r requirements-doc.txt (line 161))
2024-01-19T13:56:12.8420593Z   Downloading mkdocs_material-9.4.8-py3-none-any.whl.metadata (15 kB)
2024-01-19T13:56:12.8634403Z Collecting mkdocs-material-extensions==1.3 (from -r requirements-doc.txt (line 165))
2024-01-19T13:56:12.8711165Z   Downloading mkdocs_material_extensions-1.3-py3-none-any.whl.metadata (6.9 kB)
2024-01-19T13:56:12.9349974Z Collecting mkdocstrings==0.23.0 (from mkdocstrings[python]==0.23.0->-r requirements-doc.txt (line 169))
2024-01-19T13:56:12.9429633Z   Downloading mkdocstrings-0.23.0-py3-none-any.whl.metadata (7.6 kB)
2024-01-19T13:56:12.9734612Z Collecting mkdocstrings-python==1.7.3 (from -r requirements-doc.txt (line 173))
2024-01-19T13:56:12.9868713Z   Downloading mkdocstrings_python-1.7.3-py3-none-any.whl.metadata (5.7 kB)
2024-01-19T13:56:13.0139747Z Collecting nbclient==0.8.0 (from -r requirements-doc.txt (line 175))
2024-01-19T13:56:13.0217862Z   Downloading nbclient-0.8.0-py3-none-any.whl.metadata (7.8 kB)
2024-01-19T13:56:13.0634391Z Collecting nbconvert==7.11.0 (from -r requirements-doc.txt (line 177))
2024-01-19T13:56:13.0745020Z   Downloading nbconvert-7.11.0-py3-none-any.whl.metadata (7.7 kB)
2024-01-19T13:56:13.1001089Z Collecting nbformat==5.9.2 (from -r requirements-doc.txt (line 179))
2024-01-19T13:56:13.1073796Z   Downloading nbformat-5.9.2-py3-none-any.whl.metadata (3.4 kB)
2024-01-19T13:56:13.1332497Z Collecting nest-asyncio==1.5.8 (from -r requirements-doc.txt (line 184))
2024-01-19T13:56:13.1414345Z   Downloading nest_asyncio-1.5.8-py3-none-any.whl.metadata (2.8 kB)
2024-01-19T13:56:13.2906546Z Collecting numpy==1.26.1 (from -r requirements-doc.txt (line 186))
2024-01-19T13:56:13.3011422Z   Downloading numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
2024-01-19T13:56:13.3066422Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 kB 14.1 MB/s eta 0:00:00
2024-01-19T13:56:13.3427814Z Collecting packaging==23.2 (from -r requirements-doc.txt (line 192))
2024-01-19T13:56:13.3440858Z   Using cached packaging-23.2-py3-none-any.whl.metadata (3.2 kB)
2024-01-19T13:56:13.3623320Z Collecting paginate==0.5.6 (from -r requirements-doc.txt (line 199))
2024-01-19T13:56:13.3697171Z   Downloading paginate-0.5.6.tar.gz (12 kB)
2024-01-19T13:56:13.3766340Z   Installing build dependencies: started
2024-01-19T13:56:14.6901065Z   Installing build dependencies: finished with status 'done'
2024-01-19T13:56:14.6906743Z   Getting requirements to build wheel: started
2024-01-19T13:56:14.8266589Z   Getting requirements to build wheel: finished with status 'done'
2024-01-19T13:56:14.8288213Z   Preparing metadata (pyproject.toml): started
2024-01-19T13:56:14.9782456Z   Preparing metadata (pyproject.toml): finished with status 'done'
2024-01-19T13:56:15.0880352Z Collecting pandas==2.1.2 (from -r requirements-doc.txt (line 201))
2024-01-19T13:56:15.0965702Z   Downloading pandas-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)
2024-01-19T13:56:15.1198887Z Collecting pandocfilters==1.5.0 (from -r requirements-doc.txt (line 206))
2024-01-19T13:56:15.1316960Z   Downloading pandocfilters-1.5.0-py2.py3-none-any.whl (8.7 kB)
2024-01-19T13:56:15.1547799Z Collecting parso==0.8.3 (from -r requirements-doc.txt (line 208))
2024-01-19T13:56:15.1619311Z   Downloading parso-0.8.3-py2.py3-none-any.whl (100 kB)
2024-01-19T13:56:15.1716177Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.8/100.8 kB 11.8 MB/s eta 0:00:00
2024-01-19T13:56:15.1911288Z Collecting pathspec==0.11.2 (from -r requirements-doc.txt (line 210))
2024-01-19T13:56:15.1981238Z   Downloading pathspec-0.11.2-py3-none-any.whl.metadata (19 kB)
2024-01-19T13:56:15.2186583Z Collecting pexpect==4.9.0 (from -r requirements-doc.txt (line 212))
2024-01-19T13:56:15.2256917Z   Downloading pexpect-4.9.0-py2.py3-none-any.whl.metadata (2.5 kB)
2024-01-19T13:56:15.3860315Z Collecting pillow==10.1.0 (from -r requirements-doc.txt (line 214))
2024-01-19T13:56:15.3934686Z   Downloading Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (9.5 kB)
2024-01-19T13:56:15.4213168Z Collecting platformdirs==3.11.0 (from -r requirements-doc.txt (line 216))
2024-01-19T13:56:15.4283450Z   Downloading platformdirs-3.11.0-py3-none-any.whl.metadata (11 kB)
2024-01-19T13:56:15.4704811Z Collecting prompt-toolkit==3.0.39 (from -r requirements-doc.txt (line 220))
2024-01-19T13:56:15.4778302Z   Downloading prompt_toolkit-3.0.39-py3-none-any.whl.metadata (6.4 kB)
2024-01-19T13:56:15.6015626Z Collecting psutil==5.9.6 (from -r requirements-doc.txt (line 222))
2024-01-19T13:56:15.6101731Z   Downloading psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (21 kB)
2024-01-19T13:56:15.6298130Z Collecting ptyprocess==0.7.0 (from -r requirements-doc.txt (line 224))
2024-01-19T13:56:15.6367913Z   Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB)
2024-01-19T13:56:15.6544582Z Collecting pure-eval==0.2.2 (from -r requirements-doc.txt (line 226))
2024-01-19T13:56:15.6615578Z   Downloading pure_eval-0.2.2-py3-none-any.whl (11 kB)
2024-01-19T13:56:15.6934588Z Collecting pybtex==0.24.0 (from -r requirements-doc.txt (line 228))
2024-01-19T13:56:15.7037647Z   Downloading pybtex-0.24.0-py2.py3-none-any.whl (561 kB)
2024-01-19T13:56:15.7381823Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 561.4/561.4 kB 17.1 MB/s eta 0:00:00
2024-01-19T13:56:15.7693226Z Collecting pygments==2.16.1 (from -r requirements-doc.txt (line 230))
2024-01-19T13:56:15.7768117Z   Downloading Pygments-2.16.1-py3-none-any.whl.metadata (2.5 kB)
2024-01-19T13:56:15.8145493Z Collecting pymdown-extensions==10.3.1 (from -r requirements-doc.txt (line 236))
2024-01-19T13:56:15.8231516Z   Downloading pymdown_extensions-10.3.1-py3-none-any.whl.metadata (3.2 kB)
2024-01-19T13:56:15.8484999Z Collecting pypandoc==1.12 (from -r requirements-doc.txt (line 240))
2024-01-19T13:56:15.8555582Z   Downloading pypandoc-1.12-py3-none-any.whl.metadata (16 kB)
2024-01-19T13:56:15.8972501Z Collecting pyparsing==3.1.1 (from -r requirements-doc.txt (line 244))
2024-01-19T13:56:15.9061266Z   Downloading pyparsing-3.1.1-py3-none-any.whl.metadata (5.1 kB)
2024-01-19T13:56:15.9729933Z Collecting pyproj==3.6.1 (from -r requirements-doc.txt (line 246))
2024-01-19T13:56:15.9837163Z   Downloading pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (31 kB)
2024-01-19T13:56:16.0084516Z Collecting python-dateutil==2.8.2 (from -r requirements-doc.txt (line 248))
2024-01-19T13:56:16.0155238Z   Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
2024-01-19T13:56:16.0289727Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.7/247.7 kB 20.9 MB/s eta 0:00:00
2024-01-19T13:56:16.0824758Z Collecting pytz==2023.3.post1 (from -r requirements-doc.txt (line 254))
2024-01-19T13:56:16.0899638Z   Downloading pytz-2023.3.post1-py2.py3-none-any.whl.metadata (22 kB)
2024-01-19T13:56:16.1369266Z Collecting pyyaml==6.0.1 (from -r requirements-doc.txt (line 256))
2024-01-19T13:56:16.1443788Z   Downloading PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)
2024-01-19T13:56:16.1623539Z Collecting pyyaml-env-tag==0.1 (from -r requirements-doc.txt (line 265))
2024-01-19T13:56:16.1748733Z   Downloading pyyaml_env_tag-0.1-py3-none-any.whl (3.9 kB)
2024-01-19T13:56:16.3256890Z Collecting pyzmq==25.1.1 (from -r requirements-doc.txt (line 267))
2024-01-19T13:56:16.3367614Z   Downloading pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (4.9 kB)
2024-01-19T13:56:16.3770019Z Collecting referencing==0.30.2 (from -r requirements-doc.txt (line 271))
2024-01-19T13:56:16.3853171Z   Downloading referencing-0.30.2-py3-none-any.whl.metadata (2.6 kB)
2024-01-19T13:56:16.7289439Z Collecting regex==2023.10.3 (from -r requirements-doc.txt (line 275))
2024-01-19T13:56:16.7391849Z   Downloading regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (40 kB)
2024-01-19T13:56:16.7434600Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.9/40.9 kB 13.0 MB/s eta 0:00:00
2024-01-19T13:56:16.7825812Z Collecting requests==2.31.0 (from -r requirements-doc.txt (line 277))
2024-01-19T13:56:16.7900468Z   Downloading requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)
2024-01-19T13:56:16.9716783Z Collecting rpds-py==0.12.0 (from -r requirements-doc.txt (line 281))
2024-01-19T13:56:16.9859756Z   Downloading rpds_py-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.7 kB)
2024-01-19T13:56:17.0635224Z Collecting shapely==2.0.2 (from -r requirements-doc.txt (line 285))
2024-01-19T13:56:17.0760788Z   Downloading shapely-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.0 kB)
2024-01-19T13:56:17.0983090Z Collecting six==1.16.0 (from -r requirements-doc.txt (line 289))
2024-01-19T13:56:17.1055426Z   Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
2024-01-19T13:56:17.1327893Z Collecting soupsieve==2.5 (from -r requirements-doc.txt (line 297))
2024-01-19T13:56:17.1400069Z   Downloading soupsieve-2.5-py3-none-any.whl.metadata (4.7 kB)
2024-01-19T13:56:17.1603944Z Collecting stack-data==0.6.3 (from -r requirements-doc.txt (line 299))
2024-01-19T13:56:17.1673038Z   Downloading stack_data-0.6.3-py3-none-any.whl.metadata (18 kB)
2024-01-19T13:56:17.1881409Z Collecting tinycss2==1.2.1 (from -r requirements-doc.txt (line 301))
2024-01-19T13:56:17.1988361Z   Downloading tinycss2-1.2.1-py3-none-any.whl (21 kB)
2024-01-19T13:56:17.2175665Z Collecting toml==0.10.2 (from -r requirements-doc.txt (line 303))
2024-01-19T13:56:17.2247583Z   Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
2024-01-19T13:56:17.2661427Z Collecting tornado==6.3.3 (from -r requirements-doc.txt (line 305))
2024-01-19T13:56:17.2736437Z   Downloading tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.5 kB)
2024-01-19T13:56:17.3342669Z Collecting tqdm==4.66.1 (from -r requirements-doc.txt (line 309))
2024-01-19T13:56:17.3415538Z   Downloading tqdm-4.66.1-py3-none-any.whl.metadata (57 kB)
2024-01-19T13:56:17.3458423Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.6/57.6 kB 19.9 MB/s eta 0:00:00
2024-01-19T13:56:17.3753790Z Collecting traitlets==5.13.0 (from -r requirements-doc.txt (line 313))
2024-01-19T13:56:17.3826615Z   Downloading traitlets-5.13.0-py3-none-any.whl.metadata (10 kB)
2024-01-19T13:56:17.4102439Z Collecting tzdata==2023.3 (from -r requirements-doc.txt (line 324))
2024-01-19T13:56:17.4177532Z   Downloading tzdata-2023.3-py2.py3-none-any.whl (341 kB)
2024-01-19T13:56:17.4344029Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 341.8/341.8 kB 22.8 MB/s eta 0:00:00
2024-01-19T13:56:17.4799237Z Collecting urllib3==2.0.7 (from -r requirements-doc.txt (line 326))
2024-01-19T13:56:17.4872789Z   Downloading urllib3-2.0.7-py3-none-any.whl.metadata (6.6 kB)
2024-01-19T13:56:17.5097971Z Collecting validators==0.22.0 (from -r requirements-doc.txt (line 328))
2024-01-19T13:56:17.5169235Z   Downloading validators-0.22.0-py3-none-any.whl.metadata (4.7 kB)
2024-01-19T13:56:17.5613769Z Collecting watchdog==3.0.0 (from -r requirements-doc.txt (line 330))
2024-01-19T13:56:17.5684000Z   Downloading watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl (82 kB)
2024-01-19T13:56:17.5733820Z      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 82.1/82.1 kB 23.6 MB/s eta 0:00:00
2024-01-19T13:56:17.5935947Z Collecting wcwidth==0.2.9 (from -r requirements-doc.txt (line 332))
2024-01-19T13:56:17.6234744Z   Downloading wcwidth-0.2.9-py2.py3-none-any.whl.metadata (14 kB)
2024-01-19T13:56:17.6419134Z Collecting webencodings==0.5.1 (from -r requirements-doc.txt (line 334))
2024-01-19T13:56:17.6496919Z   Downloading webencodings-0.5.1-py2.py3-none-any.whl (11 kB)
2024-01-19T13:56:17.6673878Z Collecting wsimod[demos] (from -r requirements-doc.txt (line 338))
2024-01-19T13:56:17.6862501Z   Downloading wsimod-0.4.0-py3-none-any.whl.metadata (8.9 kB)
2024-01-19T13:56:17.8291716Z Requirement already satisfied: setuptools in /opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages (from fiona==1.9.5->-r requirements-doc.txt (line 61)) (65.5.0)
2024-01-19T13:56:19.6869774Z Downloading asttokens-2.4.1-py2.py3-none-any.whl (27 kB)
2024-01-19T13:56:19.6996641Z Downloading Babel-2.13.1-py3-none-any.whl (10.1 MB)
2024-01-19T13:56:19.8991988Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.1/10.1 MB 51.0 MB/s eta 0:00:00
2024-01-19T13:56:19.9065327Z Downloading bleach-6.1.0-py3-none-any.whl (162 kB)
2024-01-19T13:56:19.9116682Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 162.8/162.8 kB 45.6 MB/s eta 0:00:00
2024-01-19T13:56:19.9191323Z Downloading certifi-2023.7.22-py3-none-any.whl (158 kB)
2024-01-19T13:56:19.9243589Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 158.3/158.3 kB 42.9 MB/s eta 0:00:00
2024-01-19T13:56:19.9317778Z Downloading charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (140 kB)
2024-01-19T13:56:19.9365243Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.3/140.3 kB 42.7 MB/s eta 0:00:00
2024-01-19T13:56:19.9437549Z Downloading click-8.1.7-py3-none-any.whl (97 kB)
2024-01-19T13:56:19.9487351Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 97.9/97.9 kB 28.6 MB/s eta 0:00:00
2024-01-19T13:56:19.9562234Z Downloading comm-0.2.0-py3-none-any.whl (7.0 kB)
2024-01-19T13:56:19.9652344Z Downloading contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (313 kB)
2024-01-19T13:56:19.9716117Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 313.4/313.4 kB 65.4 MB/s eta 0:00:00
2024-01-19T13:56:19.9795406Z Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB)
2024-01-19T13:56:19.9903588Z Downloading debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB)
2024-01-19T13:56:20.0231356Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.0/3.0 MB 96.0 MB/s eta 0:00:00
2024-01-19T13:56:20.0304887Z Downloading dill-0.3.7-py3-none-any.whl (115 kB)
2024-01-19T13:56:20.0351127Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 115.3/115.3 kB 38.6 MB/s eta 0:00:00
2024-01-19T13:56:20.0423159Z Downloading executing-2.0.1-py2.py3-none-any.whl (24 kB)
2024-01-19T13:56:20.0525075Z Downloading fastjsonschema-2.18.1-py3-none-any.whl (23 kB)
2024-01-19T13:56:20.0643956Z Downloading fiona-1.9.5-cp311-cp311-manylinux2014_x86_64.whl (15.7 MB)
2024-01-19T13:56:20.2054334Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.7/15.7 MB 99.6 MB/s eta 0:00:00
2024-01-19T13:56:20.2157184Z Downloading fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.8 MB)
2024-01-19T13:56:20.2594888Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.8/4.8 MB 115.6 MB/s eta 0:00:00
2024-01-19T13:56:20.2705540Z Downloading geopandas-0.14.0-py3-none-any.whl (1.1 MB)
2024-01-19T13:56:20.2831243Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 101.3 MB/s eta 0:00:00
2024-01-19T13:56:20.2912425Z Downloading griffe-0.36.9-py3-none-any.whl (111 kB)
2024-01-19T13:56:20.2959137Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 111.7/111.7 kB 36.1 MB/s eta 0:00:00
2024-01-19T13:56:20.3041737Z Downloading ipykernel-6.26.0-py3-none-any.whl (114 kB)
2024-01-19T13:56:20.3087933Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 114.3/114.3 kB 35.9 MB/s eta 0:00:00
2024-01-19T13:56:20.3210974Z Downloading ipython-8.17.2-py3-none-any.whl (808 kB)
2024-01-19T13:56:20.3317344Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 808.4/808.4 kB 91.6 MB/s eta 0:00:00
2024-01-19T13:56:20.3391561Z Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)
2024-01-19T13:56:20.3556845Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 105.7 MB/s eta 0:00:00
2024-01-19T13:56:20.3629006Z Downloading jsonschema-4.19.2-py3-none-any.whl (83 kB)
2024-01-19T13:56:20.3671666Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 83.6/83.6 kB 31.7 MB/s eta 0:00:00
2024-01-19T13:56:20.3744705Z Downloading jsonschema_specifications-2023.7.1-py3-none-any.whl (17 kB)
2024-01-19T13:56:20.3835551Z Downloading jupyter_client-8.6.0-py3-none-any.whl (105 kB)
2024-01-19T13:56:20.3880947Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 105.9/105.9 kB 34.9 MB/s eta 0:00:00
2024-01-19T13:56:20.3952704Z Downloading jupyter_core-5.5.0-py3-none-any.whl (28 kB)
2024-01-19T13:56:20.4063773Z Downloading jupytext-1.15.2-py3-none-any.whl (307 kB)
2024-01-19T13:56:20.4122867Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 307.2/307.2 kB 70.8 MB/s eta 0:00:00
2024-01-19T13:56:20.4197910Z Downloading kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB)
2024-01-19T13:56:20.4359403Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 98.1 MB/s eta 0:00:00
2024-01-19T13:56:20.4432678Z Downloading Markdown-3.5.1-py3-none-any.whl (102 kB)
2024-01-19T13:56:20.4478204Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 102.2/102.2 kB 34.1 MB/s eta 0:00:00
2024-01-19T13:56:20.4550492Z Downloading markdown_it_py-3.0.0-py3-none-any.whl (87 kB)
2024-01-19T13:56:20.4594368Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 87.5/87.5 kB 29.6 MB/s eta 0:00:00
2024-01-19T13:56:20.4665791Z Downloading MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)
2024-01-19T13:56:20.4795314Z Downloading matplotlib-3.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB)
2024-01-19T13:56:20.5757803Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.6/11.6 MB 119.0 MB/s eta 0:00:00
2024-01-19T13:56:20.5831517Z Downloading mdit_py_plugins-0.4.0-py3-none-any.whl (54 kB)
2024-01-19T13:56:20.5871951Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 54.1/54.1 kB 19.5 MB/s eta 0:00:00
2024-01-19T13:56:20.5944556Z Downloading mistune-3.0.2-py3-none-any.whl (47 kB)
2024-01-19T13:56:20.5982531Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.0/48.0 kB 17.9 MB/s eta 0:00:00
2024-01-19T13:56:20.6055245Z Downloading mkdocs-1.5.3-py3-none-any.whl (3.7 MB)
2024-01-19T13:56:20.6394297Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.7/3.7 MB 116.1 MB/s eta 0:00:00
2024-01-19T13:56:20.6466107Z Downloading mkdocs_autorefs-0.5.0-py3-none-any.whl (9.6 kB)
2024-01-19T13:56:20.6568078Z Downloading mkdocs_coverage-1.0.0-py3-none-any.whl (5.5 kB)
2024-01-19T13:56:20.6721538Z Downloading mkdocs_jupyter-0.24.6-py3-none-any.whl (2.1 MB)
2024-01-19T13:56:20.6929334Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 109.3 MB/s eta 0:00:00
2024-01-19T13:56:20.7064322Z Downloading mkdocs_material-9.4.8-py3-none-any.whl (8.4 MB)
2024-01-19T13:56:20.7814465Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.4/8.4 MB 114.9 MB/s eta 0:00:00
2024-01-19T13:56:20.7907116Z Downloading mkdocs_material_extensions-1.3-py3-none-any.whl (8.6 kB)
2024-01-19T13:56:20.8008579Z Downloading mkdocstrings-0.23.0-py3-none-any.whl (25 kB)
2024-01-19T13:56:20.8152789Z Downloading mkdocstrings_python-1.7.3-py3-none-any.whl (51 kB)
2024-01-19T13:56:20.8204794Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 51.7/51.7 kB 18.2 MB/s eta 0:00:00
2024-01-19T13:56:20.8277049Z Downloading nbclient-0.8.0-py3-none-any.whl (73 kB)
2024-01-19T13:56:20.8319074Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 73.1/73.1 kB 26.6 MB/s eta 0:00:00
2024-01-19T13:56:20.8485580Z Downloading nbconvert-7.11.0-py3-none-any.whl (256 kB)
2024-01-19T13:56:20.8543838Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 256.6/256.6 kB 61.5 MB/s eta 0:00:00
2024-01-19T13:56:20.8618824Z Downloading nbformat-5.9.2-py3-none-any.whl (77 kB)
2024-01-19T13:56:20.8661983Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.6/77.6 kB 26.9 MB/s eta 0:00:00
2024-01-19T13:56:20.8734390Z Downloading nest_asyncio-1.5.8-py3-none-any.whl (5.3 kB)
2024-01-19T13:56:20.8850386Z Downloading numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)
2024-01-19T13:56:21.0526557Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.2/18.2 MB 93.3 MB/s eta 0:00:00
2024-01-19T13:56:21.0540826Z Using cached packaging-23.2-py3-none-any.whl (53 kB)
2024-01-19T13:56:21.0653502Z Downloading pandas-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.2 MB)
2024-01-19T13:56:21.1937813Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.2/12.2 MB 108.4 MB/s eta 0:00:00
2024-01-19T13:56:21.2010831Z Downloading pathspec-0.11.2-py3-none-any.whl (29 kB)
2024-01-19T13:56:21.2112209Z Downloading pexpect-4.9.0-py2.py3-none-any.whl (63 kB)
2024-01-19T13:56:21.2169379Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.8/63.8 kB 13.8 MB/s eta 0:00:00
2024-01-19T13:56:21.2264726Z Downloading Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl (3.6 MB)
2024-01-19T13:56:21.2595698Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 116.0 MB/s eta 0:00:00
2024-01-19T13:56:21.2669354Z Downloading platformdirs-3.11.0-py3-none-any.whl (17 kB)
2024-01-19T13:56:21.2767012Z Downloading prompt_toolkit-3.0.39-py3-none-any.whl (385 kB)
2024-01-19T13:56:21.2832720Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 385.2/385.2 kB 79.8 MB/s eta 0:00:00
2024-01-19T13:56:21.2949245Z Downloading psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (283 kB)
2024-01-19T13:56:21.3005099Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 283.6/283.6 kB 68.6 MB/s eta 0:00:00
2024-01-19T13:56:21.3076203Z Downloading Pygments-2.16.1-py3-none-any.whl (1.2 MB)
2024-01-19T13:56:21.3205053Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 104.6 MB/s eta 0:00:00
2024-01-19T13:56:21.3294428Z Downloading pymdown_extensions-10.3.1-py3-none-any.whl (241 kB)
2024-01-19T13:56:21.3348512Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 241.0/241.0 kB 60.9 MB/s eta 0:00:00
2024-01-19T13:56:21.3421342Z Downloading pypandoc-1.12-py3-none-any.whl (20 kB)
2024-01-19T13:56:21.3512309Z Downloading pyparsing-3.1.1-py3-none-any.whl (103 kB)
2024-01-19T13:56:21.3556327Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.1/103.1 kB 34.8 MB/s eta 0:00:00
2024-01-19T13:56:21.3672500Z Downloading pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.6 MB)
2024-01-19T13:56:21.4417697Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.6/8.6 MB 117.8 MB/s eta 0:00:00
2024-01-19T13:56:21.4489994Z Downloading pytz-2023.3.post1-py2.py3-none-any.whl (502 kB)
2024-01-19T13:56:21.4567221Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 502.5/502.5 kB 83.9 MB/s eta 0:00:00
2024-01-19T13:56:21.4642834Z Downloading PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (757 kB)
2024-01-19T13:56:21.4737792Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 757.7/757.7 kB 96.2 MB/s eta 0:00:00
2024-01-19T13:56:21.4839035Z Downloading pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl (1.1 MB)
2024-01-19T13:56:21.4983891Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 86.6 MB/s eta 0:00:00
2024-01-19T13:56:21.5055561Z Downloading referencing-0.30.2-py3-none-any.whl (25 kB)
2024-01-19T13:56:21.5178771Z Downloading regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (785 kB)
2024-01-19T13:56:21.5277293Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 785.1/785.1 kB 95.5 MB/s eta 0:00:00
2024-01-19T13:56:21.5347345Z Downloading requests-2.31.0-py3-none-any.whl (62 kB)
2024-01-19T13:56:21.5391634Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.6/62.6 kB 20.2 MB/s eta 0:00:00
2024-01-19T13:56:21.5516511Z Downloading rpds_py-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)
2024-01-19T13:56:21.5650817Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 104.4 MB/s eta 0:00:00
2024-01-19T13:56:21.5722958Z Downloading shapely-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB)
2024-01-19T13:56:21.5960564Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.5/2.5 MB 115.4 MB/s eta 0:00:00
2024-01-19T13:56:21.6032714Z Downloading soupsieve-2.5-py3-none-any.whl (36 kB)
2024-01-19T13:56:21.6125955Z Downloading stack_data-0.6.3-py3-none-any.whl (24 kB)
2024-01-19T13:56:21.6221410Z Downloading tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (427 kB)
2024-01-19T13:56:21.6289172Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 427.7/427.7 kB 82.2 MB/s eta 0:00:00
2024-01-19T13:56:21.6360535Z Downloading tqdm-4.66.1-py3-none-any.whl (78 kB)
2024-01-19T13:56:21.6403126Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.3/78.3 kB 27.8 MB/s eta 0:00:00
2024-01-19T13:56:21.6475625Z Downloading traitlets-5.13.0-py3-none-any.whl (84 kB)
2024-01-19T13:56:21.6517384Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.0/85.0 kB 31.5 MB/s eta 0:00:00
2024-01-19T13:56:21.6586433Z Downloading urllib3-2.0.7-py3-none-any.whl (124 kB)
2024-01-19T13:56:21.6673502Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.2/124.2 kB 16.3 MB/s eta 0:00:00
2024-01-19T13:56:21.6743206Z Downloading validators-0.22.0-py3-none-any.whl (26 kB)
2024-01-19T13:56:21.6836612Z Downloading wcwidth-0.2.9-py2.py3-none-any.whl (102 kB)
2024-01-19T13:56:21.6881530Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 102.3/102.3 kB 34.5 MB/s eta 0:00:00
2024-01-19T13:56:21.6986536Z Downloading wsimod-0.4.0-py3-none-any.whl (5.8 MB)
2024-01-19T13:56:21.7495841Z    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.8/5.8 MB 117.9 MB/s eta 0:00:00
2024-01-19T13:56:21.9925251Z Building wheels for collected packages: mkdocs-bibtex, paginate
2024-01-19T13:56:21.9934896Z   Building wheel for mkdocs-bibtex (pyproject.toml): started
2024-01-19T13:56:22.2792040Z   Building wheel for mkdocs-bibtex (pyproject.toml): finished with status 'done'
2024-01-19T13:56:22.2799206Z   Created wheel for mkdocs-bibtex: filename=mkdocs_bibtex-2.11.0-py3-none-any.whl size=10252 sha256=6f2184e1e432d8b051781dccdbfe96fd81debc10b15f3e5898d6470aa8a297bf
2024-01-19T13:56:22.2801898Z   Stored in directory: /home/runner/.cache/pip/wheels/20/c0/b5/21f75251cc6fbc514cdd702a2d85bea082488db280e73403d7
2024-01-19T13:56:22.2823886Z   Building wheel for paginate (pyproject.toml): started
2024-01-19T13:56:22.4503387Z   Building wheel for paginate (pyproject.toml): finished with status 'done'
2024-01-19T13:56:22.4509531Z   Created wheel for paginate: filename=paginate-0.5.6-py3-none-any.whl size=12666 sha256=0c68d15e004aa5a175db41901265eb05e64bfc5a90b61d94c99c817d212db80e
2024-01-19T13:56:22.4511892Z   Stored in directory: /home/runner/.cache/pip/wheels/c6/d1/23/f52e2714a0712789b188486c8ada5f593f6f78c8caa9892a8d
2024-01-19T13:56:22.4529735Z Successfully built mkdocs-bibtex paginate
2024-01-19T13:56:23.0784118Z Installing collected packages: webencodings, wcwidth, pytz, pure-eval, ptyprocess, paginate, fastjsonschema, watchdog, validators, urllib3, tzdata, traitlets, tqdm, tornado, toml, tinycss2, soupsieve, six, rpds-py, regex, pyzmq, pyyaml, pyparsing, pypandoc, pygments, psutil, prompt-toolkit, platformdirs, pillow, pexpect, pathspec, parso, pandocfilters, packaging, numpy, nest-asyncio, mkdocs-material-extensions, mistune, mergedeep, mdurl, markupsafe, markdown, kiwisolver, jupyterlab-pygments, idna, fonttools, executing, dill, defusedxml, decorator, debugpy, cycler, colorama, click, charset-normalizer, certifi, babel, attrs, shapely, requests, referencing, pyyaml-env-tag, python-dateutil, pyproj, pymdown-extensions, matplotlib-inline, markdown-it-py, latexcodec, jupyter-core, jinja2, jedi, griffe, contourpy, comm, cligj, click-plugins, bleach, beautifulsoup4, asttokens, stack-data, pybtex, pandas, mdit-py-plugins, matplotlib, jupyter-client, jsonschema-specifications, ghp-import, fiona, wsimod, mkdocs, jsonschema, ipython, geopandas, nbformat, mkdocs-material, mkdocs-gen-files, mkdocs-coverage, mkdocs-bibtex, mkdocs-autorefs, ipykernel, nbclient, mkdocstrings, jupytext, nbconvert, mkdocstrings-python, mkdocs-jupyter
2024-01-19T13:56:43.1344256Z Successfully installed asttokens-2.4.1 attrs-23.1.0 babel-2.13.1 beautifulsoup4-4.12.2 bleach-6.1.0 certifi-2023.7.22 charset-normalizer-3.3.2 click-8.1.7 click-plugins-1.1.1 cligj-0.7.2 colorama-0.4.6 comm-0.2.0 contourpy-1.2.0 cycler-0.12.1 debugpy-1.8.0 decorator-5.1.1 defusedxml-0.7.1 dill-0.3.7 executing-2.0.1 fastjsonschema-2.18.1 fiona-1.9.5 fonttools-4.44.0 geopandas-0.14.0 ghp-import-2.1.0 griffe-0.36.9 idna-3.4 ipykernel-6.26.0 ipython-8.17.2 jedi-0.19.1 jinja2-3.1.2 jsonschema-4.19.2 jsonschema-specifications-2023.7.1 jupyter-client-8.6.0 jupyter-core-5.5.0 jupyterlab-pygments-0.2.2 jupytext-1.15.2 kiwisolver-1.4.5 latexcodec-2.0.1 markdown-3.5.1 markdown-it-py-3.0.0 markupsafe-2.1.3 matplotlib-3.8.1 matplotlib-inline-0.1.6 mdit-py-plugins-0.4.0 mdurl-0.1.2 mergedeep-1.3.4 mistune-3.0.2 mkdocs-1.5.3 mkdocs-autorefs-0.5.0 mkdocs-bibtex-2.11.0 mkdocs-coverage-1.0.0 mkdocs-gen-files-0.5.0 mkdocs-jupyter-0.24.6 mkdocs-material-9.4.8 mkdocs-material-extensions-1.3 mkdocstrings-0.23.0 mkdocstrings-python-1.7.3 nbclient-0.8.0 nbconvert-7.11.0 nbformat-5.9.2 nest-asyncio-1.5.8 numpy-1.26.1 packaging-23.2 paginate-0.5.6 pandas-2.1.2 pandocfilters-1.5.0 parso-0.8.3 pathspec-0.11.2 pexpect-4.9.0 pillow-10.1.0 platformdirs-3.11.0 prompt-toolkit-3.0.39 psutil-5.9.6 ptyprocess-0.7.0 pure-eval-0.2.2 pybtex-0.24.0 pygments-2.16.1 pymdown-extensions-10.3.1 pypandoc-1.12 pyparsing-3.1.1 pyproj-3.6.1 python-dateutil-2.8.2 pytz-2023.3.post1 pyyaml-6.0.1 pyyaml-env-tag-0.1 pyzmq-25.1.1 referencing-0.30.2 regex-2023.10.3 requests-2.31.0 rpds-py-0.12.0 shapely-2.0.2 six-1.16.0 soupsieve-2.5 stack-data-0.6.3 tinycss2-1.2.1 toml-0.10.2 tornado-6.3.3 tqdm-4.66.1 traitlets-5.13.0 tzdata-2023.3 urllib3-2.0.7 validators-0.22.0 watchdog-3.0.0 wcwidth-0.2.9 webencodings-0.5.1 wsimod-0.4.0
2024-01-19T13:56:43.7627404Z ##[group]Run mkdocs gh-deploy --force
2024-01-19T13:56:43.7627940Z �[36;1mmkdocs gh-deploy --force�[0m
2024-01-19T13:56:43.7679504Z shell: /usr/bin/bash -e {0}
2024-01-19T13:56:43.7679914Z env:
2024-01-19T13:56:43.7680443Z   pythonLocation: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:43.7681076Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.11.7/x64/lib/pkgconfig
2024-01-19T13:56:43.7681728Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:43.7682404Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:43.7683015Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.7/x64
2024-01-19T13:56:43.7683570Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.7/x64/lib
2024-01-19T13:56:43.7684173Z ##[endgroup]
2024-01-19T13:56:44.3790700Z INFO    -  DeprecationWarning: Jupyter is migrating its paths to use standard platformdirs
2024-01-19T13:56:44.3791913Z given by the platformdirs library.  To remove this warning and
2024-01-19T13:56:44.3793204Z see the appropriate new directories, set the environment variable
2024-01-19T13:56:44.3794232Z `JUPYTER_PLATFORM_DIRS=1` and then run `jupyter --paths`.
2024-01-19T13:56:44.3795191Z The use of platformdirs will be the default in `jupyter_core` v6
2024-01-19T13:56:44.3803081Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/jupyter_core/utils/__init__.py", line 90, in deprecation
2024-01-19T13:56:44.3804490Z     warnings.warn(message, DeprecationWarning, stacklevel=stacklevel + 1)
2024-01-19T13:56:44.3805747Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/jupyter_client/connect.py", line 22, in 
2024-01-19T13:56:44.3806818Z     from jupyter_core.paths import jupyter_data_dir, jupyter_runtime_dir, secure_write
2024-01-19T13:56:44.3807307Z 
2024-01-19T13:56:45.2786555Z INFO    -  Cleaning site directory
2024-01-19T13:56:45.2787850Z INFO    -  Building documentation to directory: /home/runner/work/wsi/wsi/site
2024-01-19T13:56:47.3108014Z Traceback (most recent call last):
2024-01-19T13:56:47.3111496Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/pandas/compat/_optional.py", line 132, in import_optional_dependency
2024-01-19T13:56:47.3113535Z     module = importlib.import_module(name)
2024-01-19T13:56:47.3114392Z              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3116114Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/importlib/__init__.py", line 126, in import_module
2024-01-19T13:56:47.3117900Z     return _bootstrap._gcd_import(name[level:], package, level)
2024-01-19T13:56:47.3118765Z            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3119983Z   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
2024-01-19T13:56:47.3121167Z   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
2024-01-19T13:56:47.3122570Z   File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked
2024-01-19T13:56:47.3123777Z ModuleNotFoundError: No module named 'tabulate'
2024-01-19T13:56:47.3124342Z 
2024-01-19T13:56:47.3124795Z During handling of the above exception, another exception occurred:
2024-01-19T13:56:47.3125534Z 
2024-01-19T13:56:47.3125853Z Traceback (most recent call last):
2024-01-19T13:56:47.3126889Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/bin/mkdocs", line 8, in <module>
2024-01-19T13:56:47.3127896Z     sys.exit(cli())
2024-01-19T13:56:47.3128508Z              ^^^^^
2024-01-19T13:56:47.3130439Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
2024-01-19T13:56:47.3131748Z     return self.main(*args, **kwargs)
2024-01-19T13:56:47.3132464Z            ^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3133858Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/click/core.py", line 1078, in main
2024-01-19T13:56:47.3198206Z     rv = self.invoke(ctx)
2024-01-19T13:56:47.3198779Z          ^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3200818Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
2024-01-19T13:56:47.3202246Z     return _process_result(sub_ctx.command.invoke(sub_ctx))
2024-01-19T13:56:47.3203008Z                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3203963Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
2024-01-19T13:56:47.3204741Z     return ctx.invoke(self.callback, **ctx.params)
2024-01-19T13:56:47.3205295Z            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3206169Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/click/core.py", line 783, in invoke
2024-01-19T13:56:47.3206920Z     return __callback(*args, **kwargs)
2024-01-19T13:56:47.3207373Z            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3208509Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/mkdocs/__main__.py", line 313, in gh_deploy_command
2024-01-19T13:56:47.3209589Z     build.build(cfg, dirty=not clean)
2024-01-19T13:56:47.3210641Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/mkdocs/commands/build.py", line 304, in build
2024-01-19T13:56:47.3211472Z     files = config.plugins.on_files(files, config=config)
2024-01-19T13:56:47.3211980Z             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3213247Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/mkdocs/plugins.py", line 533, in on_files
2024-01-19T13:56:47.3214097Z     return self.run_event('files', files, config=config)
2024-01-19T13:56:47.3214754Z            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3215768Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/mkdocs/plugins.py", line 507, in run_event
2024-01-19T13:56:47.3216547Z     result = method(item, **kwargs)
2024-01-19T13:56:47.3216929Z              ^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3217917Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/mkdocs_gen_files/plugin.py", line 39, in on_files
2024-01-19T13:56:47.3218741Z     runpy.run_path(file_name)
2024-01-19T13:56:47.3219282Z   File "<frozen runpy>", line 291, in run_path
2024-01-19T13:56:47.3219776Z   File "<frozen runpy>", line 98, in _run_module_code
2024-01-19T13:56:47.3220289Z   File "<frozen runpy>", line 88, in _run_code
2024-01-19T13:56:47.3221041Z   File "/home/runner/work/wsi/wsi/docs/create_class_page.py", line 129, in <module>
2024-01-19T13:56:47.3221727Z     f.write(mytable.to_markdown(index=False))
2024-01-19T13:56:47.3222155Z             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3223137Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/pandas/core/frame.py", line 2836, in to_markdown
2024-01-19T13:56:47.3223987Z     tabulate = import_optional_dependency("tabulate")
2024-01-19T13:56:47.3224484Z                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-19T13:56:47.3225573Z   File "/opt/hostedtoolcache/Python/3.11.7/x64/lib/python3.11/site-packages/pandas/compat/_optional.py", line 135, in import_optional_dependency
2024-01-19T13:56:47.3226473Z     raise ImportError(msg)
2024-01-19T13:56:47.3227146Z ImportError: Missing optional dependency 'tabulate'.  Use pip or conda to install tabulate.
2024-01-19T13:56:47.4550544Z ##[error]Process completed with exit code 1.
2024-01-19T13:56:47.4646328Z Post job cleanup.
2024-01-19T13:56:47.5379092Z [command]/usr/bin/git version
2024-01-19T13:56:47.5419020Z git version 2.43.0
2024-01-19T13:56:47.5462221Z Temporarily overriding HOME='/home/runner/work/_temp/29530296-70ee-4bab-8463-f64db75c14c6' before making global git config changes
2024-01-19T13:56:47.5464104Z Adding repository directory to the temporary git global config as a safe directory
2024-01-19T13:56:47.5467591Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/wsi/wsi
2024-01-19T13:56:47.5502082Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
2024-01-19T13:56:47.5534354Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2024-01-19T13:56:47.5781809Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
2024-01-19T13:56:47.5802776Z http.https://github.com/.extraheader
2024-01-19T13:56:47.5814248Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
2024-01-19T13:56:47.5844823Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
2024-01-19T13:56:47.6309928Z Cleaning up orphan processes

Create CLI for WSIMOD

For DAFNI, it will be convenient to have WSIMOD run as a CLI, with input files (or general location where to find them) passed as arguments and outputs produced as output files. This approach can be useful beyond DAFNI, simply to interact with the tool without having to code.

The exact nature of the input arguments and how to ingest them and passed to the current scripting approach to give maximum flexibility is to be investigated, but broadly speaking it should allow calling WSIMOD like:

python -m wsimod --settings settings.toml --inputs /data/inputs --outputs /data/outputs

Or something along these lines. If the inputs and outputs are defined in the settings.toml file, then things are even simpler.

Enable pydocstring and fix all the issues

Docstrings are not up to the appropriate standard - to start with, many are just missing. We implement QA in #32 , but we have disabled pydocstyle simply because of the many issues to fix.

It will take a significant amount of time to sort all of those, so it will need to be done bit by bit, enabling linting the docs (see pyproject.toml), see what fails, picking an error code to fix and disabling the others. And so on and so forth until all doc-related codes are enabled.

Deployment in PyPI with new releases

The current instructions explain how to install WSIMOD using conda directly from the GitHub repo. There's nothing wrong with that, but it will be more convenient to deploy the tool to a common repository, like PyPI, allowing the installation of WSIMOD in exactly the same way but also enforcing a versioning, which is necessary for a professional tool.

I'd suggest a something similar to what we implemented in MUSE but triggered by releases, as it is done in Health-GPS.

Documentation needs updating accordingly.

Update

As much as we would like to to this soon, there are several issues that need solving before we are confident we are deploying a robust tool with a clear documentation (including well documented API documentation):

Not compatible with current pandas version

We are currently pinning the pandas version to 1.5.2 since they are using features that have been removed in the current version

See #29 (comment)

Ideally, we should fix the use of deprecated features so it can be used with the current pandas version

Update documentation and contributing guidelines

Documentation for installing and contributing to wsimod should be updated to reflect the new standard of using pyproject.toml and quality assurance tooling, in particular, the installation and use of pre-commit hooks. Files that I'm aware should be updated are:

  • docs/installation.md
  • docs/CONTRIBUTING.md

But it will be useful to review all of the documentation to ensure consistency.

JOSS Review

@barneydobson

I am beginning my review on WSIMOD for your JOSS publication and I will be tracking my review comments here and editing this issue as they come up, I should be finished doing my review by the end of this week. Feel free to address them all within this issue, or convert each of the comments to their own issues.

  • General reviews

    • I see that you have some tests set up for WSIMOD. It would be great to see these tests incorporated into a continuous integration system, such as github actions.
    • In your WSI docs you have a detailed summary and statement of need. Can you adapt a concise version of this text into your Readme.md file. The Welcome WSIMOD section would be a good place to add this information.
    • Add a requirements section in your Readme.md. What versions of python does your code support? What python packages are required or optionally required to use WSIMOD.
    • Community guidelines: A code of conduct, contributing guidelines, and either an issue template or a short statement about where to seek support for the software should be added to the reposity.
    • Add installation instructions to readme.md.
    • Update installation instructions in your api documentation (and in readme.md) to show installation with pip (pip install .). It'd be nice to add instructions on how to install directly from github for those users who aren't likely to dig into the source code (pip install https://github.com/barneydobson/wsi/archive/refs/heads/main.zip)
  • paper reviews:

    • The statement of need should expand on the gaps in scientific code/research this software is trying to fill and clarify what this software does and does not do.
      • How does this hydrologic simulator compare to other existing modeling software? What gaps does it fill?
    • Lines 22 and 23 state that you simulate "all parts of the water cycle". This should be replaced with a more detailed description of the processes that you simulate.
    • Please expand on the capabilities and limitations of your hydrologic simulator. I think it'd add a lot to the paper if you explained your approach of Arcs and Nodes to simulate fluxes and sinks/storage.
    • Optional: A short example application could really help illustrate the functionality of WSIMOD. I'd really consider consisely presenting one of your example problems (1-2 paragraphs and a figure) to illustrate the utility of the WSIMOD.
  • code reviews:

    • the demo problems for your documentation are currently missing data and not reproducible. All of the example problems are missing "timeseries_data.csv". Until this is fixed I can't really finish my review.
    • the demo problems are currently set up to generate your documentation tutorials. These could be adapted into either example scripts or interactive jupyter notebooks (in addition to keeping the current docs workflow) where the user does not have to reset the data_folder path variable to access the correct path to your data.
    • the bulk density of soil in your GrowingSurface module seems low to me (1300 kg/m3), The average bulk denity of soil is around 2650 kg/m3.

openjournals/joss-reviews#4996

More information needed on use of handlers

For example, if I am writing a custom handler:
self.push_set_handler['Land'] = self.push_set_land

When the land node pushes to my new node, it still goes via the default handler, not the 'Land' handler.

wtw node's treat_current_input method can produce a division by 0

Suggested work around is:

denominator = self.liquor["volume"] + influent["volume"] * self.liquor_multiplier["volume"]
if denominator != 0:
    self.liquor[key] = (
        self.liquor[key] * self.liquor["volume"]
        + influent[key] * influent["volume"] * self.liquor_multiplier["volume"]
    ) / denominator
else:
    # Handle the case where the denominator is zero
    self.liquor[key] = 0  # or some other default value

JOSS Review

I am one of the reviewers of your JOSS submission. I am going to include my comments and suggestions in this issue and will edit until all issues are resolved.

Comments on the accompanying paper:

  • The paper is missing some important sections:
    • No discussion on the current state of the field and the knowledge gap that this package is aiming to fill.
    • The discussion on the software capabilities are very limited. You need to provide more details on high-level functionalities of the software, such as, Urban processes that it can model, required input data, number of calibrated vs non-calibrated parameters, and its applicability range and limitations.
  • Line 42 should be removed.

Comment on the package:

  • [x Suggestions (non-blockers):
    • Including a (long) TOC in the README is not helpful. It'd be better if it includes contents similar to the About section of the software's website and some figures demonstrating its capabilities. Essentially, it should give users a quick glance to the content of the repository.
    • Since the software includes a test suite, it's easy to set up a testing GitHub Actions workflow.
    • Using linters could help improve the code quality and catch possible errors. For example, pre-commit can be a good starting point.
    • In my opinion, the way that input data are structured and users have to make all components manually is not user-friendly at all. Since there are many components that required user input, using a config file is much more user-friendly. Many modeling packages follow this input structure, such as SWMM. It's easy to implement such a config file-based input using yaml files in Python.
  • Issues (blockers):
    • There is no clear and direct guidance or discussion in the documentation regarding the required input data and pre-processing them in a form that the model accepts. There are some hints in the examples, but there should be a dedicated section for processing raw input data from different formats to the required format.
    • Considering that this package combines several models, at least a brief discussion on their assumptions and governing equations are required so a user can make informed decisions regarding the necessary components that need to be included for getting acceptable results. A very detailed and technical discussion is not required like a journal paper, but at least a user should be able to have a good understanding of the model assumptions by reading the documentation.

Further investigation into in-sewer decay

  • Decays "should" be reasonably straightforward to add by converting the sewer QueueTank to a DecayQueueTank. (See https://github.com/barneydobson/wsi/blob/main/wsimod/nodes/storage.py /QueueGroundwater for an example of how to do this in an accommodating way).
  • Main issue is very little seems to be known about in-sewer decay, even the processes involved, let alone parameterisation. Probably this needs a full study.

Implement linters

More uniformity in coding style is needed, to implement through linters

Tanks should have their own module

At the moment, Node and several Tank classes starting here share the same node.py module. However, it seems logical for all tank-related classes to live in their own tank.py module, as they are distinct from Node - they do not even inherit from it.

Enable checking the line length

There are PLENTY of lines that go beyond the standard 88 characters. They are either comments or docstrings so the formatters cannot deal with them (not event docformatter :( ). So, unfortunately, it will need to be done manually.

The steps will be:

  • Remove the ignore of E501 in pyproject.toml
  • Run ruff with python -m ruff check .
  • Enjoy going through the list of long lines and shortening them

Subselect model from existing model

Ability to pick (e.g.,) a river arc/node, and backtrace upstream to all nodes that feed into it and create a new model file just for that sub-selection

Expand unit test coverage

  • WTW mainly untested
  • River biochemical processes (once functionalised)
  • Model object
  • Other (less significant) tests also required - see coverage report

Run tutorials as tests

WSIMOD includes several tutorials that could very well serve as integration tests if run as part of the test suite. Initially the goal would be just to check that they run without errors.

A further refinement that could be implemented would be to save the outputs of running the models in the tests folder as the "truth" and then, when running the tutorials, compare if the actual outputs agree with the expected ones. But that requires a bit more work and will need to be done after #24 since at the moment no output files are produced.

Leakage

  • Does it mainly go to Groundwater, Soil Tank, or both?
  • Should it be on a % basis or something more complicated
  • Does this just go into the core Distribution class, or new subclass, or decorator?
  • Sewers or distribution only? (for now we will ignore sewers under presumption this exfiltration flow is minimal)

If you have any insight to add or other suggestions, please discuss under this issue

Create docker container for WSIMOD

After #24 , it should be relatively easy to create a Dockerfile that let you run WSIMOD within a docker container. A docker-compose.yml file should also be added to simplify its local usage and testing. These files could live within a dafni subfolder in the main repository - or directly in the root folder if they are just those two.

The Dockerfile should be written such that it creates an image that, when executed, will run wsimod CLI with the relevant input arguments:

python -m wsimod --settings /data/inputs/settings.toml`

It will trust that, when run, the correct volumes are mounted in the container (namely that /data/inputs and /data/outputs are available) and that the data is available where it is supposed to be, according to the settings.toml file.

While we will do our best to make this file as general as possible, its goal its to confirm to the requirements of the DAFNI framework, so in case of doubt, it will be tailored specifically to fulfill its needs. https://docs.secure.dafni.rl.ac.uk/docs/how-to/how-to-create-a-dafni-ready-model

Parameter set change on the DAFNI platform

To test the acceptibility of input data in .csv.gz format on the DAFNI platform, I've revised and uploaded both the setting.ymal and timeseries_data.csv.gz to the Data section on the platform.
image
The revisions are listed here:
(1) timeseries_data.csv.gz - I double the 'precipitation' data to make it different from the original timseseries_data.csv, to validate that the DAFNI platform is using the data I expect.
(2) settings.yaml - I revise the data file names in the yaml file from .csv to .csv.gz. The rest stays the same with the original yaml file.

I then try to use the WSIMOD workflow created by Diego and reset the parameters from default into the newly uploaded yaml and csv.gz
image

Two issues happen when I continue:
(1) permission denied when I try to 'upload the parameter set'
image
(2) then I just 'excute workflow with parameter set'. It runs but the results I get is based on the default quickstart_demo parameter setting. If they use the new parameter set I specify, the resultant values in flows.csv (output) should be doubled.

I then created my own workflow and tested it. Everything works as expected and the results are doubled when I switch the parameter set.

Enable overrides in `Node` and `Arc` base classes

# Initialise nodes
# Initialise arcs
# And then...
model.add_overrides(data.get("overrides", {}))

# And in Model
def add_overrides(self, config: Dict):
    for node in config.get("nodes", {}):
        type_ = node.pop("type_")
        name = node.pop("name")
        self.nodes_type[type_][name].apply_overrides(node)

    for arc in config.get("arcs", {}):
        name = arc.pop("name")
        self.arcs[name].apply_overrides(arc)

The node.apply_overrides and arc.apply_overrides will be the methods that will call the appropriate setters to ensure that any side effects of modifying those parameters are taken care of.

apply_overrides should be a method (not an abstract one) of the base class for nodes and arcs that will do nothing unless it is overridden. This way, only those specific nodes that can be overridden will need to have this method (and the relevant setters) implemented.

class Node:
    def apply_overrides(self, config: Dict):
        pass

class Arc:
    def apply_overrides(self, config: Dict):
        pass

In terms of how this can be done from a practical point of view, I would open issues for:

  1. Implement the above overriden logic. Should be harmless and backwards compatible with any existing code and config files.
  2. Identify which nodes/arcs have parameters that are worth to be overriden and open an issue for each of those nodes/arcs, indicating which parameters need such override. Watch out for recursive calls! You might need some hidden internal attributes that can be set directly and only use the setters in the overrides:
class MyNode:
    def __init__(...):
        # Does not use the setter
        self._some_param = get_default_some_param(...)

    @property 
    def some_param(self):
        return self._some_param

    @some_param.setter 
    def some_param(self, value):
        if not value:
            return
        # Some complex logic
        self._some_param = ...
        # More logic here

    def apply_overrides(self, config: Dict):
        self.some_param = config.pop("some_param", None)
        ...

Originally posted by @dalonsoa in #54 (comment)

Documentation fails to build properly

The documentation created with mkdocs relies on several Jupyter-notebook-like scripts to run successfully during the build process. These notebooks fail to run successfully because in several places they are using relative paths to find the data that are not correct.

For example, the quickstart_demo.py script will failed when running mkdocs serve from the root directory with:

#Use this path if compiling documentation
data_folder= os.path.join(os.path.abspath(''),
                               "docs","demo","data")
#Use this path otherwise
data_folder = os.path.join(os.path.split(os.path.abspath(''))[0],"data") 

input_fid = os.path.join(data_folder, "processed", "timeseries_data.csv")
input_data = pd.read_csv(input_fid)
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[2], line 8
      5 data_folder = os.path.join(os.path.split(os.path.abspath(''))[0],"data") 
      7 input_fid = os.path.join(data_folder, "processed", "timeseries_data.csv")
----> 8 input_data = pd.read_csv(input_fid)
      9 input_data.loc[input_data.variable == 'precipitation', 'value'] *= constants.MM_TO_M
     10 input_data.date = pd.to_datetime(input_data.date)

...

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\dalonsoa\\Projects\\data\\processed\\timeseries_data.csv'

The code itself seem to suggest that to build the documentation, the second version of selecting the data_folder should be commented (or removed), but that manual manipulation is very inconvenient.

The solution would be to use in any attempt to access data files the relative path with respect to the notebook file. Having said this, apparently there's no foolproof way of getting the path of a running notebook, so we just need to find a way that works for our use cases.

Model object needs to be more useful

  • Better support for pausing/restarting simulations
  • Option to save results on the fly and enable simulation cancelling
  • Tidier way to record what results are saved

Add a name property to nodes

This seems sensible. As part of this would it be sensible to stop using the class.name as part of the model behaviour and instead make that a default node attribute? I had made this poor decision super early on and since realising that it's not a good idea it has now become all over the place. Maybe it is a separate issue because it seems to me a reasonably large task and the documentation here would need to be updated.

Originally posted by @barneydobson in #60 (comment)

Further documentation

  • More expansive how-to guides for each node type
  • Better explanation of mass balance testing
  • How-to customise a handler
  • How to change hydrological model
  • How to customise simulated pollutants #17

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.