diff --git a/.gitignore b/.gitignore index 86830a544..50aef2f57 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,6 @@ bigraph-builder 3.10/ Miniforge3-Darwin-arm64.sh *.cpython-310.pyc - +playground.ipynb +composer-notebooks/playground.ipynb +*model_dir/ diff --git a/ArchiveEditor.ipynb b/ArchiveEditor.ipynb deleted file mode 100644 index b158ae194..000000000 --- a/ArchiveEditor.ipynb +++ /dev/null @@ -1,543 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "authorship_tag": "ABX9TyPjK/verqoLQXZ42lnmhg2h", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "jyZetQ55uWF6", - "outputId": "66882ce7-c27e-4bfc-99fd-556a4eb84cb9" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Collecting biosimulators-utils[sbml]\n", - " Downloading biosimulators_utils-0.1.187-py2.py3-none-any.whl (564 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m565.0/565.0 kB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting process-bigraph\n", - " Downloading process-bigraph-0.0.15.tar.gz (25 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: appdirs in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (1.4.4)\n", - "Collecting biopython (from biosimulators-utils[sbml])\n", - " Downloading biopython-1.83-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m24.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cement (from biosimulators-utils[sbml])\n", - " Downloading cement-3.0.10-py3-none-any.whl (334 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m334.7/334.7 kB\u001b[0m \u001b[31m24.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting evalidate>=2.0.0 (from biosimulators-utils[sbml])\n", - " Downloading evalidate-2.0.2-py3-none-any.whl (8.5 kB)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (3.9.0)\n", - "Collecting kisao>=2.33 (from biosimulators-utils[sbml])\n", - " Downloading kisao-2.34-py2.py3-none-any.whl (111 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.6/111.6 kB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (4.9.4)\n", - "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (3.7.1)\n", - "Requirement already satisfied: mpmath in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (1.3.0)\n", - "Requirement already satisfied: natsort in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (8.4.0)\n", - "Requirement already satisfied: networkx>=2.6 in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (3.2.1)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (1.25.2)\n", - "Requirement already satisfied: openpyxl in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (3.1.2)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (1.5.3)\n", - "Collecting pronto>=2.4 (from biosimulators-utils[sbml])\n", - " Downloading pronto-2.5.6-py2.py3-none-any.whl (61 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.7/61.7 kB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pyomexmeta>=1.2.13 (from biosimulators-utils[sbml])\n", - " Downloading pyomexmeta-1.2.14-cp310-cp310-manylinux2014_x86_64.whl (5.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.5/5.5 MB\u001b[0m \u001b[31m47.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (2.8.2)\n", - "Collecting python-libcombine>=0.2.11 (from biosimulators-utils[sbml])\n", - " Downloading python_libcombine-0.2.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m51.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting python-libsedml>=2.0.16 (from biosimulators-utils[sbml])\n", - " Downloading python_libsedml-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.3/3.3 MB\u001b[0m \u001b[31m51.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (6.0.1)\n", - "Collecting rdflib (from biosimulators-utils[sbml])\n", - " Downloading rdflib-7.0.0-py3-none-any.whl (531 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m531.9/531.9 kB\u001b[0m \u001b[31m44.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (2023.12.25)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (2.31.0)\n", - "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (67.7.2)\n", - "Collecting simplejson (from biosimulators-utils[sbml])\n", - " Downloading simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (137 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.9/137.9 kB\u001b[0m \u001b[31m17.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from biosimulators-utils[sbml]) (2.4.0)\n", - "Collecting uritools (from biosimulators-utils[sbml])\n", - " Downloading uritools-4.0.2-py3-none-any.whl (10 kB)\n", - "Collecting yamldown (from biosimulators-utils[sbml])\n", - " Downloading yamldown-0.1.8-py3-none-any.whl (4.1 kB)\n", - "Collecting python-libsbml (from biosimulators-utils[sbml])\n", - " Downloading python_libsbml-5.20.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.0/8.0 MB\u001b[0m \u001b[31m43.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting bigraph-schema (from process-bigraph)\n", - " Downloading bigraph-schema-0.0.30.tar.gz (36 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: pytest>=6.2.5 in /usr/local/lib/python3.10/dist-packages (from process-bigraph) (7.4.4)\n", - "Collecting pymongo (from process-bigraph)\n", - " Downloading pymongo-4.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (677 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m677.2/677.2 kB\u001b[0m \u001b[31m18.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting orjson (from process-bigraph)\n", - " Downloading orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.5/138.5 kB\u001b[0m \u001b[31m15.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: chardet~=5.0 in /usr/local/lib/python3.10/dist-packages (from pronto>=2.4->biosimulators-utils[sbml]) (5.2.0)\n", - "Collecting fastobo~=0.12.2 (from pronto>=2.4->biosimulators-utils[sbml])\n", - " Downloading fastobo-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m77.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: graphviz>=0.15 in /usr/local/lib/python3.10/dist-packages (from pyomexmeta>=1.2.13->biosimulators-utils[sbml]) (0.20.1)\n", - "Requirement already satisfied: pydot>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from pyomexmeta>=1.2.13->biosimulators-utils[sbml]) (1.4.2)\n", - "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest>=6.2.5->process-bigraph) (2.0.0)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from pytest>=6.2.5->process-bigraph) (24.0)\n", - "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest>=6.2.5->process-bigraph) (1.4.0)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest>=6.2.5->process-bigraph) (1.2.0)\n", - "Requirement already satisfied: tomli>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pytest>=6.2.5->process-bigraph) (2.0.1)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil->biosimulators-utils[sbml]) (1.16.0)\n", - "Collecting parsimonious (from bigraph-schema->process-bigraph)\n", - " Downloading parsimonious-0.10.0-py3-none-any.whl (48 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.4/48.4 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fire (from bigraph-schema->process-bigraph)\n", - " Downloading fire-0.6.0.tar.gz (88 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m88.4/88.4 kB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pint (from bigraph-schema->process-bigraph)\n", - " Downloading Pint-0.23-py3-none-any.whl (305 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m305.0/305.0 kB\u001b[0m \u001b[31m27.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (1.2.0)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (4.49.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (1.4.5)\n", - "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (9.4.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->biosimulators-utils[sbml]) (3.1.2)\n", - "Requirement already satisfied: et-xmlfile in /usr/local/lib/python3.10/dist-packages (from openpyxl->biosimulators-utils[sbml]) (1.1.0)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->biosimulators-utils[sbml]) (2023.4)\n", - "Collecting dnspython<3.0.0,>=1.16.0 (from pymongo->process-bigraph)\n", - " Downloading dnspython-2.6.1-py3-none-any.whl (307 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.7/307.7 kB\u001b[0m \u001b[31m29.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting isodate<0.7.0,>=0.6.0 (from rdflib->biosimulators-utils[sbml])\n", - " Downloading isodate-0.6.1-py2.py3-none-any.whl (41 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.7/41.7 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->biosimulators-utils[sbml]) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->biosimulators-utils[sbml]) (3.6)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->biosimulators-utils[sbml]) (2.0.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->biosimulators-utils[sbml]) (2024.2.2)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from pint->bigraph-schema->process-bigraph) (4.10.0)\n", - "Building wheels for collected packages: process-bigraph, bigraph-schema, fire\n", - " Building wheel for process-bigraph (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for process-bigraph: filename=process_bigraph-0.0.15-py3-none-any.whl size=26604 sha256=c9e4e7b87fd07752be8cce85938e7c7eff092c997f7110129d083774413f003c\n", - " Stored in directory: /root/.cache/pip/wheels/ee/4d/5d/18d92a8bb5484771901a0dc93d89a9029f6c6a4ba0010be079\n", - " Building wheel for bigraph-schema (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for bigraph-schema: filename=bigraph_schema-0.0.30-py3-none-any.whl size=37795 sha256=8679490631c6412524fb22bd9685564b827be85a94af608503b22c1d74164566\n", - " Stored in directory: /root/.cache/pip/wheels/b8/fd/63/3e228cc6e58b0fd46f2ecb1ca5bc78962cefc9a302feca8e5e\n", - " Building wheel for fire (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for fire: filename=fire-0.6.0-py2.py3-none-any.whl size=117029 sha256=8d44ba3c89f0d3eeca9e9e9f8abd7dd0d3dc72628838aa81ccc2c25d770647d6\n", - " Stored in directory: /root/.cache/pip/wheels/d6/6d/5d/5b73fa0f46d01a793713f8859201361e9e581ced8c75e5c6a3\n", - "Successfully built process-bigraph bigraph-schema fire\n", - "Installing collected packages: python-libsedml, python-libsbml, python-libcombine, evalidate, yamldown, uritools, simplejson, pint, parsimonious, orjson, isodate, fire, fastobo, dnspython, cement, biopython, rdflib, pyomexmeta, pymongo, pronto, bigraph-schema, process-bigraph, kisao, biosimulators-utils\n", - "Successfully installed bigraph-schema-0.0.30 biopython-1.83 biosimulators-utils-0.1.187 cement-3.0.10 dnspython-2.6.1 evalidate-2.0.2 fastobo-0.12.3 fire-0.6.0 isodate-0.6.1 kisao-2.34 orjson-3.9.15 parsimonious-0.10.0 pint-0.23 process-bigraph-0.0.15 pronto-2.5.6 pymongo-4.6.2 pyomexmeta-1.2.14 python-libcombine-0.2.20 python-libsbml-5.20.2 python-libsedml-2.0.32 rdflib-7.0.0 simplejson-3.19.2 uritools-4.0.2 yamldown-0.1.8\n" - ] - } - ], - "source": [ - "!pip install biosimulators-utils[sbml] process-bigraph" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Upload your archive" - ], - "metadata": { - "id": "gjqFHc5bufpY" - } - }, - { - "cell_type": "code", - "source": [ - "from google.colab import files" - ], - "metadata": { - "id": "YRw-DUavuZqr" - }, - "execution_count": 5, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "files.upload()" - ], - "metadata": { - "id": "YSodaaEkuibL" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# API source\n", - "import os\n", - "import tempfile\n", - "from dataclasses import dataclass, asdict\n", - "from typing import List, Tuple, Dict, Union\n", - "from process_bigraph import pp\n", - "from biosimulators_utils.combine.data_model import CombineArchive, CombineArchiveContent\n", - "from biosimulators_utils.combine.io import CombineArchiveWriter, CombineArchiveReader\n", - "from biosimulators_utils.sedml.io import SedmlSimulationReader, SedmlSimulationWriter\n", - "from biosimulators_utils.sedml.utils import get_all_sed_objects # change this\n", - "from biosimulators_utils.sedml.model_utils import get_parameters_variables_outputs_for_simulation\n", - "from biosimulators_utils.sedml.data_model import *\n", - "\n", - "\n", - "# datamodel\n", - "@dataclass\n", - "class ParameterValue:\n", - " default: Union[int, float]\n", - " new_value: Union[int, float] = None\n", - "\n", - "\n", - "@dataclass\n", - "class EditableSimulationParameter:\n", - " target: str\n", - " value: Union[ParameterValue, Dict[str, Union[float, int]]]\n", - " name: str\n", - " target_namespaces: Dict\n", - " id: str\n", - "\n", - " def to_dict(self):\n", - " return asdict(self)\n", - "\n", - "\n", - "# exec\n", - "class ArchiveEditorApi:\n", - " @classmethod\n", - " def upload_archive(cls):\n", - " return files.upload()\n", - "\n", - " @classmethod\n", - " def get_uploaded_omex_fp(cls, root: str) -> str:\n", - " \"\"\"Get content from colab env\"\"\"\n", - " fpaths = []\n", - " for f in os.listdir(root):\n", - " if '.omex' in f:\n", - " fpaths.append(f)\n", - " # if len(fpaths) > 1:\n", - " # raise OSError('You can only edit one omex archive at a time.')\n", - " # else:\n", - " return fpaths[0]\n", - "\n", - " @classmethod\n", - " def read_omex(cls, omex_fp: str, out_dir: str) -> CombineArchive:\n", - " return CombineArchiveReader().run(in_file=omex_fp, out_dir=out_dir)\n", - "\n", - " @classmethod\n", - " def is_sedml(cls, content: CombineArchiveContent) -> bool:\n", - " return 'simulation' in content.location\n", - "\n", - " @classmethod\n", - " def get_sedml(cls, fp: str) -> SedDocument:\n", - " return SedmlSimulationReader().run(filename=fp)\n", - "\n", - " @classmethod\n", - " def get_editable_params(\n", - " cls,\n", - " fp: str,\n", - " model_lang: str,\n", - " sim_type: Simulation,\n", - " kisao_id: str\n", - " ) -> Tuple[List[ModelAttributeChange], List[Simulation], List[Variable], List[Plot]]:\n", - " attrb_changes, sim, variables, plots = get_parameters_variables_outputs_for_simulation(\n", - " model_filename=fp,\n", - " model_language=model_lang,\n", - " simulation_type=sim_type,\n", - " change_level=SedDocument,\n", - " algorithm_kisao_id=kisao_id)\n", - " return attrb_changes, sim, variables, plots\n", - "\n", - " @classmethod\n", - " def parse_editable_params(\n", - " cls,\n", - " attributes: List[ModelAttributeChange]\n", - " ) -> List[EditableSimulationParameter]:\n", - " params = []\n", - " for attribute in attributes:\n", - " # new_value is default and target is target\n", - " param_value = ParameterValue(default=attribute.new_value)\n", - " editable_param = EditableSimulationParameter(\n", - " target=attribute.target,\n", - " value=param_value,\n", - " target_namespaces=attribute.target_namespaces,\n", - " name=attribute.name,\n", - " id=attribute.name)\n", - " params.append(editable_param)\n", - " return params\n", - "\n", - " @classmethod\n", - " def get_serialized_params(cls, attributes: List[ModelAttributeChange]) -> Dict[str, List[Dict[str, Union[str, Dict[str, Union[int, float]]]]]]:\n", - " editable_params = cls.parse_editable_params(attributes)\n", - " serialized = []\n", - " for param in editable_params:\n", - " serialized.append(param.to_dict())\n", - " return {'values': serialized}\n", - "\n", - " @classmethod\n", - " def edit_simulation_parameters(cls, serialized_parameters: Dict, **new_values) -> Dict:\n", - " \"\"\"Provide new values to the serialized_parameters dict and return the same\n", - " dict, but edited.\n", - "\n", - " Args:\n", - " serialized_parameters:`Dict`: params datastructure that will be edited.\n", - " **new_values:`kwargs`: new key value assignments to the values.\n", - "\n", - " Returns:\n", - " the edited parameters\n", - " \"\"\"\n", - " for param_name, param_val in new_values.items():\n", - " serialized_parameters['values'][param_name]['value']['new_value'] = param_val\n", - " return serialized_parameters\n", - "\n", - " @classmethod\n", - " def generate_model(\n", - " cls,\n", - " model_id: str,\n", - " model_name: str,\n", - " model_source: str,\n", - " model_language: str,\n", - " changes: List[ModelAttributeChange]\n", - " ) -> Model:\n", - " return Model(model_id, model_name, model_source, model_language, changes)\n", - "\n", - " @classmethod\n", - " def generate_sed_doc_from_changed_model(\n", - " cls,\n", - " uploaded_archive: CombineArchive,\n", - " extraction_dir: str,\n", - " kisao_id: str = None,\n", - " **changes) -> SedDocument:\n", - " introspection = cls.introspect_archive(\n", - " uploaded_archive=uploaded_archive,\n", - " extraction_dir=extraction_dir,\n", - " kisao_id=kisao_id)\n", - "\n", - " sim_type = introspection['sim_type']\n", - " sim_model = introspection['sim_model']\n", - " model_lang = introspection['model_lang']\n", - " model_source = introspection['model_source']\n", - " changed_attributes = cls.edit_simulation_parameters(serialized_parameters=introspection, **changes)\n", - " new_model_changes = []\n", - " for param in introspection['values']:\n", - " param_values = param.pop('value')\n", - " val = param_values.get('new_value') or param_values['default']\n", - " attribute_change = ModelAttributeChange(\n", - " id=param['id'],\n", - " name=param['name'],\n", - " target=param['target'],\n", - " target_namespaces=param['target_namespaces'],\n", - " new_value=str(val))\n", - " new_model_changes.append(attribute_change)\n", - "\n", - " assert sim_model.changes != new_model_changes\n", - " introspection['sim_model'].changes = new_model_changes\n", - " pp(introspection)\n", - " # TODO: Create sed doc\n", - "\n", - " @classmethod\n", - " def add_changed_sed_to_uploaded_archive(cls, uploaded_archive: CombineArchive) -> None:\n", - " # remove previous sedml\n", - " print(len(uploaded_archive.contents))\n", - " for content in uploaded_archive.contents:\n", - " if 'sedml' in content.location:\n", - " uploaded_archive.contents.remove(content)\n", - " print(len(uploaded_archive.contents))\n", - "\n", - " # TODO: add this to the yaml spec\n", - " @classmethod\n", - " def introspect_archive(\n", - " cls,\n", - " uploaded_archive: CombineArchive,\n", - " extraction_dir: str,\n", - " kisao_id: str = None) -> Dict:\n", - " for content in uploaded_archive.contents:\n", - " if 'sedml' in content.location:\n", - " sed_fp = content.location.replace('./', '')\n", - " sed_doc: SedDocument = cls.get_sedml(\n", - " os.path.join(extraction_dir, sed_fp))\n", - " sed_doc_objects = get_all_sed_objects(sed_doc)\n", - " for obj in sed_doc_objects:\n", - " if isinstance(obj, Task):\n", - " sim_type = type(obj.simulation)\n", - " sim_model = obj.model\n", - " model_lang = sim_model.language\n", - " model_fp = os.path.join(extraction_dir, sim_model.source)\n", - "\n", - " attributes, sim, variables, plots = cls.get_editable_params(\n", - " fp=model_fp,\n", - " model_lang=model_lang,\n", - " sim_type=sim_type,\n", - " kisao_id=kisao_id)\n", - "\n", - " serialized_editable_params = cls.get_serialized_params(attributes)\n", - " serialized_editable_params['sim_type'] = sim_type\n", - " serialized_editable_params['sim_model'] = sim_model\n", - " serialized_editable_params['model_lang'] = model_lang\n", - " serialized_editable_params['model_source'] = model_fp\n", - " return serialized_editable_params\n", - "\n", - " @classmethod\n", - " def run(cls, working_dir: str, colab: bool = False, kisao_id: str = None):\n", - " \"\"\"Introspect an archive for all editable changes to the simulation and\n", - " return a JSON representation of the editable parameters.\n", - "\n", - " Args:\n", - " working_dir:`str`: path of location in which the COMBINE archive\n", - " is stored.\n", - " colab:`bool`: If using colab, prompts user for archive input. Defaults\n", - " to `False`.\n", - " kisao_id:`str`: KiSAO id of the algorithm for simulating the model.\n", - " Defaults to `None`.\n", - "\n", - " Returns:\n", - " Dict: JSON representation of all editable parameters.\n", - " \"\"\"\n", - " if colab:\n", - " from google.colab import files\n", - " cls.upload_archive()\n", - "\n", - " omex_fp: str = cls.get_uploaded_omex_fp(working_dir)\n", - " temp_extraction_dir = tempfile.mkdtemp()\n", - " uploaded_archive: CombineArchive = cls.read_omex(omex_fp, temp_extraction_dir)\n", - " serialized_editable_params = cls.introspect_archive(uploaded_archive, temp_extraction_dir, kisao_id)\n", - "\n", - " adjusted_sed: SedDocument = cls.generate_sed_doc_from_changed_model(uploaded_archive, temp_extraction_dir, kisao_id)\n", - "\n", - "\n", - "\n", - "ArchiveEditorApi.run('/content')" - ], - "metadata": { - "id": "nhzHa4j_uj9y" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "1. Client passes an archive filepath to an upload Component -> returns url\n", - "\n", - "2. A service called ArchiveService.ts is configured with the archive url -> (params)\n", - "\n", - "3. ArchiveService.ts makes a REST call to EditorApi/introspect -> return editable params\n", - "\n", - "4. ArchiveService.ts uses the params data to populate form fields -> component data\n", - "\n", - "5. Client adds changes to form fields and hits submit -> returns datastructure from 3 but edited\n", - "\n", - "6. ArchiveService.ts uses the returned datastructure from client changes in 5 to make REST call to EditorAPI/edit_simulation\n", - "\n", - "\n", - "\n", - "\n" - ], - "metadata": { - "id": "ZqBr0gTbKuFv" - } - }, - { - "cell_type": "code", - "source": [ - "import tkinter as tk\n", - "from tkinter import simpledialog\n", - "\n", - "# Assume this is your SED-ML document represented as a dictionary\n", - "sedml_document = {\n", - " 'model': 'my_model.xml',\n", - " 'simulation': 'stochastic',\n", - " 'steps': 1000,\n", - " 'algorithm': 'KISAO:0000032'\n", - "}\n", - "\n", - "def update_steps():\n", - " new_steps = simpledialog.askinteger(\"Update Steps\", \"Enter new number of steps:\",\n", - " parent=root)\n", - " if new_steps is not None:\n", - " sedml_document['steps'] = new_steps\n", - " steps_var.set(f\"Steps: {sedml_document['steps']}\")\n", - "\n", - "# Set up the Tkinter root window\n", - "root = tk.Tk()\n", - "root.title(\"SED-ML Editor\")\n", - "\n", - "# Display the current number of steps\n", - "steps_var = tk.StringVar(value=f\"Steps: {sedml_document['steps']}\")\n", - "tk.Label(root, textvariable=steps_var).pack()\n", - "\n", - "# Button to change the number of steps\n", - "tk.Button(root, text=\"Change Steps\", command=update_steps).pack()\n", - "\n", - "root.mainloop()\n" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 332 - }, - "id": "lHP47jfF-RpL", - "outputId": "d6013e56-191e-4fa5-b2c9-428fe979f965" - }, - "execution_count": 2, - "outputs": [ - { - "output_type": "error", - "ename": "TclError", - "evalue": "no display name and no $DISPLAY environment variable", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTclError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;31m# Set up the Tkinter root window\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mroot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0mroot\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"SED-ML Editor\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/lib/python3.10/tkinter/__init__.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, screenName, baseName, className, useTk, sync, use)\u001b[0m\n\u001b[1;32m 2297\u001b[0m \u001b[0mbaseName\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbaseName\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2298\u001b[0m \u001b[0minteractive\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2299\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_tkinter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscreenName\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbaseName\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclassName\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minteractive\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwantobjects\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0museTk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msync\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2300\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0museTk\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2301\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_loadtk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTclError\u001b[0m: no display name and no $DISPLAY environment variable" - ] - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "4jWAQ038-SE7" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 62451bece..5886321da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ WORKDIR /app # copy and make dirs COPY ./biosimulator_processes /app/biosimulator_processes -COPY notebooks /app/notebooks +COPY composer-notebooks /app/notebooks # copy files COPY ./pyproject.toml ./poetry.lock ./data ./scripts/trust-notebooks.sh /app/ @@ -51,10 +51,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && poetry config virtualenvs.in-project true \ && poetry update \ && poetry install \ - && chmod +x ./trust-notebooks.sh \ + && chmod +x ./trust-composer-notebooks.sh \ && chmod +x /usr/local/bin/enter-lab.sh \ - && ./trust-notebooks.sh \ - && rm ./trust-notebooks.sh \ + && ./trust-composer-notebooks.sh \ + && rm ./trust-composer-notebooks.sh \ && apt-get clean \ && apt-get autoclean diff --git a/README.md b/README.md index f694a6e79..1ab51644a 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,13 @@ a jupyter notebook. The installation for this notebook is provided below. ### Using `biosimulator_processes.smoldyn_process.SmoldynProcess()`: #### Mac Users PLEASE NOTE: + +##### **Amici** +You most likely have to install/update `swig` with `brew`, among other possible requirements. Please refer to the +[Amici Python Installation Documentation](https://amici.readthedocs.io/en/latest/python_installation.html) for +more information. + +##### **Smoldyn** Due to the multi-lingual nature of Smoldyn, which is primarily developed in C++, the installation process for utilizing the `SmoldynProcess` process implementation requires separate handling. This is particularly diff --git a/biosimulator_processes/__init__.py b/biosimulator_processes/__init__.py index 68c0ea1d0..4eee7ee71 100644 --- a/biosimulator_processes/__init__.py +++ b/biosimulator_processes/__init__.py @@ -1,6 +1,13 @@ -from builder import ProcessTypes import importlib -from biosimulator_processes.data_model import SedDataModel +from typing import * + +from builder import ProcessTypes +from bigraph_schema import TypeSystem +from process_bigraph import Composite + +from biosimulator_processes.steps.viz import CompositionPlotter, Plotter2d +from biosimulator_processes.data_model.sed_data_model import MODEL_TYPE +from biosimulator_processes.utils import register_module # Define a list of processes to attempt to import and register @@ -9,37 +16,17 @@ ('copasi', 'copasi_process.CopasiProcess'), ('smoldyn', 'smoldyn_process.SmoldynProcess'), ('tellurium', 'tellurium_process.TelluriumProcess'), - # ('parameter_scan', 'parameter_scan.DeterministicTimeCourseParameterScan') -] - -CORE = ProcessTypes() + ('amici', 'amici_process.AmiciProcess')] -for process_name, process_path in PROCESSES_TO_REGISTER: - module_name, class_name = process_path.rsplit('.', 1) - try: - if 'parameter_scan' in process_name: - import_statement = f'biosimulator_processes.steps.{module_name}' - else: - import_statement = f'biosimulator_processes.processes.{module_name}' - - module = __import__( - import_statement, fromlist=[class_name]) - - # module = importlib.import_module(import_statement) - - # Get the class from the module - bigraph_class = getattr(module, class_name) - - # Register the process - CORE.process_registry.register(class_name, bigraph_class) - print(f"{class_name} registered successfully.") - except ImportError as e: - print(f"{class_name} not available. Error: {e}") +STEPS_TO_REGISTER = [ + ('get_sbml', 'get_sbml.GetSbml'), + ('plotter', 'viz.CompositionPlotter'), + ('plotter2d', 'viz.Plotter2d')] +# core process registry implementation (unique to this package) +CORE = ProcessTypes() -""" - Builder(dataclasses) <- Implementation(dict) <- ProcessBigraph(dict) <- BigraphSchema(dict) - - the general builder should make/take dynamically created classes - the biosimulator builder should make/take predefined classes -""" +# core type system implementation (unique to this package) +CORE.type_registry.register('sed_model', schema={'_type': MODEL_TYPE}) +register_module(PROCESSES_TO_REGISTER, CORE) +register_module(STEPS_TO_REGISTER, CORE) diff --git a/biosimulator_processes/data_model/__init__.py b/biosimulator_processes/data_model/__init__.py new file mode 100644 index 000000000..ef6e790f5 --- /dev/null +++ b/biosimulator_processes/data_model/__init__.py @@ -0,0 +1,20 @@ +"""Data Model Root for Biosimulator Processes + +author: Alex Patrie < alexanderpatrie@gmail.com > +license: Apache 2.0 +created: 03/2024 +""" + + +from dataclasses import dataclass, asdict, field +from pydantic import BaseModel, ConfigDict + + +@dataclass +class _BaseClass: + def to_dict(self): + return asdict(self) + + +class _BaseModel(BaseModel): + model_config = ConfigDict(arbitrary_types_allowed=True) diff --git a/biosimulator_processes/data_model/compare_data_model.py b/biosimulator_processes/data_model/compare_data_model.py new file mode 100644 index 000000000..35a807ec4 --- /dev/null +++ b/biosimulator_processes/data_model/compare_data_model.py @@ -0,0 +1,166 @@ +from typing import * +from abc import ABC +from dataclasses import dataclass +from biosimulator_processes.utils import prepare_single_ode_process_document + +from typing import List, Dict, Tuple, Any +from biosimulator_processes.data_model import _BaseModel as BaseModel + + +class SimulatorComparisonResult(BaseModel): + simulators: List[str] + value: Dict[Tuple[str], Dict[str, Any]] + + +class IntervalResult(BaseModel): + global_time_stamp: float + results: Dict[str, Any] + + +class SimulatorResult(BaseModel): + process_id: str + simulator: str + result: List[IntervalResult] + + +class ComparisonResults(BaseModel): + duration: int + num_steps: int + values: List[SimulatorResult] + + +class ProcessAttributes(BaseModel): + name: str + initial_state: Dict[str, Any] + inputs: Dict[str, Any] + outputs: Dict[str, Any] + + +class CompositeRunError(BaseModel): + exception: Exception + + +class ComparisonDocument(ABC): + def __init__(self): + pass + + +class ODEComparisonDocument(ComparisonDocument): + """To be called 'behind-the-scenes' by the Comparison REST API""" + def __init__(self, + duration: int, + num_steps: int, + model_filepath: str, + framework_type='deterministic', + simulators: Optional[Union[List[str], Dict[str, str]]] = None, + target_parameter: Optional[Dict[str, Union[str, float]]] = None, + **kwargs): + """This object implements a self generated factory with which it creates its representation. The naming of + simulator processes within the composition are by default generated through concatenating the simulator + tool _name_(i.e: `'tellurium'`) with with a simple index `i` which is a population of an iteration over + the total number of processes in the bigraph. + + Args: + simulators:`Union[List[str], Dict[str, str]]`: either a list of actual simulator tool names, + ie: `'copasi'`; or a dict mapping of {simulator_tool_name: custom_process_id} + duration:`int`: the total duration of simulation run + num_steps:`int` + model_filepath:`str`: filepath which points to a SBML model file. + framework_type:`str`: type of mathematical framework to employ with the simulators within your + composition. Choices are `'stochastic'`, `'deterministic'`. Note that there may be more + stochastic options than deterministic. + """ + super().__init__() + + if simulators is None: + self.simulators = ['tellurium', 'copasi', 'amici'] + elif isinstance(simulators, dict): + self.simulators = list(simulators.keys()) if isinstance(simulators, dict) else simulators + self.custom_process_ids = list(simulators.values()) + else: + self.simulators = simulators + + self.composite = kwargs.get('composite', {}) + self.framework_type = framework_type + + context = 'concentrations' + self.species_port_name = f'floating_species_{context}' + self.species_store = [f'floating_species_{context}_store'] + self._populate_composition(model_filepath) + + def add_single_process_to_composite(self, process_id: str, simulator: str): + process_instance = prepare_single_ode_process_document( + process_id=process_id, + simulator_name=simulator, + sbml_model_fp=self.model_filepath, + add_emitter=False) + self.composite[process_id] = process_instance[process_id] + + def _generate_composite_index(self) -> float: + # TODO: implement this. + pass + + def _add_emitter(self) -> None: # TODO: How do we reference different nesting levels? + self.composite['emitter'] = { + '_type': 'step', + 'address': 'local:ram-emitter', + 'config': { + 'emit': { + self.species_port_name: 'tree[float]', + 'time': 'float'} + }, + 'inputs': { + self.species_port_name: self.species_store, + 'time': ['time_store']}} + + def _populate_composition(self, model_filepath: str): + context = 'concentrations' + for index, process in enumerate(self.simulators): + self._add_ode_process_schema( + process_name=process, + species_context=context, + i=index, + model={'model_source': model_filepath}) + return self._add_emitter() + + def _add_ode_process_schema( + self, + process_name: str, + species_context: str, + i: int, + **config + ) -> None: + species_port_name = f'floating_species_{species_context}' + species_store = [f'floating_species_{species_context}_store'] + self.composite[f'{process_name}_{i}'] = { + '_type': 'process', + 'address': f'local:{process_name}', + 'config': config, + 'inputs': { + species_port_name: species_store, + 'model_parameters': ['model_parameters_store'], + 'time': ['time_store'], + 'reactions': ['reactions_store'] + }, + 'outputs': { + species_port_name: species_store, + 'time': ['time_store'] + } + } + + +class DocumentFactory: + @classmethod + def from_dict(cls, configuration: Dict) -> ComparisonDocument: + """ + Args: + configuration:`Dict`: required keys: + simulators: List[str], + duration: int, + num_steps: int, + model_filepath: str, + framework_type='deterministic', + target_parameter: Dict[str, Union[str, float]] = None + + """ + return ComparisonDocument(**configuration) diff --git a/biosimulator_processes/data_model.py b/biosimulator_processes/data_model/sed_data_model.py similarity index 87% rename from biosimulator_processes/data_model.py rename to biosimulator_processes/data_model/sed_data_model.py index e51c7928f..2ce0809eb 100644 --- a/biosimulator_processes/data_model.py +++ b/biosimulator_processes/data_model/sed_data_model.py @@ -1,32 +1,13 @@ -"""Data Model for the highest-level BioBuilder API - -author: Alex Patrie < alexanderpatrie@gmail.com > -license: Apache 2.0 -created: 03/2024 -""" - - -from typing import Dict, List, Union, Tuple, Optional, Any -import requests +from dataclasses import dataclass +from typing import * from types import NoneType -from dataclasses import dataclass, asdict -from abc import ABC, abstractmethod -from pydantic import ( - BaseModel as _BaseModel, - field_validator, - field_serializer, - Field, - ConfigDict, - create_model, - ValidationError -) - +import requests +from abc import abstractmethod, ABC +from pydantic import Field, create_model +from biosimulator_processes.data_model import _BaseClass -@dataclass -class _BaseClass: - def to_dict(self): - return asdict(self) +__all__ = ['SedDataModel'] @dataclass class SimulationModelParameter(_BaseClass): @@ -156,7 +137,7 @@ class SedModel(_BaseClass): model_source: Union[BiomodelID, ModelFilepath, str] model_id: str = None model_name: str = None - model_language: str = 'sbml' + model_language: str = Field(default='sbml') model_changes: ModelChanges = None model_units: ModelUnits = None @@ -219,11 +200,11 @@ class TimeCourseModel(SedModel): Attributes: model_id: `str` model_source: `Union[biosimulator_processes.data_model.ModelFilepath, biosimulator_processes.data_model.BiomodelId]` - model_language: `str` + model_language: `str` defaults to sbml model_name: `str` model_changes: `biosimulator_processes.data_model.TimeCourseModelChanges` """ - model_language: str = None, + model_language: str = 'sbml', model_changes: TimeCourseModelChanges = None, model_units: ModelUnits = None @@ -277,6 +258,7 @@ class TimeCourseProcess(_BaseClass): """Used as config for BioBuilder API""" model: SedModel method: str = 'lsoda' + model_language: str = 'sbml' @dataclass @@ -379,6 +361,26 @@ class SedDataModel: # --- Non-Pydantic FromDict classes + +MODEL_TYPE = { + 'model_id': 'string', + 'model_source': 'string', # TODO: add antimony support here. + 'model_language': { + '_type': 'string', + '_default': 'sbml' + }, + 'model_name': { + '_type': 'string', + '_default': 'composite_process_model' + }, + 'model_changes': { + 'species_changes': 'maybe[tree[string]]', + 'global_parameter_changes': 'maybe[tree[string]]', + 'reaction_changes': 'maybe[tree[string]]' + }, + 'model_units': 'maybe[tree[string]]'} + + class FromDict(dict): def __init__(self, value: Dict): super().__init__(value) @@ -439,45 +441,7 @@ class SedModel(FromDict): # } # } """ - # The first 3 params are NOT optional below for a TimeCourseModel in SEDML. model_source has been adapted to mean point of residence - MODEL_TYPE = { - 'model_id': 'string', - 'model_source': 'dict[string]', # 'string', # could be used as the "model_file" or "biomodel_id" below (SEDML l1V4 uses URIs); what if it was 'model_source': 'sbml:model_filepath' ? - 'model_language': { # could be used to load a different model language supported by COPASI/basico - '_type': 'string', - '_default': 'sbml' # perhaps concatenate this with 'model_source'.value? I.E: 'model_source': 'MODEL_LANGUAGE:MODEL_FILEPATH' <-- this would facilitate verifying correct model fp types. - }, - 'model_name': { - '_type': 'string', - '_default': 'composite_process_model' - }, - 'model_changes': { - 'species_changes': 'maybe[tree[string]]', # <-- this is done like set_species('B', kwarg=) where the inner most keys are the kwargs - 'global_parameter_changes': 'maybe[tree[string]]', # <-- this is done with set_parameters(PARAM, kwarg=). where the inner most keys are the kwargs - 'reaction_changes': 'maybe[tree[string]]' - }, - 'model_units': 'maybe[tree[string]]' - } - - def __init__(self, _type: Dict = MODEL_TYPE): + _MODEL_TYPE = MODEL_TYPE + def __init__(self, _type: Dict = _MODEL_TYPE): super().__init__(_type) - -MODEL_TYPE = { - 'model_id': 'string', - 'model_source': 'string', # 'tree[string]', - 'model_language': { - '_type': 'string', - '_default': 'sbml' - }, - 'model_name': { - '_type': 'string', - '_default': 'composite_process_model' - }, - 'model_changes': { - 'species_changes': 'maybe[tree[string]]', - 'global_parameter_changes': 'maybe[tree[string]]', - 'reaction_changes': 'maybe[tree[string]]' - }, - 'model_units': 'maybe[tree[string]]' - } diff --git a/biosimulator_processes/experiments/parameter_optimization.py b/biosimulator_processes/experiments/parameter_optimization.py new file mode 100644 index 000000000..e0e2a03a7 --- /dev/null +++ b/biosimulator_processes/experiments/parameter_optimization.py @@ -0,0 +1,32 @@ +import numpy as np +from scipy.integrate import solve_ivp +from scipy.optimize import minimize + +# Define the biological ODE +def biological_system(t, x, A, B, C): + # Example dynamics + dxdt = A * x[0] - B * x[1] * x[0] + C * np.cos(x[0]) + return [dxdt] + +# Define the cost function to be minimized +def cost_function(params): + A, B, C = params + initial_conditions = [1.0] # Initial state of the system + t_span = (0, 10) # Time span for the simulation + + # Solve the ODE + sol = solve_ivp(biological_system, t_span, initial_conditions, args=(A, B, C)) + + # Define the output D as the last value of the first state variable + D = sol.y[0, -1] + + return D # We want to minimize this value + +# Initial guess for parameters A, B, C +initial_guess = [0.5, 0.5, 0.5] + +# Perform the optimization +result = minimize(cost_function, initial_guess, method='BFGS') + +print("Optimal parameters:", result.x) +print("Minimum value of D:", result.fun) \ No newline at end of file diff --git a/biosimulator_processes/experiments/predict.py b/biosimulator_processes/experiments/predict.py new file mode 100644 index 000000000..8eacad796 --- /dev/null +++ b/biosimulator_processes/experiments/predict.py @@ -0,0 +1,82 @@ +import tensorflow as tf +from tensorflow.keras import layers, models +import numpy as np +import json + +# Example function to simulate data corruption in JSON structures +def introduce_noise(data, noise_level=0.1): + noisy_data = data.copy() + for key in list(data.keys()): + if np.random.rand() < noise_level: + if isinstance(data[key], dict): + noisy_data[key] = introduce_noise(data[key], noise_level) + else: + del noisy_data[key] # Simulating missing data + return noisy_data + +# Function to convert nested dictionaries to flat, vector-like structures +def flatten_dict(d, parent_key='', sep='_'): + items = [] + for k, v in d.items(): + new_key = parent_key + sep + k if parent_key else k + if isinstance(v, dict): + items.extend(flatten_dict(v, new_key, sep=sep).items()) + else: + items.append((new_key, v)) + return dict(items) + +# Creating the model +def build_autoencoder(input_dim): + input_layer = layers.Input(shape=(input_dim,)) + encoded = layers.Dense(128, activation='relu')(input_layer) + encoded = layers.Dense(64, activation='relu')(encoded) + decoded = layers.Dense(128, activation='relu')(encoded) + decoded = layers.Dense(input_dim, activation='sigmoid')(decoded) + + autoencoder = models.Model(input_layer, decoded) + encoder = models.Model(input_layer, encoded) + + autoencoder.compile(optimizer='adam', loss='binary_crossentropy') + return autoencoder, encoder + +# Sample data +data_structure = { + 'copasi': { + '_type': 'process', + 'address': 'local:!biosimulator_processes.processes.copasi_process.CopasiProcess', + 'config': { + 'model': { + 'model_source': 'biosimulator_processes/model_files/Caravagna2010.xml' + } + }, + 'inputs': { + 'floating_species': ['floating_species_store'], + 'model_parameters': ['model_parameters_store'], + 'time': ['time_store'], + 'reactions': ['reactions_store'] + }, + 'outputs': { + 'floating_species': ['floating_species_store'], + 'time': ['time_store'], + } + } +} + +# Introducing noise +noisy_data = introduce_noise(data_structure, noise_level=0.2) +flattened_clean_data = flatten_dict(data_structure) +flattened_noisy_data = flatten_dict(noisy_data) + +# Assume we have a way to create a numerical dataset from these (needs more specific implementation) +X_clean = np.array([list(flattened_clean_data.values())]) # placeholder +X_noisy = np.array([list(flattened_noisy_data.values())]) # placeholder + +# Model +input_dim = X_clean.shape[1] +autoencoder, encoder = build_autoencoder(input_dim) + +# Training (you would actually need many examples and iterations) +autoencoder.fit(X_noisy, X_clean, epochs=50) + +# Predicting and denoising +predicted_clean_data = autoencoder.predict(X_noisy) \ No newline at end of file diff --git a/biosimulator_processes/model_files/BIOMD0000000061_url.xml b/biosimulator_processes/model_files/sbml/BIOMD0000000061_url.xml similarity index 100% rename from biosimulator_processes/model_files/BIOMD0000000061_url.xml rename to biosimulator_processes/model_files/sbml/BIOMD0000000061_url.xml diff --git a/biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml b/biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml new file mode 100644 index 000000000..b8113e080 --- /dev/null +++ b/biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml @@ -0,0 +1,1541 @@ + + + + + +
Venkatraman2011 - PLS-UPA behaviour in the +presence of substrate competition
+
+

The posibility of ultrasensitivity and bistable activation of + PLS (Plasmin) and UPA (Urokinase-type plasminogen activator) in + the presence of substrate competition is explained here using a + mathematical model. 

+
+
+

This model is described in the article:

+ +
Venkatraman L, Li H, Dewey CF Jr, + White JK, Bhowmick SS, Yu H, Tucker-Kellogg L.
+
Biophys. J. 2011 Oct; 101(8): + 1825-1834
+

Abstract:

+
+

Plasmin (PLS) and urokinase-type plasminogen activator (UPA) + are ubiquitous proteases that regulate the extracellular + environment. Although they are secreted in inactive forms, they + can activate each other through proteolytic cleavage. This + mutual interplay creates the potential for complex dynamics, + which we investigated using mathematical modeling and in vitro + experiments. We constructed ordinary differential equations to + model the conversion of precursor plasminogen into active PLS, + and precursor urokinase (scUPA) into active urokinase (tcUPA). + Although neither PLS nor UPA exhibits allosteric cooperativity, + modeling showed that cooperativity occurred at the system level + because of substrate competition. Computational simulations and + bifurcation analysis predicted that the system would be + bistable over a range of parameters for cooperativity and + positive feedback. Cell-free experiments with recombinant + proteins tested key predictions of the model. PLS activation in + response to scUPA stimulus was found to be cooperative in + vitro. Finally, bistability was demonstrated in vitro by the + presence of two significantly different steady-state levels of + PLS activation for the same levels of stimulus. We conclude + that ultrasensitive, bistable activation of UPA-PLS is possible + in the presence of substrate competition. An ultrasensitive + threshold for activation of PLS and UPA would have + ramifications for normal and disease processes, including + angiogenesis, metastasis, wound healing, and fibrosis.

+
+
+
+

The cooperativity parameter "ci" was missing in the original + model. The parameter "ci" has been added to the added.

+
+
+

This model is hosted on + BioModels Database + and identified by: + BIOMD0000000630.

+

To cite BioModels Database, please use: + BioModels Database: + An enhanced, curated and annotated resource for published + quantitative kinetic models.

+
+
+

To the extent possible under law, all copyright and related or + neighbouring rights to this encoded model have been dedicated to + the public domain worldwide. Please refer to + CC0 + Public Domain Dedication for more information.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2017-02-02T14:43:21Z + + + + + + + fkurtoglu@gtu.edu.tr + + + Kurtoglu + Furkan + + + + + Gebze Technical University + + + + + + + LisaTK@nus.edu.sg + + + Tucker-Kellogg + Lisa + + + + + Institute of Bioengineering and +Nanotechnology + + + + + + + + + 2017-03-21T14:20:42Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tucker-Kellogg + Lisa + + LisaTK@nus.edu.sg + + Institute of Bioengineering and +Nanotechnology + + + + + Kurtoglu + Furkan + + fkurtoglu@gtu.edu.tr + + Gebze Technical University + + + + + + 2017-02-02T14:43:21Z + + + 2017-05-01T21:56:34Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2017-02-06T10:02:18Z + + + + + + + + + + v + + v + + + + + + + + + + + 2017-02-02T13:51:51Z + + + + + + + + + + parameter_13 + + + parameter_8 + + + species_2 + + + species_3 + + + + parameter_8 + + + species_2 + parameter_13 + + species_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + k1 + species_3 + species_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + + Function_for_reaction_2_0 + parameter_13 + parameter_8 + species_2 + species_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + k1 + species_4 + species_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_1 + species_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_2 + species_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_1 + species_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_1 + species_4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + + + + + k1 + species_2 + species_5 + + + + k2 + species_6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + k1 + species_6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_2 + species_5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + parameter_2 + species_6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + + Constant_flux__irreversible_0 + v + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + + Constant_flux__irreversible_0 + v + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_1 + + Constant_flux__irreversible_0 + v + + + + + + + + + +
+
\ No newline at end of file diff --git a/biosimulator_processes/model_files/Caravagna2010.xml b/biosimulator_processes/model_files/sbml/Caravagna2010.xml similarity index 100% rename from biosimulator_processes/model_files/Caravagna2010.xml rename to biosimulator_processes/model_files/sbml/Caravagna2010.xml diff --git a/biosimulator_processes/model_files/Reppas2015.xml b/biosimulator_processes/model_files/sbml/Reppas2015.xml similarity index 100% rename from biosimulator_processes/model_files/Reppas2015.xml rename to biosimulator_processes/model_files/sbml/Reppas2015.xml diff --git a/biosimulator_processes/model_files/e_coli_core.xml b/biosimulator_processes/model_files/sbml/e_coli_core.xml similarity index 100% rename from biosimulator_processes/model_files/e_coli_core.xml rename to biosimulator_processes/model_files/sbml/e_coli_core.xml diff --git a/biosimulator_processes/model_files/sbml/vilar-discrete-SSA.xml b/biosimulator_processes/model_files/sbml/vilar-discrete-SSA.xml new file mode 100644 index 000000000..9cf05c39f --- /dev/null +++ b/biosimulator_processes/model_files/sbml/vilar-discrete-SSA.xml @@ -0,0 +1,667 @@ + + + + +

Exported by VCell 7.3

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + common_delta_A + + + + + common_delta_A + + + + + + + 0.0033210775663254518 + KMOLE + + + + + + delta_R_R_decay + + + + + alphaA_A_trnscr + + + + + alphaA_prmbound_active_A_trnscr + + + + + alphaR_R_trnsc + + + + + alphaR_prmbound_active_R_trnsc + + + + + + + 0.0016605387831627259 + KMOLE + + + + + + + + 0.0016605387831627259 + KMOLE + + + + + + betaR_R_trnsl + + + + + betaA_A_trnsl + + + + + + + + + + + + + + + + + + + + C + Kf_C_decay + + + + Kr_C_decay + R + + + cell + + + + + + + + + + + + + + + A + Kf_A_decay + + cell + + + + + + + + + + + + + + + + + + Kf_mRNA_A_decay + mRNA_A_ + + cell + + + + + + + + + + + + + + + + + + Kf_mRNA_R_decay + mRNA_R + + cell + + + + + + + + + + + + + + + + + + + + + + + + + + C + Kr_AR_binding + + + + + + + A + Kf_AR_binding + + R + + + cell + + + + + + + + + + + + + + + Kf_R_decay + R + + cell + + + + + + + + + + + + + + + + + + + + + + + + Kf_A_trnscr + PrmA + + + + + + Kr_A_trnscr + PrmA + + mRNA_A_ + + + cell + + + + + + + + + + + + + + + + + + + + + Kf_active_A_trnscr + PrmA_bound + + + + + + Kr_active_A_trnscr + PrmA_bound + + mRNA_A_ + + + cell + + + + + + + + + + + + + + + + + + + + + Kf_R_trnsc + PrmR + + + + + + Kr_R_trnsc + PrmR + + mRNA_R + + + cell + + + + + + + + + + + + + + + + + + + + + Kf_active_R_trnsc + PrmR_bound + + + + + + Kr_active_R_trnsc + PrmR_bound + + mRNA_R + + + cell + + + + + + + + + + + + + + + + + + + + + + + A + Kf_PrmA_activation + + PrmA + + + + Kr_PrmA_activation + PrmA_bound + + + cell + + + + + + + + + + + + + + + + + + + + + + + A + Kf_PrmR_activation + + PrmR + + + + Kr_PrmR_activation + PrmR_bound + + + cell + + + + + + + + + + + + + + + + + + + + + Kf_R_trnsl + mRNA_R + + + + + + Kr_R_trnsl + R + + mRNA_R + + + cell + + + + + + + + + + + + + + + + + + + + + Kf_A_trnsl + mRNA_A_ + + + + + + A + Kr_A_trnsl + + mRNA_A_ + + + cell + + + + + + +
\ No newline at end of file diff --git a/biosimulator_processes/model_files/minE_model.txt b/biosimulator_processes/model_files/smoldyn/minE_model.txt similarity index 100% rename from biosimulator_processes/model_files/minE_model.txt rename to biosimulator_processes/model_files/smoldyn/minE_model.txt diff --git a/biosimulator_processes/processes/__pycache__/__init__.cpython-310-pytest-8.0.2.pyc b/biosimulator_processes/processes/__pycache__/__init__.cpython-310-pytest-8.0.2.pyc deleted file mode 100644 index 5188dfe20..000000000 Binary files a/biosimulator_processes/processes/__pycache__/__init__.cpython-310-pytest-8.0.2.pyc and /dev/null differ diff --git a/biosimulator_processes/processes/__pycache__/__init__.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/__init__.cpython-310.pyc index dbd2731b2..6f05b7705 100644 Binary files a/biosimulator_processes/processes/__pycache__/__init__.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/__init__.cpython-310.pyc differ diff --git a/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310-pytest-8.0.2.pyc b/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310-pytest-8.0.2.pyc deleted file mode 100644 index 42a8ad5cb..000000000 Binary files a/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310-pytest-8.0.2.pyc and /dev/null differ diff --git a/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310.pyc index e478936d5..3ac66b373 100644 Binary files a/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/cobra_process.cpython-310.pyc differ diff --git a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310-pytest-8.0.2.pyc b/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310-pytest-8.0.2.pyc deleted file mode 100644 index 69eaf2572..000000000 Binary files a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310-pytest-8.0.2.pyc and /dev/null differ diff --git a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc index 44e626092..8f7c0b348 100644 Binary files a/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/copasi_process.cpython-310.pyc differ diff --git a/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310-pytest-8.0.2.pyc b/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310-pytest-8.0.2.pyc deleted file mode 100644 index ac775a55c..000000000 Binary files a/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310-pytest-8.0.2.pyc and /dev/null differ diff --git a/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310.pyc index e1b23b564..481da0998 100644 Binary files a/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/smoldyn_process.cpython-310.pyc differ diff --git a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310-pytest-8.0.2.pyc b/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310-pytest-8.0.2.pyc deleted file mode 100644 index 994b4eeb5..000000000 Binary files a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310-pytest-8.0.2.pyc and /dev/null differ diff --git a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc b/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc index 3c95f6c64..9a8ebab18 100644 Binary files a/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc and b/biosimulator_processes/processes/__pycache__/tellurium_process.cpython-310.pyc differ diff --git a/biosimulator_processes/processes/amici_process.py b/biosimulator_processes/processes/amici_process.py new file mode 100644 index 000000000..aff388001 --- /dev/null +++ b/biosimulator_processes/processes/amici_process.py @@ -0,0 +1,193 @@ +import os +import logging +import libsbml +from amici import amici, SbmlImporter, import_model_module, Model +from amici.sbml_import import get_species_initial +from tempfile import mkdtemp +from process_bigraph import Process +from biosimulator_processes import CORE +from biosimulator_processes.data_model.sed_data_model import MODEL_TYPE + +class AmiciProcess(Process): + """ + Parameters: + config:`Dict`: dict keys include: + model: SED Model Spec. + species_context: Context by which to measure species outputs (defaults to concentrations). + model_output_dir: Dirpath in which to save the AMICI model output. + observables: for example: + observables = { + "observable_x1": {"name": "", "formula": "x1"}, + "observable_x2": {"name": "", "formula": "x2"}, + "observable_x3": {"name": "", "formula": "x3"}, + "observable_x1_scaled": {"name": "", "formula": "scaling_x1 * x1"}, + "observable_x2_offsetted": {"name": "", "formula": "offset_x2 + x2"}, + "observable_x1withsigma": {"name": "", "formula": "x1"}, + } + constant_parameters: for example: + constant_parameters = ["k0"] + sigmas: for example: + sigmas = {"observable_x1withsigma": "observable_x1withsigma_sigma"} + + + + """ + config_schema = { + # SED and ODE-specific types + 'model': MODEL_TYPE, + 'species_context': { + '_default': 'concentrations', + '_type': 'string' + }, + # AMICI-specific types + 'model_output_dir': { + '_default': mkdtemp(), + '_type': 'string' + }, + 'observables': 'maybe[tree[string]]', + 'constant_parameters': 'maybe[list[string]]', + 'sigmas': 'maybe[tree[string]]' + # TODO: add more amici-specific fields:: MODEL_TYPE should be enough to encompass this. + } + + def __init__(self, config=None, core=CORE): + super().__init__(config, core) + # TODO: Enable counts species_context + + # reference model source and assert filepath + model_fp = self.config['model'].get('model_source') + assert model_fp is not None and '/' in model_fp, 'You must pass a valid path to an SBML model file.' + model_config = self.config['model'] + + # get and compile libsbml model from fp + sbml_reader = libsbml.SBMLReader() + sbml_doc = sbml_reader.readSBML(model_fp) + self.sbml_model_object: libsbml.Model = sbml_doc.getModel() + + # get model args from config + model_id = self.config['model'].get('model_id', None) \ + or model_fp.split('/')[-1].replace('.', '_').split('_')[0] + + model_output_dir = self.config['model_output_dir'] + + # compile sbml to amici + sbml_importer = SbmlImporter(model_fp) + sbml_importer.sbml2amici( + model_name=model_id, + output_dir=model_output_dir, + verbose=logging.INFO, + observables=self.config.get('observables'), + constant_parameters=self.config.get('constant_parameters'), + sigmas=self.config.get('sigmas')) + model_module = import_model_module(model_id, model_output_dir) + self.amici_model_object: amici.Model = model_module.getModel() + + # set species context (concentrations for ODE by default) + context_type = self.config['species_context'] + self.species_context_key = f'floating_species_{context_type}' + self.use_counts = 'counts' in self.species_context_key + + # get species names + self.species_objects = self.sbml_model_object.getListOfSpecies() + self.floating_species_list = [s.getId() for s in self.species_objects] + self.floating_species_initial = [ + s.getInitialAmount() if self.use_counts else s.getInitialConcentration() + for s in self.species_objects] + + # get model parameters + self.model_parameter_objects = self.sbml_model_object.getListOfParameters() + self.model_parameters_list = [param.getName() for param in self.model_parameter_objects] + self.model_parameters_values = [param.getValue() for param in self.model_parameter_objects] + + # get reactions + self.reaction_objects = self.sbml_model_object.reactions + self.reaction_list = [reaction.getName() for reaction in self.reaction_objects] + + # get method + self.method = self.amici_model_object.getSolver() + + def initial_state(self): + floating_species_dict = dict( + zip(self.floating_species_list, self.floating_species_initial)) + + model_parameters_dict = dict( + zip(self.model_parameters_list, self.model_parameters_values)) + return { + 'time': 0.0, + 'floating_species_concentrations': floating_species_dict, + 'model_parameters': model_parameters_dict} + + def inputs(self): + # dependent on species context set in self.config + floating_species_type = { + species_id: { + '_type': 'float', + '_apply': 'set'} + for species_id in self.floating_species_list + } + + model_params_type = { + param_id: { + '_type': 'float', + '_apply': 'set'} + for param_id in self.model_parameters_list + } + + reactions_type = { + reaction_id: 'float' + for reaction_id in self.reaction_list + } + + return { + 'time': 'float', + self.species_context_key: floating_species_type, + 'model_parameters': model_params_type, + 'reactions': reactions_type} + + def outputs(self): + floating_species_type = { + species_id: { + '_type': 'float', + '_apply': 'set'} + for species_id in self.floating_species_list + } + return { + 'time': 'float', + self.species_context_key: floating_species_type} + + def update(self, inputs, interval): + # TODO: Complete this.` + for cat_id, value in inputs[self.species_context_key].items(): + print(f'Values for {cat_id} in AmiciProcess: {value}') + """COPIED FROM CopasiProcess: + + for cat_id, value in inputs[self.species_context_key].items(): + set_type = 'particle_number' if 'counts' in self.species_context_key else 'concentration' + species_config = { + 'name': cat_id, + 'model': self.copasi_model_object, + set_type: value} + set_species(**species_config) + + # run model for "interval" length; we only want the state at the end + timecourse = run_time_course( + start_time=inputs['time'], + duration=interval, + update_model=True, + model=self.copasi_model_object, + method=self.method) + + # extract end values of concentrations from the model and set them in results + results = {'time': interval} + for mol_id in self.floating_species_list: + raw_mol_data = get_species( + name=mol_id, + exact=True, + model=self.copasi_model_object) + + mol_data = raw_mol_data.particle_number[0] if self.use_counts else raw_mol_data.concentration[0] + results[self.species_context_key] = { + mol_id: float(mol_data) + } + """ + return {} diff --git a/biosimulator_processes/processes/comparator_process.py b/biosimulator_processes/processes/comparator_process.py new file mode 100644 index 000000000..0c8b4d39b --- /dev/null +++ b/biosimulator_processes/processes/comparator_process.py @@ -0,0 +1,123 @@ +from typing import * + +import numpy as np +from process_bigraph import Process + +from biosimulator_processes.data_model.compare_data_model import ComparisonResults, SimulatorResult, IntervalResult + + +def mean_squared_error(true_values: np.ndarray, predicted_values: np.ndarray): + return np.mean((predicted_values - true_values) ** 2) + + +class ODEComparator(Process): + """Process that serves to perform a comparison of ODE-enabled simulator output, particularly + simulators that are equipped to use CVODE. Such simulators include: COPASI, Tellurium, and AMICI. + """ + config_schema = { + 'sbml_model_file': 'string', + 'duration': 'number', + 'num_steps': 'number', + 'simulators': 'list[string]', + 'framework_type': { # TODO: handle this with assertion + '_default': 'deterministic', + '_type': 'string' + }, + 'target_parameter': 'maybe[tree[union[string, float]]]', # derived from experimental data for fitness calculation + 'target_dataset': 'maybe[tree[string, tree[union[string, float]]]]' # TODO: are experimental datasets which match the ports available? + } + + def __init__(self, config=None, core=None): + """ + Parameters: + config:`Dict`: required keys include: sbml_model_file(`str`), duration(`int`), + num_steps(`int`), simulators(`List[str]`). Optional keys include framework_type(`str`), + target_parameter(`Dict`), target_dataset(`Dict`). + """ + super().__init__(config, core) + self.species_context_key = 'floating_species_concentrations' + self.simulator_instances = self._set_simulator_instances() + self.floating_species_ids = {} + self.model_parameter_ids = {} + self.reactions = {} + + # if assuming that the simulators will have the same attributes to call. TODO: ensure this happens + for simulator_name, simulator_instance in self.simulator_instances.items(): + self.floating_species_ids[simulator_name] = simulator_instance.floating_species_list # TODO: ensure that Tellurium has a floating_species_list + self.model_parameter_ids[simulator_name] = simulator_instance.model_parameters_list + self.reactions[simulator_name] = simulator_instance.reaction_list + + + def _set_simulator_instances(self) -> Dict: + simulator_instances = {} + for simulator in self.config['simulators']: + module_name = simulator + '_process' + class_name = simulator.replace(simulator[0], simulator[0].upper()) + 'Process' + import_statement = f'biosimulator_processes.processes.{module_name}' + simulator_module = __import__(import_statement, fromlist=[class_name]) + simulator_instance = getattr(simulator_module, class_name) + simulator_instances[simulator] = simulator_instance(config={ + 'model': { + 'model_source': self.config['sbml_model_file']} + }) + return simulator_instances + + def initial_state(self): + # TODO: get these values from constructor + return { + simulator_name: simulator_process.initial_state() + for simulator_name, simulator_process in self.simulator_instances.items()} + + def inputs(self): + # TODO: will each ode simulator have all of the same names/vals for this? + input_schema = { + simulator_name: { + 'time': 'float', + self.species_context_key: 'tree[any]', # floating_species_type, + 'model_parameters': 'tree[any]', # model_params_type, + 'reactions': 'tree[any]' # reactions_type + } + for simulator_name, simulator_process in self.simulator_instances.items()} + + if self.config.get('target_parameter'): + for sim in self.simulator_instances.keys(): + input_schema[sim]['validation_score'] = { + '_type': 'float', + '_apply': 'set'} + + return input_schema + + def outputs(self): + output_schema = { + simulator_name: { + 'time': 'float', + self.species_context_key: 'tree[any]' # floating_species_type + } for simulator_name in self.simulator_instances.keys()} + + if self.config.get('target_parameter'): + for sim in self.simulator_instances.keys(): + output_schema[sim]['validation_score'] = { + '_type': 'float', + '_apply': 'set'} + + return output_schema + + def update(self, state, interval): + # TODO: instantiate parallel subprocesses for the simulation run + # TODO: somehow integrate num_steps into interval here + results = { + simulator_name: simulator_process.update(state, interval) + for simulator_name, simulator_process in self.simulator_instances.items()} + + # TODO: creating mapping of species names to value for MSE and iterate over below: + + if self.config.get('target_parameter'): + target_param: dict = self.config['target_parameter'] + for simulator in self.simulator_instances.keys(): + simulator_values = results[simulator][self.species_context_key] + simulator_result_value = simulator_values.get(target_param['name']) + # TODO: implement MSE + diff = mean_squared_error(target_param['value'], simulator_result_value) + results[simulator]['validation_score'] = diff # TODO: make this more fine-grained with MSE + + return results diff --git a/biosimulator_processes/processes/copasi_process.py b/biosimulator_processes/processes/copasi_process.py index 123aebd8e..752d74d61 100644 --- a/biosimulator_processes/processes/copasi_process.py +++ b/biosimulator_processes/processes/copasi_process.py @@ -1,14 +1,5 @@ -""" - - * `deterministic` / `lsoda`: the LSODA implementation - | * `stochastic`: the Gibson & Bruck Gillespie implementation - | * `directMethod`: Gillespie Direct Method - | * others: `hybrid`, `hybridode45`, `hybridlsoda`, `adaptivesa`, `tauleap`, `radau5`, `sde` - -""" - - from typing import Dict, Union, Optional +import json from pandas import DataFrame from basico import ( load_model, @@ -25,10 +16,11 @@ set_parameters, add_parameter ) -from process_bigraph import Process, Composite, pf +from process_bigraph import Process from biosimulator_processes.utils import fetch_biomodel from biosimulator_processes import CORE -from biosimulator_processes.data_model import MODEL_TYPE +from biosimulator_processes.data_model.sed_data_model import MODEL_TYPE +from datetime import datetime class CopasiProcess(Process): @@ -49,19 +41,28 @@ class CopasiProcess(Process): strings that define the parameter "type" according to bigraph-schema. - A dictionary which defines the same kwargs/values as the high-level objects. See `biosimulator_processes.data_model.MODEL_TYPE` for details. + + Config: + model: see datamodel for more details. + species_context: the context by which you measure the species data:: one of: 'concentrations', 'counts'. # TODO: map these to method inference + method: basico timecourse setting. Defaults to 'lsoda'. """ config_schema = { 'model': MODEL_TYPE, + 'species_context': { + '_type': 'string', + '_default': 'concentrations' + }, 'method': { '_type': 'string', - '_default': 'lsoda' + '_default': 'deterministic' # <-- CVODE for consistency, or should we use LSODA? } } def __init__(self, config: Dict[str, Union[str, Dict[str, str], Dict[str, Optional[Dict[str, str]]], Optional[Dict[str, str]]]] = None, - core: Dict = None): + core: Dict = CORE): super().__init__(config, core) # insert copasi process model config @@ -73,86 +74,50 @@ def __init__(self, # Option A: if '/' in model_source: self.copasi_model_object = load_model(model_source) + print('found a filepath') # Option B: elif 'BIO' in model_source: self.copasi_model_object = fetch_biomodel(model_id=model_source) + print('found a biomodel id') # Option C: else: if not self.model_changes: - raise AttributeError("You must pass a source of model changes specifying params, reactions, species or all three if starting from an empty model.") + raise AttributeError( + """You must pass a source of model changes specifying params, reactions, + species or all three if starting from an empty model.""") model_units = self.config['model'].get('model_units', {}) self.copasi_model_object = new_model( name='CopasiProcess TimeCourseModel', **model_units) - # ----REACTIONS: set reactions - existing_reaction_names = get_reactions(model=self.copasi_model_object).index - reaction_changes = self.model_changes.get('reaction_changes', []) - if reaction_changes: - for reaction_change in reaction_changes: - reaction_name: str = reaction_change['reaction_name'] - param_changes: list[dict[str, float]] = reaction_change['parameter_changes'] - scheme_change: str = reaction_change.get('reaction_scheme') - - # handle changes to existing reactions - if param_changes: - for param_name, param_change_val in param_changes: - set_reaction_parameters(param_name, value=param_change_val, model=self.copasi_model_object) - if scheme_change: - set_reaction(name=reaction_name, scheme=scheme_change, model=self.copasi_model_object) - # handle new reactions - if reaction_name not in existing_reaction_names and scheme_change: - add_reaction(reaction_name, scheme_change, model=self.copasi_model_object) + # handle context of species output + context_type = self.config['species_context'] + self.species_context_key = f'floating_species_{context_type}' + self.use_counts = 'concentrations' in context_type # Get a list of reactions - self.reaction_list = get_reactions(model=self.copasi_model_object).index.tolist() - if not self.reaction_list: - raise AttributeError('No reactions could be parsed from this model. Your model must contain reactions to run.') - - # ----SPECS: set species changes - species_changes = self.model_changes.get('species_changes', []) - if species_changes: - for species_change in species_changes: - if isinstance(species_change, dict): - species_name = species_change.pop('name') - changes_to_apply = {} - for spec_param_type, spec_param_value in species_change.items(): - if spec_param_value: - changes_to_apply[spec_param_type] = spec_param_value - set_species(**changes_to_apply, model=self.copasi_model_object) + self._set_reaction_changes() + reactions = get_reactions(model=self.copasi_model_object) + self.reaction_list = reactions.index.tolist() if reactions is not None else [] + # if not self.reaction_list: + # raise AttributeError('No reactions could be parsed from this model. Your model must contain reactions to run.') # Get the species (floating only) TODO: add boundary species - self.floating_species_list = get_species(model=self.copasi_model_object).index.tolist() - self.floating_species_initial = get_species(model=self.copasi_model_object)['concentration'].tolist() - - # ----GLOBAL PARAMS: set global parameter changes - global_parameter_changes = self.model_changes.get('global_parameter_changes', []) - if global_parameter_changes: - for param_change in global_parameter_changes: - param_name = param_change.pop('name') - for param_type, param_value in param_change.items(): - if not param_value: - param_change.pop(param_type) - # handle changes to existing params - set_parameters(name=param_name, **param_change, model=self.copasi_model_object) - # set new params - global_params = get_parameters(model=self.copasi_model_object) - if global_params: - existing_global_parameters = global_params.index - if param_name not in existing_global_parameters: - assert param_change.get('initial_concentration') is not None, "You must pass an initial_concentration value if adding a new global parameter." - add_parameter(name=param_name, **param_change, model=self.copasi_model_object) + self._set_species_changes() + species_data = get_species(model=self.copasi_model_object) + self.floating_species_list = species_data.index.tolist() + self.floating_species_initial = species_data.particle_number.tolist() \ + if self.use_counts else species_data.concentration.tolist() # Get the list of parameters and their values (it is possible to run a model without any parameters) + self._set_global_param_changes() model_parameters = get_parameters(model=self.copasi_model_object) - if isinstance(model_parameters, DataFrame): - self.model_parameters_list = model_parameters.index.tolist() - self.model_parameter_values = model_parameters['initial_value'].tolist() - else: - self.model_parameters_list = [] - self.model_parameter_values = [] + self.model_parameters_list = model_parameters.index.tolist() \ + if isinstance(model_parameters, DataFrame) else [] + self.model_parameters_values = model_parameters.initial_value.tolist() \ + if isinstance(model_parameters, DataFrame) else [] # Get a list of compartments self.compartments_list = get_compartments(model=self.copasi_model_object).index.tolist() @@ -161,61 +126,66 @@ def __init__(self, self.method = self.config['method'] def initial_state(self): + # keep in mind that a valid simulation may not have global parameters + model_parameters_dict = dict( + zip(self.model_parameters_list, self.model_parameters_values)) + floating_species_dict = dict( zip(self.floating_species_list, self.floating_species_initial)) - # keep in mind that a valid simulation may not have global parameters - if self.model_parameters_list: - model_parameters_dict = dict( - zip(self.model_parameters_list, self.model_parameter_values)) - else: - model_parameters_dict = {} + return { 'time': 0.0, - 'floating_species': floating_species_dict, - 'model_parameters': model_parameters_dict + 'model_parameters': model_parameters_dict, + self.species_context_key: floating_species_dict, } def inputs(self): + # dependent on species context set in self.config floating_species_type = { species_id: { '_type': 'float', - '_apply': 'set', - } for species_id in self.floating_species_list + '_apply': 'set'} + for species_id in self.floating_species_list + } + + model_params_type = { + param_id: { + '_type': 'float', + '_apply': 'set'} + for param_id in self.model_parameters_list + } + + reactions_type = { + reaction_id: 'float' + for reaction_id in self.reaction_list } - if self.model_parameters_list: - model_params_type = { - param_id: 'float' for param_id in self.model_parameters_list - } - else: - model_params_type = {} return { 'time': 'float', - 'floating_species': floating_species_type, + self.species_context_key: floating_species_type, 'model_parameters': model_params_type, - 'reactions': { - reaction_id: 'float' for reaction_id in self.reaction_list}, - } + 'reactions': reactions_type} def outputs(self): floating_species_type = { species_id: { '_type': 'float', - '_apply': 'set', - } for species_id in self.floating_species_list + '_apply': 'set'} + for species_id in self.floating_species_list } return { 'time': 'float', - 'floating_species': floating_species_type - } + self.species_context_key: floating_species_type} def update(self, inputs, interval): - # set copasi values according to what is passed in states - for cat_id, value in inputs['floating_species'].items(): - set_species( - name=cat_id, - initial_concentration=value, - model=self.copasi_model_object) + # set copasi values according to what is passed in states for concentrations + for cat_id, value in inputs[self.species_context_key].items(): + set_type = 'particle_number' if 'counts' in self.species_context_key else 'concentration' + species_config = { + 'name': cat_id, + 'model': self.copasi_model_object, + set_type: value} + set_species(**species_config) # run model for "interval" length; we only want the state at the end timecourse = run_time_course( @@ -227,74 +197,77 @@ def update(self, inputs, interval): # extract end values of concentrations from the model and set them in results results = {'time': interval} - results['floating_species'] = { - mol_id: float(get_species( - name=mol_id, - exact=True, - model=self.copasi_model_object - ).concentration[0]) - for mol_id in self.floating_species_list - } + if self.use_counts: + results[self.species_context_key] = { + mol_id: float(get_species( + name=mol_id, + exact=True, + model=self.copasi_model_object + ).particle_number[0]) + for mol_id in self.floating_species_list} + else: + results[self.species_context_key] = { + mol_id: float(get_species( + name=mol_id, + exact=True, + model=self.copasi_model_object + ).concentration[0]) + for mol_id in self.floating_species_list} + + with open(f'/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/composer-notebooks/out/{str(datetime.today())}.json', 'w') as fp: + print('writing out fp!') + json.dump(results, fp, indent=4) + return results + def _set_reaction_changes(self): + # ----REACTIONS: set reactions + existing_reactions = get_reactions(model=self.copasi_model_object) + existing_reaction_names = existing_reactions.index.tolist() if existing_reactions is not None else [] + reaction_changes = self.model_changes.get('reaction_changes', []) + if reaction_changes: + for reaction_change in reaction_changes: + reaction_name: str = reaction_change['reaction_name'] + param_changes: list[dict[str, float]] = reaction_change['parameter_changes'] + scheme_change: str = reaction_change.get('reaction_scheme') + # handle changes to existing reactions + if param_changes: + for param_name, param_change_val in param_changes: + set_reaction_parameters(param_name, value=param_change_val, model=self.copasi_model_object) + if scheme_change: + set_reaction(name=reaction_name, scheme=scheme_change, model=self.copasi_model_object) + # handle new reactions + if reaction_name not in existing_reaction_names and scheme_change: + add_reaction(reaction_name, scheme_change, model=self.copasi_model_object) -def test_process_from_document(): - import json - # ensure that the process is registered - CORE.process_registry.register('biosimulator_processes.processes.copasi_process.CopasiProcess', CopasiProcess) - - # read the document from local file: - five_process_fp = 'notebooks/out/five_process_composite.json' - with open(five_process_fp, 'r') as fp: - instance = json.load(fp) - - workflow = Composite(config={ - 'state': instance - }) - - -def test_process(): - CORE.process_registry.register('biosimulator_processes.processes.copasi_process.CopasiProcess', CopasiProcess) - instance = { - 'copasi': { - '_type': 'process', - 'address': 'local:!biosimulator_processes.processes.copasi_process.CopasiProcess', - 'config': { - 'model': { - 'model_source': { - 'value': 'biosimulator_processes/model_files/Caravagna2010.xml'} - } - }, - 'inputs': { - 'floating_species': ['floating_species_store'], - 'model_parameters': ['model_parameters_store'], - 'time': ['time_store'], - 'reactions': ['reactions_store'] - }, - 'outputs': { - 'floating_species': ['floating_species_store'], - 'time': ['time_store'], - } - }, - 'emitter': { - '_type': 'step', - 'address': 'local:ram-emitter', - 'config': { - 'emit': { - 'floating_species': 'tree[float]', - 'time': 'float', - }, - }, - 'inputs': { - 'floating_species': ['floating_species_store'], - 'time': ['time_store'], - } - } - } + def _set_species_changes(self): + # ----SPECS: set species changes + species_changes = self.model_changes.get('species_changes', []) + if species_changes: + for species_change in åspecies_changes: + if isinstance(species_change, dict): + species_name = species_change.pop('name') + changes_to_apply = {} + for spec_param_type, spec_param_value in species_change.items(): + if spec_param_value: + changes_to_apply[spec_param_type] = spec_param_value + set_species(**changes_to_apply, model=self.copasi_model_object) - workflow = Composite(config={ - 'state': instance # initial_sim_state - }) - workflow.run(10) - results = workflow.gather_results() - print(f'RESULTS: {pf(results)}') + def _set_global_param_changes(self): + # ----GLOBAL PARAMS: set global parameter changes + global_parameter_changes = self.model_changes.get('global_parameter_changes', []) + if global_parameter_changes: + for param_change in global_parameter_changes: + param_name = param_change.pop('name') + for param_type, param_value in param_change.items(): + if not param_value: + param_change.pop(param_type) + # handle changes to existing params + set_parameters(name=param_name, **param_change, model=self.copasi_model_object) + # set new params + global_params = get_parameters(model=self.copasi_model_object) + if global_params: + existing_global_parameters = global_params.index + if param_name not in existing_global_parameters: + assert param_change.get('initial_concentration') is not None, "You must pass an initial_concentration value if adding a new global parameter." + add_parameter(name=param_name, **param_change, model=self.copasi_model_object) diff --git a/biosimulator_processes/processes/qiskit_process.py b/biosimulator_processes/processes/qiskit_process.py new file mode 100644 index 000000000..b5500ba32 --- /dev/null +++ b/biosimulator_processes/processes/qiskit_process.py @@ -0,0 +1,257 @@ +from math import pi +from typing import * + +import numpy as np +import rustworkx as rx +import networkx as nx +from qiskit_nature.second_q.hamiltonians.lattices import ( + BoundaryCondition, + HyperCubicLattice, + Lattice, + LatticeDrawStyle, + LineLattice, + SquareLattice, + TriangularLattice, +) +from qiskit_nature.second_q.hamiltonians import FermiHubbardModel +from qiskit_nature.second_q.problems import LatticeModelProblem +from qiskit_algorithms import NumPyMinimumEigensolver +from qiskit_nature.second_q.algorithms import GroundStateEigensolver +from qiskit_nature.second_q.mappers import JordanWignerMapper +from qiskit.quantum_info import Pauli, SparsePauliOp +from qiskit.primitives import Sampler +from qiskit.quantum_info import Pauli +from qiskit.result import QuasiDistribution +from qiskit_algorithms import QAOA +from qiskit_algorithms.optimizers import COBYLA +from qiskit_algorithms.utils import algorithm_globals + +from process_bigraph import Composite, Process +# TODO: import more qiskit nature for sbml processes here +from biosimulator_processes import CORE + + +class QiskitProcess(Process): + config_schema = { + 'num_qbits': 'int', + 'duration': 'int' + } + + def __init__(self, config=None, core=CORE): + super().__init__(config, core) + + def initial_state(self): + return {} + + def inputs(self): + return {} + + def outputs(self): + return {} + + def update(self, state, interval): + return {} + + +class QAOAProcess(QiskitProcess): + config_schema = { + 'bigraph_instance': 'tree[any]'} + + def __init__(self, config=None, core=CORE): + # TODO: Finish this based on https://qiskit-community.github.io/qiskit-algorithms/tutorials/05_qaoa.html + super().__init__(config, core) + self.num_nodes = len(list(self.config['bigraph_instance'].keys())) + + # TODO: Enable dynamic setting of these weights with np.stack + weights = [] + for i, n in enumerate(list(range(self.num_nodes))): + adj = [0.0, 1.0, 1.0, 0.0] # TODO: Finish this below + weights.append(adj) + + # self.w = np.stack(weights) + self.w = np.array([ + [0.0, 1.0, 1.0, 0.0], + [1.0, 0.0, 1.0, 1.0], + [1.0, 1.0, 0.0, 1.0], + [0.0, 1.0, 1.0, 0.0]]) + + self.G = nx.from_numpy_array(self.w) + self.sampler = Sampler() + + print('Drawing graph: ') + self._draw_graph() + + def initial_state(self): + return {} + + def inputs(self): + return {'weights': 'list[float]', 'objective_result': 'int'} + + def outputs(self): + return {'weights': 'list[float]', 'objective_result': 'int'} + + def update(self, state, interval): + qubit_op, offset = self._get_operator(self.w) + algorithm_globals.random_seed = 10598 + + optimizer = COBYLA() + qaoa = QAOA(self.sampler, optimizer, reps=2) + + result = qaoa.compute_minimum_eigenvalue(qubit_op) + + x = self._sample_most_likely(result.eigenstate) + objective_result = self._objective_value(x, self.w) + # TODO: somehow update the weights assigned to self.w here. + return {'weights': self.w, 'objective_result': objective_result} + + @classmethod + def _sample_most_likely(cls, state_vector): + """Compute the most likely binary string from state vector. + Args: + state_vector: State vector or quasi-distribution. + + Returns: + Binary string as an array of ints. + """ + if isinstance(state_vector, QuasiDistribution): + values = list(state_vector.values()) + else: + values = state_vector + n = int(np.log2(len(values))) + k = np.argmax(np.abs(values)) + x = cls._bitfield(k, n) + x.reverse() + return np.asarray(x) + + @classmethod + def _objective_value(cls, x, w): + """Compute the value of a cut. + Args: + x: Binary string as numpy array. + w: Adjacency matrix. + Returns: + Value of the cut. + """ + X = np.outer(x, (1 - x)) + w_01 = np.where(w != 0, 1, 0) + return np.sum(w_01 * X) + + @classmethod + def _bitfield(cls, n, L): + result = np.binary_repr(n, L) + return [int(digit) for digit in result] + + @classmethod + def _get_operator(cls, weight_matrix) -> Tuple[SparsePauliOp, int]: + r"""Generate Hamiltonian for the graph partitioning + Notes: + Goals: + 1 Separate the vertices into two set of the same size. + 2 Make sure the number of edges between the two set is minimized. + Hamiltonian: + H = H_A + H_B + H_A = sum\_{(i,j)\in E}{(1-ZiZj)/2} + H_B = (sum_{i}{Zi})^2 = sum_{i}{Zi^2}+sum_{i!=j}{ZiZj} + H_A is for achieving goal 2 and H_B is for achieving goal 1. + Args: + weight_matrix: Adjacency matrix. + Returns: + Operator for the Hamiltonian + A constant shift for the obj function. + """ + num_nodes = len(weight_matrix) + pauli_list = [] + coeffs = [] + shift = 0 + + for i in range(num_nodes): + for j in range(i): + if weight_matrix[i, j] != 0: + x_p = np.zeros(num_nodes, dtype=bool) + z_p = np.zeros(num_nodes, dtype=bool) + z_p[i] = True + z_p[j] = True + pauli_list.append(Pauli((z_p, x_p))) + coeffs.append(-0.5) + shift += 0.5 + + for i in range(num_nodes): + for j in range(num_nodes): + if i != j: + x_p = np.zeros(num_nodes, dtype=bool) + z_p = np.zeros(num_nodes, dtype=bool) + z_p[i] = True + z_p[j] = True + pauli_list.append(Pauli((z_p, x_p))) + coeffs.append(1.0) + else: + shift += 1 + + return SparsePauliOp(pauli_list, coeffs=coeffs), shift + + def _draw_graph(self): + layout = nx.random_layout(self.G, seed=10) + colors = ["r", "g", "b", "y"] + nx.draw(self.G, layout, node_color=colors) + labels = nx.get_edge_attributes(self.G, "weight") + return nx.draw_networkx_edge_labels(self.G, pos=layout, edge_labels=labels) + + +class QuantumAutoencoderProcess(QiskitProcess): + config_schema = { + 'num_qbits': 'int', + 'duration': 'int', + 'global_random_seed': { + '_default': 42, + '_type': 'string' + }} + + def __init__(self, config=None, core=CORE): + super().__init__(config, core) + """ + TODO: See https://qiskit-community.github.io/qiskit-machine-learning/tutorials/12_quantum_autoencoder.html + """ + + +class LatticeGroundStateSolverProcess(QiskitProcess): + config_schema = { + 'num_nodes': 'int', + 'interaction_parameters': { + '_type': 'tree[float]', + '_default': {'t': -1.0, 'u': 5.0}}, + 'onsite_potential': { # <--alias for v + '_default': 0.0, + '_type': 'float'}} + + def __init__(self, config=None, core=CORE): + super().__init__(config, core) + + num_nodes = self.config['num_nodes'] + boundary_condition = BoundaryCondition.OPEN + line_lattice = LineLattice(num_nodes=num_nodes, boundary_condition=boundary_condition) + interaction_parameters = self.config['interaction_parameters'] + t = interaction_parameters['t'] + u = interaction_parameters['u'] + v = self.config['onsite_potential'] + lattice = line_lattice.uniform_parameters(uniform_interaction=t, uniform_onsite_potential=v) + fhm = FermiHubbardModel(lattice=lattice, onsite_interaction=u) + self.lmp = LatticeModelProblem(fhm) + + def initial_state(self): + return {} + + def inputs(self): + """TODO: Take in instances of bigraphs and convert and then fit them into the Fermi Hubbard Model.""" + return {} + + def outputs(self): + return {'ground_state': 'float'} + + def update(self, state, interval): + numpy_solver = NumPyMinimumEigensolver() + qubit_mapper = JordanWignerMapper() + calc = GroundStateEigensolver(qubit_mapper, numpy_solver) + res = calc.solve(self.lmp) + print(res) + # TODO: somehow be able to create a new instance from this ground state. + return {'ground_state': res} diff --git a/biosimulator_processes/processes/smoldyn_process.py b/biosimulator_processes/processes/smoldyn_process.py index 2b425533a..5ed33fe51 100644 --- a/biosimulator_processes/processes/smoldyn_process.py +++ b/biosimulator_processes/processes/smoldyn_process.py @@ -94,7 +94,10 @@ class SmoldynProcess(Process): # TODO: Add the ability to pass model parameters and not just a model file. config_schema = { 'model_filepath': 'string', - 'animate': 'bool', + 'animate': { + '_type': 'boolean', + '_default': False + } } def __init__(self, config: Dict[str, Any] = None, core=None): diff --git a/biosimulator_processes/processes/tellurium_process.py b/biosimulator_processes/processes/tellurium_process.py index 0de872a36..cbeb48ce4 100644 --- a/biosimulator_processes/processes/tellurium_process.py +++ b/biosimulator_processes/processes/tellurium_process.py @@ -7,6 +7,7 @@ import tellurium as te from process_bigraph import Process, Composite, pf, Step from biosimulator_processes import CORE +from biosimulator_processes.data_model.sed_data_model import MODEL_TYPE class TelluriumStep(Step): @@ -84,37 +85,45 @@ def update(self, inputs): class TelluriumProcess(Process): config_schema = { - 'sbml_model_path': 'string', - 'antimony_string': 'string', - 'record_history': 'bool', # TODO -- do we have this type? + 'record_history': 'maybe[boolean]', # TODO -- do we have this type? + 'model': 'sed_model', + 'method': { + '_default': 'cvode', + '_type': 'string' + }, + 'species_context': { + '_default': 'concentrations', + '_type': 'string' + } } def __init__(self, config=None, core=None): super().__init__(config, core) - # initialize a tellurium(roadrunner) simulation object. Load the model in using either sbml(default) or antimony - if self.config.get('antimony_string') and not self.config.get('sbml_model_path'): - self.simulator = te.loada(self.config['antimony_string']) - elif self.config.get('sbml_model_path') and not self.config.get('antimony_string'): - self.simulator: te.roadrunner.extended_roadrunner.ExtendedRoadRunner = te.loadSBMLModel(self.config['sbml_model_path']) + model_source = self.config['model']['model_source'] + if '/' in model_source: + self.simulator = te.loadSBMLModel(model_source) else: - raise Exception('the config requires either an "antimony_string" or an "sbml_model_path"') + if 'model' in model_source: # TODO: find a better way to do this + self.simulator = te.loada(model_source) + else: + raise Exception('the config requires either an "antimony_string" or an "sbml_model_path"') + + # handle context type (concentrations for deterministic by default) + context_type = self.config['species_context'] + self.species_context_key = f'floating_species_{context_type}' + self.use_counts = 'concentrations' in context_type # TODO -- make this configurable. self.input_ports = [ - 'floating_species', + self.species_context_key, 'boundary_species', 'model_parameters' - 'time', - # 'compartments', - # 'parameters', - # 'stoichiometries', - ] + 'time'] self.output_ports = [ - 'floating_species', - 'time', - ] + self.species_context_key, + 'time'] # Get the species (floating and boundary) self.floating_species_list = self.simulator.getFloatingSpeciesIds() @@ -135,8 +144,8 @@ def initial_state(self, config=None): model_parameters_dict = dict(zip(self.model_parameters_list, self.model_parameter_values)) return { 'time': 0.0, - 'floating_species': floating_species_dict, - 'boundary_species': boundary_species_dict, + self.species_context_key: floating_species_dict, + # 'boundary_species': boundary_species_dict, 'model_parameters': model_parameters_dict } @@ -144,11 +153,11 @@ def inputs(self): float_set = {'_type': 'float', '_apply': 'set'} return { 'time': 'float', - 'run_time': 'float', - 'floating_species': { + # 'run_time': 'float', + self.species_context_key: { species_id: float_set for species_id in self.floating_species_list}, - 'boundary_species': { - species_id: float_set for species_id in self.boundary_species_list}, + # 'boundary_species': { + # species_id: float_set for species_id in self.boundary_species_list}, 'model_parameters': { param_id: float_set for param_id in self.model_parameters_list}, 'reactions': { @@ -158,7 +167,7 @@ def inputs(self): def outputs(self): float_set = {'_type': 'float', '_apply': 'set'} return { - 'floating_species': { + self.species_context_key: { species_id: float_set for species_id in self.floating_species_list}, 'time': 'float' } @@ -171,16 +180,26 @@ def update(self, inputs, interval): for cat_id, value in values.items(): self.simulator.setValue(cat_id, value) + for cat_id, value in inputs[self.species_context_key].items(): + self.simulator.setValue(cat_id, value) + # run the simulation new_time = self.simulator.oneStep(inputs['time'], interval) # extract the results and convert to update - update = {'time': new_time} - for port_id, values in inputs.items(): + update = { + 'time': interval, # new_time, + self.species_context_key: { + mol_id: float(self.simulator.getValue(mol_id)) + for mol_id in self.floating_species_list + } + } + + """for port_id, values in inputs.items(): if port_id in self.output_ports: update[port_id] = {} for cat_id in values.keys(): - update[port_id][cat_id] = self.simulator.getValue(cat_id) + update[port_id][cat_id] = self.simulator.getValue(cat_id)""" return update diff --git a/biosimulator_processes/steps/__pycache__/__init__.cpython-310.pyc b/biosimulator_processes/steps/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index cf706e992..000000000 Binary files a/biosimulator_processes/steps/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/biosimulator_processes/steps/__pycache__/parameter_scan.cpython-310.pyc b/biosimulator_processes/steps/__pycache__/parameter_scan.cpython-310.pyc deleted file mode 100644 index 64f855068..000000000 Binary files a/biosimulator_processes/steps/__pycache__/parameter_scan.cpython-310.pyc and /dev/null differ diff --git a/biosimulator_processes/steps/get_sbml.py b/biosimulator_processes/steps/get_sbml.py new file mode 100644 index 000000000..193706101 --- /dev/null +++ b/biosimulator_processes/steps/get_sbml.py @@ -0,0 +1,9 @@ +from tempfile import mkdtemp +import os +import requests + +from process_bigraph import Step, pp + + +class GetSbml(Step): + pass diff --git a/biosimulator_processes/steps/viz.py b/biosimulator_processes/steps/viz.py index bcac72b1a..533f835f9 100644 --- a/biosimulator_processes/steps/viz.py +++ b/biosimulator_processes/steps/viz.py @@ -1,9 +1,31 @@ -from typing import Tuple, Callable +from typing import Tuple, Callable, Union, List, Dict from dataclasses import dataclass import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation -from process_bigraph.composite import Step +from process_bigraph.composite import Step, Composite, RAMEmitter + + +def parse_composition_results(composition: Composite) -> Dict[float, Dict[str, Union[Dict, int, float]]]: + """Return a dictionary in which the outer keys are each member of the timescale, which is parsed + from the `process_bigraph.Composite.state['global_time']`. Each outer key's children represent the + data returned from the emitter for ports at each time step. + + Args: + composition:`process_bigraph.Composite`: Composite instance from which data is being retrieved. + + Returns: + `Dict[float, Dict[str, Union[Dict, int, float]]]` + A dictionary of keys: result_values. + """ + results = composition.gather_results() + result_vals = list(results.values())[0] + timescale = [ + float(n) + for n in range(int(composition.state['global_time']) + 1) # python ranges are not as they appear ;) + ] + assert len(timescale) == len(result_vals) # src check: is there a better way to perform the check? + return dict(zip(timescale, result_vals)) @dataclass @@ -72,8 +94,169 @@ def run(self, num_frames: int): return FuncAnimation(fig, self._prepare_animation, frames=num_frames) -# TODO: Create plotting step for this + +class CompositionPlotter(Step): + + data: Dict[float, Dict[str, Union[Dict, int, float]]] + emitter: RAMEmitter + config_schema = { + 'emitter': 'step', + 'plot_counts': { + '_type': 'boolean', + '_default': False + } + } + + def __init__(self, config=None, core=None): + super().__init__(config, core) + + self.emitter = self.config.get('emitter') + assert self.emitter is not None, 'You must pass a ram-emitter instance into this plotter' + self.data = self.emitter.history + self.species_names = [] + for timestamp, result in self.data.items(): + names = list(result['floating_species_concentrations'].keys()) + for n in names: + self.species_names.append(n) + + self.species_names = list(set(self.species_names)) + + def _parse_data(self, species_names: List): + fig, axes = plt.subplots(nrows=len(species_names), ncols=2, figsize=(15, 5 * len(species_names))) + fig.suptitle('Species Counts and Concentrations Over Time') + + # Process each species + for index, species in enumerate(species_names): + times = list(data.keys()) + counts = [data[time]['floating_species_counts'][species] for time in times] + concentrations = [data[time]['floating_species_concentrations'][species] for time in times] + + # Plot counts + ax1 = axes[index, 0] + ax1.plot(times, counts, label=f'Counts of {species}') + ax1.set_title(f'Counts of {species}') + ax1.set_xlabel('Time') + ax1.set_ylabel('Counts') + ax1.legend() + + # Plot concentrations + ax2 = axes[index, 1] + ax2.plot(times, concentrations, label=f'Concentration of {species}') + ax2.set_title(f'Concentration of {species}') + ax2.set_xlabel('Time') + ax2.set_ylabel('Concentration') + ax2.legend() + + plt.tight_layout(rect=[0, 0, 1, 0.96]) + plt.show() + + def inputs(self): + return {'emitter': 'step'} + + def outputs(self): + return {} + + def update(self, state): + return self._parse_data(self.species_names) + + class Plotter2d(Step): - pass + config_schema = { + 'duration': 'any', # TODO: change this + 'process': 'string', + 'species_context': { + '_type': 'string', + '_default': 'concentrations' + } + } + + def __init__(self, config=None, core=None): + super().__init__(config, core) + context = self.config['species_context'] + self.context_key = f'floating_species_{context}' + self.species_store = [f'{self.context_key}_store'] + + + def inputs(self): + return { + self.context_key: 'tree[float]' + } + + def outputs(self): + return { + self.context_key: 'tree[float]' + } + + def update(self, state): + """print(f'GOt the state: {state}') + results = state[self.context_key] + species_names = list(results.keys()) + timescale = list(range(self.config['duration'] + 1)) + for name in species_names: + y_data = results[name] + self.plot_output( + x_data=timescale, + y_data=y_data, + species=name, + x_label='Time', + y_label=self.context_key + ) + return {}""" + print('----', state) + print('----', self.config['process']) + return {} + + + @classmethod + def plot_output( + cls, + x_data: Union[List, np.ndarray], + y_data: Union[List, np.ndarray], + **label_config + ) -> None: + """Plot arbitrary output. + + Args: + x_data: array or list of data for x axis. + y_data: array or list of data for y axis. + **label_config: kwargs include--> title, x_label, y_label + """ + plt.figure(figsize=(8, 5)) + plt.plot(x_data, y_data, marker='o', linestyle='-', color='b', label=label_config.get('species')) + plt.title(label_config.get('title')) + plt.xlabel(label_config.get('x_label')) + plt.ylabel(label_config.get('y_label')) + plt.legend() + plt.grid(True) + plt.show() + + @classmethod + def plot_single_output( + cls, + timescale: Union[List, np.array], + data: Union[List, np.array], + species_name: str, + plot_concentration=True + ) -> None: + """Plotting function to plot the output of a SINGLE species' concentrations over a timescale for the output + of a deterministic time course simulation. + + Args: + timescale:`Union[List, np.array]`: list containing each time step. + data:`Union[List, np.array]`: output data mapped to each timescale. + species_name:`str`: Name of the species that you are plotting. + plot_concentration:`bool`: Whether you are plotting concentrations for data. Effects + plot labels. Defaults to `True`. + """ + plt.figure(figsize=(8, 5)) + plt.plot(timescale, data, marker='o', linestyle='-', color='b', label=species_name) + plt.title(f'{species_name} over time') + plt.xlabel('Time') + plt.ylabel('Concentration' if plot_concentration else 'Counts') + plt.legend() + plt.grid(True) + plt.show() + + diff --git a/biosimulator_processes/utils.py b/biosimulator_processes/utils.py index 8f9238665..569ce9cd5 100644 --- a/biosimulator_processes/utils.py +++ b/biosimulator_processes/utils.py @@ -1,12 +1,142 @@ -from typing import Dict, Union +from typing import Dict, Union, List, Tuple from types import FunctionType import os - import numpy as np from basico import biomodels, load_model_from_string from process_bigraph import Composite, pf import nbformat -from pydantic import BaseModel +from pydantic import Field +from biosimulator_processes.data_model import _BaseModel + + +def register_module(items_to_register: List[Tuple[str, str]], core) -> None: + for process_name, path in items_to_register: + module_name, class_name = path.rsplit('.', 1) + try: + library = 'steps' if 'process' not in path else 'processes' + import_statement = f'biosimulator_processes.{library}.{module_name}' + + module = __import__( + import_statement, fromlist=[class_name]) + + # module = importlib.import_module(import_statement) + + # Get the class from the module + bigraph_class = getattr(module, class_name) + + # Register the process + core.process_registry.register(process_name, bigraph_class) + print(f"{class_name} registered successfully.") + except ImportError as e: + print(f"{class_name} not available. Error: {e}") + + +def prepare_single_ode_process_document( + process_id: str, + simulator_name: str, + sbml_model_fp: str, + add_emitter=True + ) -> Dict: + """ + * `simulator_name` must correspond to an existing process implementation. + # TODO: Make this more flexible by providing a default to biosimulators1.0 for tools not yet implemented. + """ + species_context = 'concentrations' + species_port_name = f'floating_species_{species_context}' + species_store = [f'{species_port_name}_store'] + document = { + process_id: { + '_type': 'process', + 'address': 'local:copasi', + 'config': { + 'model': { + 'model_source': sbml_model_fp}}, + 'inputs': { + species_port_name: species_store, + 'model_parameters': ['model_parameters_store'], + 'time': ['time_store'], + 'reactions': ['reactions_store']}, + 'outputs': { + species_port_name: species_store, + 'time': ['time_store']}}} + + if add_emitter: + document['emitter'] = { + '_type': 'step', + 'address': 'local:ram-emitter', + 'config': { + 'emit': { + species_port_name: 'tree[float]', + 'time': 'float'}}, + 'inputs': { + species_port_name: species_store, + 'time': ['time_store']}} + + return document + + +def prepare_single_copasi_process_schema( + process_name: str, + biomodel_id: str = None, + sbml_model_fp: str = None, + method='lsoda', + species_context='concentrations', + add_emitter=True + ) -> Dict: + species_port_name = f'floating_species_{species_context}' + species_store = [f'floating_species_{species_context}_store'] + model_source = biomodel_id or sbml_model_fp + assert model_source, 'You must pass either a biomodel id or sbml model path source.' + document = { + process_name: { + '_type': 'process', + 'address': 'local:copasi', + 'config': { + 'model': { + 'model_source': model_source}, + 'method': method, + 'species_context': species_context}, + 'inputs': { + species_port_name: species_store, + 'model_parameters': ['model_parameters_store'], + 'time': ['time_store'], + 'reactions': ['reactions_store']}, + 'outputs': { + species_port_name: species_store, + 'time': ['time_store']}}} + + if add_emitter: + document['emitter'] = { + 'emitter': { + '_type': 'step', + 'address': 'local:ram-emitter', + 'config': { + 'emit': { + species_port_name: 'tree[float]', + 'time': 'float'}}, + 'inputs': { + species_port_name: species_store, + 'time': ['time_store']}}} + + return document + + +def run_composition(instance, duration: int = 10) -> dict: + workflow = Composite( + config={ + 'state': instance + } + ) + workflow.run(duration) + return workflow.gather_results() + + +def create_class_from_dict(instance_dict: Dict, class_name="DynamicClass"): + """ + Dynamically create a class with attributes set to data based on the outermost keys of the given dictionary. + """ + class_attrs = {key: val for key, val in instance_dict.items()} + return type(class_name, (object,), class_attrs) def fetch_biomodel_by_term(term: str, index: int = 0): @@ -258,7 +388,7 @@ def fix_execution_count(notebook_path): def fix_notebooks_execution_count(): - for root, _, files in os.walk('../notebooks'): + for root, _, files in os.walk('../composer-notebooks'): for _file in files: notebook_path = os.path.join(root, _file) fix_execution_count(notebook_path) diff --git a/compare_api/README.md b/compare_api/README.md new file mode 100644 index 000000000..fdf4b41b6 --- /dev/null +++ b/compare_api/README.md @@ -0,0 +1,4 @@ +# BioSimulatorProcesses Compare REST API + +### Run CompareAPI service: +`uvicorn compare_api.main:app --reload --env-file tests/.env` diff --git a/biosimulator_processes/tests/__init__.py b/compare_api/__init__.py similarity index 100% rename from biosimulator_processes/tests/__init__.py rename to compare_api/__init__.py diff --git a/compare_api/main.py b/compare_api/main.py new file mode 100644 index 000000000..b24ca3a98 --- /dev/null +++ b/compare_api/main.py @@ -0,0 +1,107 @@ +import logging +from datetime import datetime +from typing import * +from urllib.parse import unquote + +from fastapi import FastAPI, HTTPException, Query, File, UploadFile +from fastapi.middleware.cors import CORSMiddleware +from biosimulator_processes.data_model.compare_data_model import ProcessAttributes, ComparisonResults +from compare_api.src.composite_doc import create_comparison_document, generate_workflow, run_workflow + + +# logger for this module +logger = logging.getLogger(__name__) + + +app = FastAPI(title="compare-api", version="1.0.0") +app.dependency_overrides = {} +# enable cross-origin resource sharing (CORS) +origins = [ + 'http://127.0.0.1:4200', + 'http://127.0.0.1:4201', + 'http://127.0.0.1:4202', + 'http://localhost:4200', + 'http://localhost:4201', + 'http://localhost:4202', + 'https://biosimulators.org', + 'https://www.biosimulators.org', + 'https://biosimulators.dev', + 'https://www.biosimulators.dev', + 'https://run.biosimulations.dev', + 'https://run.biosimulations.org', + 'https://biosimulations.dev', + 'https://biosimulations.org', + 'https://bio.libretexts.org', +] +app.add_middleware( + middleware_class=CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +@app.get("/") +async def root(): + return {"message": "Hello from compare-api!!!"} + + +@app.get( + "/get-process-attributes", + response_model=ProcessAttributes, + name="Get Process Attributes", + operation_id="get-process-attributes", + responses={ + 404: {"description": "Unable to get attributes for specified simulator process."}}) +async def get_process_attributes( + process_name: str = Query(..., title="Name of the process type; i.e: copasi, tellurium, etc.") + ) -> ProcessAttributes: + try: + module_name = f'{process_name}_process' + import_statement = f'biosimulator_processes.processes.{module_name}' + module_paths = module_name.split('_') + class_name = module_paths[0].replace(module_name[0], module_name[0].upper()) + class_name += module_paths[0].replace(module_name[0], module_name[0].upper()) + module = __import__( + import_statement, fromlist=[class_name]) + + # Get the class from the module + bigraph_class = getattr(module, class_name) + attributes = await ProcessAttributes( + name=class_name, + initial_state=bigraph_class.initial_state(), + inputs=bigraph_class.inputs(), + outputs=bigraph_class.outputs()) + return attributes + except Exception as e: + logger.warning(f'failed to run simulator comparison composite: {str(e)}') + raise HTTPException(status_code=404, detail="Parameters not valid.") + + +@app.post( + "/run-comparison", + response_model=ComparisonResults, + name="Run a Simulator Comparison", + operation_id="run-comparison", + responses={ + 404: {"description": "Unable to run comparison"}}) +async def run_comparison( + sbml_model_file: UploadFile = File(..., title="Upload a File"), + sbml_model_url: str = Query(None, title="SBML Model Url"), + simulators: List[str] = Query(..., title="Simulators to Compare"), + duration: int = Query(..., title="Duration"), + num_steps: int = Query(..., title="Number of Steps") +) -> ComparisonResults: + # TODO: Add fallback of biosimulations 1.0 for simulators not yet implemented. + # TODO: enable remote model file for model path with download + try: + model_file_content = await sbml_model_file.read() + model_file_location = sbml_model_file.filename + document = create_comparison_document(model_file_location, simulators, duration, num_steps) + workflow = generate_workflow(document) + results = await run_workflow(workflow, duration) + return ComparisonResults(simulators=simulators, value=results) + except AssertionError as e: + logger.warning(f'failed to run simulator comparison composite: {str(e)}') + raise HTTPException(status_code=404, detail="Parameters not valid.") diff --git a/compare_api/spec/openapi_3_1_0_generated.yaml b/compare_api/spec/openapi_3_1_0_generated.yaml new file mode 100644 index 000000000..a847982c6 --- /dev/null +++ b/compare_api/spec/openapi_3_1_0_generated.yaml @@ -0,0 +1,126 @@ +openapi: 3.1.0 +info: + title: compare-api + version: 1.0.0 +paths: + /: + get: + summary: Root + operationId: root__get + responses: + '200': + description: Successful Response + content: + application/json: + schema: {} + /run: + post: + summary: Run A Simulator Comparison + operationId: run-comparison + parameters: + - name: sbml_model_url + in: query + required: false + schema: + type: string + title: SBML Model Url + - name: simulators + in: query + required: true + schema: + type: array + items: + type: string + title: Simulators to Compare + - name: duration + in: query + required: true + schema: + type: integer + title: Duration + - name: num_steps + in: query + required: true + schema: + type: integer + title: Number of Steps + requestBody: + required: true + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_run-comparison' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/SimulatorComparisonResult' + '404': + description: Unable to run comparison + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' +components: + schemas: + Body_run-comparison: + properties: + sbml_model_file: + type: string + format: binary + title: Upload a File + type: object + required: + - sbml_model_file + title: Body_run-comparison + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + type: array + title: Detail + type: object + title: HTTPValidationError + SimulatorComparisonResult: + properties: + simulators: + items: + type: string + type: array + title: Simulators + value: + additionalProperties: + type: object + type: object + title: Value + type: object + required: + - simulators + - value + title: SimulatorComparisonResult + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + type: array + title: Location + msg: + type: string + title: Message + type: + type: string + title: Error Type + type: object + required: + - loc + - msg + - type + title: ValidationError diff --git a/biosimulator_processes/tests/test_copasi_process.py b/compare_api/src/__init__.py similarity index 100% rename from biosimulator_processes/tests/test_copasi_process.py rename to compare_api/src/__init__.py diff --git a/compare_api/src/comparison.py b/compare_api/src/comparison.py new file mode 100644 index 000000000..0bc668952 --- /dev/null +++ b/compare_api/src/comparison.py @@ -0,0 +1,54 @@ +"""class IntervalResult(BaseModel): + global_time_stamp: float + results: Dict[str, Any] + + +class SimulatorResult(BaseModel): + process_id: str + simulator: str + result: List[IntervalResult] + + +class ComparisonResults(BaseModel): + duration: int + num_steps: int + values: List[SimulatorResult] + +{('emitter',): [{ + 'copasi': [ + { + 'floating_species_concentrations': { + 'plasminogen': 0.0, + 'plasmin': 0.0, + 'single intact chain urokinase-type plasminogen activator': 0.0, + 'two-chain urokinase-type plasminogen activator': 0.0, + 'x': 0.0, + 'x-plasmin': 0.0}, + 'time': 0.0 + }, + ... + ], + 'amici': [ + { + 'floating_species_concentrations': { + 'plasminogen': 1.1758171177387002e+16, + 'plasmin': 1096150505274.1506, + 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0, + 'two-chain urokinase-type plasminogen activator': 80249.33829510311, + 'x': 0.0, + 'x-plasmin': 0.0}, + 'time': 0.0}, + }, + ... + ] + + +""" + +from typing import * +from biosimulator_processes.data_model.compare_data_model import IntervalResult, SimulatorResult, ComparisonResults + + +def parse_comparison_results(results: Dict): + result_values = results[('emitter',)] + diff --git a/compare_api/src/composite_doc.py b/compare_api/src/composite_doc.py new file mode 100644 index 000000000..199ae1991 --- /dev/null +++ b/compare_api/src/composite_doc.py @@ -0,0 +1,30 @@ +from typing import * +from process_bigraph import Composite +from biosimulator_processes import CORE +from biosimulator_processes.data_model.compare_data_model import ComparisonDocument + + +def create_comparison_document( + sbml_model_path: str, + simulators: list[str], + duration: int, + n_steps: int, + target_param: dict = None + ) -> ComparisonDocument: + return ComparisonDocument( + simulators=simulators, + duration=duration, + num_steps=n_steps, + model_filepath=sbml_model_path, + target_parameter=target_param) + + +def generate_workflow(document: ComparisonDocument) -> Composite: + return Composite( + config={'state': document.composite}, + core=CORE) + + +async def run_workflow(workflow: Composite, duration: int) -> Dict: + workflow.run(duration) + return workflow.gather_results() diff --git a/compare_api/src/openapi_spec.py b/compare_api/src/openapi_spec.py new file mode 100644 index 000000000..6bb0872b9 --- /dev/null +++ b/compare_api/src/openapi_spec.py @@ -0,0 +1,36 @@ +import json +import os + +import yaml +from fastapi.openapi.utils import get_openapi + +from compare_api.main import app + + +def main(): + openapi_spec = get_openapi( + title=app.title, + version=app.version, + openapi_version=app.openapi_version, + description=app.description, + routes=app.routes, + ) + + # Convert the JSON OpenAPI spec to YAML + openapi_spec_yaml = yaml.dump(json.loads(json.dumps(openapi_spec)), sort_keys=False) + + current_directory = os.path.dirname(os.path.realpath(__file__)) + + # Write the YAML OpenAPI spec to a file in subdirectory spec + openapi_version = app.openapi_version.replace('.', '_') + spec_fp = f"{current_directory}/../spec/openapi_{openapi_version}_generated.yaml" + if os.path.exists(spec_fp): + print('Spec exists, overwriting') + os.remove(spec_fp) + + with open(spec_fp, "w") as f: + f.write(openapi_spec_yaml) + + +if __name__ == "__main__": + main() diff --git a/compare_api/tests.py b/compare_api/tests.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/compare_api/tests.py @@ -0,0 +1 @@ + diff --git a/composer-notebooks/amici_process_composer.ipynb b/composer-notebooks/amici_process_composer.ipynb new file mode 100644 index 000000000..f25630a5c --- /dev/null +++ b/composer-notebooks/amici_process_composer.ipynb @@ -0,0 +1,2727 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bb262c90b116dc5d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:53:50.548760Z", + "start_time": "2024-05-03T23:53:46.818274Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "sys.path.insert(0, '..')\n", + "\n", + "import os\n", + "import requests\n", + "import json\n", + "from tempfile import mkdtemp\n", + "import libsbml\n", + "import amici\n", + "import os\n", + "from biosimulator_processes.utils import prepare_single_ode_process_document\n", + "from biosimulator_processes.data_model.compare_data_model import ODEComparisonDocument, DocumentFactory\n", + "from biosimulator_processes import CORE\n", + "from process_bigraph import Composite, pp" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d9a30637052900a1", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:53:53.342107Z", + "start_time": "2024-05-03T23:53:53.334331Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'copasi_0': {'_type': 'process',\n", + " 'address': 'local:copasi',\n", + " 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n", + " 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'model_parameters': ['model_parameters_store'],\n", + " 'time': ['time_store'],\n", + " 'reactions': ['reactions_store']},\n", + " 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'amici_1': {'_type': 'process',\n", + " 'address': 'local:amici',\n", + " 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n", + " 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'model_parameters': ['model_parameters_store'],\n", + " 'time': ['time_store'],\n", + " 'reactions': ['reactions_store']},\n", + " 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'emitter': {'_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n", + " 'time': 'float'}},\n", + " 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'time': ['time_store']}}}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#### Step 1: Define the document to be read by the Composite, which is implemented by the Process.\n", + "biomodel_id = 'BIOMD0000000630'\n", + "model_fp = f'../biosimulator_processes/model_files/sbml/{biomodel_id}_url.xml'\n", + "species_context = 'concentrations'\n", + "species_port_name = f'floating_species_{species_context}'\n", + "species_store = [f'floating_species_{species_context}_store']\n", + "duration = 30\n", + "\n", + "comparison_document = ODEComparisonDocument(\n", + " simulators=['copasi', 'amici'],\n", + " duration=20,\n", + " num_steps=32,\n", + " model_filepath=model_fp)\n", + "\n", + "comparison_document.composite" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "805cea07eb6c8433", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:22:51.465715Z", + "start_time": "2024-05-03T23:22:33.990631Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "# Amici Model from compiled module\n", + "sbml_importer = amici.SbmlImporter(model_fp)\n", + "model_name = biomodel_id\n", + "model_dir = \"./model_dir\"\n", + "if not os.path.exists(model_dir):\n", + " os.mkdir(model_dir)\n", + "\n", + "sbml_importer.sbml2amici(model_name, model_dir)\n", + "# load the model module\n", + "model_module = amici.import_model_module(model_name, model_dir)\n", + "# instantiate model\n", + "compiled_model = model_module.getModel()\n", + "# instantiate solver\n", + "method = compiled_model.getSolver()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dfb5655df610ddc6", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T21:47:58.601844Z", + "start_time": "2024-05-03T21:47:58.599946Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "# From load sbml model module \n", + "sbml_reader = libsbml.SBMLReader()\n", + "sbml_doc = sbml_reader.readSBML(model_fp)\n", + "sbml_model = sbml_doc.getModel()\n", + "species_objects_list = sbml_model.getListOfSpecies()\n", + "floating_species_list = [s.getId() for s in species_objects_list]\n", + "floating_species_initial = dict(zip(floating_species_list, [s.getInitialConcentration() for s in species_objects_list]))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "48a0cdbb6ca6a7bd", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:06:37.447558Z", + "start_time": "2024-05-03T19:06:37.423225Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0\n", + "0.0\n", + "0.0\n", + "0.0\n", + "0.0\n", + "0.0\n" + ] + } + ], + "source": [ + "for s in species_objects_list:\n", + " print(s.getInitialAmount())" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8125d183e8bb2669", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:56:53.448069Z", + "start_time": "2024-05-03T18:56:53.439183Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['species_1', 'species_2', 'species_3', 'species_4', 'species_5', 'species_6']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[s.getId() for s in species_objects_list]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "4ee2dee1553a652b", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:56:12.937501Z", + "start_time": "2024-05-03T18:56:12.928144Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'plasminogen': 0.01,\n", + " 'plasmin': 0.0,\n", + " 'single intact chain urokinase-type plasminogen activator': 0.002,\n", + " 'two-chain urokinase-type plasminogen activator': 0.0,\n", + " 'x': 0.0,\n", + " 'x-plasmin': 0.0}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "floating_species_initial" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "539b9a949984514c", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:55:19.850972Z", + "start_time": "2024-05-03T18:55:19.825867Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'species_1': 0.01,\n", + " 'species_2': 0.0,\n", + " 'species_3': 0.002,\n", + " 'species_4': 0.0,\n", + " 'species_5': 0.0,\n", + " 'species_6': 0.0}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dict(zip(floating_species_list, [s.getInitialConcentration() for s in species_objects_list]))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b25cff91d01761da", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:52:55.587491Z", + "start_time": "2024-05-03T18:52:55.561926Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'species_1': 0.01,\n", + " 'species_2': 0.0,\n", + " 'species_3': 0.002,\n", + " 'species_4': 0.0,\n", + " 'species_5': 0.0,\n", + " 'species_6': 0.0}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "floating_species_initial" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "acb196b51a61ced4", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:48:29.911410Z", + "start_time": "2024-05-03T18:48:29.854873Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "species_objects_list = sbml_model.getListOfSpecies()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c8f65af5abb5de6e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T18:50:23.014505Z", + "start_time": "2024-05-03T18:50:23.009279Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "species_1\n", + "0 0.01\n", + "species_2\n", + "1 0.0\n", + "species_3\n", + "2 0.002\n", + "species_4\n", + "3 0.0\n", + "species_5\n", + "4 0.0\n", + "species_6\n", + "5 0.0\n" + ] + } + ], + "source": [ + "for i, s in enumerate(species_objects_list):\n", + " print(s.getId())\n", + " print(i, s.getInitialConcentration())" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "2b2dd4c9721c5471", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:08:19.760041Z", + "start_time": "2024-05-03T19:08:19.472080Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__bool__',\n", + " '__class__',\n", + " '__deepcopy__',\n", + " '__delattr__',\n", + " '__deref__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__nonzero__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__swig_destroy__',\n", + " '__weakref__',\n", + " 'clone',\n", + " 'fdsigmaydy',\n", + " 'fdspline_slopesdp',\n", + " 'fdspline_valuesdp',\n", + " 'fdtotal_cldp',\n", + " 'fdtotal_cldx_rdata',\n", + " 'fdx_rdatadp',\n", + " 'fdx_rdatadtcl',\n", + " 'fdx_rdatadx_solver',\n", + " 'get',\n", + " 'getAddSigmaResiduals',\n", + " 'getAlwaysCheckFinite',\n", + " 'getAmiciCommit',\n", + " 'getAmiciVersion',\n", + " 'getExpressionIds',\n", + " 'getExpressionNames',\n", + " 'getFixedParameterById',\n", + " 'getFixedParameterByName',\n", + " 'getFixedParameterIds',\n", + " 'getFixedParameterNames',\n", + " 'getFixedParameters',\n", + " 'getInitialStateSensitivities',\n", + " 'getInitialStates',\n", + " 'getMinimumSigmaResiduals',\n", + " 'getName',\n", + " 'getObservableIds',\n", + " 'getObservableNames',\n", + " 'getObservableScaling',\n", + " 'getParameterById',\n", + " 'getParameterByName',\n", + " 'getParameterIds',\n", + " 'getParameterList',\n", + " 'getParameterNames',\n", + " 'getParameterScale',\n", + " 'getParameters',\n", + " 'getReinitializationStateIdxs',\n", + " 'getReinitializeFixedParameterInitialStates',\n", + " 'getSolver',\n", + " 'getStateIds',\n", + " 'getStateIdsSolver',\n", + " 'getStateIsNonNegative',\n", + " 'getStateNames',\n", + " 'getStateNamesSolver',\n", + " 'getSteadyStateComputationMode',\n", + " 'getSteadyStateSensitivityMode',\n", + " 'getTimepoint',\n", + " 'getTimepoints',\n", + " 'getUnscaledParameters',\n", + " 'get_steadystate_mask',\n", + " 'get_trigger_timepoints',\n", + " 'hasCustomInitialStateSensitivities',\n", + " 'hasCustomInitialStates',\n", + " 'hasExpressionIds',\n", + " 'hasExpressionNames',\n", + " 'hasFixedParameterIds',\n", + " 'hasFixedParameterNames',\n", + " 'hasObservableIds',\n", + " 'hasObservableNames',\n", + " 'hasParameterIds',\n", + " 'hasParameterNames',\n", + " 'hasQuadraticLLH',\n", + " 'hasStateIds',\n", + " 'hasStateNames',\n", + " 'idlist',\n", + " 'initializeSplineSensitivities',\n", + " 'initializeSplines',\n", + " 'isFixedParameterStateReinitializationAllowed',\n", + " 'k',\n", + " 'lbw',\n", + " 'logger',\n", + " 'module',\n", + " 'nJ',\n", + " 'nMaxEvent',\n", + " 'ncl',\n", + " 'ndJydy',\n", + " 'ndtotal_cldx_rdata',\n", + " 'ndwdp',\n", + " 'ndwdw',\n", + " 'ndwdx',\n", + " 'ndxdotdw',\n", + " 'ndxrdatadtcl',\n", + " 'ndxrdatadxsolver',\n", + " 'ne',\n", + " 'ne_solver',\n", + " 'nk',\n", + " 'nnz',\n", + " 'np',\n", + " 'nplist',\n", + " 'nspl',\n", + " 'nt',\n", + " 'nw',\n", + " 'nx_rdata',\n", + " 'nx_reinit',\n", + " 'nx_solver',\n", + " 'nx_solver_reinit',\n", + " 'nxtrue_rdata',\n", + " 'nxtrue_solver',\n", + " 'ny',\n", + " 'nytrue',\n", + " 'nz',\n", + " 'nztrue',\n", + " 'o2mode',\n", + " 'plist',\n", + " 'pythonGenerated',\n", + " 'release',\n", + " 'requireSensitivitiesForAllParameters',\n", + " 'reset',\n", + " 'setAddSigmaResiduals',\n", + " 'setAllStatesNonNegative',\n", + " 'setAlwaysCheckFinite',\n", + " 'setFixedParameterById',\n", + " 'setFixedParameterByName',\n", + " 'setFixedParameters',\n", + " 'setFixedParametersByIdRegex',\n", + " 'setFixedParametersByNameRegex',\n", + " 'setInitialStateSensitivities',\n", + " 'setInitialStates',\n", + " 'setMinimumSigmaResiduals',\n", + " 'setNMaxEvent',\n", + " 'setParameterById',\n", + " 'setParameterByName',\n", + " 'setParameterList',\n", + " 'setParameterScale',\n", + " 'setParameters',\n", + " 'setParametersByIdRegex',\n", + " 'setParametersByNameRegex',\n", + " 'setReinitializationStateIdxs',\n", + " 'setReinitializeFixedParameterInitialStates',\n", + " 'setStateIsNonNegative',\n", + " 'setSteadyStateComputationMode',\n", + " 'setSteadyStateSensitivityMode',\n", + " 'setT0',\n", + " 'setTimepoints',\n", + " 'setUnscaledInitialStateSensitivities',\n", + " 'set_steadystate_mask',\n", + " 'state_independent_events_',\n", + " 'swap',\n", + " 't0',\n", + " 'this',\n", + " 'thisown',\n", + " 'ubw']" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "9cd19fe6bd84b86f", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:08:29.429593Z", + "start_time": "2024-05-03T19:08:29.389402Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.084, 0.032, 2.0, 0.035, 40.0, 0.9, 0.016, 0.0, 0.02, 0.0032, 0.01, 0.01)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.getParameters()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "90c9ded770c7958", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:08:38.470138Z", + "start_time": "2024-05-03T19:08:38.438239Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.getParameterList()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "5012c0188dd43fab", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:08:50.525626Z", + "start_time": "2024-05-03T19:08:50.485913Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('parameter_1',\n", + " 'parameter_2',\n", + " 'parameter_13',\n", + " 'reaction_1_k1',\n", + " 'reaction_2_parameter_8',\n", + " 'reaction_3_k1',\n", + " 'reaction_8_k2',\n", + " 'reaction_8_k1',\n", + " 'reaction_9_k1',\n", + " 'reaction_12_v',\n", + " 'reaction_13_v',\n", + " 'reaction_14_v')" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.getParameterIds()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c9997ab4999912b", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model_parameters_list = model.getP" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "3b06fd629c36c4", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:09:32.631805Z", + "start_time": "2024-05-03T19:09:32.597441Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__metaclass__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__parent_ref__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__swig_destroy__',\n", + " '__weakref__',\n", + " 'addCVTerm',\n", + " 'addCompartment',\n", + " 'addCompartmentType',\n", + " 'addConstantAttribute',\n", + " 'addConstraint',\n", + " 'addDefinitionsForDefaultUnits',\n", + " 'addEvent',\n", + " 'addFunctionDefinition',\n", + " 'addInitialAssignment',\n", + " 'addModifiedDate',\n", + " 'addModifiers',\n", + " 'addParameter',\n", + " 'addReaction',\n", + " 'addRule',\n", + " 'addSpecies',\n", + " 'addSpeciesType',\n", + " 'addUnitDefinition',\n", + " 'all_element_id_list',\n", + " 'all_element_meta_id_list',\n", + " 'all_elements',\n", + " 'all_elements_from_plugins',\n", + " 'annotation',\n", + " 'annotation_string',\n", + " 'appendAnnotation',\n", + " 'appendFrom',\n", + " 'appendNotes',\n", + " 'area_units',\n", + " 'assignRequiredValues',\n", + " 'checkCompatibility',\n", + " 'checkMathMLNamespace',\n", + " 'clearAllElementIdList',\n", + " 'clearAllElementMetaIdList',\n", + " 'clone',\n", + " 'column',\n", + " 'compartment_types',\n", + " 'compartments',\n", + " 'connectToChild',\n", + " 'connectToParent',\n", + " 'constraints',\n", + " 'containsUndeclaredUnits',\n", + " 'conversion_factor',\n", + " 'convertFromL3V2',\n", + " 'convertL1ToL2',\n", + " 'convertL1ToL3',\n", + " 'convertL2ToL1',\n", + " 'convertL2ToL3',\n", + " 'convertL3ToL1',\n", + " 'convertL3ToL2',\n", + " 'convertParametersToLocals',\n", + " 'convertStoichiometryMath',\n", + " 'createAlgebraicRule',\n", + " 'createAssignmentRule',\n", + " 'createCompartment',\n", + " 'createCompartmentType',\n", + " 'createConstraint',\n", + " 'createDelay',\n", + " 'createEvent',\n", + " 'createEventAssignment',\n", + " 'createFunctionDefinition',\n", + " 'createInitialAssignment',\n", + " 'createKineticLaw',\n", + " 'createKineticLawLocalParameter',\n", + " 'createKineticLawParameter',\n", + " 'createModifier',\n", + " 'createParameter',\n", + " 'createProduct',\n", + " 'createRateRule',\n", + " 'createReactant',\n", + " 'createReaction',\n", + " 'createSpecies',\n", + " 'createSpeciesType',\n", + " 'createTrigger',\n", + " 'createUnit',\n", + " 'createUnitDefinition',\n", + " 'cv_terms',\n", + " 'dealWithDefaultValues',\n", + " 'dealWithEvents',\n", + " 'dealWithFast',\n", + " 'dealWithL3Fast',\n", + " 'dealWithModelUnits',\n", + " 'dealWithStoichiometry',\n", + " 'deleteDisabledPlugins',\n", + " 'derived_unit_definition',\n", + " 'disablePackage',\n", + " 'divideAssignmentsToSIdByFunction',\n", + " 'element_name',\n", + " 'enablePackage',\n", + " 'enablePackageInternal',\n", + " 'events',\n", + " 'extent_units',\n", + " 'function_definitions',\n", + " 'getAllElementIdList',\n", + " 'getAllElementMetaIdList',\n", + " 'getAncestorOfType',\n", + " 'getAnnotation',\n", + " 'getAnnotationString',\n", + " 'getAreaUnits',\n", + " 'getAssignmentRule',\n", + " 'getAssignmentRuleByVariable',\n", + " 'getCVTerm',\n", + " 'getCVTerms',\n", + " 'getColumn',\n", + " 'getCompartment',\n", + " 'getCompartmentType',\n", + " 'getConstraint',\n", + " 'getConversionFactor',\n", + " 'getCreatedDate',\n", + " 'getDerivedUnitDefinition',\n", + " 'getDisabledPlugin',\n", + " 'getElementByMetaId',\n", + " 'getElementBySId',\n", + " 'getElementFromPluginsByMetaId',\n", + " 'getElementFromPluginsBySId',\n", + " 'getElementName',\n", + " 'getEvent',\n", + " 'getExtentUnits',\n", + " 'getFormulaUnitsDataForAssignment',\n", + " 'getFormulaUnitsDataForVariable',\n", + " 'getFunctionDefinition',\n", + " 'getId',\n", + " 'getIdAttribute',\n", + " 'getInitialAssignment',\n", + " 'getInitialAssignmentBySymbol',\n", + " 'getLengthUnits',\n", + " 'getLevel',\n", + " 'getLine',\n", + " 'getListOfAllElements',\n", + " 'getListOfAllElementsFromPlugins',\n", + " 'getListOfCompartmentTypes',\n", + " 'getListOfCompartments',\n", + " 'getListOfConstraints',\n", + " 'getListOfEvents',\n", + " 'getListOfFunctionDefinitions',\n", + " 'getListOfInitialAssignments',\n", + " 'getListOfParameters',\n", + " 'getListOfReactions',\n", + " 'getListOfRules',\n", + " 'getListOfSpecies',\n", + " 'getListOfSpeciesTypes',\n", + " 'getListOfUnitDefinitions',\n", + " 'getMetaId',\n", + " 'getModel',\n", + " 'getModelHistory',\n", + " 'getModifiedDate',\n", + " 'getModifierSpeciesReference',\n", + " 'getName',\n", + " 'getNamespaces',\n", + " 'getNotes',\n", + " 'getNotesString',\n", + " 'getNumCVTerms',\n", + " 'getNumCompartmentTypes',\n", + " 'getNumCompartments',\n", + " 'getNumConstraints',\n", + " 'getNumDisabledPlugins',\n", + " 'getNumEvents',\n", + " 'getNumFunctionDefinitions',\n", + " 'getNumInitialAssignments',\n", + " 'getNumModifiedDates',\n", + " 'getNumParameters',\n", + " 'getNumPlugins',\n", + " 'getNumReactions',\n", + " 'getNumRules',\n", + " 'getNumSpecies',\n", + " 'getNumSpeciesTypes',\n", + " 'getNumSpeciesWithBoundaryCondition',\n", + " 'getNumUnitDefinitions',\n", + " 'getPackageCoreVersion',\n", + " 'getPackageName',\n", + " 'getPackageVersion',\n", + " 'getParameter',\n", + " 'getParentSBMLObject',\n", + " 'getPlugin',\n", + " 'getPrefix',\n", + " 'getRateRule',\n", + " 'getRateRuleByVariable',\n", + " 'getReaction',\n", + " 'getResourceBiologicalQualifier',\n", + " 'getResourceModelQualifier',\n", + " 'getRule',\n", + " 'getRuleByVariable',\n", + " 'getSBMLDocument',\n", + " 'getSBMLNamespaces',\n", + " 'getSBOTerm',\n", + " 'getSBOTermAsURL',\n", + " 'getSBOTermID',\n", + " 'getSpecies',\n", + " 'getSpeciesReference',\n", + " 'getSpeciesType',\n", + " 'getSubstanceUnits',\n", + " 'getTimeUnits',\n", + " 'getTypeCode',\n", + " 'getURI',\n", + " 'getUnitDefinition',\n", + " 'getVersion',\n", + " 'getVolumeUnits',\n", + " 'hasNonstandardIdentifierBeginningWith',\n", + " 'hasOptionalAttributes',\n", + " 'hasOptionalElements',\n", + " 'hasRequiredAttributes',\n", + " 'hasRequiredElements',\n", + " 'hasValidLevelVersionNamespaceCombination',\n", + " 'id',\n", + " 'id_attribute',\n", + " 'initial_assignments',\n", + " 'isPackageEnabled',\n", + " 'isPackageURIEnabled',\n", + " 'isPkgEnabled',\n", + " 'isPkgURIEnabled',\n", + " 'isPopulatedAllElementIdList',\n", + " 'isPopulatedAllElementMetaIdList',\n", + " 'isPopulatedListFormulaUnitsData',\n", + " 'isSetAnnotation',\n", + " 'isSetAreaUnits',\n", + " 'isSetConversionFactor',\n", + " 'isSetCreatedDate',\n", + " 'isSetExtentUnits',\n", + " 'isSetId',\n", + " 'isSetIdAttribute',\n", + " 'isSetLengthUnits',\n", + " 'isSetMetaId',\n", + " 'isSetModelHistory',\n", + " 'isSetModifiedDate',\n", + " 'isSetName',\n", + " 'isSetNotes',\n", + " 'isSetSBOTerm',\n", + " 'isSetSubstanceUnits',\n", + " 'isSetTimeUnits',\n", + " 'isSetUserData',\n", + " 'isSetVolumeUnits',\n", + " 'length_units',\n", + " 'level',\n", + " 'line',\n", + " 'matchesRequiredSBMLNamespacesForAddition',\n", + " 'matchesSBMLNamespaces',\n", + " 'meta_id',\n", + " 'model',\n", + " 'multiplyAssignmentsToSIdByFunction',\n", + " 'name',\n", + " 'namespaces',\n", + " 'notes',\n", + " 'notes_string',\n", + " 'num_compartment_types',\n", + " 'num_compartments',\n", + " 'num_constraints',\n", + " 'num_cv_terms',\n", + " 'num_disabled_plugins',\n", + " 'num_events',\n", + " 'num_function_definitions',\n", + " 'num_initial_assignments',\n", + " 'num_modified_dates',\n", + " 'num_parameters',\n", + " 'num_plugins',\n", + " 'num_reactions',\n", + " 'num_rules',\n", + " 'num_species',\n", + " 'num_species_types',\n", + " 'num_species_with_boundary_condition',\n", + " 'num_unit_definitions',\n", + " 'package_core_version',\n", + " 'package_name',\n", + " 'package_version',\n", + " 'parameters',\n", + " 'populateAllElementIdList',\n", + " 'populateAllElementMetaIdList',\n", + " 'populateListFormulaUnitsData',\n", + " 'prefix',\n", + " 'prependStringToAllIdentifiers',\n", + " 'reactions',\n", + " 'read',\n", + " 'removeCompartment',\n", + " 'removeCompartmentType',\n", + " 'removeCompartmentTypes',\n", + " 'removeConstraint',\n", + " 'removeDuplicateAnnotations',\n", + " 'removeEvent',\n", + " 'removeFromParentAndDelete',\n", + " 'removeFunctionDefinition',\n", + " 'removeInitialAssignment',\n", + " 'removeListFormulaUnitsData',\n", + " 'removeParameter',\n", + " 'removeParameterRuleUnits',\n", + " 'removeReaction',\n", + " 'removeRule',\n", + " 'removeRuleByVariable',\n", + " 'removeSpecies',\n", + " 'removeSpeciesType',\n", + " 'removeSpeciesTypes',\n", + " 'removeTopLevelAnnotationElement',\n", + " 'removeUnitDefinition',\n", + " 'renameAllIds',\n", + " 'renameIDs',\n", + " 'renameMetaIdRefs',\n", + " 'renameSIdRefs',\n", + " 'renameUnitSIdRefs',\n", + " 'replaceSIDWithFunction',\n", + " 'replaceTopLevelAnnotationElement',\n", + " 'rules',\n", + " 'sbml_namespaces',\n", + " 'sbml_namespaces_and_own',\n", + " 'sbo_term',\n", + " 'sbo_term_as_url',\n", + " 'sbo_term_id',\n", + " 'setAnnotation',\n", + " 'setAreaUnits',\n", + " 'setConversionFactor',\n", + " 'setCreatedDate',\n", + " 'setExtentUnits',\n", + " 'setId',\n", + " 'setIdAttribute',\n", + " 'setLengthUnits',\n", + " 'setMetaId',\n", + " 'setModelHistory',\n", + " 'setName',\n", + " 'setNamespaces',\n", + " 'setNotes',\n", + " 'setSBMLNamespacesAndOwn',\n", + " 'setSBOTerm',\n", + " 'setSpatialDimensions',\n", + " 'setSpeciesReferenceConstantValueAndStoichiometry',\n", + " 'setSubstanceUnits',\n", + " 'setTimeUnits',\n", + " 'setVolumeUnits',\n", + " 'spatial_dimensions',\n", + " 'species',\n", + " 'species_reference_constant_value_and_stoichiometry',\n", + " 'species_types',\n", + " 'substance_units',\n", + " 'this',\n", + " 'thisown',\n", + " 'time_units',\n", + " 'toSBML',\n", + " 'toXMLNode',\n", + " 'transformIdentifiers',\n", + " 'type_code',\n", + " 'unit_definitions',\n", + " 'unsetAnnotation',\n", + " 'unsetAreaUnits',\n", + " 'unsetCVTerms',\n", + " 'unsetConversionFactor',\n", + " 'unsetCreatedDate',\n", + " 'unsetExtentUnits',\n", + " 'unsetId',\n", + " 'unsetIdAttribute',\n", + " 'unsetLengthUnits',\n", + " 'unsetMetaId',\n", + " 'unsetModelHistory',\n", + " 'unsetModifiedDates',\n", + " 'unsetName',\n", + " 'unsetNotes',\n", + " 'unsetSBOTerm',\n", + " 'unsetSubstanceUnits',\n", + " 'unsetTimeUnits',\n", + " 'unsetUserData',\n", + " 'unsetVolumeUnits',\n", + " 'updateSBMLNamespace',\n", + " 'uri',\n", + " 'version',\n", + " 'volume_units',\n", + " 'write',\n", + " 'writeExtensionElements']" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(sbml_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "4809419cda37489d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:13:27.757355Z", + "start_time": "2024-05-03T19:13:27.746469Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "model_parameter_objects = sbml_model.getListOfParameters()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "b894d5eaede8618a", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:13:28.376159Z", + "start_time": "2024-05-03T19:13:28.362537Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_parameter_objects" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e97db8af52fe0009", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:13:34.234305Z", + "start_time": "2024-05-03T19:13:34.224870Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'addCVTerm', 'addModifiedDate', 'all_elements', 'all_elements_from_plugins', 'annotation', 'annotation_string', 'appendAnnotation', 'appendNotes', 'calculating_units', 'checkCompatibility', 'checkMathMLNamespace', 'clone', 'column', 'connectToChild', 'connectToParent', 'constant', 'containsUndeclaredUnits', 'cv_terms', 'deleteDisabledPlugins', 'derived_unit_definition', 'disablePackage', 'divideAssignmentsToSIdByFunction', 'element_name', 'enablePackage', 'enablePackageInternal', 'getAncestorOfType', 'getAnnotation', 'getAnnotationString', 'getCVTerm', 'getCVTerms', 'getColumn', 'getConstant', 'getCreatedDate', 'getDerivedUnitDefinition', 'getDisabledPlugin', 'getElementByMetaId', 'getElementBySId', 'getElementFromPluginsByMetaId', 'getElementFromPluginsBySId', 'getElementName', 'getId', 'getIdAttribute', 'getLevel', 'getLine', 'getListOfAllElements', 'getListOfAllElementsFromPlugins', 'getMetaId', 'getModel', 'getModelHistory', 'getModifiedDate', 'getName', 'getNamespaces', 'getNotes', 'getNotesString', 'getNumCVTerms', 'getNumDisabledPlugins', 'getNumModifiedDates', 'getNumPlugins', 'getPackageCoreVersion', 'getPackageName', 'getPackageVersion', 'getParentSBMLObject', 'getPlugin', 'getPrefix', 'getResourceBiologicalQualifier', 'getResourceModelQualifier', 'getSBMLDocument', 'getSBMLNamespaces', 'getSBOTerm', 'getSBOTermAsURL', 'getSBOTermID', 'getTypeCode', 'getURI', 'getUnits', 'getValue', 'getVersion', 'hasNonstandardIdentifierBeginningWith', 'hasOptionalAttributes', 'hasOptionalElements', 'hasRequiredAttributes', 'hasRequiredElements', 'hasValidLevelVersionNamespaceCombination', 'id', 'id_attribute', 'initDefaults', 'isPackageEnabled', 'isPackageURIEnabled', 'isPkgEnabled', 'isPkgURIEnabled', 'isSetAnnotation', 'isSetConstant', 'isSetCreatedDate', 'isSetId', 'isSetIdAttribute', 'isSetMetaId', 'isSetModelHistory', 'isSetModifiedDate', 'isSetName', 'isSetNotes', 'isSetSBOTerm', 'isSetUnits', 'isSetUserData', 'isSetValue', 'level', 'line', 'matchesRequiredSBMLNamespacesForAddition', 'matchesSBMLNamespaces', 'meta_id', 'model', 'multiplyAssignmentsToSIdByFunction', 'name', 'namespaces', 'notes', 'notes_string', 'num_cv_terms', 'num_disabled_plugins', 'num_modified_dates', 'num_plugins', 'package_core_version', 'package_name', 'package_version', 'prefix', 'prependStringToAllIdentifiers', 'read', 'removeDuplicateAnnotations', 'removeFromParentAndDelete', 'removeTopLevelAnnotationElement', 'renameMetaIdRefs', 'renameSIdRefs', 'renameUnitSIdRefs', 'replaceSIDWithFunction', 'replaceTopLevelAnnotationElement', 'sbml_namespaces', 'sbml_namespaces_and_own', 'sbo_term', 'sbo_term_as_url', 'sbo_term_id', 'setAnnotation', 'setCalculatingUnits', 'setConstant', 'setCreatedDate', 'setId', 'setIdAttribute', 'setMetaId', 'setModelHistory', 'setName', 'setNamespaces', 'setNotes', 'setSBMLNamespacesAndOwn', 'setSBOTerm', 'setUnits', 'setValue', 'this', 'thisown', 'toSBML', 'toXMLNode', 'transformIdentifiers', 'type_code', 'units', 'unsetAnnotation', 'unsetCVTerms', 'unsetConstant', 'unsetCreatedDate', 'unsetId', 'unsetIdAttribute', 'unsetMetaId', 'unsetModelHistory', 'unsetModifiedDates', 'unsetName', 'unsetNotes', 'unsetSBOTerm', 'unsetUnits', 'unsetUserData', 'unsetValue', 'updateSBMLNamespace', 'uri', 'value', 'version', 'write', 'writeExtensionElements']\n", + "0.084\n", + "degradation constant 1\n", + "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'addCVTerm', 'addModifiedDate', 'all_elements', 'all_elements_from_plugins', 'annotation', 'annotation_string', 'appendAnnotation', 'appendNotes', 'calculating_units', 'checkCompatibility', 'checkMathMLNamespace', 'clone', 'column', 'connectToChild', 'connectToParent', 'constant', 'containsUndeclaredUnits', 'cv_terms', 'deleteDisabledPlugins', 'derived_unit_definition', 'disablePackage', 'divideAssignmentsToSIdByFunction', 'element_name', 'enablePackage', 'enablePackageInternal', 'getAncestorOfType', 'getAnnotation', 'getAnnotationString', 'getCVTerm', 'getCVTerms', 'getColumn', 'getConstant', 'getCreatedDate', 'getDerivedUnitDefinition', 'getDisabledPlugin', 'getElementByMetaId', 'getElementBySId', 'getElementFromPluginsByMetaId', 'getElementFromPluginsBySId', 'getElementName', 'getId', 'getIdAttribute', 'getLevel', 'getLine', 'getListOfAllElements', 'getListOfAllElementsFromPlugins', 'getMetaId', 'getModel', 'getModelHistory', 'getModifiedDate', 'getName', 'getNamespaces', 'getNotes', 'getNotesString', 'getNumCVTerms', 'getNumDisabledPlugins', 'getNumModifiedDates', 'getNumPlugins', 'getPackageCoreVersion', 'getPackageName', 'getPackageVersion', 'getParentSBMLObject', 'getPlugin', 'getPrefix', 'getResourceBiologicalQualifier', 'getResourceModelQualifier', 'getSBMLDocument', 'getSBMLNamespaces', 'getSBOTerm', 'getSBOTermAsURL', 'getSBOTermID', 'getTypeCode', 'getURI', 'getUnits', 'getValue', 'getVersion', 'hasNonstandardIdentifierBeginningWith', 'hasOptionalAttributes', 'hasOptionalElements', 'hasRequiredAttributes', 'hasRequiredElements', 'hasValidLevelVersionNamespaceCombination', 'id', 'id_attribute', 'initDefaults', 'isPackageEnabled', 'isPackageURIEnabled', 'isPkgEnabled', 'isPkgURIEnabled', 'isSetAnnotation', 'isSetConstant', 'isSetCreatedDate', 'isSetId', 'isSetIdAttribute', 'isSetMetaId', 'isSetModelHistory', 'isSetModifiedDate', 'isSetName', 'isSetNotes', 'isSetSBOTerm', 'isSetUnits', 'isSetUserData', 'isSetValue', 'level', 'line', 'matchesRequiredSBMLNamespacesForAddition', 'matchesSBMLNamespaces', 'meta_id', 'model', 'multiplyAssignmentsToSIdByFunction', 'name', 'namespaces', 'notes', 'notes_string', 'num_cv_terms', 'num_disabled_plugins', 'num_modified_dates', 'num_plugins', 'package_core_version', 'package_name', 'package_version', 'prefix', 'prependStringToAllIdentifiers', 'read', 'removeDuplicateAnnotations', 'removeFromParentAndDelete', 'removeTopLevelAnnotationElement', 'renameMetaIdRefs', 'renameSIdRefs', 'renameUnitSIdRefs', 'replaceSIDWithFunction', 'replaceTopLevelAnnotationElement', 'sbml_namespaces', 'sbml_namespaces_and_own', 'sbo_term', 'sbo_term_as_url', 'sbo_term_id', 'setAnnotation', 'setCalculatingUnits', 'setConstant', 'setCreatedDate', 'setId', 'setIdAttribute', 'setMetaId', 'setModelHistory', 'setName', 'setNamespaces', 'setNotes', 'setSBMLNamespacesAndOwn', 'setSBOTerm', 'setUnits', 'setValue', 'this', 'thisown', 'toSBML', 'toXMLNode', 'transformIdentifiers', 'type_code', 'units', 'unsetAnnotation', 'unsetCVTerms', 'unsetConstant', 'unsetCreatedDate', 'unsetId', 'unsetIdAttribute', 'unsetMetaId', 'unsetModelHistory', 'unsetModifiedDates', 'unsetName', 'unsetNotes', 'unsetSBOTerm', 'unsetUnits', 'unsetUserData', 'unsetValue', 'updateSBMLNamespace', 'uri', 'value', 'version', 'write', 'writeExtensionElements']\n", + "0.032\n", + "degradation constant 2\n", + "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'addCVTerm', 'addModifiedDate', 'all_elements', 'all_elements_from_plugins', 'annotation', 'annotation_string', 'appendAnnotation', 'appendNotes', 'calculating_units', 'checkCompatibility', 'checkMathMLNamespace', 'clone', 'column', 'connectToChild', 'connectToParent', 'constant', 'containsUndeclaredUnits', 'cv_terms', 'deleteDisabledPlugins', 'derived_unit_definition', 'disablePackage', 'divideAssignmentsToSIdByFunction', 'element_name', 'enablePackage', 'enablePackageInternal', 'getAncestorOfType', 'getAnnotation', 'getAnnotationString', 'getCVTerm', 'getCVTerms', 'getColumn', 'getConstant', 'getCreatedDate', 'getDerivedUnitDefinition', 'getDisabledPlugin', 'getElementByMetaId', 'getElementBySId', 'getElementFromPluginsByMetaId', 'getElementFromPluginsBySId', 'getElementName', 'getId', 'getIdAttribute', 'getLevel', 'getLine', 'getListOfAllElements', 'getListOfAllElementsFromPlugins', 'getMetaId', 'getModel', 'getModelHistory', 'getModifiedDate', 'getName', 'getNamespaces', 'getNotes', 'getNotesString', 'getNumCVTerms', 'getNumDisabledPlugins', 'getNumModifiedDates', 'getNumPlugins', 'getPackageCoreVersion', 'getPackageName', 'getPackageVersion', 'getParentSBMLObject', 'getPlugin', 'getPrefix', 'getResourceBiologicalQualifier', 'getResourceModelQualifier', 'getSBMLDocument', 'getSBMLNamespaces', 'getSBOTerm', 'getSBOTermAsURL', 'getSBOTermID', 'getTypeCode', 'getURI', 'getUnits', 'getValue', 'getVersion', 'hasNonstandardIdentifierBeginningWith', 'hasOptionalAttributes', 'hasOptionalElements', 'hasRequiredAttributes', 'hasRequiredElements', 'hasValidLevelVersionNamespaceCombination', 'id', 'id_attribute', 'initDefaults', 'isPackageEnabled', 'isPackageURIEnabled', 'isPkgEnabled', 'isPkgURIEnabled', 'isSetAnnotation', 'isSetConstant', 'isSetCreatedDate', 'isSetId', 'isSetIdAttribute', 'isSetMetaId', 'isSetModelHistory', 'isSetModifiedDate', 'isSetName', 'isSetNotes', 'isSetSBOTerm', 'isSetUnits', 'isSetUserData', 'isSetValue', 'level', 'line', 'matchesRequiredSBMLNamespacesForAddition', 'matchesSBMLNamespaces', 'meta_id', 'model', 'multiplyAssignmentsToSIdByFunction', 'name', 'namespaces', 'notes', 'notes_string', 'num_cv_terms', 'num_disabled_plugins', 'num_modified_dates', 'num_plugins', 'package_core_version', 'package_name', 'package_version', 'prefix', 'prependStringToAllIdentifiers', 'read', 'removeDuplicateAnnotations', 'removeFromParentAndDelete', 'removeTopLevelAnnotationElement', 'renameMetaIdRefs', 'renameSIdRefs', 'renameUnitSIdRefs', 'replaceSIDWithFunction', 'replaceTopLevelAnnotationElement', 'sbml_namespaces', 'sbml_namespaces_and_own', 'sbo_term', 'sbo_term_as_url', 'sbo_term_id', 'setAnnotation', 'setCalculatingUnits', 'setConstant', 'setCreatedDate', 'setId', 'setIdAttribute', 'setMetaId', 'setModelHistory', 'setName', 'setNamespaces', 'setNotes', 'setSBMLNamespacesAndOwn', 'setSBOTerm', 'setUnits', 'setValue', 'this', 'thisown', 'toSBML', 'toXMLNode', 'transformIdentifiers', 'type_code', 'units', 'unsetAnnotation', 'unsetCVTerms', 'unsetConstant', 'unsetCreatedDate', 'unsetId', 'unsetIdAttribute', 'unsetMetaId', 'unsetModelHistory', 'unsetModifiedDates', 'unsetName', 'unsetNotes', 'unsetSBOTerm', 'unsetUnits', 'unsetUserData', 'unsetValue', 'updateSBMLNamespace', 'uri', 'value', 'version', 'write', 'writeExtensionElements']\n", + "2.0\n", + "hill cooperativity\n" + ] + } + ], + "source": [ + "for m in model_parameter_objects:\n", + " print(dir(m))\n", + " print(m.getValue())\n", + " print(m.getName())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cafce19b29c528e", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model_parameter_objects = sbml_model.getListOfParameters()\n", + "model_parameters_list = [param.getName() for param in model_parameter_objects]\n", + "model_parameters_values = [param.getValue() for param in model_parameter_objects]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "8402c0d763be61b7", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:17:10.349346Z", + "start_time": "2024-05-03T19:17:10.310003Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__metaclass__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__parent_ref__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__swig_destroy__',\n", + " '__weakref__',\n", + " 'addCVTerm',\n", + " 'addCompartment',\n", + " 'addCompartmentType',\n", + " 'addConstantAttribute',\n", + " 'addConstraint',\n", + " 'addDefinitionsForDefaultUnits',\n", + " 'addEvent',\n", + " 'addFunctionDefinition',\n", + " 'addInitialAssignment',\n", + " 'addModifiedDate',\n", + " 'addModifiers',\n", + " 'addParameter',\n", + " 'addReaction',\n", + " 'addRule',\n", + " 'addSpecies',\n", + " 'addSpeciesType',\n", + " 'addUnitDefinition',\n", + " 'all_element_id_list',\n", + " 'all_element_meta_id_list',\n", + " 'all_elements',\n", + " 'all_elements_from_plugins',\n", + " 'annotation',\n", + " 'annotation_string',\n", + " 'appendAnnotation',\n", + " 'appendFrom',\n", + " 'appendNotes',\n", + " 'area_units',\n", + " 'assignRequiredValues',\n", + " 'checkCompatibility',\n", + " 'checkMathMLNamespace',\n", + " 'clearAllElementIdList',\n", + " 'clearAllElementMetaIdList',\n", + " 'clone',\n", + " 'column',\n", + " 'compartment_types',\n", + " 'compartments',\n", + " 'connectToChild',\n", + " 'connectToParent',\n", + " 'constraints',\n", + " 'containsUndeclaredUnits',\n", + " 'conversion_factor',\n", + " 'convertFromL3V2',\n", + " 'convertL1ToL2',\n", + " 'convertL1ToL3',\n", + " 'convertL2ToL1',\n", + " 'convertL2ToL3',\n", + " 'convertL3ToL1',\n", + " 'convertL3ToL2',\n", + " 'convertParametersToLocals',\n", + " 'convertStoichiometryMath',\n", + " 'createAlgebraicRule',\n", + " 'createAssignmentRule',\n", + " 'createCompartment',\n", + " 'createCompartmentType',\n", + " 'createConstraint',\n", + " 'createDelay',\n", + " 'createEvent',\n", + " 'createEventAssignment',\n", + " 'createFunctionDefinition',\n", + " 'createInitialAssignment',\n", + " 'createKineticLaw',\n", + " 'createKineticLawLocalParameter',\n", + " 'createKineticLawParameter',\n", + " 'createModifier',\n", + " 'createParameter',\n", + " 'createProduct',\n", + " 'createRateRule',\n", + " 'createReactant',\n", + " 'createReaction',\n", + " 'createSpecies',\n", + " 'createSpeciesType',\n", + " 'createTrigger',\n", + " 'createUnit',\n", + " 'createUnitDefinition',\n", + " 'cv_terms',\n", + " 'dealWithDefaultValues',\n", + " 'dealWithEvents',\n", + " 'dealWithFast',\n", + " 'dealWithL3Fast',\n", + " 'dealWithModelUnits',\n", + " 'dealWithStoichiometry',\n", + " 'deleteDisabledPlugins',\n", + " 'derived_unit_definition',\n", + " 'disablePackage',\n", + " 'divideAssignmentsToSIdByFunction',\n", + " 'element_name',\n", + " 'enablePackage',\n", + " 'enablePackageInternal',\n", + " 'events',\n", + " 'extent_units',\n", + " 'function_definitions',\n", + " 'getAllElementIdList',\n", + " 'getAllElementMetaIdList',\n", + " 'getAncestorOfType',\n", + " 'getAnnotation',\n", + " 'getAnnotationString',\n", + " 'getAreaUnits',\n", + " 'getAssignmentRule',\n", + " 'getAssignmentRuleByVariable',\n", + " 'getCVTerm',\n", + " 'getCVTerms',\n", + " 'getColumn',\n", + " 'getCompartment',\n", + " 'getCompartmentType',\n", + " 'getConstraint',\n", + " 'getConversionFactor',\n", + " 'getCreatedDate',\n", + " 'getDerivedUnitDefinition',\n", + " 'getDisabledPlugin',\n", + " 'getElementByMetaId',\n", + " 'getElementBySId',\n", + " 'getElementFromPluginsByMetaId',\n", + " 'getElementFromPluginsBySId',\n", + " 'getElementName',\n", + " 'getEvent',\n", + " 'getExtentUnits',\n", + " 'getFormulaUnitsDataForAssignment',\n", + " 'getFormulaUnitsDataForVariable',\n", + " 'getFunctionDefinition',\n", + " 'getId',\n", + " 'getIdAttribute',\n", + " 'getInitialAssignment',\n", + " 'getInitialAssignmentBySymbol',\n", + " 'getLengthUnits',\n", + " 'getLevel',\n", + " 'getLine',\n", + " 'getListOfAllElements',\n", + " 'getListOfAllElementsFromPlugins',\n", + " 'getListOfCompartmentTypes',\n", + " 'getListOfCompartments',\n", + " 'getListOfConstraints',\n", + " 'getListOfEvents',\n", + " 'getListOfFunctionDefinitions',\n", + " 'getListOfInitialAssignments',\n", + " 'getListOfParameters',\n", + " 'getListOfReactions',\n", + " 'getListOfRules',\n", + " 'getListOfSpecies',\n", + " 'getListOfSpeciesTypes',\n", + " 'getListOfUnitDefinitions',\n", + " 'getMetaId',\n", + " 'getModel',\n", + " 'getModelHistory',\n", + " 'getModifiedDate',\n", + " 'getModifierSpeciesReference',\n", + " 'getName',\n", + " 'getNamespaces',\n", + " 'getNotes',\n", + " 'getNotesString',\n", + " 'getNumCVTerms',\n", + " 'getNumCompartmentTypes',\n", + " 'getNumCompartments',\n", + " 'getNumConstraints',\n", + " 'getNumDisabledPlugins',\n", + " 'getNumEvents',\n", + " 'getNumFunctionDefinitions',\n", + " 'getNumInitialAssignments',\n", + " 'getNumModifiedDates',\n", + " 'getNumParameters',\n", + " 'getNumPlugins',\n", + " 'getNumReactions',\n", + " 'getNumRules',\n", + " 'getNumSpecies',\n", + " 'getNumSpeciesTypes',\n", + " 'getNumSpeciesWithBoundaryCondition',\n", + " 'getNumUnitDefinitions',\n", + " 'getPackageCoreVersion',\n", + " 'getPackageName',\n", + " 'getPackageVersion',\n", + " 'getParameter',\n", + " 'getParentSBMLObject',\n", + " 'getPlugin',\n", + " 'getPrefix',\n", + " 'getRateRule',\n", + " 'getRateRuleByVariable',\n", + " 'getReaction',\n", + " 'getResourceBiologicalQualifier',\n", + " 'getResourceModelQualifier',\n", + " 'getRule',\n", + " 'getRuleByVariable',\n", + " 'getSBMLDocument',\n", + " 'getSBMLNamespaces',\n", + " 'getSBOTerm',\n", + " 'getSBOTermAsURL',\n", + " 'getSBOTermID',\n", + " 'getSpecies',\n", + " 'getSpeciesReference',\n", + " 'getSpeciesType',\n", + " 'getSubstanceUnits',\n", + " 'getTimeUnits',\n", + " 'getTypeCode',\n", + " 'getURI',\n", + " 'getUnitDefinition',\n", + " 'getVersion',\n", + " 'getVolumeUnits',\n", + " 'hasNonstandardIdentifierBeginningWith',\n", + " 'hasOptionalAttributes',\n", + " 'hasOptionalElements',\n", + " 'hasRequiredAttributes',\n", + " 'hasRequiredElements',\n", + " 'hasValidLevelVersionNamespaceCombination',\n", + " 'id',\n", + " 'id_attribute',\n", + " 'initial_assignments',\n", + " 'isPackageEnabled',\n", + " 'isPackageURIEnabled',\n", + " 'isPkgEnabled',\n", + " 'isPkgURIEnabled',\n", + " 'isPopulatedAllElementIdList',\n", + " 'isPopulatedAllElementMetaIdList',\n", + " 'isPopulatedListFormulaUnitsData',\n", + " 'isSetAnnotation',\n", + " 'isSetAreaUnits',\n", + " 'isSetConversionFactor',\n", + " 'isSetCreatedDate',\n", + " 'isSetExtentUnits',\n", + " 'isSetId',\n", + " 'isSetIdAttribute',\n", + " 'isSetLengthUnits',\n", + " 'isSetMetaId',\n", + " 'isSetModelHistory',\n", + " 'isSetModifiedDate',\n", + " 'isSetName',\n", + " 'isSetNotes',\n", + " 'isSetSBOTerm',\n", + " 'isSetSubstanceUnits',\n", + " 'isSetTimeUnits',\n", + " 'isSetUserData',\n", + " 'isSetVolumeUnits',\n", + " 'length_units',\n", + " 'level',\n", + " 'line',\n", + " 'matchesRequiredSBMLNamespacesForAddition',\n", + " 'matchesSBMLNamespaces',\n", + " 'meta_id',\n", + " 'model',\n", + " 'multiplyAssignmentsToSIdByFunction',\n", + " 'name',\n", + " 'namespaces',\n", + " 'notes',\n", + " 'notes_string',\n", + " 'num_compartment_types',\n", + " 'num_compartments',\n", + " 'num_constraints',\n", + " 'num_cv_terms',\n", + " 'num_disabled_plugins',\n", + " 'num_events',\n", + " 'num_function_definitions',\n", + " 'num_initial_assignments',\n", + " 'num_modified_dates',\n", + " 'num_parameters',\n", + " 'num_plugins',\n", + " 'num_reactions',\n", + " 'num_rules',\n", + " 'num_species',\n", + " 'num_species_types',\n", + " 'num_species_with_boundary_condition',\n", + " 'num_unit_definitions',\n", + " 'package_core_version',\n", + " 'package_name',\n", + " 'package_version',\n", + " 'parameters',\n", + " 'populateAllElementIdList',\n", + " 'populateAllElementMetaIdList',\n", + " 'populateListFormulaUnitsData',\n", + " 'prefix',\n", + " 'prependStringToAllIdentifiers',\n", + " 'reactions',\n", + " 'read',\n", + " 'removeCompartment',\n", + " 'removeCompartmentType',\n", + " 'removeCompartmentTypes',\n", + " 'removeConstraint',\n", + " 'removeDuplicateAnnotations',\n", + " 'removeEvent',\n", + " 'removeFromParentAndDelete',\n", + " 'removeFunctionDefinition',\n", + " 'removeInitialAssignment',\n", + " 'removeListFormulaUnitsData',\n", + " 'removeParameter',\n", + " 'removeParameterRuleUnits',\n", + " 'removeReaction',\n", + " 'removeRule',\n", + " 'removeRuleByVariable',\n", + " 'removeSpecies',\n", + " 'removeSpeciesType',\n", + " 'removeSpeciesTypes',\n", + " 'removeTopLevelAnnotationElement',\n", + " 'removeUnitDefinition',\n", + " 'renameAllIds',\n", + " 'renameIDs',\n", + " 'renameMetaIdRefs',\n", + " 'renameSIdRefs',\n", + " 'renameUnitSIdRefs',\n", + " 'replaceSIDWithFunction',\n", + " 'replaceTopLevelAnnotationElement',\n", + " 'rules',\n", + " 'sbml_namespaces',\n", + " 'sbml_namespaces_and_own',\n", + " 'sbo_term',\n", + " 'sbo_term_as_url',\n", + " 'sbo_term_id',\n", + " 'setAnnotation',\n", + " 'setAreaUnits',\n", + " 'setConversionFactor',\n", + " 'setCreatedDate',\n", + " 'setExtentUnits',\n", + " 'setId',\n", + " 'setIdAttribute',\n", + " 'setLengthUnits',\n", + " 'setMetaId',\n", + " 'setModelHistory',\n", + " 'setName',\n", + " 'setNamespaces',\n", + " 'setNotes',\n", + " 'setSBMLNamespacesAndOwn',\n", + " 'setSBOTerm',\n", + " 'setSpatialDimensions',\n", + " 'setSpeciesReferenceConstantValueAndStoichiometry',\n", + " 'setSubstanceUnits',\n", + " 'setTimeUnits',\n", + " 'setVolumeUnits',\n", + " 'spatial_dimensions',\n", + " 'species',\n", + " 'species_reference_constant_value_and_stoichiometry',\n", + " 'species_types',\n", + " 'substance_units',\n", + " 'this',\n", + " 'thisown',\n", + " 'time_units',\n", + " 'toSBML',\n", + " 'toXMLNode',\n", + " 'transformIdentifiers',\n", + " 'type_code',\n", + " 'unit_definitions',\n", + " 'unsetAnnotation',\n", + " 'unsetAreaUnits',\n", + " 'unsetCVTerms',\n", + " 'unsetConversionFactor',\n", + " 'unsetCreatedDate',\n", + " 'unsetExtentUnits',\n", + " 'unsetId',\n", + " 'unsetIdAttribute',\n", + " 'unsetLengthUnits',\n", + " 'unsetMetaId',\n", + " 'unsetModelHistory',\n", + " 'unsetModifiedDates',\n", + " 'unsetName',\n", + " 'unsetNotes',\n", + " 'unsetSBOTerm',\n", + " 'unsetSubstanceUnits',\n", + " 'unsetTimeUnits',\n", + " 'unsetUserData',\n", + " 'unsetVolumeUnits',\n", + " 'updateSBMLNamespace',\n", + " 'uri',\n", + " 'version',\n", + " 'volume_units',\n", + " 'write',\n", + " 'writeExtensionElements']" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(sbml_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "7bbc34d43e00e3f3", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:23:17.142713Z", + "start_time": "2024-05-03T19:23:17.125483Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['cleavage of plasminogen',\n", + " 'activation of urokinase-type plasminogen activator',\n", + " 'activation of plasmin',\n", + " 'degradation of single intact chain urokinase-type plasminogen activator',\n", + " 'degradation of plasminogen',\n", + " 'degradation of plasmin',\n", + " 'degradation of two-chain urokinase type plasminogen activator',\n", + " 'reversible plasmin bonding x',\n", + " 'catalytic reaction of x-plasmin',\n", + " 'degradation of x',\n", + " 'degradation of x-plasmin',\n", + " 'synthesis of single intact chain urokinase-type plasminogen activator',\n", + " 'synthesis of plasminogen',\n", + " 'synthesis of x']" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reaction_objects = sbml_model.reactions\n", + "reaction_list = [reaction.getName() for reaction in reaction_objects]\n", + "\n", + "reaction_list" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "9d681d8a025d8470", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:20:04.853940Z", + "start_time": "2024-05-03T19:20:04.833097Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__metaclass__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__swig_destroy__',\n", + " '__weakref__',\n", + " 'addCVTerm',\n", + " 'addModifiedDate',\n", + " 'addModifier',\n", + " 'addProduct',\n", + " 'addReactant',\n", + " 'all_elements',\n", + " 'all_elements_from_plugins',\n", + " 'annotation',\n", + " 'annotation_string',\n", + " 'appendAnnotation',\n", + " 'appendNotes',\n", + " 'checkCompatibility',\n", + " 'checkMathMLNamespace',\n", + " 'clone',\n", + " 'column',\n", + " 'compartment',\n", + " 'connectToChild',\n", + " 'connectToParent',\n", + " 'containsUndeclaredUnits',\n", + " 'createKineticLaw',\n", + " 'createModifier',\n", + " 'createProduct',\n", + " 'createReactant',\n", + " 'cv_terms',\n", + " 'deleteDisabledPlugins',\n", + " 'derived_unit_definition',\n", + " 'disablePackage',\n", + " 'divideAssignmentsToSIdByFunction',\n", + " 'element_name',\n", + " 'enablePackage',\n", + " 'enablePackageInternal',\n", + " 'fast',\n", + " 'getAncestorOfType',\n", + " 'getAnnotation',\n", + " 'getAnnotationString',\n", + " 'getCVTerm',\n", + " 'getCVTerms',\n", + " 'getColumn',\n", + " 'getCompartment',\n", + " 'getCreatedDate',\n", + " 'getDerivedUnitDefinition',\n", + " 'getDisabledPlugin',\n", + " 'getElementByMetaId',\n", + " 'getElementBySId',\n", + " 'getElementFromPluginsByMetaId',\n", + " 'getElementFromPluginsBySId',\n", + " 'getElementName',\n", + " 'getFast',\n", + " 'getId',\n", + " 'getIdAttribute',\n", + " 'getKineticLaw',\n", + " 'getLevel',\n", + " 'getLine',\n", + " 'getListOfAllElements',\n", + " 'getListOfAllElementsFromPlugins',\n", + " 'getListOfModifiers',\n", + " 'getListOfProducts',\n", + " 'getListOfReactants',\n", + " 'getMetaId',\n", + " 'getModel',\n", + " 'getModelHistory',\n", + " 'getModifiedDate',\n", + " 'getModifier',\n", + " 'getName',\n", + " 'getNamespaces',\n", + " 'getNotes',\n", + " 'getNotesString',\n", + " 'getNumCVTerms',\n", + " 'getNumDisabledPlugins',\n", + " 'getNumModifiedDates',\n", + " 'getNumModifiers',\n", + " 'getNumPlugins',\n", + " 'getNumProducts',\n", + " 'getNumReactants',\n", + " 'getPackageCoreVersion',\n", + " 'getPackageName',\n", + " 'getPackageVersion',\n", + " 'getParentSBMLObject',\n", + " 'getPlugin',\n", + " 'getPrefix',\n", + " 'getProduct',\n", + " 'getReactant',\n", + " 'getResourceBiologicalQualifier',\n", + " 'getResourceModelQualifier',\n", + " 'getReversible',\n", + " 'getSBMLDocument',\n", + " 'getSBMLNamespaces',\n", + " 'getSBOTerm',\n", + " 'getSBOTermAsURL',\n", + " 'getSBOTermID',\n", + " 'getTypeCode',\n", + " 'getURI',\n", + " 'getVersion',\n", + " 'hasNonstandardIdentifierBeginningWith',\n", + " 'hasOptionalAttributes',\n", + " 'hasOptionalElements',\n", + " 'hasRequiredAttributes',\n", + " 'hasRequiredElements',\n", + " 'hasValidLevelVersionNamespaceCombination',\n", + " 'id',\n", + " 'id_attribute',\n", + " 'initDefaults',\n", + " 'isPackageEnabled',\n", + " 'isPackageURIEnabled',\n", + " 'isPkgEnabled',\n", + " 'isPkgURIEnabled',\n", + " 'isSetAnnotation',\n", + " 'isSetCompartment',\n", + " 'isSetCreatedDate',\n", + " 'isSetFast',\n", + " 'isSetId',\n", + " 'isSetIdAttribute',\n", + " 'isSetKineticLaw',\n", + " 'isSetMetaId',\n", + " 'isSetModelHistory',\n", + " 'isSetModifiedDate',\n", + " 'isSetName',\n", + " 'isSetNotes',\n", + " 'isSetReversible',\n", + " 'isSetSBOTerm',\n", + " 'isSetUserData',\n", + " 'level',\n", + " 'line',\n", + " 'matchesRequiredSBMLNamespacesForAddition',\n", + " 'matchesSBMLNamespaces',\n", + " 'meta_id',\n", + " 'model',\n", + " 'modifiers',\n", + " 'multiplyAssignmentsToSIdByFunction',\n", + " 'name',\n", + " 'namespaces',\n", + " 'notes',\n", + " 'notes_string',\n", + " 'num_cv_terms',\n", + " 'num_disabled_plugins',\n", + " 'num_modified_dates',\n", + " 'num_modifiers',\n", + " 'num_plugins',\n", + " 'num_products',\n", + " 'num_reactants',\n", + " 'package_core_version',\n", + " 'package_name',\n", + " 'package_version',\n", + " 'prefix',\n", + " 'prependStringToAllIdentifiers',\n", + " 'products',\n", + " 'reactants',\n", + " 'read',\n", + " 'removeDuplicateAnnotations',\n", + " 'removeFromParentAndDelete',\n", + " 'removeModifier',\n", + " 'removeProduct',\n", + " 'removeReactant',\n", + " 'removeTopLevelAnnotationElement',\n", + " 'renameMetaIdRefs',\n", + " 'renameSIdRefs',\n", + " 'renameUnitSIdRefs',\n", + " 'replaceSIDWithFunction',\n", + " 'replaceTopLevelAnnotationElement',\n", + " 'reversible',\n", + " 'sbml_namespaces',\n", + " 'sbml_namespaces_and_own',\n", + " 'sbo_term',\n", + " 'sbo_term_as_url',\n", + " 'sbo_term_id',\n", + " 'setAnnotation',\n", + " 'setCompartment',\n", + " 'setCreatedDate',\n", + " 'setFast',\n", + " 'setId',\n", + " 'setIdAttribute',\n", + " 'setKineticLaw',\n", + " 'setMetaId',\n", + " 'setModelHistory',\n", + " 'setName',\n", + " 'setNamespaces',\n", + " 'setNotes',\n", + " 'setReversible',\n", + " 'setSBMLNamespacesAndOwn',\n", + " 'setSBOTerm',\n", + " 'this',\n", + " 'thisown',\n", + " 'toSBML',\n", + " 'toXMLNode',\n", + " 'transformIdentifiers',\n", + " 'type_code',\n", + " 'unsetAnnotation',\n", + " 'unsetCVTerms',\n", + " 'unsetCompartment',\n", + " 'unsetCreatedDate',\n", + " 'unsetFast',\n", + " 'unsetId',\n", + " 'unsetIdAttribute',\n", + " 'unsetKineticLaw',\n", + " 'unsetMetaId',\n", + " 'unsetModelHistory',\n", + " 'unsetModifiedDates',\n", + " 'unsetName',\n", + " 'unsetNotes',\n", + " 'unsetReversible',\n", + " 'unsetSBOTerm',\n", + " 'unsetUserData',\n", + " 'updateSBMLNamespace',\n", + " 'uri',\n", + " 'version',\n", + " 'write',\n", + " 'writeExtensionElements']" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(reaction_objects[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "9192ee2293afe983", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T19:22:35.598462Z", + "start_time": "2024-05-03T19:22:35.540298Z" + }, + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Wrong number or type of arguments for overloaded function 'Reaction_getProduct'.\n Possible C/C++ prototypes are:\n Reaction::getProduct(unsigned int) const\n Reaction::getProduct(unsigned int)\n Reaction::getProduct(std::string const &) const\n Reaction::getProduct(std::string const &)\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/5d/d79js_zj5b7dwk7h0sr8m23c0000gn/T/ipykernel_66466/3781945296.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mreaction_objects\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetProduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-ECOqdsTs-py3.10/lib/python3.10/site-packages/libsbml/__init__.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 32429\u001b[0m \u001b[0mReturns\u001b[0m \u001b[0ma\u001b[0m \u001b[0mSpeciesReference\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m'None'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mno\u001b[0m \u001b[0mspecies\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mthe\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32430\u001b[0m \u001b[0mgiven\u001b[0m \u001b[0midentifier\u001b[0m \u001b[0;34m'species'\u001b[0m \u001b[0mappears\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0ma\u001b[0m \u001b[0mproduct\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthis\u001b[0m \u001b[0mReaction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32431\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32432\u001b[0m \"\"\"\n\u001b[0;32m> 32433\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_libsbml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReaction_getProduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: Wrong number or type of arguments for overloaded function 'Reaction_getProduct'.\n Possible C/C++ prototypes are:\n Reaction::getProduct(unsigned int) const\n Reaction::getProduct(unsigned int)\n Reaction::getProduct(std::string const &) const\n Reaction::getProduct(std::string const &)\n" + ] + } + ], + "source": [ + "reaction_objects[0].getProduct()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c74a7b2c264ae9c4", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T21:50:49.720391Z", + "start_time": "2024-05-03T21:50:49.673946Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__metaclass__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__parent_ref__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__swig_destroy__',\n", + " '__weakref__',\n", + " 'addCVTerm',\n", + " 'addCompartment',\n", + " 'addCompartmentType',\n", + " 'addConstantAttribute',\n", + " 'addConstraint',\n", + " 'addDefinitionsForDefaultUnits',\n", + " 'addEvent',\n", + " 'addFunctionDefinition',\n", + " 'addInitialAssignment',\n", + " 'addModifiedDate',\n", + " 'addModifiers',\n", + " 'addParameter',\n", + " 'addReaction',\n", + " 'addRule',\n", + " 'addSpecies',\n", + " 'addSpeciesType',\n", + " 'addUnitDefinition',\n", + " 'all_element_id_list',\n", + " 'all_element_meta_id_list',\n", + " 'all_elements',\n", + " 'all_elements_from_plugins',\n", + " 'annotation',\n", + " 'annotation_string',\n", + " 'appendAnnotation',\n", + " 'appendFrom',\n", + " 'appendNotes',\n", + " 'area_units',\n", + " 'assignRequiredValues',\n", + " 'checkCompatibility',\n", + " 'checkMathMLNamespace',\n", + " 'clearAllElementIdList',\n", + " 'clearAllElementMetaIdList',\n", + " 'clone',\n", + " 'column',\n", + " 'compartment_types',\n", + " 'compartments',\n", + " 'connectToChild',\n", + " 'connectToParent',\n", + " 'constraints',\n", + " 'containsUndeclaredUnits',\n", + " 'conversion_factor',\n", + " 'convertFromL3V2',\n", + " 'convertL1ToL2',\n", + " 'convertL1ToL3',\n", + " 'convertL2ToL1',\n", + " 'convertL2ToL3',\n", + " 'convertL3ToL1',\n", + " 'convertL3ToL2',\n", + " 'convertParametersToLocals',\n", + " 'convertStoichiometryMath',\n", + " 'createAlgebraicRule',\n", + " 'createAssignmentRule',\n", + " 'createCompartment',\n", + " 'createCompartmentType',\n", + " 'createConstraint',\n", + " 'createDelay',\n", + " 'createEvent',\n", + " 'createEventAssignment',\n", + " 'createFunctionDefinition',\n", + " 'createInitialAssignment',\n", + " 'createKineticLaw',\n", + " 'createKineticLawLocalParameter',\n", + " 'createKineticLawParameter',\n", + " 'createModifier',\n", + " 'createParameter',\n", + " 'createProduct',\n", + " 'createRateRule',\n", + " 'createReactant',\n", + " 'createReaction',\n", + " 'createSpecies',\n", + " 'createSpeciesType',\n", + " 'createTrigger',\n", + " 'createUnit',\n", + " 'createUnitDefinition',\n", + " 'cv_terms',\n", + " 'dealWithDefaultValues',\n", + " 'dealWithEvents',\n", + " 'dealWithFast',\n", + " 'dealWithL3Fast',\n", + " 'dealWithModelUnits',\n", + " 'dealWithStoichiometry',\n", + " 'deleteDisabledPlugins',\n", + " 'derived_unit_definition',\n", + " 'disablePackage',\n", + " 'divideAssignmentsToSIdByFunction',\n", + " 'element_name',\n", + " 'enablePackage',\n", + " 'enablePackageInternal',\n", + " 'events',\n", + " 'extent_units',\n", + " 'function_definitions',\n", + " 'getAllElementIdList',\n", + " 'getAllElementMetaIdList',\n", + " 'getAncestorOfType',\n", + " 'getAnnotation',\n", + " 'getAnnotationString',\n", + " 'getAreaUnits',\n", + " 'getAssignmentRule',\n", + " 'getAssignmentRuleByVariable',\n", + " 'getCVTerm',\n", + " 'getCVTerms',\n", + " 'getColumn',\n", + " 'getCompartment',\n", + " 'getCompartmentType',\n", + " 'getConstraint',\n", + " 'getConversionFactor',\n", + " 'getCreatedDate',\n", + " 'getDerivedUnitDefinition',\n", + " 'getDisabledPlugin',\n", + " 'getElementByMetaId',\n", + " 'getElementBySId',\n", + " 'getElementFromPluginsByMetaId',\n", + " 'getElementFromPluginsBySId',\n", + " 'getElementName',\n", + " 'getEvent',\n", + " 'getExtentUnits',\n", + " 'getFormulaUnitsDataForAssignment',\n", + " 'getFormulaUnitsDataForVariable',\n", + " 'getFunctionDefinition',\n", + " 'getId',\n", + " 'getIdAttribute',\n", + " 'getInitialAssignment',\n", + " 'getInitialAssignmentBySymbol',\n", + " 'getLengthUnits',\n", + " 'getLevel',\n", + " 'getLine',\n", + " 'getListOfAllElements',\n", + " 'getListOfAllElementsFromPlugins',\n", + " 'getListOfCompartmentTypes',\n", + " 'getListOfCompartments',\n", + " 'getListOfConstraints',\n", + " 'getListOfEvents',\n", + " 'getListOfFunctionDefinitions',\n", + " 'getListOfInitialAssignments',\n", + " 'getListOfParameters',\n", + " 'getListOfReactions',\n", + " 'getListOfRules',\n", + " 'getListOfSpecies',\n", + " 'getListOfSpeciesTypes',\n", + " 'getListOfUnitDefinitions',\n", + " 'getMetaId',\n", + " 'getModel',\n", + " 'getModelHistory',\n", + " 'getModifiedDate',\n", + " 'getModifierSpeciesReference',\n", + " 'getName',\n", + " 'getNamespaces',\n", + " 'getNotes',\n", + " 'getNotesString',\n", + " 'getNumCVTerms',\n", + " 'getNumCompartmentTypes',\n", + " 'getNumCompartments',\n", + " 'getNumConstraints',\n", + " 'getNumDisabledPlugins',\n", + " 'getNumEvents',\n", + " 'getNumFunctionDefinitions',\n", + " 'getNumInitialAssignments',\n", + " 'getNumModifiedDates',\n", + " 'getNumParameters',\n", + " 'getNumPlugins',\n", + " 'getNumReactions',\n", + " 'getNumRules',\n", + " 'getNumSpecies',\n", + " 'getNumSpeciesTypes',\n", + " 'getNumSpeciesWithBoundaryCondition',\n", + " 'getNumUnitDefinitions',\n", + " 'getPackageCoreVersion',\n", + " 'getPackageName',\n", + " 'getPackageVersion',\n", + " 'getParameter',\n", + " 'getParentSBMLObject',\n", + " 'getPlugin',\n", + " 'getPrefix',\n", + " 'getRateRule',\n", + " 'getRateRuleByVariable',\n", + " 'getReaction',\n", + " 'getResourceBiologicalQualifier',\n", + " 'getResourceModelQualifier',\n", + " 'getRule',\n", + " 'getRuleByVariable',\n", + " 'getSBMLDocument',\n", + " 'getSBMLNamespaces',\n", + " 'getSBOTerm',\n", + " 'getSBOTermAsURL',\n", + " 'getSBOTermID',\n", + " 'getSpecies',\n", + " 'getSpeciesReference',\n", + " 'getSpeciesType',\n", + " 'getSubstanceUnits',\n", + " 'getTimeUnits',\n", + " 'getTypeCode',\n", + " 'getURI',\n", + " 'getUnitDefinition',\n", + " 'getVersion',\n", + " 'getVolumeUnits',\n", + " 'hasNonstandardIdentifierBeginningWith',\n", + " 'hasOptionalAttributes',\n", + " 'hasOptionalElements',\n", + " 'hasRequiredAttributes',\n", + " 'hasRequiredElements',\n", + " 'hasValidLevelVersionNamespaceCombination',\n", + " 'id',\n", + " 'id_attribute',\n", + " 'initial_assignments',\n", + " 'isPackageEnabled',\n", + " 'isPackageURIEnabled',\n", + " 'isPkgEnabled',\n", + " 'isPkgURIEnabled',\n", + " 'isPopulatedAllElementIdList',\n", + " 'isPopulatedAllElementMetaIdList',\n", + " 'isPopulatedListFormulaUnitsData',\n", + " 'isSetAnnotation',\n", + " 'isSetAreaUnits',\n", + " 'isSetConversionFactor',\n", + " 'isSetCreatedDate',\n", + " 'isSetExtentUnits',\n", + " 'isSetId',\n", + " 'isSetIdAttribute',\n", + " 'isSetLengthUnits',\n", + " 'isSetMetaId',\n", + " 'isSetModelHistory',\n", + " 'isSetModifiedDate',\n", + " 'isSetName',\n", + " 'isSetNotes',\n", + " 'isSetSBOTerm',\n", + " 'isSetSubstanceUnits',\n", + " 'isSetTimeUnits',\n", + " 'isSetUserData',\n", + " 'isSetVolumeUnits',\n", + " 'length_units',\n", + " 'level',\n", + " 'line',\n", + " 'matchesRequiredSBMLNamespacesForAddition',\n", + " 'matchesSBMLNamespaces',\n", + " 'meta_id',\n", + " 'model',\n", + " 'multiplyAssignmentsToSIdByFunction',\n", + " 'name',\n", + " 'namespaces',\n", + " 'notes',\n", + " 'notes_string',\n", + " 'num_compartment_types',\n", + " 'num_compartments',\n", + " 'num_constraints',\n", + " 'num_cv_terms',\n", + " 'num_disabled_plugins',\n", + " 'num_events',\n", + " 'num_function_definitions',\n", + " 'num_initial_assignments',\n", + " 'num_modified_dates',\n", + " 'num_parameters',\n", + " 'num_plugins',\n", + " 'num_reactions',\n", + " 'num_rules',\n", + " 'num_species',\n", + " 'num_species_types',\n", + " 'num_species_with_boundary_condition',\n", + " 'num_unit_definitions',\n", + " 'package_core_version',\n", + " 'package_name',\n", + " 'package_version',\n", + " 'parameters',\n", + " 'populateAllElementIdList',\n", + " 'populateAllElementMetaIdList',\n", + " 'populateListFormulaUnitsData',\n", + " 'prefix',\n", + " 'prependStringToAllIdentifiers',\n", + " 'reactions',\n", + " 'read',\n", + " 'removeCompartment',\n", + " 'removeCompartmentType',\n", + " 'removeCompartmentTypes',\n", + " 'removeConstraint',\n", + " 'removeDuplicateAnnotations',\n", + " 'removeEvent',\n", + " 'removeFromParentAndDelete',\n", + " 'removeFunctionDefinition',\n", + " 'removeInitialAssignment',\n", + " 'removeListFormulaUnitsData',\n", + " 'removeParameter',\n", + " 'removeParameterRuleUnits',\n", + " 'removeReaction',\n", + " 'removeRule',\n", + " 'removeRuleByVariable',\n", + " 'removeSpecies',\n", + " 'removeSpeciesType',\n", + " 'removeSpeciesTypes',\n", + " 'removeTopLevelAnnotationElement',\n", + " 'removeUnitDefinition',\n", + " 'renameAllIds',\n", + " 'renameIDs',\n", + " 'renameMetaIdRefs',\n", + " 'renameSIdRefs',\n", + " 'renameUnitSIdRefs',\n", + " 'replaceSIDWithFunction',\n", + " 'replaceTopLevelAnnotationElement',\n", + " 'rules',\n", + " 'sbml_namespaces',\n", + " 'sbml_namespaces_and_own',\n", + " 'sbo_term',\n", + " 'sbo_term_as_url',\n", + " 'sbo_term_id',\n", + " 'setAnnotation',\n", + " 'setAreaUnits',\n", + " 'setConversionFactor',\n", + " 'setCreatedDate',\n", + " 'setExtentUnits',\n", + " 'setId',\n", + " 'setIdAttribute',\n", + " 'setLengthUnits',\n", + " 'setMetaId',\n", + " 'setModelHistory',\n", + " 'setName',\n", + " 'setNamespaces',\n", + " 'setNotes',\n", + " 'setSBMLNamespacesAndOwn',\n", + " 'setSBOTerm',\n", + " 'setSpatialDimensions',\n", + " 'setSpeciesReferenceConstantValueAndStoichiometry',\n", + " 'setSubstanceUnits',\n", + " 'setTimeUnits',\n", + " 'setVolumeUnits',\n", + " 'spatial_dimensions',\n", + " 'species',\n", + " 'species_reference_constant_value_and_stoichiometry',\n", + " 'species_types',\n", + " 'substance_units',\n", + " 'this',\n", + " 'thisown',\n", + " 'time_units',\n", + " 'toSBML',\n", + " 'toXMLNode',\n", + " 'transformIdentifiers',\n", + " 'type_code',\n", + " 'unit_definitions',\n", + " 'unsetAnnotation',\n", + " 'unsetAreaUnits',\n", + " 'unsetCVTerms',\n", + " 'unsetConversionFactor',\n", + " 'unsetCreatedDate',\n", + " 'unsetExtentUnits',\n", + " 'unsetId',\n", + " 'unsetIdAttribute',\n", + " 'unsetLengthUnits',\n", + " 'unsetMetaId',\n", + " 'unsetModelHistory',\n", + " 'unsetModifiedDates',\n", + " 'unsetName',\n", + " 'unsetNotes',\n", + " 'unsetSBOTerm',\n", + " 'unsetSubstanceUnits',\n", + " 'unsetTimeUnits',\n", + " 'unsetUserData',\n", + " 'unsetVolumeUnits',\n", + " 'updateSBMLNamespace',\n", + " 'uri',\n", + " 'version',\n", + " 'volume_units',\n", + " 'write',\n", + " 'writeExtensionElements']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(sbml_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "30922257c0464a58", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:26:17.859028Z", + "start_time": "2024-05-03T23:26:17.850525Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'simple_amici': {'_type': 'process',\n", + " 'address': 'local:copasi',\n", + " 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n", + " 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'model_parameters': ['model_parameters_store'],\n", + " 'time': ['time_store'],\n", + " 'reactions': ['reactions_store']},\n", + " 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'emitter': {'emitter': {'_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n", + " 'time': 'float'}},\n", + " 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n", + " 'time': ['time_store']}}}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from biosimulator_processes.processes.amici_process import AmiciProcess\n", + "\n", + "simulator_to_use = 'amici'\n", + "process_id = 'simple_' + simulator_to_use\n", + "amici_process_document = prepare_single_ode_process_document(\n", + " process_id=process_id,\n", + " simulator_name=simulator_to_use,\n", + " sbml_model_fp=model_fp)\n", + "\n", + "amici_process_document" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "17c9dbaf558104f9", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:26:29.189497Z", + "start_time": "2024-05-03T23:26:29.163427Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "amici_process_config = amici_process_document[process_id]['config']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5378878752b91367", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:26:33.011215Z", + "start_time": "2024-05-03T23:26:32.985412Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amici_process_config" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bdd28fc3edc3de", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:27:37.008645Z", + "start_time": "2024-05-03T23:27:36.904609Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + } + ], + "source": [ + "amici_workflow = Composite(\n", + " config={'state': amici_process_document},\n", + " core=CORE)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b8e2fad5058d741d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:28:51.035180Z", + "start_time": "2024-05-03T23:28:51.020817Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "amici_process: AmiciProcess = amici_workflow.state[process_id]['instance']" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "581da83d5f6bf788", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:28:55.194142Z", + "start_time": "2024-05-03T23:28:55.173652Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'time': 0.0,\n", + " 'model_parameters': {'degradation constant 1': 0.084,\n", + " 'degradation constant 2': 0.032,\n", + " 'hill cooperativity': 2.0},\n", + " 'floating_species_concentrations': {'plasminogen': 6022140760000000.0,\n", + " 'plasmin': 0.0,\n", + " 'single intact chain urokinase-type plasminogen activator': 1204428152000000.0,\n", + " 'two-chain urokinase-type plasminogen activator': 0.0,\n", + " 'x': 0.0,\n", + " 'x-plasmin': 0.0}}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amici_process.initial_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b803b3931f9c3ef8", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:36:16.476825Z", + "start_time": "2024-05-03T23:36:16.437926Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['cleavage of plasminogen',\n", + " 'activation of urokinase-type plasminogen activator',\n", + " 'activation of plasmin',\n", + " 'degradation of single intact chain urokinase-type plasminogen activator',\n", + " 'degradation of plasminogen',\n", + " 'degradation of plasmin',\n", + " 'degradation of two-chain urokinase type plasminogen activator',\n", + " 'reversible plasmin bonding x',\n", + " 'catalytic reaction of x-plasmin',\n", + " 'degradation of x',\n", + " 'degradation of x-plasmin',\n", + " 'synthesis of single intact chain urokinase-type plasminogen activator',\n", + " 'synthesis of plasminogen',\n", + " 'synthesis of x']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amici_process.reaction_list" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "a6e139abf0e14fc", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:39:00.148258Z", + "start_time": "2024-05-03T23:39:00.144051Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'time': 0.0,\n", + " 'model_parameters': {'degradation constant 1': 0.084,\n", + " 'degradation constant 2': 0.032,\n", + " 'hill cooperativity': 2.0},\n", + " 'floating_species_concentrations': {'plasminogen': 6022140760000000.0,\n", + " 'plasmin': 0.0,\n", + " 'single intact chain urokinase-type plasminogen activator': 1204428152000000.0,\n", + " 'two-chain urokinase-type plasminogen activator': 0.0,\n", + " 'x': 0.0,\n", + " 'x-plasmin': 0.0}}" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amici_process.initial_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e5a3da394b146ab3", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:38:09.184771Z", + "start_time": "2024-05-03T23:38:09.121189Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + } + ], + "source": [ + "# Let's compare that against copasi process\n", + "from biosimulator_processes.processes.copasi_process import CopasiProcess\n", + "\n", + "\n", + "copasi_process: CopasiProcess = CopasiProcess(\n", + " config=comparison_document.composite['copasi_0']['config'])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "3c1342e968d1ffbe", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:40:10.711087Z", + "start_time": "2024-05-03T23:40:10.694215Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "copasi_process.outputs() == amici_process.outputs()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "77eac97eb3c4d60f", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:40:35.104747Z", + "start_time": "2024-05-03T23:40:35.088525Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amici_process.initial_state() == copasi_process.initial_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5a56775a9f209a33", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-03T23:40:47.460840Z", + "start_time": "2024-05-03T23:40:47.451818Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "copasi_process.reaction_list == amici_process.reaction_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8242e8126c264f8d", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/cobra_process_composer.ipynb b/composer-notebooks/cobra_process_composer.ipynb similarity index 100% rename from notebooks/cobra_process_composer.ipynb rename to composer-notebooks/cobra_process_composer.ipynb diff --git a/notebooks/copasi_process_composer.ipynb b/composer-notebooks/copasi_process_composer.ipynb similarity index 100% rename from notebooks/copasi_process_composer.ipynb rename to composer-notebooks/copasi_process_composer.ipynb diff --git a/notebooks/out/'my_first_composition'.json b/composer-notebooks/out/'my_first_composition'.json similarity index 100% rename from notebooks/out/'my_first_composition'.json rename to composer-notebooks/out/'my_first_composition'.json diff --git a/notebooks/out/2_process_composition.json b/composer-notebooks/out/2_process_composition.json similarity index 100% rename from notebooks/out/2_process_composition.json rename to composer-notebooks/out/2_process_composition.json diff --git a/notebooks/out/BUILD_FLUSH_2024-03-15__16_00_11.649347.json b/composer-notebooks/out/BUILD_FLUSH_2024-03-15__16_00_11.649347.json similarity index 100% rename from notebooks/out/BUILD_FLUSH_2024-03-15__16_00_11.649347.json rename to composer-notebooks/out/BUILD_FLUSH_2024-03-15__16_00_11.649347.json diff --git a/composer-notebooks/out/copasi-doc.json b/composer-notebooks/out/copasi-doc.json new file mode 100644 index 000000000..e69de29bb diff --git a/notebooks/out/demo_single_process_composite.json b/composer-notebooks/out/demo_single_process_composite.json similarity index 100% rename from notebooks/out/demo_single_process_composite.json rename to composer-notebooks/out/demo_single_process_composite.json diff --git a/notebooks/out/demo_tumor_control_composite.json b/composer-notebooks/out/demo_tumor_control_composite.json similarity index 100% rename from notebooks/out/demo_tumor_control_composite.json rename to composer-notebooks/out/demo_tumor_control_composite.json diff --git a/notebooks/out/five_process_composite.json b/composer-notebooks/out/five_process_composite.json similarity index 97% rename from notebooks/out/five_process_composite.json rename to composer-notebooks/out/five_process_composite.json index c13912251..12bfe5ad0 100644 --- a/notebooks/out/five_process_composite.json +++ b/composer-notebooks/out/five_process_composite.json @@ -10,7 +10,7 @@ }, "simple1": { "_type": "process", - "address": "local:CopasiProcess", + "address": "local:copasi", "config": { "model": { "model_source": "BIOMD0000000391", @@ -101,7 +101,7 @@ }, "simple2": { "_type": "process", - "address": "local:CopasiProcess", + "address": "local:copasi", "config": { "model": { "model_source": "BIOMD0000000391", @@ -143,7 +143,7 @@ }, "simple3": { "_type": "process", - "address": "local:CopasiProcess", + "address": "local:copasi", "config": { "model": { "model_source": "BIOMD0000000391", @@ -185,7 +185,7 @@ }, "simple4": { "_type": "process", - "address": "local:CopasiProcess", + "address": "local:copasi", "config": { "model": { "model_source": "BIOMD0000000391", @@ -227,7 +227,7 @@ }, "simple5": { "_type": "process", - "address": "local:CopasiProcess", + "address": "local:copasi", "config": { "model": { "model_source": "BIOMD0000000391", @@ -267,4 +267,4 @@ }, "interval": 1.0 } -} \ No newline at end of file +} diff --git a/notebooks/out/simple_demo_single_process_composition.json b/composer-notebooks/out/simple_demo_single_process_composition.json similarity index 100% rename from notebooks/out/simple_demo_single_process_composition.json rename to composer-notebooks/out/simple_demo_single_process_composition.json diff --git a/notebooks/out/simple_lsoda.json b/composer-notebooks/out/simple_lsoda.json similarity index 100% rename from notebooks/out/simple_lsoda.json rename to composer-notebooks/out/simple_lsoda.json diff --git a/notebooks/out/simple_single_demo.json b/composer-notebooks/out/simple_single_demo.json similarity index 100% rename from notebooks/out/simple_single_demo.json rename to composer-notebooks/out/simple_single_demo.json diff --git a/notebooks/out/single_lsoda.json b/composer-notebooks/out/single_lsoda.json similarity index 100% rename from notebooks/out/single_lsoda.json rename to composer-notebooks/out/single_lsoda.json diff --git a/notebooks/smoldyn_process_composer.ipynb b/composer-notebooks/smoldyn_process_composer.ipynb similarity index 100% rename from notebooks/smoldyn_process_composer.ipynb rename to composer-notebooks/smoldyn_process_composer.ipynb diff --git a/notebooks/tellurium_process_composer.ipynb b/composer-notebooks/tellurium_process_composer.ipynb similarity index 100% rename from notebooks/tellurium_process_composer.ipynb rename to composer-notebooks/tellurium_process_composer.ipynb diff --git a/demos/biolab_api_demo.ipynb b/demos/biolab_api_demo.ipynb new file mode 100644 index 000000000..6ca265e2e --- /dev/null +++ b/demos/biolab_api_demo.ipynb @@ -0,0 +1,652 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8087f67dcdaefdee", + "metadata": { + "collapsed": false + }, + "source": [ + "# BioLab API Demo (BioLab container)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c253d92e47737dd9", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:49.375459Z", + "start_time": "2024-05-01T18:23:49.229821Z" + } + }, + "outputs": [], + "source": [ + "# TODO: create sep repo and pypi for data model so that you can install it and import like `import sed_data as sed`" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:49.375680Z", + "start_time": "2024-05-01T18:23:49.234219Z" + } + }, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "sys.path.insert(0, '..')" + ] + }, + { + "cell_type": "markdown", + "id": "572ce5fd9c49efcb", + "metadata": { + "collapsed": false + }, + "source": [ + "#### **_Experiment 1_**: Here we cross a boundary in the stack that is a biological simulation. We go from model configuration, to experiment. Thus, this tooling sits at that level: both experiment specification AND experiment execution. It's not just a way to specify an experiment, but it is also a way to run it, given the many knobs and buttons that you can use predefine and customize the way the actual model is being solved. Our users are seeking to be involved in an experiment as a \"stack\". We should make a bigger distinction between terms like \"model\"." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e3218a2629726818", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:51.747571Z", + "start_time": "2024-05-01T18:23:49.237895Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n" + ] + } + ], + "source": [ + "from process_bigraph import pp\n", + "from biosimulator_processes.biosimulator_builder import BuildPrompter\n", + "from biosimulator_processes.data_model.sed_data_model import SedDataModel as sed " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "871b58285775fb24", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.256123Z", + "start_time": "2024-05-01T18:23:51.745806Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TimeCourseModel(model_source='BIOMD0000000749',\n", + " model_id='model_from_BIOMD0000000749',\n", + " model_name='model_from_BIOMD0000000749',\n", + " model_language=(None,),\n", + " model_changes=None,\n", + " model_units=None)\n" + ] + } + ], + "source": [ + "# 1a. define a model for the process composition. In this case, just one model to be re-used as configuration for the processes we create:\n", + "tumor_control_biomodel_id = 'BIOMD0000000749'\n", + "simple_tc_model = sed.TimeCourseModel(model_source=tumor_control_biomodel_id)\n", + "\n", + "pp(simple_tc_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1519914d8b9a85ce", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.257772Z", + "start_time": "2024-05-01T18:23:52.254603Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ 'description': 'The paper describes a model of tumor control via alternating '\n", + " 'immunostimulating and immunosuppressive phases. \\r\\n'\n", + " 'Created by COPASI 4.25 (Build 207) \\r\\n'\n", + " '\\r\\n'\n", + " 'This model is described in the article: \\r\\n'\n", + " 'In silico tumor control induced via alternating '\n", + " 'immunostimulating and immunosuppressive phases\\r\\n'\n", + " 'AI Reppas, JCL Alfonso, and H Hatzikirou\\r\\n'\n", + " 'Virulence 7:2, 174--186\\r\\n'\n", + " '\\r\\n'\n", + " 'Abstract: \\r\\n'\n", + " 'Despite recent advances in the field of Oncoimmunology, the '\n", + " 'success potential of immunomodulatory therapies against '\n", + " 'cancer remains to be elucidated. One of the reasons is the '\n", + " 'lack of understanding on the complex interplay between tumor '\n", + " 'growth dynamics and the associated immune system responses. '\n", + " 'Toward this goal, we consider a mathematical model of '\n", + " 'vascularized tumor growth and the corresponding effector '\n", + " 'cell recruitment dynamics. Bifurcation analysis allows for '\n", + " 'the exploration of model’s dynamic behavior and the '\n", + " 'determination of these parameter regimes that result in '\n", + " 'immune-mediated tumor control. In this work, we focus on a '\n", + " 'particular tumor evasion regime that involves tumor and '\n", + " 'effector cell concentration oscillations of slowly '\n", + " 'increasing and decreasing amplitude, respectively. '\n", + " 'Considering a temporal multiscale analysis, we derive an '\n", + " 'analytically tractable mapping of model solutions onto a '\n", + " 'weakly negatively damped harmonic oscillator. Based on our '\n", + " 'analysis, we propose a theory-driven intervention strategy '\n", + " 'involving immunostimulating and immunosuppressive phases to '\n", + " 'induce long-term tumor control.\\r\\n'\n", + " '\\r\\n'\n", + " 'To cite BioModels Database, please use: BioModels Database: '\n", + " 'An enhanced, curated and annotated resource for published '\n", + " 'quantitative kinetic models . \\r\\n'\n", + " 'To the extent possible under law, all copyright and related '\n", + " 'or neighbouring rights to this encoded model have been '\n", + " 'dedicated to the public domain worldwide. \\r\\n'\n", + " 'Please refer to CC0 Public Domain Dedication for more '\n", + " 'information.',\n", + " 'files': { 'additional': [ { 'description': 'Auto-generated SEDML file',\n", + " 'fileSize': '2191',\n", + " 'name': 'Reppas2015.sedml'},\n", + " { 'description': 'CPS file of the model in COPASI',\n", + " 'fileSize': '81326',\n", + " 'name': 'Reppas2015.cps'}],\n", + " 'main': [{'fileSize': '62675', 'name': 'Reppas2015.xml'}]},\n", + " 'firstPublished': 1562858819000,\n", + " 'format': {'name': 'SBML', 'version': 'L3V1'},\n", + " 'history': { 'revisions': [ { 'comment': 'Edited model metadata online.',\n", + " 'submitted': 1562858737000,\n", + " 'submitter': 'Jinghao Men',\n", + " 'version': 2},\n", + " { 'comment': 'Automatically added model '\n", + " 'identifier BIOMD0000000749',\n", + " 'submitted': 1562858822000,\n", + " 'submitter': 'Jinghao Men',\n", + " 'version': 3}]},\n", + " 'name': 'Reppas2015 - tumor control via alternating immunostimulating and '\n", + " 'immunosuppressive phases',\n", + " 'publication': { 'affiliation': 'a Center for Advancing Electronics; '\n", + " 'Technische Universität Dresden ; Dresden , '\n", + " 'Germany.',\n", + " 'authors': [ {'name': 'Reppas AI'},\n", + " {'name': 'Alfonso JC'},\n", + " { 'name': 'Hatzikirou H',\n", + " 'orcid': '0000-0002-1270-7885'}],\n", + " 'issue': '2',\n", + " 'journal': 'Virulence',\n", + " 'link': 'http://identifiers.org/pubmed/26305801',\n", + " 'month': '1',\n", + " 'pages': '174-186',\n", + " 'synopsis': 'Despite recent advances in the field of '\n", + " 'Oncoimmunology, the success potential of '\n", + " 'immunomodulatory therapies against cancer '\n", + " 'remains to be elucidated. One of the reasons '\n", + " 'is the lack of understanding on the complex '\n", + " 'interplay between tumor growth dynamics and '\n", + " 'the associated immune system responses. Toward '\n", + " 'this goal, we consider a mathematical model of '\n", + " 'vascularized tumor growth and the '\n", + " 'corresponding effector cell recruitment '\n", + " 'dynamics. Bifurcation analysis allows for the '\n", + " \"exploration of model's dynamic behavior and \"\n", + " 'the determination of these parameter regimes '\n", + " 'that result in immune-mediated tumor control. '\n", + " 'In this work, we focus on a particular tumor '\n", + " 'evasion regime that involves tumor and '\n", + " 'effector cell concentration oscillations of '\n", + " 'slowly increasing and decreasing amplitude, '\n", + " 'respectively. Considering a temporal '\n", + " 'multiscale analysis, we derive an analytically '\n", + " 'tractable mapping of model solutions onto a '\n", + " 'weakly negatively damped harmonic oscillator. '\n", + " 'Based on our analysis, we propose a '\n", + " 'theory-driven intervention strategy involving '\n", + " 'immunostimulating and immunosuppressive phases '\n", + " 'to induce long-term tumor control.',\n", + " 'title': 'In silico tumor control induced via alternating '\n", + " 'immunostimulating and immunosuppressive phases.',\n", + " 'volume': '7',\n", + " 'year': 2016},\n", + " 'publicationId': 'BIOMD0000000749',\n", + " 'submissionId': 'MODEL1907110002'}\n" + ] + } + ], + "source": [ + "# 1b. view model info for model source:\n", + "\n", + "pp(simple_tc_model.source_info)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a30f5e94167513c9", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.266338Z", + "start_time": "2024-05-01T18:23:52.258070Z" + } + }, + "outputs": [], + "source": [ + "# 1c. define a TimeCourse process instance using the above object as a parameter. The other parameter is method. See BasiCO documentation for more details on solvers\n", + "\n", + "simple_tc_process = sed.TimeCourseProcess(model=simple_tc_model, method='lsoda')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a9c15126dda87970", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.266655Z", + "start_time": "2024-05-01T18:23:52.261921Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TimeCourseProcess(model=TimeCourseModel(model_source='BIOMD0000000749',\n", + " model_id='model_from_BIOMD0000000749',\n", + " model_name='model_from_BIOMD0000000749',\n", + " model_language=(None,),\n", + " model_changes=None,\n", + " model_units=None),\n", + " method='lsoda',\n", + " model_language='sbml')\n" + ] + } + ], + "source": [ + "# >> The process model instance is viewable as a dataclass...\n", + "\n", + "pp(simple_tc_process)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ba3d6e8bae50f216", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.268987Z", + "start_time": "2024-05-01T18:23:52.265517Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ 'method': 'lsoda',\n", + " 'model': { 'model_changes': None,\n", + " 'model_id': 'model_from_BIOMD0000000749',\n", + " 'model_language': (None,),\n", + " 'model_name': 'model_from_BIOMD0000000749',\n", + " 'model_source': 'BIOMD0000000749',\n", + " 'model_units': None},\n", + " 'model_language': 'sbml'}\n" + ] + } + ], + "source": [ + "# >> ...or a dict:\n", + "\n", + "pp(simple_tc_process.to_dict())" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f6d099ae829fb063", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:52.319339Z", + "start_time": "2024-05-01T18:23:52.269208Z" + } + }, + "outputs": [], + "source": [ + "# 2. instantiate the prompter:\n", + "\n", + "prompter = BuildPrompter()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6ff0228586348da1", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:59.152054Z", + "start_time": "2024-05-01T18:23:52.273445Z" + } + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'BiosimulatorBuilder' object has no attribute 'get_pydantic_model'", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mAttributeError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[10], line 3\u001B[0m\n\u001B[1;32m 1\u001B[0m \u001B[38;5;66;03m# 3. add process(es) to the bigraph with the Time Course model instance we created above. For now, just one process will be added.\u001B[39;00m\n\u001B[0;32m----> 3\u001B[0m \u001B[43mprompter\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43madd_single_process\u001B[49m\u001B[43m(\u001B[49m\u001B[43mconfig\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msimple_tc_process\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Desktop/uchc_work/repos/biosimulator-processes/notebooks/../biosimulator_processes/biosimulator_builder.py:78\u001B[0m, in \u001B[0;36mBuildPrompter.add_single_process\u001B[0;34m(self, builder, process_type, config, builder_node_name)\u001B[0m\n\u001B[1;32m 75\u001B[0m builder_node_name \u001B[38;5;241m=\u001B[39m \u001B[38;5;28minput\u001B[39m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mPlease enter the name that you wish to assign to this process: \u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m 77\u001B[0m \u001B[38;5;66;03m# generate input data from user prompt results and add processes to the bigraph through pydantic model\u001B[39;00m\n\u001B[0;32m---> 78\u001B[0m DynamicProcessConfig \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbuilder_instance\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_pydantic_model\u001B[49m(process_type)\n\u001B[1;32m 80\u001B[0m input_kwargs \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mgenerate_input_kwargs() \u001B[38;5;28;01mif\u001B[39;00m config \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;28;01melse\u001B[39;00m config\u001B[38;5;241m.\u001B[39mto_dict()\n\u001B[1;32m 81\u001B[0m dynamic_config \u001B[38;5;241m=\u001B[39m DynamicProcessConfig(\u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39minput_kwargs)\n", + "\u001B[0;31mAttributeError\u001B[0m: 'BiosimulatorBuilder' object has no attribute 'get_pydantic_model'" + ] + } + ], + "source": [ + "# 3. add process(es) to the bigraph with the Time Course model instance we created above. For now, just one process will be added.\n", + "\n", + "prompter.add_single_process(config=simple_tc_process)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b833c7217603645c", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T18:23:59.157229Z", + "start_time": "2024-05-01T18:23:59.153391Z" + } + }, + "outputs": [], + "source": [ + "# 4. Inspect the builder instance within prompter:\n", + "\n", + "pp(prompter.builder_instance)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8400f44e3a2e8433", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.155333Z" + } + }, + "outputs": [], + "source": [ + "# 5. Visualize the fully-connected composition:\n", + "\n", + "prompter.visualize_bigraph()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38052757b3b95baa", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.156753Z" + } + }, + "outputs": [], + "source": [ + "# 6. Generate a composite engine and use to execute the bigraph that we just created:\n", + "\n", + "prompter.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45ae5b121110cdce", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.158776Z" + } + }, + "outputs": [], + "source": [ + "# 7. Clear the builder and start from scratch, writing it out first:\n", + "\n", + "prompter.flush(fp='simple_single_demo')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79fbea4fa6708088", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.160556Z" + } + }, + "outputs": [], + "source": [ + "prompter.builder_instance" + ] + }, + { + "cell_type": "markdown", + "id": "b65a6fab79ad097c", + "metadata": { + "collapsed": false + }, + "source": [ + "#### **_Experiment 2_**: Load an SBML model from a specified model filepath and add Model changes to the composite before adding it to the bigraph. Here, we expect the user to be familiar enough with the model file they are passing to make individual species/parameter/reaction changes for specific species types. In the Caravagna model, for example, the species involved are T, E, I. Let's change the initial concentration for some of these as an example of model changes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89739e0302d6b89a", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.162011Z" + } + }, + "outputs": [], + "source": [ + "caravagna_model_filepath = '../biosimulator_processes/model_files/Caravagna2010.xml'\n", + "print(os.path.exists(caravagna_model_filepath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55e063c857e51f3", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.163295Z" + } + }, + "outputs": [], + "source": [ + "# first make the timecourse model which is easily configured with objects related to model changes\n", + "adjusted_tc_model_from_file = sed.TimeCourseModel(\n", + " model_source=caravagna_model_filepath, \n", + " model_changes=sed.TimeCourseModelChanges(\n", + " species_changes=sed.SpeciesChange(species_name='T', initial_concentration=0.234)\n", + " )\n", + ")\n", + "\n", + "\n", + "pp(adjusted_tc_model_from_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1ddec005282e13f", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.164702Z" + } + }, + "outputs": [], + "source": [ + "adjusted_tc_process = sed.TimeCourseProcess(model=adjusted_tc_model_from_file, method='stochastic')\n", + "\n", + "pp(adjusted_tc_process)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32b4be407a09f96", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.165980Z" + } + }, + "outputs": [], + "source": [ + "# add the process we just created with the prompter. The prompter will create a new instance of builder for us, if not passed:\n", + "\n", + "prompter.add_single_process(config=adjusted_tc_process)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0121977a95c320c", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.167039Z" + } + }, + "outputs": [], + "source": [ + "# visualize the adjusted creation\n", + "\n", + "prompter.visualize_bigraph()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6e83469c5b8b93d", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.167933Z" + } + }, + "outputs": [], + "source": [ + "# view the builder document\n", + "\n", + "prompter.builder_instance.document()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "121064387d7729b0", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.168771Z" + } + }, + "outputs": [], + "source": [ + "# run the composite\n", + "\n", + "prompter.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6918be74a9a99f7d", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.169791Z" + } + }, + "outputs": [], + "source": [ + "# stochastic works with Caravagna!!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f160008fa3538b5", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T18:23:59.170806Z" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/demos/comparison_api_demo.ipynb b/demos/comparison_api_demo.ipynb new file mode 100644 index 000000000..98716471d --- /dev/null +++ b/demos/comparison_api_demo.ipynb @@ -0,0 +1,709 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n", + "AmiciProcess registered successfully.\n" + ] + } + ], + "source": [ + "import sys\n", + "\n", + "sys.path.insert(0, '..')\n", + "\n", + "import os\n", + "import requests\n", + "import json\n", + "from tempfile import mkdtemp\n", + "import libsbml\n", + "import amici\n", + "import os\n", + "from biosimulator_processes.utils import prepare_single_ode_process_document\n", + "from biosimulator_processes.data_model.compare_data_model import ODEComparisonDocument, DocumentFactory\n", + "from biosimulator_processes import CORE\n", + "from process_bigraph import Composite, pp" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-06T18:27:23.742188Z", + "start_time": "2024-05-06T18:27:19.861579Z" + } + }, + "id": "159305ff5f3dc676" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "data": { + "text/plain": "\"TODO: Update the input/output schema of the ODEComparatorProcess to mimic the following:\\n\\n{('emitter',): [{\\n 'copasi': [\\n {\\n 'floating_species_concentrations': {\\n 'plasminogen': 0.0,\\n 'plasmin': 0.0,\\n 'single intact chain urokinase-type plasminogen activator': 0.0,\\n 'two-chain urokinase-type plasminogen activator': 0.0,\\n 'x': 0.0,\\n 'x-plasmin': 0.0},\\n 'time': 0.0\\n },\\n ...\\n ],\\n 'amici': [\\n {\\n 'floating_species_concentrations': {\\n 'plasminogen': 1.1758171177387002e+16,\\n 'plasmin': 1096150505274.1506,\\n 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\\n 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\\n 'x': 0.0,\\n 'x-plasmin': 0.0},\\n 'time': 0.0},\\n },\\n ...\\n ]\\n\\n\\n\"" + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"TODO: Update the input/output schema of the ODEComparatorProcess to mimic the following:\n", + "\n", + "{('emitter',): [{\n", + " 'copasi': [\n", + " {\n", + " 'floating_species_concentrations': {\n", + " 'plasminogen': 0.0,\n", + " 'plasmin': 0.0,\n", + " 'single intact chain urokinase-type plasminogen activator': 0.0,\n", + " 'two-chain urokinase-type plasminogen activator': 0.0,\n", + " 'x': 0.0,\n", + " 'x-plasmin': 0.0},\n", + " 'time': 0.0\n", + " },\n", + " ...\n", + " ],\n", + " 'amici': [\n", + " {\n", + " 'floating_species_concentrations': {\n", + " 'plasminogen': 1.1758171177387002e+16,\n", + " 'plasmin': 1096150505274.1506,\n", + " 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n", + " 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n", + " 'x': 0.0,\n", + " 'x-plasmin': 0.0},\n", + " 'time': 0.0},\n", + " },\n", + " ...\n", + " ]\n", + "\n", + "\n", + "\"\"\"" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-06T18:27:23.747891Z", + "start_time": "2024-05-06T18:27:23.742625Z" + } + }, + "id": "4738a65e22cf7264" + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:03.320029Z", + "start_time": "2024-05-04T00:15:03.314889Z" + } + }, + "outputs": [], + "source": [ + "# Step 1: Define the input parameters of the api method\n", + "\n", + "biomodel_id = 'BIOMD0000000630'\n", + "model_fp = f'../biosimulator_processes/model_files/sbml/{biomodel_id}_url.xml'\n", + "species_context = 'concentrations'\n", + "species_port_name = f'floating_species_{species_context}'\n", + "species_store = [f'floating_species_{species_context}_store']\n", + "duration = 30\n", + "n_steps = 42\n", + "simulators = ['copasi', 'amici']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [ + { + "data": { + "text/plain": "{'copasi_0': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'amici_1': {'_type': 'process',\n 'address': 'local:amici',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'emitter': {'_type': 'step',\n 'address': 'local:ram-emitter',\n 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}}}" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Step 2: Define a helper composite maker\n", + "\n", + "comparison_document = ODEComparisonDocument(\n", + " simulators=simulators,\n", + " duration=duration,\n", + " num_steps=n_steps,\n", + " model_filepath=model_fp)\n", + "\n", + "comparison_document.composite" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:03.329246Z", + "start_time": "2024-05-04T00:15:03.321625Z" + } + }, + "id": "5dcc12fc75947cc6" + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "data": { + "text/plain": "{'copasi_0': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'amici_1': {'_type': 'process',\n 'address': 'local:amici',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'emitter': {'_type': 'step',\n 'address': 'local:ram-emitter',\n 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'amici_2': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}}}" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Step 2a: Define one more amici process for demo purposes\n", + "\n", + "comparison_document.add_single_process_to_composite(process_id='amici_2', simulator='amici')\n", + "\n", + "comparison_document.composite" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:03.354183Z", + "start_time": "2024-05-04T00:15:03.328309Z" + } + }, + "id": "eaa9a29b871cccab" + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-05-03 20:15:03.440 - amici.sbml_import - INFO - Finished importing SBML (3.66E-02s)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-05-03 20:15:03.487 - amici.sbml_import - INFO - Finished processing SBML observables (4.34E-02s)\n", + "2024-05-03 20:15:03.491 - amici.sbml_import - INFO - Finished processing SBML event observables (9.58E-07s)\n", + "2024-05-03 20:15:03.530 - amici.de_model - INFO - Finished computing xdot (4.90E-03s)\n", + "2024-05-03 20:15:03.537 - amici.de_model - INFO - Finished computing x0 (3.07E-03s)\n", + "2024-05-03 20:15:03.550 - amici.de_model - INFO - Finished computing w (9.39E-03s)\n", + "2024-05-03 20:15:04.070 - amici.de_export - INFO - Finished generating cpp code (5.14E-01s)\n", + "2024-05-03 20:15:21.859 - amici.de_export - INFO - Finished compiling cpp code (1.78E+01s)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + } + ], + "source": [ + "# Step 3: Add document to composition\n", + "\n", + "ode_comparison_workflow = Composite(\n", + " config={'state': comparison_document.composite},\n", + " core=CORE)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:22.031425Z", + "start_time": "2024-05-04T00:15:03.334465Z" + } + }, + "id": "65b98f2e25b77fcf" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/demos/../biosimulator_processes/processes/copasi_process.py:245: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values for plasminogen in AmiciProcess: 0.0\n", + "Values for plasmin in AmiciProcess: 0.0\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 0.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 0.0\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.1758171177387002e+16\n", + "Values for plasmin in AmiciProcess: 1096150505274.1506\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2955755808974603.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 80249.33829510311\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.7311483609242468e+16\n", + "Values for plasmin in AmiciProcess: 4126180180911.928\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 4565981193830563.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 2976560.37325531\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 2.26869588734145e+16\n", + "Values for plasmin in AmiciProcess: 9784956821643.105\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 6046472716713519.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 30951110.75217968\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 2.7889481084018964e+16\n", + "Values for plasmin in AmiciProcess: 18558439541149.89\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 7407682778865739.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 175042198.95559487\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 3.2923916509059264e+16\n", + "Values for plasmin in AmiciProcess: 30761002685509.9\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 8659221476339174.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 687289532.508261\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 3.7795095609180904e+16\n", + "Values for plasmin in AmiciProcess: 46567302681540.46\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 9809924318429976.0\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 2113013380.9636695\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 4.2507797871322344e+16\n", + "Values for plasmin in AmiciProcess: 66039405775206.95\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.0867914452361614e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 5449219859.160596\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 4.706673909036679e+16\n", + "Values for plasmin in AmiciProcess: 89149811273205.81\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.1840659857224688e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 12309508198.907099\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 5.147656079175656e+16\n", + "Values for plasmin in AmiciProcess: 115800924190099.58\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.2735025928520176e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 25075171286.06717\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 5.574182152051895e+16\n", + "Values for plasmin in AmiciProcess: 145841467074379.56\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.355732385538408e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 47015162093.09385\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 5.986698976513339e+16\n", + "Values for plasmin in AmiciProcess: 179080237855683.53\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.4313355089545092e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 82362503755.67668\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 6.3856438287800984e+16\n", + "Values for plasmin in AmiciProcess: 215297618745438.78\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.5008452360485492e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 136340540392.75003\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 6.7714439701787944e+16\n", + "Values for plasmin in AmiciProcess: 254255104876365.1\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.5647517350855912e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 215137576688.10364\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 7.144516311870991e+16\n", + "Values for plasmin in AmiciProcess: 295703164163521.06\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.6235055424118262e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 325833159641.05225\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 7.505267173181958e+16\n", + "Values for plasmin in AmiciProcess: 339387657046354.44\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.677520762025202e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 476282328652.6262\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 7.85409212160007e+16\n", + "Values for plasmin in AmiciProcess: 385055012586171.4\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.7271780075250048e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 674966891944.4807\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 8.191375883381933e+16\n", + "Values for plasmin in AmiciProcess: 432456352612456.25\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.7728271136626422e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 930823100721.2874\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 8.517492203875176e+16\n", + "Values for plasmin in AmiciProcess: 481350825362251.9\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.8147893772513976e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 1253055607165.2722\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 8.83280428838129e+16\n", + "Values for plasmin in AmiciProcess: 531507614449189.06\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.8533608080431036e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 1650948411200.6243\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 9.137664333591266e+16\n", + "Values for plasmin in AmiciProcess: 582708331204134.5\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.8888129744225932e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 2133678942161.1296\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 9.432413878039368e+16\n", + "Values for plasmin in AmiciProcess: 634748006249735.1\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.92139554173191e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 2710141260730.3037\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 9.717383977782714e+16\n", + "Values for plasmin in AmiciProcess: 687435834659681.5\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.9513381093606176e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 3388789835133.086\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 9.99289533969418e+16\n", + "Values for plasmin in AmiciProcess: 740595641063850.4\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 1.9788517678702548e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 4177500772077.9346\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.0259258516194536e+17\n", + "Values for plasmin in AmiciProcess: 794065982050477.0\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.0041306088335676e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 5083456370053.415\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.0516774117317611e+17\n", + "Values for plasmin in AmiciProcess: 847699997988712.0\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.0273531020992504e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 6113054159621.316\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.0765733040204266e+17\n", + "Values for plasmin in AmiciProcess: 901365061160812.9\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.0486833739199336e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 7271839025813.728\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.100641670918206e+17\n", + "Values for plasmin in AmiciProcess: 954942268115595.2\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.06827237256962e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 8564459067459.251\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.1239097324684171e+17\n", + "Values for plasmin in AmiciProcess: 1008325814137492.5\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.086258939100529e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 9994642962989.371\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n", + "Values for plasminogen in AmiciProcess: 1.1464038118369742e+17\n", + "Values for plasmin in AmiciProcess: 1061422282081494.2\n", + "Values for single intact chain urokinase-type plasminogen activator in AmiciProcess: 2.1027707905216044e+16\n", + "Values for two-chain urokinase-type plasminogen activator in AmiciProcess: 11565196899893.963\n", + "Values for x in AmiciProcess: 0.0\n", + "Values for x-plasmin in AmiciProcess: 0.0\n" + ] + } + ], + "source": [ + "# Step 4: Run the comparison\n", + "\n", + "ode_comparison_workflow.run(duration)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:22.304387Z", + "start_time": "2024-05-04T00:15:22.032739Z" + } + }, + "id": "30c3a822a7d9af72" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "# Step 5: Gather the comparison results from the Process Bigraph Engine (workflow)\n", + "\n", + "ode_comparison_results = ode_comparison_workflow.gather_results()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:22.304625Z", + "start_time": "2024-05-04T00:15:22.301188Z" + } + }, + "id": "7c8e52c219d4ef58" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [ + { + "data": { + "text/plain": "{('emitter',): [{'floating_species_concentrations': {'plasminogen': 0.0,\n 'plasmin': 0.0,\n 'single intact chain urokinase-type plasminogen activator': 0.0,\n 'two-chain urokinase-type plasminogen activator': 0.0,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 0.0},\n {'floating_species_concentrations': {'plasminogen': 1.1758171177387002e+16,\n 'plasmin': 1096150505274.1506,\n 'single intact chain urokinase-type plasminogen activator': 2955755808974603.0,\n 'two-chain urokinase-type plasminogen activator': 80249.33829510311,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 2.0},\n {'floating_species_concentrations': {'plasminogen': 1.7311483609242468e+16,\n 'plasmin': 4126180180911.928,\n 'single intact chain urokinase-type plasminogen activator': 4565981193830563.0,\n 'two-chain urokinase-type plasminogen activator': 2976560.37325531,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 4.0},\n {'floating_species_concentrations': {'plasminogen': 2.26869588734145e+16,\n 'plasmin': 9784956821643.105,\n 'single intact chain urokinase-type plasminogen activator': 6046472716713519.0,\n 'two-chain urokinase-type plasminogen activator': 30951110.75217968,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 6.0},\n {'floating_species_concentrations': {'plasminogen': 2.7889481084018964e+16,\n 'plasmin': 18558439541149.89,\n 'single intact chain urokinase-type plasminogen activator': 7407682778865739.0,\n 'two-chain urokinase-type plasminogen activator': 175042198.95559487,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 8.0},\n {'floating_species_concentrations': {'plasminogen': 3.2923916509059264e+16,\n 'plasmin': 30761002685509.9,\n 'single intact chain urokinase-type plasminogen activator': 8659221476339174.0,\n 'two-chain urokinase-type plasminogen activator': 687289532.508261,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 10.0},\n {'floating_species_concentrations': {'plasminogen': 3.7795095609180904e+16,\n 'plasmin': 46567302681540.46,\n 'single intact chain urokinase-type plasminogen activator': 9809924318429976.0,\n 'two-chain urokinase-type plasminogen activator': 2113013380.9636695,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 12.0},\n {'floating_species_concentrations': {'plasminogen': 4.2507797871322344e+16,\n 'plasmin': 66039405775206.95,\n 'single intact chain urokinase-type plasminogen activator': 1.0867914452361614e+16,\n 'two-chain urokinase-type plasminogen activator': 5449219859.160596,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 14.0},\n {'floating_species_concentrations': {'plasminogen': 4.706673909036679e+16,\n 'plasmin': 89149811273205.81,\n 'single intact chain urokinase-type plasminogen activator': 1.1840659857224688e+16,\n 'two-chain urokinase-type plasminogen activator': 12309508198.907099,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 16.0},\n {'floating_species_concentrations': {'plasminogen': 5.147656079175656e+16,\n 'plasmin': 115800924190099.58,\n 'single intact chain urokinase-type plasminogen activator': 1.2735025928520176e+16,\n 'two-chain urokinase-type plasminogen activator': 25075171286.06717,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 18.0},\n {'floating_species_concentrations': {'plasminogen': 5.574182152051895e+16,\n 'plasmin': 145841467074379.56,\n 'single intact chain urokinase-type plasminogen activator': 1.355732385538408e+16,\n 'two-chain urokinase-type plasminogen activator': 47015162093.09385,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 20.0},\n {'floating_species_concentrations': {'plasminogen': 5.986698976513339e+16,\n 'plasmin': 179080237855683.53,\n 'single intact chain urokinase-type plasminogen activator': 1.4313355089545092e+16,\n 'two-chain urokinase-type plasminogen activator': 82362503755.67668,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 22.0},\n {'floating_species_concentrations': {'plasminogen': 6.3856438287800984e+16,\n 'plasmin': 215297618745438.78,\n 'single intact chain urokinase-type plasminogen activator': 1.5008452360485492e+16,\n 'two-chain urokinase-type plasminogen activator': 136340540392.75003,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 24.0},\n {'floating_species_concentrations': {'plasminogen': 6.7714439701787944e+16,\n 'plasmin': 254255104876365.1,\n 'single intact chain urokinase-type plasminogen activator': 1.5647517350855912e+16,\n 'two-chain urokinase-type plasminogen activator': 215137576688.10364,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 26.0},\n {'floating_species_concentrations': {'plasminogen': 7.144516311870991e+16,\n 'plasmin': 295703164163521.06,\n 'single intact chain urokinase-type plasminogen activator': 1.6235055424118262e+16,\n 'two-chain urokinase-type plasminogen activator': 325833159641.05225,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 28.0},\n {'floating_species_concentrations': {'plasminogen': 7.505267173181958e+16,\n 'plasmin': 339387657046354.44,\n 'single intact chain urokinase-type plasminogen activator': 1.677520762025202e+16,\n 'two-chain urokinase-type plasminogen activator': 476282328652.6262,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 30.0},\n {'floating_species_concentrations': {'plasminogen': 7.85409212160007e+16,\n 'plasmin': 385055012586171.4,\n 'single intact chain urokinase-type plasminogen activator': 1.7271780075250048e+16,\n 'two-chain urokinase-type plasminogen activator': 674966891944.4807,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 32.0},\n {'floating_species_concentrations': {'plasminogen': 8.191375883381933e+16,\n 'plasmin': 432456352612456.25,\n 'single intact chain urokinase-type plasminogen activator': 1.7728271136626422e+16,\n 'two-chain urokinase-type plasminogen activator': 930823100721.2874,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 34.0},\n {'floating_species_concentrations': {'plasminogen': 8.517492203875176e+16,\n 'plasmin': 481350825362251.9,\n 'single intact chain urokinase-type plasminogen activator': 1.8147893772513976e+16,\n 'two-chain urokinase-type plasminogen activator': 1253055607165.2722,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 36.0},\n {'floating_species_concentrations': {'plasminogen': 8.83280428838129e+16,\n 'plasmin': 531507614449189.06,\n 'single intact chain urokinase-type plasminogen activator': 1.8533608080431036e+16,\n 'two-chain urokinase-type plasminogen activator': 1650948411200.6243,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 38.0},\n {'floating_species_concentrations': {'plasminogen': 9.137664333591266e+16,\n 'plasmin': 582708331204134.5,\n 'single intact chain urokinase-type plasminogen activator': 1.8888129744225932e+16,\n 'two-chain urokinase-type plasminogen activator': 2133678942161.1296,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 40.0},\n {'floating_species_concentrations': {'plasminogen': 9.432413878039368e+16,\n 'plasmin': 634748006249735.1,\n 'single intact chain urokinase-type plasminogen activator': 1.92139554173191e+16,\n 'two-chain urokinase-type plasminogen activator': 2710141260730.3037,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 42.0},\n {'floating_species_concentrations': {'plasminogen': 9.717383977782714e+16,\n 'plasmin': 687435834659681.5,\n 'single intact chain urokinase-type plasminogen activator': 1.9513381093606176e+16,\n 'two-chain urokinase-type plasminogen activator': 3388789835133.086,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 44.0},\n {'floating_species_concentrations': {'plasminogen': 9.99289533969418e+16,\n 'plasmin': 740595641063850.4,\n 'single intact chain urokinase-type plasminogen activator': 1.9788517678702548e+16,\n 'two-chain urokinase-type plasminogen activator': 4177500772077.9346,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 46.0},\n {'floating_species_concentrations': {'plasminogen': 1.0259258516194536e+17,\n 'plasmin': 794065982050477.0,\n 'single intact chain urokinase-type plasminogen activator': 2.0041306088335676e+16,\n 'two-chain urokinase-type plasminogen activator': 5083456370053.415,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 48.0},\n {'floating_species_concentrations': {'plasminogen': 1.0516774117317611e+17,\n 'plasmin': 847699997988712.0,\n 'single intact chain urokinase-type plasminogen activator': 2.0273531020992504e+16,\n 'two-chain urokinase-type plasminogen activator': 6113054159621.316,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 50.0},\n {'floating_species_concentrations': {'plasminogen': 1.0765733040204266e+17,\n 'plasmin': 901365061160812.9,\n 'single intact chain urokinase-type plasminogen activator': 2.0486833739199336e+16,\n 'two-chain urokinase-type plasminogen activator': 7271839025813.728,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 52.0},\n {'floating_species_concentrations': {'plasminogen': 1.100641670918206e+17,\n 'plasmin': 954942268115595.2,\n 'single intact chain urokinase-type plasminogen activator': 2.06827237256962e+16,\n 'two-chain urokinase-type plasminogen activator': 8564459067459.251,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 54.0},\n {'floating_species_concentrations': {'plasminogen': 1.1239097324684171e+17,\n 'plasmin': 1008325814137492.5,\n 'single intact chain urokinase-type plasminogen activator': 2.086258939100529e+16,\n 'two-chain urokinase-type plasminogen activator': 9994642962989.371,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 56.0},\n {'floating_species_concentrations': {'plasminogen': 1.1464038118369742e+17,\n 'plasmin': 1061422282081494.2,\n 'single intact chain urokinase-type plasminogen activator': 2.1027707905216044e+16,\n 'two-chain urokinase-type plasminogen activator': 11565196899893.963,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 58.0},\n {'floating_species_concentrations': {'plasminogen': 1.168149361201406e+17,\n 'plasmin': 1114149873547627.1,\n 'single intact chain urokinase-type plasminogen activator': 2.1179254220640844e+16,\n 'two-chain urokinase-type plasminogen activator': 13278018746156.03,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'time': 60.0}]}" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode_comparison_results" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:15:22.315509Z", + "start_time": "2024-05-04T00:15:22.308743Z" + } + }, + "id": "62fed9cb77db27f9" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "# Step 6: Perform mean-squared-error on each simulator's output\n", + "# TODO: implement this." + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-04T00:17:19.493741Z", + "start_time": "2024-05-04T00:17:19.483421Z" + } + }, + "id": "d73b15ec831933b8" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Step 7: Return a pydantic-friendly ComparisonResult object for the REST api" + ], + "metadata": { + "collapsed": false + }, + "id": "eea2991f04445bd3" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [], + "source": [ + "from qiskit_nature.second_q.hamiltonians.lattices import (\n", + " BoundaryCondition,\n", + " HyperCubicLattice,\n", + " Lattice,\n", + " LatticeDrawStyle,\n", + " LineLattice,\n", + " SquareLattice,\n", + " TriangularLattice)\n", + "from qiskit_algorithms import NumPyMinimumEigensolver\n", + "from qiskit_nature.second_q.algorithms import GroundStateEigensolver\n", + "from qiskit_nature.second_q.mappers import JordanWignerMapper\n", + "\n", + "boundary_condition = BoundaryCondition.OPEN\n", + "num_nodes = 5\n", + "line_lattice = LineLattice(num_nodes=num_nodes, boundary_condition=boundary_condition)\n", + "t = -1.0\n", + "u = 0.0\n", + "v = 5.0\n", + "lattice = line_lattice.uniform_parameters(uniform_interaction=t, uniform_onsite_potential=v)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-05T15:26:59.605950Z", + "start_time": "2024-05-05T15:26:58.377934Z" + } + }, + "id": "686fd936400826f6" + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "lattice.draw()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-05T15:27:09.331630Z", + "start_time": "2024-05-05T15:27:07.948286Z" + } + }, + "id": "13802a6d18f404b7" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "fhm = FermiHubbardModel(\n", + " line_lattice.uniform_parameters(\n", + " uniform_interaction=t,\n", + " uniform_onsite_potential=v,\n", + " ),\n", + " onsite_interaction=u,\n", + ")\n", + "\n", + "lmp = LatticeModelProblem(fhm)" + ], + "metadata": { + "collapsed": false + }, + "id": "d340c7be3e8cf881" + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n", + "AmiciProcess registered successfully.\n", + "Drawing graph: \n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from biosimulator_processes.processes.qiskit_process import QAOAProcess\n", + "\n", + "\n", + "\n", + "qaoa = QAOAProcess(config={})" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-06T14:02:36.042670Z", + "start_time": "2024-05-06T14:02:33.136991Z" + } + }, + "id": "7bbe076e6517e719" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "data": { + "text/plain": "['G',\n '__class__',\n '__delattr__',\n '__dict__',\n '__dir__',\n '__doc__',\n '__eq__',\n '__format__',\n '__ge__',\n '__getattribute__',\n '__gt__',\n '__hash__',\n '__init__',\n '__init_subclass__',\n '__le__',\n '__lt__',\n '__module__',\n '__ne__',\n '__new__',\n '__reduce__',\n '__reduce_ex__',\n '__repr__',\n '__setattr__',\n '__sizeof__',\n '__str__',\n '__subclasshook__',\n '__weakref__',\n 'config',\n 'config_schema',\n 'core',\n 'draw_graph',\n 'initial_state',\n 'inputs',\n 'interface',\n 'invoke',\n 'num_nodes',\n 'outputs',\n 'update']" + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(qaoa)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-06T13:59:44.406430Z", + "start_time": "2024-05-06T13:59:44.387637Z" + } + }, + "id": "4b6921cc9a1a7bcf" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + }, + "id": "397774795e364edb" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/demos/compositions.ipynb b/demos/compositions.ipynb new file mode 100644 index 000000000..27bceaf9e --- /dev/null +++ b/demos/compositions.ipynb @@ -0,0 +1,829 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "sys.path.insert(0, '..')\n", + "\n", + "import os\n", + "import requests\n", + "import json" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T08:45:09.699631Z", + "start_time": "2024-05-01T08:45:09.646937Z" + } + }, + "id": "24fc5d62890368dd" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n" + ] + } + ], + "source": [ + "from biosimulator_processes.compare import ComparisonDocument\n", + "from biosimulator_processes import CORE\n", + "from process_bigraph import pp, Composite" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T08:45:13.511424Z", + "start_time": "2024-05-01T08:45:10.281028Z" + } + }, + "id": "1dc1ba69e5acc44" + }, + { + "cell_type": "markdown", + "source": [ + "### Example Composite process using copasi and tellurium" + ], + "metadata": { + "collapsed": false + }, + "id": "8491845ac8f593cd" + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [], + "source": [ + "simulators = ['copasi', 'tellurium'] # , 'amici']\n", + "duration = 30\n", + "n_steps = 200\n", + "model_filepath = '../biosimulator_processes/model_files/sbml/Caravagna2010.xml'\n", + "\n", + "\n", + "comparison = ComparisonDocument(simulators, duration, n_steps, model_filepath)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:32.979028Z", + "start_time": "2024-05-01T06:59:32.976561Z" + } + }, + "id": "d9fce82a600bb9af" + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ 'processes': { 'copasi_0': { '_type': 'process',\n", + " 'address': 'local:copasi',\n", + " 'config': { 'model': { 'model_source': '../biosimulator_processes/model_files/sbml/Caravagna2010.xml'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'model_parameters': [ 'model_parameters_store'],\n", + " 'reactions': ['reactions_store'],\n", + " 'time': ['time_store']},\n", + " 'outputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'duration': 30,\n", + " 'emitter': { '_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': { 'emit': { 'floating_species_concentrations': 'tree[float]',\n", + " 'time': 'float'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'num_steps': 200,\n", + " 'tellurium_1': { '_type': 'process',\n", + " 'address': 'local:tellurium',\n", + " 'config': { 'model': { 'model_source': '../biosimulator_processes/model_files/sbml/Caravagna2010.xml'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'model_parameters': [ 'model_parameters_store'],\n", + " 'reactions': ['reactions_store'],\n", + " 'time': ['time_store']},\n", + " 'outputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}}}}\n" + ] + } + ], + "source": [ + "pp(comparison.composite)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:32.985217Z", + "start_time": "2024-05-01T06:59:32.981251Z" + } + }, + "id": "57a94e90c5c2ba41" + }, + { + "cell_type": "markdown", + "source": [ + "### ODE Simulator Comparison" + ], + "metadata": { + "collapsed": false + }, + "id": "659245544fd8d1b3" + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "from biosimulator_processes.compare import ComparisonDocument\n", + "\n", + "sbml_model_path = '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'\n", + "simulators = ['copasi', 'copasi'] # , 'tellurium']\n", + "duration = 30 \n", + "n_steps = 50 \n", + "target_parameter = {\n", + " 'name': 'plasmin',\n", + " 'value': 2.01\n", + "}\n", + "\n", + "\n", + "def create_comparison_document(\n", + " sbml_model_path: str, \n", + " simulators: list[str], \n", + " duration: int, \n", + " n_steps: int, \n", + " target_param: dict = None\n", + " ) -> ComparisonDocument:\n", + " return ComparisonDocument(\n", + " simulators=simulators, \n", + " duration=duration, \n", + " num_steps=n_steps,\n", + " model_filepath=sbml_model_path,\n", + " target_parameter=target_param)\n", + "\n", + "\n", + "def generate_workflow(document: ComparisonDocument):\n", + " return Composite(\n", + " config={'state': document.composite},\n", + " core=CORE)\n", + "\n", + "\n", + "ode_comparison_document = create_comparison_document(sbml_model_path, simulators, duration, n_steps, target_parameter)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:32.991192Z", + "start_time": "2024-05-01T06:59:32.986334Z" + } + }, + "id": "3cc9032bbca74784" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ 'processes': { 'copasi_0': { '_type': 'process',\n", + " 'address': 'local:copasi',\n", + " 'config': { 'model': { 'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'model_parameters': [ 'model_parameters_store'],\n", + " 'reactions': ['reactions_store'],\n", + " 'time': ['time_store']},\n", + " 'outputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'copasi_1': { '_type': 'process',\n", + " 'address': 'local:copasi',\n", + " 'config': { 'model': { 'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'model_parameters': [ 'model_parameters_store'],\n", + " 'reactions': ['reactions_store'],\n", + " 'time': ['time_store']},\n", + " 'outputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'duration': 30,\n", + " 'emitter': { '_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': { 'emit': { 'floating_species_concentrations': 'tree[float]',\n", + " 'time': 'float'}},\n", + " 'inputs': { 'floating_species_concentrations': [ 'floating_species_concentrations_store'],\n", + " 'time': ['time_store']}},\n", + " 'num_steps': 50}}\n" + ] + } + ], + "source": [ + "pp(ode_comparison_document.composite)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:33.502935Z", + "start_time": "2024-05-01T06:59:33.496658Z" + } + }, + "id": "5f99df92f1acbf52" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n", + "found a filepath\n" + ] + } + ], + "source": [ + "ode_comparison_workflow = Composite(config={'state': ode_comparison_document.composite}, core=CORE)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:34.342968Z", + "start_time": "2024-05-01T06:59:34.257050Z" + } + }, + "id": "9c44bd491ad5ddb0" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [], + "source": [ + "ode_comparison_workflow.run(duration)\n", + "ode_comparison_results = ode_comparison_workflow.gather_results()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:34.956538Z", + "start_time": "2024-05-01T06:59:34.946595Z" + } + }, + "id": "a52b1903520045a0" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [ + { + "data": { + "text/plain": "{}" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode_comparison_results" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:59:35.546107Z", + "start_time": "2024-05-01T06:59:35.539397Z" + } + }, + "id": "806d60012d71a2eb" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.165350Z", + "start_time": "2024-05-01T06:56:28.160529Z" + } + }, + "id": "da55f1556e28363f" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.166914Z", + "start_time": "2024-05-01T06:56:28.163347Z" + } + }, + "id": "3330d11b7b80252b" + }, + { + "cell_type": "code", + "execution_count": 10, + "outputs": [], + "source": [ + "import tellurium as te\n", + "\n", + "simulator = te.loadSBMLModel('../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml')\n" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.959849Z", + "start_time": "2024-05-01T06:56:28.167336Z" + } + }, + "id": "5f07a08ac835b2b5" + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "data": { + "text/plain": "['_ExtendedRoadRunner__getSBML',\n '_RoadRunner__simulateOld',\n '_RoadRunner__simulateOptions',\n '__class__',\n '__delattr__',\n '__dict__',\n '__dir__',\n '__doc__',\n '__eq__',\n '__format__',\n '__ge__',\n '__getattr__',\n '__getattribute__',\n '__getitem__',\n '__getstate__',\n '__gt__',\n '__hash__',\n '__init__',\n '__init_subclass__',\n '__le__',\n '__len__',\n '__lt__',\n '__module__',\n '__ne__',\n '__new__',\n '__reduce__',\n '__reduce_ex__',\n '__repr__',\n '__setattr__',\n '__setitem__',\n '__setstate__',\n '__sizeof__',\n '__str__',\n '__subclasshook__',\n '__swig_destroy__',\n '__weakref__',\n '_addCompartment',\n '_addParameter',\n '_addReaction',\n '_addSpeciesAmount',\n '_addSpeciesConcentration',\n '_diffstep_getter',\n '_diffstep_stter',\n '_getConservedMoietyAnalysis',\n '_getDependentFloatingSpeciesIds',\n '_getIds',\n '_getIndependentFloatingSpeciesIds',\n '_getModel',\n '_getSelections',\n '_getSteadyStateSelections',\n '_getValue',\n '_load',\n '_makeProperties',\n '_model_functions',\n '_new_init',\n '_properties',\n '_setConservedMoietyAnalysis',\n '_setConservedMoietyAnalysisProxy',\n '_setSelections',\n '_setSimulateOptionsTimes',\n '_setSteadyStateSelections',\n '_simulate',\n '_steadyStateThresh_getter',\n '_steadyStateThresh_setter',\n '_swig_init',\n 'addAssignmentRule',\n 'addCompartment',\n 'addDelay',\n 'addEvent',\n 'addEventAssignment',\n 'addInitialAssignment',\n 'addParameter',\n 'addPriority',\n 'addRateRule',\n 'addReaction',\n 'addSpecies',\n 'addSpeciesAmount',\n 'addSpeciesConcentration',\n 'addTrigger',\n 'bs',\n 'clearModel',\n 'compartment_1',\n 'conservedMoietyAnalysis',\n 'createSelection',\n 'diffstep',\n 'draw',\n 'dv',\n 'exportToAntimony',\n 'exportToCellML',\n 'exportToMatlab',\n 'exportToSBML',\n 'fjac',\n 'fs',\n 'getAntimony',\n 'getAssignmentRuleIds',\n 'getAvailableIntegrators',\n 'getBoundarySpeciesAmounts',\n 'getBoundarySpeciesAmountsNamedArray',\n 'getBoundarySpeciesConcentrationIds',\n 'getBoundarySpeciesConcentrations',\n 'getBoundarySpeciesConcentrationsNamedArray',\n 'getBoundarySpeciesIds',\n 'getCC',\n 'getCellML',\n 'getCompartmentIds',\n 'getCompartmentVolumes',\n 'getCompiler',\n 'getConservationMatrix',\n 'getConservedMoietyIds',\n 'getConservedMoietyValues',\n 'getCurrentAntimony',\n 'getCurrentCellML',\n 'getCurrentMatlab',\n 'getCurrentSBML',\n 'getCurrentTime',\n 'getDependentFloatingSpeciesAmountsNamedArray',\n 'getDependentFloatingSpeciesAmountsV',\n 'getDependentFloatingSpeciesConcentrationsNamedArray',\n 'getDependentFloatingSpeciesConcentrationsV',\n 'getDependentFloatingSpeciesIds',\n 'getDependentRatesOfChange',\n 'getDependentRatesOfChangeNamedArray',\n 'getDiffStepSize',\n 'getEE',\n 'getEigenValueIds',\n 'getExistingIntegratorNames',\n 'getExistingSensitivitySolverNames',\n 'getExistingSteadyStateSolverNames',\n 'getExtendedStoichiometryMatrix',\n 'getExtendedVersionInfo',\n 'getFloatingSpeciesAmounts',\n 'getFloatingSpeciesAmountsNamedArray',\n 'getFloatingSpeciesConcentrationIds',\n 'getFloatingSpeciesConcentrations',\n 'getFloatingSpeciesConcentrationsNamedArray',\n 'getFloatingSpeciesIds',\n 'getFloatingSpeciesInitialConcentrationIds',\n 'getFluxThreshold',\n 'getFrequencyResponse',\n 'getFullEigenValues',\n 'getFullEigenValuesNamedArray',\n 'getFullJacobian',\n 'getFullStoichiometryMatrix',\n 'getGlobalParameterByName',\n 'getGlobalParameterIds',\n 'getGlobalParameterValues',\n 'getHasOnlySubstanceUnits',\n 'getIds',\n 'getIndependentFloatingSpeciesAmountsNamedArray',\n 'getIndependentFloatingSpeciesAmountsV',\n 'getIndependentFloatingSpeciesConcentrationsNamedArray',\n 'getIndependentFloatingSpeciesConcentrationsV',\n 'getIndependentFloatingSpeciesIds',\n 'getIndependentRatesOfChange',\n 'getIndependentRatesOfChangeNamedArray',\n 'getInfo',\n 'getInitialAssignmentIds',\n 'getInstanceCount',\n 'getInstanceID',\n 'getIntegrator',\n 'getIntegratorByName',\n 'getKMatrix',\n 'getKineticLaw',\n 'getL0Matrix',\n 'getLinkMatrix',\n 'getMatlab',\n 'getModel',\n 'getModelId',\n 'getModelName',\n 'getNrMatrix',\n 'getNumBoundarySpecies',\n 'getNumCompartments',\n 'getNumConservedMoieties',\n 'getNumDepFloatingSpecies',\n 'getNumEvents',\n 'getNumFloatingSpecies',\n 'getNumGlobalParameters',\n 'getNumIndFloatingSpecies',\n 'getNumRateRules',\n 'getNumReactions',\n 'getNumberOfDependentSpecies',\n 'getNumberOfIndependentSpecies',\n 'getParamPromotedSBML',\n 'getRateRuleIds',\n 'getRatesOfChange',\n 'getRatesOfChangeNamedArray',\n 'getReactionIds',\n 'getReactionRates',\n 'getReducedEigenValues',\n 'getReducedEigenValuesNamedArray',\n 'getReducedJacobian',\n 'getReducedStoichiometryMatrix',\n 'getRegisteredIntegratorNames',\n 'getRegisteredSensitivitySolverNames',\n 'getRegisteredSteadyStateSolverNames',\n 'getSBML',\n 'getScaledConcentrationControlCoefficientMatrix',\n 'getScaledElasticityMatrix',\n 'getScaledFloatingSpeciesElasticity',\n 'getScaledFluxControlCoefficientMatrix',\n 'getSeed',\n 'getSelectedValues',\n 'getSensitivitySolver',\n 'getSensitivitySolverByName',\n 'getSimulationData',\n 'getSteadyStateSelectionStrings',\n 'getSteadyStateSolver',\n 'getSteadyStateSolverByName',\n 'getSteadyStateThreshold',\n 'getSteadyStateValues',\n 'getSteadyStateValuesNamedArray',\n 'getSupportedIdTypes',\n 'getUnscaledConcentrationControlCoefficientMatrix',\n 'getUnscaledElasticityMatrix',\n 'getUnscaledFluxControlCoefficientMatrix',\n 'getUnscaledParameterElasticity',\n 'getUnscaledSpeciesElasticity',\n 'getValue',\n 'getuCC',\n 'getuEE',\n 'gillespie',\n 'integrator',\n 'integratorExists',\n 'internalOneStep',\n 'isModelLoaded',\n 'items',\n 'iteritems',\n 'iterkeys',\n 'itervalues',\n 'keys',\n 'load',\n 'loadState',\n 'loadStateS',\n 'makeIntegrator',\n 'makeSensitivitySolver',\n 'makeSteadyStateSolver',\n 'mcaSteadyState',\n 'model',\n 'oneStep',\n 'options',\n 'parameter_1',\n 'parameter_13',\n 'parameter_2',\n 'plot',\n 'plotLegend',\n 'ps',\n 'reaction_1',\n 'reaction_10',\n 'reaction_11',\n 'reaction_12',\n 'reaction_13',\n 'reaction_14',\n 'reaction_2',\n 'reaction_3',\n 'reaction_4',\n 'reaction_5',\n 'reaction_6',\n 'reaction_7',\n 'reaction_8',\n 'reaction_9',\n 'regenerateModel',\n 'registerSolvers',\n 'removeCompartment',\n 'removeEvent',\n 'removeEventAssignments',\n 'removeInitialAssignment',\n 'removeParameter',\n 'removeReaction',\n 'removeRules',\n 'removeSpecies',\n 'reset',\n 'resetAll',\n 'resetParameter',\n 'resetSelectionLists',\n 'resetToOrigin',\n 'rs',\n 'rv',\n 'saveState',\n 'saveStateS',\n 'seed',\n 'selections',\n 'sensitivitySolverExists',\n 'setBoundary',\n 'setConstant',\n 'setDiffStepSize',\n 'setFluxThreshold',\n 'setGlobalParameterByName',\n 'setHasOnlySubstanceUnits',\n 'setInitAmount',\n 'setInitConcentration',\n 'setIntegrator',\n 'setIntegratorSetting',\n 'setKineticLaw',\n 'setModelId',\n 'setModelName',\n 'setOptions',\n 'setPersistent',\n 'setReversible',\n 'setSeed',\n 'setSensitivitySolver',\n 'setSteadyStateSolver',\n 'setSteadyStateThreshold',\n 'setTriggerInitialValue',\n 'setValue',\n 'setValues',\n 'show',\n 'showPlot',\n 'simulate',\n 'sm',\n 'species_1',\n 'species_1_amt',\n 'species_1_conc',\n 'species_2',\n 'species_2_amt',\n 'species_2_conc',\n 'species_3',\n 'species_3_amt',\n 'species_3_conc',\n 'species_4',\n 'species_4_amt',\n 'species_4_conc',\n 'species_5',\n 'species_5_amt',\n 'species_5_conc',\n 'species_6',\n 'species_6_amt',\n 'species_6_conc',\n 'steadyState',\n 'steadyStateNamedArray',\n 'steadyStateSelections',\n 'steadyStateSolver',\n 'steadyStateSolverExists',\n 'steadyStateThresh',\n 'sv',\n 'this',\n 'thisown',\n 'timeCourseSelections',\n 'timeSeriesSensitivities',\n 'validateCurrentSBML',\n 'values',\n 'vs']" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(simulator)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.967633Z", + "start_time": "2024-05-01T06:56:28.963005Z" + } + }, + "id": "f4fd7072004772cb" + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [ + { + "data": { + "text/plain": "array([7.00e-07, 0.00e+00, 0.00e+00, 1.68e-04, 3.20e-04, 0.00e+00,\n 0.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, 3.20e-03,\n 1.00e-02, 1.00e-02])" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulator.getReactionRates()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.973429Z", + "start_time": "2024-05-01T06:56:28.967766Z" + } + }, + "id": "e92d5b185840048f" + }, + { + "cell_type": "code", + "execution_count": 13, + "outputs": [ + { + "data": { + "text/plain": "['reaction_1',\n 'reaction_2',\n 'reaction_3',\n 'reaction_4',\n 'reaction_5',\n 'reaction_6',\n 'reaction_7',\n 'reaction_8',\n 'reaction_9',\n 'reaction_10',\n 'reaction_11',\n 'reaction_12',\n 'reaction_13',\n 'reaction_14']" + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulator.getReactionIds()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:28.976229Z", + "start_time": "2024-05-01T06:56:28.971951Z" + } + }, + "id": "278ae59c7dedfc33" + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "collapsed": false + }, + "id": "264bd8c515dda5aa" + }, + { + "cell_type": "code", + "execution_count": 14, + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "No such solver called \"stochastic\". Available options are \"cvode\", \"gillespie\", \"rk4\", \"rk45\", \"euler\"", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mRuntimeError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[14], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43msimulator\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mintegrator\u001B[49m \u001B[38;5;241m=\u001B[39m \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mstochastic\u001B[39m\u001B[38;5;124m'\u001B[39m\n", + "File \u001B[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-ECOqdsTs-py3.10/lib/python3.10/site-packages/roadrunner/roadrunner.py:2867\u001B[0m, in \u001B[0;36mRoadRunner.setIntegrator\u001B[0;34m(self, name)\u001B[0m\n\u001B[1;32m 2865\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21msetIntegrator\u001B[39m(\u001B[38;5;28mself\u001B[39m, name: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mstd::string const &\u001B[39m\u001B[38;5;124m\"\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mvoid\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[1;32m 2866\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124mr\u001B[39m\u001B[38;5;124;03m\"\"\"set the current Integrator to :param name;:\"\"\"\u001B[39;00m\n\u001B[0;32m-> 2867\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43m_roadrunner\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mRoadRunner_setIntegrator\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mname\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[0;31mRuntimeError\u001B[0m: No such solver called \"stochastic\". Available options are \"cvode\", \"gillespie\", \"rk4\", \"rk45\", \"euler\"" + ] + } + ], + "source": [ + "simulator.integrator = 'stochastic'" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:29.393537Z", + "start_time": "2024-05-01T06:56:28.975565Z" + } + }, + "id": "3692858d8548cbee" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "simulator.integrator" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T06:56:29.398884Z", + "start_time": "2024-05-01T06:56:29.394793Z" + } + }, + "id": "f688e9553786d36e" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "simulator.getIds()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "start_time": "2024-05-01T06:56:29.397421Z" + } + }, + "id": "850c62b4ab027800" + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "data": { + "text/plain": "type" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T08:34:23.555250Z", + "start_time": "2024-05-01T08:34:23.547556Z" + } + }, + "id": "66b8d04c5b4d6d38" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "data": { + "text/plain": "numpy.ndarray" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np \n", + "type(np.random.rand(3, 4))" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T16:16:16.860293Z", + "start_time": "2024-05-01T16:16:16.843628Z" + } + }, + "id": "665d11516a211ac8" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generation 0\n", + "Best fitness: 0.02801479563046072\n", + "Generation 1\n", + "Best fitness: 0.02801479563046072\n", + "Generation 2\n", + "Best fitness: 0.02801479563046072\n", + "Generation 3\n", + "Best fitness: 0.02801479563046072\n", + "Generation 4\n", + "Best fitness: 0.02801479563046072\n", + "Generation 5\n", + "Best fitness: 0.006007810411500336\n", + "Generation 6\n", + "Best fitness: 0.006007810411500336\n", + "Generation 7\n", + "Best fitness: 0.006007810411500336\n", + "Generation 8\n", + "Best fitness: 0.0007575817243439253\n", + "Generation 9\n", + "Best fitness: 6.63345185392128e-05\n", + "Generation 10\n", + "Best fitness: 4.4860689358605654e-05\n", + "Generation 11\n", + "Best fitness: 3.97414125982154e-05\n", + "Generation 12\n", + "Best fitness: 1.7883422972375662e-05\n", + "Generation 13\n", + "Best fitness: 1.5526645734675881e-06\n", + "Generation 14\n", + "Best fitness: 1.5526645734675881e-06\n", + "Generation 15\n", + "Best fitness: 1.925006692937714e-07\n", + "Generation 16\n", + "Best fitness: 1.925006692937714e-07\n", + "Generation 17\n", + "Best fitness: 3.75755874193473e-08\n", + "Generation 18\n", + "Best fitness: 3.75755874193473e-08\n", + "Generation 19\n", + "Best fitness: 2.2750193617859793e-08\n", + "Generation 20\n", + "Best fitness: 3.442072293857734e-09\n", + "Generation 21\n", + "Best fitness: 3.442072293857734e-09\n", + "Generation 22\n", + "Best fitness: 1.479702693707452e-09\n", + "Generation 23\n", + "Best fitness: 8.82388606626705e-11\n", + "Generation 24\n", + "Best fitness: 1.3380296870479924e-11\n", + "Generation 25\n", + "Best fitness: 1.3380296870479924e-11\n", + "Generation 26\n", + "Best fitness: 9.421019520061691e-12\n", + "Generation 27\n", + "Best fitness: 9.421019520061691e-12\n", + "Generation 28\n", + "Best fitness: 1.0754730439543891e-12\n", + "Generation 29\n", + "Best fitness: 9.72333324966712e-13\n", + "Generation 30\n", + "Best fitness: 9.72333324966712e-13\n", + "Generation 31\n", + "Best fitness: 3.93574062229618e-13\n", + "Generation 32\n", + "Best fitness: 4.5852210917018965e-14\n", + "Generation 33\n", + "Best fitness: 9.992007221626409e-15\n", + "Generation 34\n", + "Best fitness: 9.992007221626409e-15\n", + "Generation 35\n", + "Best fitness: 2.4424906541753444e-15\n", + "Generation 36\n", + "Best fitness: 2.3314683517128287e-15\n", + "Generation 37\n", + "Best fitness: 3.3306690738754696e-16\n", + "Generation 38\n", + "Best fitness: 1.1102230246251565e-16\n", + "Generation 39\n", + "Best fitness: 1.1102230246251565e-16\n", + "Generation 40\n", + "Best fitness: 1.1102230246251565e-16\n", + "Generation 41\n", + "Best fitness: 0.0\n", + "Generation 42\n", + "Best fitness: 0.0\n", + "Generation 43\n", + "Best fitness: 0.0\n", + "Generation 44\n", + "Best fitness: 0.0\n", + "Generation 45\n", + "Best fitness: 0.0\n", + "Generation 46\n", + "Best fitness: 0.0\n", + "Generation 47\n", + "Best fitness: 0.0\n", + "Generation 48\n", + "Best fitness: 0.0\n", + "Generation 49\n", + "Best fitness: 0.0\n", + "Generation 50\n", + "Best fitness: 0.0\n", + "Generation 51\n", + "Best fitness: 0.0\n", + "Generation 52\n", + "Best fitness: 0.0\n", + "Generation 53\n", + "Best fitness: 0.0\n", + "Generation 54\n", + "Best fitness: 0.0\n", + "Generation 55\n", + "Best fitness: 0.0\n", + "Stopping: No improvement in 40 generations.\n", + "The winning value: 0.5742081442947241\n", + "Best output closest to winning value with dynamic stopping: BestOutput(value=0.5742081442947241, generation=55, index=0, winning_value=0.5742081442947241)\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from dataclasses import dataclass\n", + "from random import randint\n", + "\n", + "\n", + "@dataclass\n", + "class BestOutput:\n", + " value: float \n", + " generation: int \n", + " index: int \n", + " winning_value: float \n", + " \n", + "\n", + "# Fetch experimental data\n", + "def get_experimental_data(param_name: str = None) -> float:\n", + " # TODO: enable this\n", + " return np.random.rand()\n", + "\n", + "# Initialize parameters\n", + "winning_value = get_experimental_data() # TODO: Fetch this data from experimental online\n", + "population_size = 100 # Number of simulators being compared\n", + "mutation_rate = 0.1 # Initial mutation rate\n", + "range_low = 0 \n", + "range_high = 20 # TODO: make low and high derived automatically from population size and winning value\n", + "\n", + "\n", + "# Fitness function\n", + "def calculate_fitness(population):\n", + " return [abs(individual - winning_value) for individual in population]\n", + "\n", + "# Selection function\n", + "def select_individuals(fitness, num_parents):\n", + " fitness = np.array(fitness)\n", + " sorted_indices = np.argsort(fitness)\n", + " return sorted_indices[:num_parents]\n", + "\n", + "# Crossover function\n", + "def crossover(parents, num_offspring):\n", + " offspring = []\n", + " for _ in range(num_offspring):\n", + " parent1, parent2 = np.random.choice(parents, 2, replace=False)\n", + " child = (parent1 + parent2) / 2\n", + " offspring.append(child)\n", + " return offspring\n", + "\n", + "# Mutation function\n", + "def mutate(offspring, mutation_rate):\n", + " for i in range(len(offspring)):\n", + " if np.random.rand() < mutation_rate:\n", + " offspring[i] += np.random.normal(0, 0.1)\n", + " return offspring\n", + "\n", + "# Feedback function to adjust algorithm parameters based on real-world testing\n", + "def feedback_adjustment(best_output, current_range):\n", + " error = abs(best_output - winning_value)\n", + " new_mutation_rate = max(0.01, mutation_rate - 0.02 * (1 - error / (range_high - range_low)))\n", + " new_range_low, new_range_high = current_range\n", + " if error < 1:\n", + " new_range_low, new_range_high = best_output - 5, best_output + 5\n", + " return new_mutation_rate, new_range_low, new_range_high\n", + "\n", + "# Main genetic algorithm function with dynamic stopping\n", + "def genetic_algorithm(improvement_threshold=0.000001, max_stagnation=40):\n", + " global range_low, range_high, mutation_rate\n", + " population = np.random.uniform(low=range_low, high=range_high, size=population_size)\n", + " best_output = None\n", + " best_index = None\n", + " last_best_fitness = float('inf')\n", + " stagnation_counter = 0\n", + "\n", + " generation = 0\n", + " while True:\n", + " fitness = calculate_fitness(population)\n", + " current_best_fitness = min(fitness)\n", + " print(f\"Generation {generation}\")\n", + " print(\"Best fitness:\", current_best_fitness)\n", + "\n", + " if current_best_fitness < last_best_fitness:\n", + " if last_best_fitness - current_best_fitness < improvement_threshold:\n", + " stagnation_counter += 1\n", + " else:\n", + " stagnation_counter = 0\n", + " last_best_fitness = current_best_fitness\n", + " else:\n", + " stagnation_counter += 1\n", + "\n", + " if stagnation_counter >= max_stagnation:\n", + " print(f\"Stopping: No improvement in {max_stagnation} generations.\")\n", + " break\n", + "\n", + " selected_indices = select_individuals(fitness, population_size // 2)\n", + " selected = [population[i] for i in selected_indices]\n", + "\n", + " offspring = crossover(selected, population_size - len(selected))\n", + " offspring = mutate(offspring, mutation_rate)\n", + "\n", + " population = np.array(selected + offspring)\n", + "\n", + " best_index = np.argmin(calculate_fitness(population))\n", + " best_output = population[best_index]\n", + " mutation_rate, range_low, range_high = feedback_adjustment(best_output, (range_low, range_high))\n", + "\n", + " generation += 1\n", + "\n", + " return BestOutput(value=best_output, generation=generation, index=best_index, winning_value=winning_value)\n", + "\n", + "\n", + "# Running the enhanced genetic algorithm\n", + "best_output = genetic_algorithm()\n", + "print(f\"The winning value: {winning_value}\")\n", + "print(\"Best output closest to winning value with dynamic stopping:\", best_output)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-01T17:26:10.121893Z", + "start_time": "2024-05-01T17:26:10.084506Z" + } + }, + "id": "e6938f543d913ac" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + }, + "id": "21fcf6952f0ba30" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/demos/copasi_process_demo.ipynb b/demos/copasi_process_demo.ipynb new file mode 100644 index 000000000..4404ab886 --- /dev/null +++ b/demos/copasi_process_demo.ipynb @@ -0,0 +1,867 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "40898635d17c0f08", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:15.246340Z", + "start_time": "2024-05-02T17:46:15.195226Z" + } + }, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.insert(0, '..')\n", + "\n", + "import os\n", + "import requests\n", + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:18.648654Z", + "start_time": "2024-05-02T17:46:15.382959Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CobraProcess registered successfully.\n", + "CopasiProcess registered successfully.\n", + "SmoldynProcess not available. Error: \n", + "PLEASE NOTE: Smoldyn is not correctly installed on your system which prevents you from using the SmoldynProcess. Please refer to the README for further information on installing Smoldyn.\n", + "TelluriumProcess registered successfully.\n" + ] + } + ], + "source": [ + "from biosimulator_processes.utils import prepare_single_copasi_process_schema\n", + "from biosimulator_processes import CORE\n", + "from process_bigraph import Composite, pp" + ] + }, + { + "cell_type": "markdown", + "id": "c7dca241b02a7265", + "metadata": {}, + "source": [ + "#### Step 1: Define the document to be read by the Composite, which is implemented by the Process." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2633feac24b596a6", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T17:46:18.651630Z", + "start_time": "2024-05-02T17:46:18.643502Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "{'copasi_A': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'},\n 'method': 'lsoda',\n 'species_context': 'concentrations'},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}},\n 'emitter': {'emitter': {'_type': 'step',\n 'address': 'local:ram-emitter',\n 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']}}}}" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "biomodel_id = 'BIOMD0000000630'\n", + "model_fp = f'../biosimulator_processes/model_files/sbml/{biomodel_id}_url.xml'\n", + "species_context = 'concentrations'\n", + "species_port_name = f'floating_species_{species_context}'\n", + "species_store = [f'floating_species_{species_context}_store']\n", + "duration = 30\n", + "\n", + "document = prepare_single_copasi_process_schema(\n", + " process_name='copasi_A',\n", + " sbml_model_fp=model_fp)\n", + "\n", + "document" + ] + }, + { + "cell_type": "markdown", + "id": "e502cb54666345af", + "metadata": {}, + "source": [ + "\n", + "\n", + "#### Step 2: Define the instance composition along with the process registry" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bd91dca0be22cd27", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T17:40:47.750756Z", + "start_time": "2024-05-02T17:40:47.687910Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + } + ], + "source": [ + "workflow = Composite(\n", + " config={'state': document},\n", + " core=CORE\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "857667277d39c647", + "metadata": {}, + "source": [ + "#### Step 3: Run the workflow for a duration and get the results" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7c6f72142af0616b", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T17:40:48.035636Z", + "start_time": "2024-05-02T17:40:47.887576Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/demos/../biosimulator_processes/processes/copasi_process.py:249: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + } + ], + "source": [ + "workflow.run(duration)\n", + "\n", + "results = workflow.gather_results()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c7a254aee3009b8c", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T02:22:57.402016Z", + "start_time": "2024-05-02T02:22:57.387107Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n" + ] + } + ], + "source": [ + "pp(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "76259bde7fd711f5", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T02:22:59.583591Z", + "start_time": "2024-05-02T02:22:59.423936Z" + } + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'instance'", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mKeyError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[7], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m emitter \u001B[38;5;241m=\u001B[39m \u001B[43mworkflow\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mstate\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43memitter\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43minstance\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m]\u001B[49m\n", + "\u001B[0;31mKeyError\u001B[0m: 'instance'" + ] + } + ], + "source": [ + "emitter = workflow.state['emitter']['instance']" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7924d2e8b42e432d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-02T02:28:40.448604Z", + "start_time": "2024-05-02T02:28:40.443409Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "{'floating_species_concentrations_store': {'plasminogen': 0.0,\n 'plasmin': 0.0,\n 'single intact chain urokinase-type plasminogen activator': 0.0,\n 'two-chain urokinase-type plasminogen activator': 0.0,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'model_parameters_store': {'degradation constant 1': 0.0,\n 'degradation constant 2': 0.0,\n 'hill cooperativity': 0.0},\n 'time_store': 30.0,\n 'copasi_A': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml',\n 'model_id': '',\n 'model_language': 'sbml',\n 'model_name': 'composite_process_model',\n 'model_changes': {'species_changes': {},\n 'global_parameter_changes': {},\n 'reaction_changes': {}},\n 'model_units': {}},\n 'method': 'lsoda',\n 'species_context': 'concentrations'},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']},\n 'instance': ,\n 'interval': 1.0,\n '_inputs': {'time': 'float',\n 'floating_species_concentrations': {'plasminogen': {'_type': 'float',\n '_apply': 'set'},\n 'plasmin': {'_type': 'float', '_apply': 'set'},\n 'single intact chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'two-chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'x': {'_type': 'float', '_apply': 'set'},\n 'x-plasmin': {'_type': 'float', '_apply': 'set'}},\n 'model_parameters': {'degradation constant 1': {'_type': 'float',\n '_apply': 'set'},\n 'degradation constant 2': {'_type': 'float', '_apply': 'set'},\n 'hill cooperativity': {'_type': 'float', '_apply': 'set'}},\n 'reactions': {'cleavage of plasminogen': 'float',\n 'activation of urokinase-type plasminogen activator': 'float',\n 'activation of plasmin': 'float',\n 'degradation of single intact chain urokinase-type plasminogen activator': 'float',\n 'degradation of plasminogen': 'float',\n 'degradation of plasmin': 'float',\n 'degradation of two-chain urokinase type plasminogen activator': 'float',\n 'reversible plasmin bonding x': 'float',\n 'catalytic reaction of x-plasmin': 'float',\n 'degradation of x': 'float',\n 'degradation of x-plasmin': 'float',\n 'synthesis of single intact chain urokinase-type plasminogen activator': 'float',\n 'synthesis of plasminogen': 'float',\n 'synthesis of x': 'float'}},\n '_outputs': {'time': 'float',\n 'floating_species_concentrations': {'plasminogen': {'_type': 'float',\n '_apply': 'set'},\n 'plasmin': {'_type': 'float', '_apply': 'set'},\n 'single intact chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'two-chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'x': {'_type': 'float', '_apply': 'set'},\n 'x-plasmin': {'_type': 'float', '_apply': 'set'}}}},\n 'emitter': {'emitter': {'_type': 'step',\n 'address': 'local:ram-emitter',\n 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']},\n 'instance': ,\n '_inputs': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'},\n '_outputs': {},\n 'outputs': {}}},\n 'global_time': 30.0,\n 'reactions_store': {'cleavage of plasminogen': 0.0,\n 'activation of urokinase-type plasminogen activator': 0.0,\n 'activation of plasmin': 0.0,\n 'degradation of single intact chain urokinase-type plasminogen activator': 0.0,\n 'degradation of plasminogen': 0.0,\n 'degradation of plasmin': 0.0,\n 'degradation of two-chain urokinase type plasminogen activator': 0.0,\n 'reversible plasmin bonding x': 0.0,\n 'catalytic reaction of x-plasmin': 0.0,\n 'degradation of x': 0.0,\n 'degradation of x-plasmin': 0.0,\n 'synthesis of single intact chain urokinase-type plasminogen activator': 0.0,\n 'synthesis of plasminogen': 0.0,\n 'synthesis of x': 0.0}}" + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "workflow.state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27ae371af7ff2fa6", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136275c9f8743a57", + "metadata": {}, + "outputs": [], + "source": [ + "from biosimulator_processes.steps.viz import parse_composition_results\n", + "\n", + "\n", + "results = parse_composition_results(workflow)\n", + "\n", + "pp(results)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6bbb65c9a862f12", + "metadata": {}, + "outputs": [], + "source": [ + "y_data = []\n", + "times = list(results.keys())\n", + "index = 'floating_species_concentrations'\n", + "\n", + "\n", + " \n", + "\n", + "for timestamp, result in results.items():\n", + " \n", + " root_data = result[index]\n", + " names = list(root_data.keys())\n", + " for name in names:\n", + " y_data.append(results[timestamp][index][name])\n", + " print(f'Got data for name {name}: {y_data}')\n", + " y_data.clear()\n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "150dc15755417a42", + "metadata": {}, + "outputs": [], + "source": [ + "workflow.state['global_time']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1614b8359c0651f", + "metadata": {}, + "outputs": [], + "source": [ + "from biosimulator_processes.steps.viz import ResultsAnimation, Plotter2d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "601a2e10c945b363", + "metadata": {}, + "outputs": [], + "source": [ + "output = results.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "538db282c51069d6", + "metadata": {}, + "outputs": [], + "source": [ + "output_vals = output[('emitter',)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a44c1cc0f9850758", + "metadata": {}, + "outputs": [], + "source": [ + "timescale = list(set([val.get('time', 0.0) for val in output_vals]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c510ec6dac592eb", + "metadata": {}, + "outputs": [], + "source": [ + "timescale" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f27e97fdebb17b07", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "counts_data = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c476add07372b47c", + "metadata": {}, + "outputs": [], + "source": [ + "for i, val in enumerate(output_vals):\n", + " species_data = val.get('floating_species_concentrations')\n", + " data.append(species_data.get('plasminogen'))\n", + " counts = val.get('floating_species_counts')\n", + " counts_data.append(counts.get('plasminogen'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f84f85bf43a82b40", + "metadata": {}, + "outputs": [], + "source": [ + "len(timescale), len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4311ca8a4fce3a7c", + "metadata": {}, + "outputs": [], + "source": [ + "Plotter2d.plot_single_output(timescale=timescale, data=data, species_name='plasminogen concentration')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a385d75479e50b1c", + "metadata": {}, + "outputs": [], + "source": [ + "Plotter2d.plot_single_output(timescale=timescale, data=counts_data, species_name='plasminogen counts', plot_concentration=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b07263ce48d2094", + "metadata": {}, + "outputs": [], + "source": [ + "Plotter2d.plot_output(x_data=data, y_data=counts_data, title='Plasminogen concentration over counts', x_label='concentration', y_label='counts', species='plasminogen')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e5efa38b0de7505", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65cf4a00f212edaa", + "metadata": {}, + "outputs": [], + "source": [ + "class_name = 'TelluriumProcess'\n", + "module_name = 'tellurium_process'\n", + "module__ = module_name.split('_')\n", + "for i, v in enumerate(module__):\n", + " val = v.replace(v[0], v[0].upper())\n", + " module__.pop(i)\n", + " module__.insert(i, val)\n", + "print(module__.join())\n", + "import_statement = f'biosimulator_processes.processes.{module_name}'\n", + "\n", + "module = __import__(\n", + " import_statement, fromlist=[class_name])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b43d4e3d39be4ff", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "module" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db19fb9af030507", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class_name\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9aa632d6ba1240d1", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = list(range(10))\n", + "y = list(range(10))\n", + "z = [x, y]\n", + "\n", + "def func(z):\n", + " for i, v in enumerate(z):\n", + " if z[i + 1] != z[i]:\n", + " return" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5e19d61cb651a822", + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:29.460012Z", + "start_time": "2024-05-02T17:46:29.441447Z" + } + }, + "outputs": [], + "source": [ + "from biosimulator_processes.processes.copasi_process import CopasiProcess \n", + "\n", + "\n", + "process_name = 'copasi'\n", + "module_name = f'{process_name}_process'\n", + "import_statement = f'biosimulator_processes.processes.{module_name}'\n", + "module_paths = module_name.split('_')\n", + "module_id = module_paths[0]\n", + "module_type = module_paths[1]\n", + "class_name = module_id.replace(module_id[0], module_id[0].upper())\n", + "class_name += module_type.replace(module_type[0], module_type[0].upper())\n", + "module = __import__(\n", + " import_statement, fromlist=[class_name])\n", + "# Get the class from the module\n", + "bigraph_class = getattr(module, class_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [ + { + "data": { + "text/plain": "{'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml'},\n 'method': 'lsoda',\n 'species_context': 'concentrations'}" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "document['copasi_A']['config']" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:31.253580Z", + "start_time": "2024-05-02T17:46:31.241197Z" + } + }, + "id": "d560d9964c489785" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found a filepath\n" + ] + } + ], + "source": [ + "copasi_process: CopasiProcess = bigraph_class(config=document['copasi_A']['config'])\n", + "\n", + "process_attributes = vars(copasi_process)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:32.631847Z", + "start_time": "2024-05-02T17:46:32.573561Z" + } + }, + "id": "c1aff67afe1cd8e8" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [ + { + "data": { + "text/plain": "{'time': 0.0,\n 'model_parameters': {'degradation constant 1': 0.5,\n 'degradation constant 2': 0.032,\n 'hill cooperativity': 2.0},\n 'floating_species_concentrations': {'plasminogen': 6022140760000000.0,\n 'plasmin': 0.0,\n 'single intact chain urokinase-type plasminogen activator': 1204428152000000.0,\n 'two-chain urokinase-type plasminogen activator': 0.0,\n 'x': 0.0,\n 'x-plasmin': 0.0}}" + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_initial_state = copasi_process.initial_state().copy()\n", + "\n", + "new_initial_state['model_parameters']['degradation constant 1'] = 0.50\n", + "\n", + "new_initial_state" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:46:33.853711Z", + "start_time": "2024-05-02T17:46:33.843267Z" + } + }, + "id": "8b3a24a6e47f6eab" + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T18:01:29.107236Z", + "start_time": "2024-05-02T18:01:29.092702Z" + } + }, + "id": "6a2e21d03e963604" + }, + { + "cell_type": "code", + "execution_count": 13, + "outputs": [], + "source": [ + "\n", + "\n", + "\n", + "def parse_state_params(state) -> list[str]:\n", + " state_parameters = []\n", + " _nested_vals = {}\n", + " \n", + " def parse_state(state): \n", + " for param_name, val in state.items():\n", + " if not isinstance(val, dict):\n", + " state_parameters.append(param_name)\n", + " else:\n", + " _nested_vals[param_name] = val\n", + " \n", + " parse_state(state)\n", + " nested = _nested_vals is not None\n", + " \n", + " def parse_nested(state, is_nested):\n", + " if not _nested_vals:\n", + " nested = False\n", + " print('nesting complete')\n", + " return\n", + " else:\n", + " print('is nested')\n", + " parse_state(state)\n", + " _nested_vals.clear()\n", + " \n", + " while nested:\n", + " parse_state(_nested_vals)\n", + " \n", + " return state_parameters\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " " + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T18:09:55.905065Z", + "start_time": "2024-05-02T18:09:55.895769Z" + } + }, + "id": "4206e75e0d01fbb8" + }, + { + "cell_type": "code", + "execution_count": 15, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[15], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m params \u001B[38;5;241m=\u001B[39m \u001B[43mparse_state_params\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnew_initial_state\u001B[49m\u001B[43m)\u001B[49m\n", + "Cell \u001B[0;32mIn[13], line 26\u001B[0m, in \u001B[0;36mparse_state_params\u001B[0;34m(state)\u001B[0m\n\u001B[1;32m 23\u001B[0m _nested_vals\u001B[38;5;241m.\u001B[39mclear()\n\u001B[1;32m 25\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m nested:\n\u001B[0;32m---> 26\u001B[0m \u001B[43mparse_state\u001B[49m\u001B[43m(\u001B[49m\u001B[43m_nested_vals\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 28\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m state_parameters\n", + "Cell \u001B[0;32mIn[13], line 7\u001B[0m, in \u001B[0;36mparse_state_params..parse_state\u001B[0;34m(state)\u001B[0m\n\u001B[1;32m 5\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mparse_state\u001B[39m(state): \n\u001B[1;32m 6\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m param_name, val \u001B[38;5;129;01min\u001B[39;00m state\u001B[38;5;241m.\u001B[39mitems():\n\u001B[0;32m----> 7\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;43misinstance\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mval\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mdict\u001B[39;49m\u001B[43m)\u001B[49m:\n\u001B[1;32m 8\u001B[0m state_parameters\u001B[38;5;241m.\u001B[39mappend(param_name)\n\u001B[1;32m 9\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n", + "\u001B[0;31mKeyboardInterrupt\u001B[0m: " + ] + } + ], + "source": [ + "params = parse_state_params(new_initial_state)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-03T15:03:11.977888Z", + "start_time": "2024-05-02T18:10:16.601120Z" + } + }, + "id": "6258b8ec1891a27d" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "\n", + "copasi_process.initial_state = new_initial_state" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:48:28.917017Z", + "start_time": "2024-05-02T17:48:28.904501Z" + } + }, + "id": "75aadcdd3dc1c8db" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/demos/../biosimulator_processes/processes/copasi_process.py:249: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "data": { + "text/plain": "{'time': 100.0, 'floating_species_concentrations': {'x-plasmin': 0.0}}" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "one_step = copasi_process.update(new_initial_state, 100.0)\n", + "\n", + "one_step" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:47:21.105371Z", + "start_time": "2024-05-02T17:47:21.091725Z" + } + }, + "id": "f7c8f328902103c" + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'dict' object is not callable", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mTypeError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[11], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mcopasi_process\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43minitial_state\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[0;31mTypeError\u001B[0m: 'dict' object is not callable" + ] + } + ], + "source": [ + "copasi_process.initial_state()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:48:44.839724Z", + "start_time": "2024-05-02T17:48:44.666280Z" + } + }, + "id": "d64f8f8de7463a00" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [ + { + "data": { + "text/plain": "{'floating_species_concentrations_store': {'plasminogen': 0.0,\n 'plasmin': 0.0,\n 'single intact chain urokinase-type plasminogen activator': 0.0,\n 'two-chain urokinase-type plasminogen activator': 0.0,\n 'x': 0.0,\n 'x-plasmin': 0.0},\n 'model_parameters_store': {'degradation constant 1': 0.0,\n 'degradation constant 2': 0.0,\n 'hill cooperativity': 0.0},\n 'time_store': 30.0,\n 'copasi_A': {'_type': 'process',\n 'address': 'local:copasi',\n 'config': {'model': {'model_source': '../biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml',\n 'model_id': '',\n 'model_language': 'sbml',\n 'model_name': 'composite_process_model',\n 'model_changes': {'species_changes': {},\n 'global_parameter_changes': {},\n 'reaction_changes': {}},\n 'model_units': {}},\n 'method': 'lsoda',\n 'species_context': 'concentrations'},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'model_parameters': ['model_parameters_store'],\n 'time': ['time_store'],\n 'reactions': ['reactions_store']},\n 'outputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']},\n 'instance': ,\n 'interval': 1.0,\n '_inputs': {'time': 'float',\n 'floating_species_concentrations': {'plasminogen': {'_type': 'float',\n '_apply': 'set'},\n 'plasmin': {'_type': 'float', '_apply': 'set'},\n 'single intact chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'two-chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'x': {'_type': 'float', '_apply': 'set'},\n 'x-plasmin': {'_type': 'float', '_apply': 'set'}},\n 'model_parameters': {'degradation constant 1': {'_type': 'float',\n '_apply': 'set'},\n 'degradation constant 2': {'_type': 'float', '_apply': 'set'},\n 'hill cooperativity': {'_type': 'float', '_apply': 'set'}},\n 'reactions': {'cleavage of plasminogen': 'float',\n 'activation of urokinase-type plasminogen activator': 'float',\n 'activation of plasmin': 'float',\n 'degradation of single intact chain urokinase-type plasminogen activator': 'float',\n 'degradation of plasminogen': 'float',\n 'degradation of plasmin': 'float',\n 'degradation of two-chain urokinase type plasminogen activator': 'float',\n 'reversible plasmin bonding x': 'float',\n 'catalytic reaction of x-plasmin': 'float',\n 'degradation of x': 'float',\n 'degradation of x-plasmin': 'float',\n 'synthesis of single intact chain urokinase-type plasminogen activator': 'float',\n 'synthesis of plasminogen': 'float',\n 'synthesis of x': 'float'}},\n '_outputs': {'time': 'float',\n 'floating_species_concentrations': {'plasminogen': {'_type': 'float',\n '_apply': 'set'},\n 'plasmin': {'_type': 'float', '_apply': 'set'},\n 'single intact chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'two-chain urokinase-type plasminogen activator': {'_type': 'float',\n '_apply': 'set'},\n 'x': {'_type': 'float', '_apply': 'set'},\n 'x-plasmin': {'_type': 'float', '_apply': 'set'}}}},\n 'emitter': {'emitter': {'_type': 'step',\n 'address': 'local:ram-emitter',\n 'config': {'emit': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'}},\n 'inputs': {'floating_species_concentrations': ['floating_species_concentrations_store'],\n 'time': ['time_store']},\n 'instance': ,\n '_inputs': {'floating_species_concentrations': 'tree[float]',\n 'time': 'float'},\n '_outputs': {},\n 'outputs': {}}},\n 'global_time': 30.0,\n 'reactions_store': {'cleavage of plasminogen': 0.0,\n 'activation of urokinase-type plasminogen activator': 0.0,\n 'activation of plasmin': 0.0,\n 'degradation of single intact chain urokinase-type plasminogen activator': 0.0,\n 'degradation of plasminogen': 0.0,\n 'degradation of plasmin': 0.0,\n 'degradation of two-chain urokinase type plasminogen activator': 0.0,\n 'reversible plasmin bonding x': 0.0,\n 'catalytic reaction of x-plasmin': 0.0,\n 'degradation of x': 0.0,\n 'degradation of x-plasmin': 0.0,\n 'synthesis of single intact chain urokinase-type plasminogen activator': 0.0,\n 'synthesis of plasminogen': 0.0,\n 'synthesis of x': 0.0}}" + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "workflow.state" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:41:00.790459Z", + "start_time": "2024-05-02T17:41:00.773632Z" + } + }, + "id": "2fd1d1169b59660b" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "data": { + "text/plain": "" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "workflow" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-05-02T17:40:58.396766Z", + "start_time": "2024-05-02T17:40:58.305142Z" + } + }, + "id": "c74e508f13eaceeb" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + }, + "id": "50919eb9594a555" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/demos/process-api.py b/demos/process-api.py new file mode 100644 index 000000000..4ce24d5fe --- /dev/null +++ b/demos/process-api.py @@ -0,0 +1,85 @@ +from typing import Callable +import numpy as np +from process_bigraph.composite import Composite, Process +from biosimulator_processes.steps.viz import ResultsAnimation + + +class Synthesizer: + current_note: list + + def __init__(self, sample_rate: int = 44100) -> None: + self.sample_rate = sample_rate + self.all_notes = {} + + def apply_effect(self, application_func: Callable, **kwargs): + """This should be called by the processes""" + return application_func(**kwargs) + + def generate_sine_wave(self, frequency: int, duration: int): + t = np.arange(0, duration, 1 /self.sample_rate) + return np.sin(2 * np.pi * frequency * t).tolist() + + def apply_tremolo(self, wave, rate: float, depth: float): + if isinstance(wave, list): + wave = np.array(wave) + t = np.arange(len(wave)) / self.sample_rate + modulator = 1 + depth * np.sin(2 * np.pi * rate * t) + return (wave * modulator).tolist() + + def apply_flanger(self, wave, delay: int, depth: int, rate: float): + if isinstance(wave, list): + wave = np.array(wave) + + length = len(wave) + flanged = np.copy(wave) + t = np.arange(length) + delay_signal = delay + depth * np.sin(2 * np.pi * rate * t / self.sample_rate) + + for i in range(length): + index = int(i - delay_signal[i]) + if index >= 0 and index < length: + flanged[i] += wave[index] + + return flanged.tolist() + + +class SynthesizerProcess(Process): + config_schema = { + 'frequency': 'int', + 'duration': 'int' + } + + def __init__(self, config=None, core=None): + super().__init__(config, core) + + def inputs(self): + pass + + + +def play(pitch: int, phrase_duration: int, atomic_duration: int): + output = [] + synth = Synthesizer() + '''output[0] = synth.generate_sine_wave(pitch, atomic_duration) + + for beat in range(phrase_duration): + output[beat + 1] = synth.apply_flanger(output[beat], 3, 8, 3.2)''' + + output.append(synth.generate_sine_wave(pitch, atomic_duration)) + output.append(synth.apply_tremolo(output[0], 23.23, 8.2)) + output.append(synth.apply_flanger(output[1], 3, 10, 23.4)) + output.append(synth.apply_flanger(output[2], 3, 10, 23.4)) + output.append(synth.apply_flanger(output[3], 3, 10, 23.4)) + return np.array(output) + + + +output = play(440, 10, 2) +print(output) + + + + + + + \ No newline at end of file diff --git a/notebooks/biolab_api_demo.ipynb b/notebooks/biolab_api_demo.ipynb deleted file mode 100644 index fbcc44577..000000000 --- a/notebooks/biolab_api_demo.ipynb +++ /dev/null @@ -1,1559 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "8087f67dcdaefdee", - "metadata": { - "collapsed": false - }, - "source": [ - "# BioLab API Demo (BioLab container)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c253d92e47737dd9", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:31:25.367399Z", - "start_time": "2024-03-15T20:31:25.362852Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# TODO: create sep repo and pypi for data model so that you can install it and import like `import sed_data as sed`" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:23:29.758772Z", - "start_time": "2024-03-15T20:23:29.756131Z" - }, - "collapsed": true - }, - "outputs": [], - "source": [ - "import sys\n", - "\n", - "sys.path.insert(0, '..')" - ] - }, - { - "cell_type": "markdown", - "id": "572ce5fd9c49efcb", - "metadata": { - "collapsed": false - }, - "source": [ - "#### **_Experiment 1_**: Here we cross a boundary in the stack that is a biological simulation. We go from model configuration, to experiment. Thus, this tooling sits at that level: both experiment specification AND experiment execution. It's not just a way to specify an experiment, but it is also a way to run it, given the many knobs and buttons that you can use predefine and customize the way the actual model is being solved. Our users are seeking to be involved in an experiment as a \"stack\". We should make a bigger distinction between terms like \"model\"." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "e3218a2629726818", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.374137Z", - "start_time": "2024-03-15T20:13:24.443503Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CobraProcess registered successfully.\n", - "CopasiProcess registered successfully.\n", - "SmoldynProcess registered successfully.\n", - "TelluriumProcess registered successfully.\n" - ] - } - ], - "source": [ - "from process_bigraph import pp\n", - "from biosimulator_processes.biosimulator_builder import BuildPrompter\n", - "from biosimulator_processes import SedDataModel as sed " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "871b58285775fb24", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.815316Z", - "start_time": "2024-03-15T20:13:26.375300Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TimeCourseModel(model_source='BIOMD0000000749',\n", - " model_id='model_from_BIOMD0000000749',\n", - " model_name='model_from_BIOMD0000000749',\n", - " model_language=(None,),\n", - " model_changes=None,\n", - " model_units=None)\n" - ] - } - ], - "source": [ - "# 1a. define a model for the process composition. In this case, just one model to be re-used as configuration for the processes we create:\n", - "\n", - "simple_tc_model = sed.TimeCourseModel(model_source=tumor_control_biomodel_id)\n", - "\n", - "pp(simple_tc_model)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "1519914d8b9a85ce", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:22:06.411220Z", - "start_time": "2024-03-15T20:22:06.408264Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ 'description': 'The paper describes a model of tumor control via alternating '\n", - " 'immunostimulating and immunosuppressive phases. \\r\\n'\n", - " 'Created by COPASI 4.25 (Build 207) \\r\\n'\n", - " '\\r\\n'\n", - " 'This model is described in the article: \\r\\n'\n", - " 'In silico tumor control induced via alternating '\n", - " 'immunostimulating and immunosuppressive phases\\r\\n'\n", - " 'AI Reppas, JCL Alfonso, and H Hatzikirou\\r\\n'\n", - " 'Virulence 7:2, 174--186\\r\\n'\n", - " '\\r\\n'\n", - " 'Abstract: \\r\\n'\n", - " 'Despite recent advances in the field of Oncoimmunology, the '\n", - " 'success potential of immunomodulatory therapies against '\n", - " 'cancer remains to be elucidated. One of the reasons is the '\n", - " 'lack of understanding on the complex interplay between tumor '\n", - " 'growth dynamics and the associated immune system responses. '\n", - " 'Toward this goal, we consider a mathematical model of '\n", - " 'vascularized tumor growth and the corresponding effector '\n", - " 'cell recruitment dynamics. Bifurcation analysis allows for '\n", - " 'the exploration of model’s dynamic behavior and the '\n", - " 'determination of these parameter regimes that result in '\n", - " 'immune-mediated tumor control. In this work, we focus on a '\n", - " 'particular tumor evasion regime that involves tumor and '\n", - " 'effector cell concentration oscillations of slowly '\n", - " 'increasing and decreasing amplitude, respectively. '\n", - " 'Considering a temporal multiscale analysis, we derive an '\n", - " 'analytically tractable mapping of model solutions onto a '\n", - " 'weakly negatively damped harmonic oscillator. Based on our '\n", - " 'analysis, we propose a theory-driven intervention strategy '\n", - " 'involving immunostimulating and immunosuppressive phases to '\n", - " 'induce long-term tumor control.\\r\\n'\n", - " '\\r\\n'\n", - " 'To cite BioModels Database, please use: BioModels Database: '\n", - " 'An enhanced, curated and annotated resource for published '\n", - " 'quantitative kinetic models . \\r\\n'\n", - " 'To the extent possible under law, all copyright and related '\n", - " 'or neighbouring rights to this encoded model have been '\n", - " 'dedicated to the public domain worldwide. \\r\\n'\n", - " 'Please refer to CC0 Public Domain Dedication for more '\n", - " 'information.',\n", - " 'files': { 'additional': [ { 'description': 'CPS file of the model in COPASI',\n", - " 'fileSize': '81326',\n", - " 'name': 'Reppas2015.cps'},\n", - " { 'description': 'Auto-generated SEDML file',\n", - " 'fileSize': '2191',\n", - " 'name': 'Reppas2015.sedml'}],\n", - " 'main': [{'fileSize': '62675', 'name': 'Reppas2015.xml'}]},\n", - " 'firstPublished': 1562858819000,\n", - " 'format': {'name': 'SBML', 'version': 'L3V1'},\n", - " 'history': { 'revisions': [ { 'comment': 'Edited model metadata online.',\n", - " 'submitted': 1562858737000,\n", - " 'submitter': 'Jinghao Men',\n", - " 'version': 2},\n", - " { 'comment': 'Automatically added model '\n", - " 'identifier BIOMD0000000749',\n", - " 'submitted': 1562858822000,\n", - " 'submitter': 'Jinghao Men',\n", - " 'version': 3}]},\n", - " 'name': 'Reppas2015 - tumor control via alternating immunostimulating and '\n", - " 'immunosuppressive phases',\n", - " 'publication': { 'affiliation': 'a Center for Advancing Electronics; '\n", - " 'Technische Universität Dresden ; Dresden , '\n", - " 'Germany.',\n", - " 'authors': [ {'name': 'Reppas AI'},\n", - " {'name': 'Alfonso JC'},\n", - " { 'name': 'Hatzikirou H',\n", - " 'orcid': '0000-0002-1270-7885'}],\n", - " 'issue': '2',\n", - " 'journal': 'Virulence',\n", - " 'link': 'http://identifiers.org/pubmed/26305801',\n", - " 'month': '1',\n", - " 'pages': '174-186',\n", - " 'synopsis': 'Despite recent advances in the field of '\n", - " 'Oncoimmunology, the success potential of '\n", - " 'immunomodulatory therapies against cancer '\n", - " 'remains to be elucidated. One of the reasons '\n", - " 'is the lack of understanding on the complex '\n", - " 'interplay between tumor growth dynamics and '\n", - " 'the associated immune system responses. Toward '\n", - " 'this goal, we consider a mathematical model of '\n", - " 'vascularized tumor growth and the '\n", - " 'corresponding effector cell recruitment '\n", - " 'dynamics. Bifurcation analysis allows for the '\n", - " \"exploration of model's dynamic behavior and \"\n", - " 'the determination of these parameter regimes '\n", - " 'that result in immune-mediated tumor control. '\n", - " 'In this work, we focus on a particular tumor '\n", - " 'evasion regime that involves tumor and '\n", - " 'effector cell concentration oscillations of '\n", - " 'slowly increasing and decreasing amplitude, '\n", - " 'respectively. Considering a temporal '\n", - " 'multiscale analysis, we derive an analytically '\n", - " 'tractable mapping of model solutions onto a '\n", - " 'weakly negatively damped harmonic oscillator. '\n", - " 'Based on our analysis, we propose a '\n", - " 'theory-driven intervention strategy involving '\n", - " 'immunostimulating and immunosuppressive phases '\n", - " 'to induce long-term tumor control.',\n", - " 'title': 'In silico tumor control induced via alternating '\n", - " 'immunostimulating and immunosuppressive phases.',\n", - " 'volume': '7',\n", - " 'year': 2016},\n", - " 'publicationId': 'BIOMD0000000749',\n", - " 'submissionId': 'MODEL1907110002'}\n" - ] - } - ], - "source": [ - "# 1b. view model info for model source:\n", - "\n", - "pp(simple_tc_model.source_info)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a30f5e94167513c9", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.818017Z", - "start_time": "2024-03-15T20:13:26.816089Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# 1c. define a TimeCourse process instance using the above object as a parameter. The other parameter is method. See BasiCO documentation for more details on solvers\n", - "\n", - "simple_tc_process = sed.TimeCourseProcess(model=simple_tc_model, method='lsoda')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "a9c15126dda87970", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.821191Z", - "start_time": "2024-03-15T20:13:26.819433Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TimeCourseProcess(model=TimeCourseModel(model_source='BIOMD0000000749',\n", - " model_id='model_from_BIOMD0000000749',\n", - " model_name='model_from_BIOMD0000000749',\n", - " model_language=(None,),\n", - " model_changes=None,\n", - " model_units=None),\n", - " method='lsoda')\n" - ] - } - ], - "source": [ - "# >> The process model instance is viewable as a dataclass...\n", - "\n", - "pp(simple_tc_process)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "ba3d6e8bae50f216", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.823578Z", - "start_time": "2024-03-15T20:13:26.821925Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ 'method': 'lsoda',\n", - " 'model': { 'model_changes': None,\n", - " 'model_id': 'model_from_BIOMD0000000749',\n", - " 'model_language': (None,),\n", - " 'model_name': 'model_from_BIOMD0000000749',\n", - " 'model_source': 'BIOMD0000000749',\n", - " 'model_units': None}}\n" - ] - } - ], - "source": [ - "# >> ...or a dict:\n", - "\n", - "pp(simple_tc_process.to_dict())" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "f6d099ae829fb063", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:26.826247Z", - "start_time": "2024-03-15T20:13:26.824768Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# 2. instantiate the prompter:\n", - "\n", - "prompter = BuildPrompter()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "6ff0228586348da1", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:35.794931Z", - "start_time": "2024-03-15T20:13:27.407984Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "simple process successfully added to the bi-graph!\n", - "All nodes including the most recently added simple processes connected!\n", - "Done adding single simple (CopasiProcess) to the bigraph.\n" - ] - } - ], - "source": [ - "# 3. add process(es) to the bigraph with the Time Course model instance we created above. For now, just one process will be added.\n", - "\n", - "prompter.add_single_process(config=simple_tc_process)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b833c7217603645c", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:36.417741Z", - "start_time": "2024-03-15T20:13:36.413643Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Builder({ 'emitter': { '_type': 'step',\n", - " 'address': 'local:ram-emitter',\n", - " 'config': {'emit': {}},\n", - " 'inputs': {},\n", - " 'instance': ,\n", - " 'outputs': {}},\n", - " 'simple': { '_type': 'process',\n", - " 'address': 'local:CopasiProcess',\n", - " 'config': { 'method': 'lsoda',\n", - " 'model': { 'model_changes': { 'global_parameter_changes': None,\n", - " 'reaction_changes': None,\n", - " 'species_changes': None},\n", - " 'model_id': 'model_from_BIOMD0000000749',\n", - " 'model_language': (None,),\n", - " 'model_name': 'model_from_BIOMD0000000749',\n", - " 'model_source': 'BIOMD0000000749',\n", - " 'model_units': None}},\n", - " 'inputs': { 'floating_species': ['floating_species_store'],\n", - " 'model_parameters': ['model_parameters_store'],\n", - " 'reactions': ['reactions_store'],\n", - " 'time': ['time_store']},\n", - " 'instance': ,\n", - " 'interval': 1.0,\n", - " 'outputs': { 'floating_species': ['floating_species_store'],\n", - " 'time': ['time_store']}}})\n" - ] - } - ], - "source": [ - "# 4. Inspect the builder instance within prompter:\n", - "\n", - "pp(prompter.builder_instance)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "8400f44e3a2e8433", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:37.304578Z", - "start_time": "2024-03-15T20:13:37.084635Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "bigraph\n", - "\n", - "\n", - "\n", - "('time_store',)\n", - "\n", - "time_store\n", - "\n", - "\n", - "\n", - "('simple',)\n", - "\n", - "simple\n", - "\n", - "\n", - "\n", - "('time_store',)->('simple',)\n", - "\n", - "\n", - "time\n", - "\n", - "\n", - "\n", - "('time_store',)->('simple',)\n", - "\n", - "\n", - "time\n", - "\n", - "\n", - "\n", - "('floating_species_store',)\n", - "\n", - "floating_species_store\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'E')\n", - "\n", - "E\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'E')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'R')\n", - "\n", - "R\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'R')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'f')\n", - "\n", - "f\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'f')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store', "E'")\n", - "\n", - "E'\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', "E'")\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('simple',)\n", - "\n", - "\n", - "floating_species\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('simple',)\n", - "\n", - "\n", - "floating_species\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)\n", - "\n", - "model_parameters_store\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'B')\n", - "\n", - "B\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'B')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'lm')\n", - "\n", - "lm\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'lm')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'la')\n", - "\n", - "la\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'la')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'ld')\n", - "\n", - "ld\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'ld')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'c')\n", - "\n", - "c\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'c')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'k')\n", - "\n", - "k\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'k')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'd1')\n", - "\n", - "d1\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'd1')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'd0')\n", - "\n", - "d0\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'd0')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'sigma')\n", - "\n", - "sigma\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'sigma')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'r')\n", - "\n", - "r\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'r')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('simple',)\n", - "\n", - "\n", - "model_parameters\n", - "\n", - "\n", - "\n", - "('reactions_store',)\n", - "\n", - "reactions_store\n", - "\n", - "\n", - "\n", - "('reactions_store', 'tumor growth')\n", - "\n", - "tumor growth\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'tumor growth')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'tumor death')\n", - "\n", - "tumor death\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'tumor death')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'tumor killing')\n", - "\n", - "tumor killing\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'tumor killing')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'tumor nutrient supply')\n", - "\n", - "tumor nutrient supply\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'tumor nutrient supply')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'effector stimulation')\n", - "\n", - "effector stimulation\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'effector stimulation')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'effector exhaustion')\n", - "\n", - "effector exhaustion\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'effector exhaustion')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'effector death')\n", - "\n", - "effector death\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'effector death')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'effector source')\n", - "\n", - "effector source\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'effector source')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'tumor nutrient missuply')\n", - "\n", - "tumor nutrient missuply\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'tumor nutrient missuply')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('simple',)\n", - "\n", - "\n", - "reactions\n", - "\n", - "\n", - "\n", - "('emitter',)\n", - "\n", - "emitter\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 5. Visualize the fully-connected composition:\n", - "\n", - "prompter.visualize_bigraph()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "38052757b3b95baa", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:39.609053Z", - "start_time": "2024-03-15T20:13:38.219045Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Error while running the simulation: >ERROR 2024-03-15T16:13:39<\n", - " CCopasiTask (5): No output file defined for report of task 'Time-Course'.>EXCEPTION 2024-03-15T16:13:39<\n", - " CTrajectoryMethod (25): Invalid state at time '0.010000'.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generating composite...\n", - "Composite generated!\n", - "Running generated composite for an interval of 1\n", - "Composite successfully run. Request complete. Done.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/notebooks/../biosimulator_processes/processes/copasi_process.py:231: FutureWarning:\n", - "\n", - "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", - "\n" - ] - } - ], - "source": [ - "# 6. Generate a composite engine and use to execute the bigraph that we just created:\n", - "\n", - "prompter.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "45ae5b121110cdce", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:41.061921Z", - "start_time": "2024-03-15T20:13:41.057586Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File 'simple_single_demo' successfully written in 'out' directory.\n", - "Builder flushed! This is verified because builder is: None\n" - ] - } - ], - "source": [ - "# 7. Clear the builder and start from scratch, writing it out first:\n", - "\n", - "prompter.flush(fp='simple_single_demo')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "79fbea4fa6708088", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:13:42.252590Z", - "start_time": "2024-03-15T20:13:42.249942Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "prompter.builder_instance" - ] - }, - { - "cell_type": "markdown", - "id": "b65a6fab79ad097c", - "metadata": { - "collapsed": false - }, - "source": [ - "#### **_Experiment 2_**: Load an SBML model from a specified model filepath and add Model changes to the composite before adding it to the bigraph. Here, we expect the user to be familiar enough with the model file they are passing to make individual species/parameter/reaction changes for specific species types. In the Caravagna model, for example, the species involved are T, E, I. Let's change the initial concentration for some of these as an example of model changes:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "89739e0302d6b89a", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:21:00.668323Z", - "start_time": "2024-03-15T20:21:00.664979Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "caravagna_model_filepath = '../biosimulator_processes/model_files/Caravagna2010.xml'\n", - "print(os.path.exists(caravagna_model_filepath))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "55e063c857e51f3", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:14:50.814659Z", - "start_time": "2024-03-15T20:14:50.812026Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TimeCourseModel(model_source='../biosimulator_processes/model_files/Caravagna2010.xml',\n", - " model_id='model_from_Caravagna2010.xml',\n", - " model_name='model_from_Caravagna2010.xml',\n", - " model_language=TimeCourseModelChanges(species_changes=SpeciesChange(species_name='T',\n", - " unit=None,\n", - " initial_concentration=0.234,\n", - " initial_particle_number=None,\n", - " initial_expression=None,\n", - " expression=None),\n", - " global_parameter_changes=None,\n", - " reaction_changes=None),\n", - " model_changes=None,\n", - " model_units=None)\n" - ] - } - ], - "source": [ - "# first make the timecourse model which is easily configured with objects related to model changes\n", - "adjusted_tc_model_from_file = sed.TimeCourseModel(\n", - " model_source=caravagna_model_filepath, \n", - " model_changes=sed.TimeCourseModelChanges(\n", - " species_changes=sed.SpeciesChange(species_name='T', initial_concentration=0.234)\n", - " )\n", - ")\n", - "\n", - "\n", - "pp(adjusted_tc_model_from_file)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "c1ddec005282e13f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:15:54.149790Z", - "start_time": "2024-03-15T20:15:54.147576Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TimeCourseProcess(model=TimeCourseModel(model_source='../biosimulator_processes/model_files/Caravagna2010.xml',\n", - " model_id='model_from_Caravagna2010.xml',\n", - " model_name='model_from_Caravagna2010.xml',\n", - " model_language=TimeCourseModelChanges(species_changes=SpeciesChange(species_name='T',\n", - " unit=None,\n", - " initial_concentration=0.234,\n", - " initial_particle_number=None,\n", - " initial_expression=None,\n", - " expression=None),\n", - " global_parameter_changes=None,\n", - " reaction_changes=None),\n", - " model_changes=None,\n", - " model_units=None),\n", - " method='stochastic')\n" - ] - } - ], - "source": [ - "adjusted_tc_process = sed.TimeCourseProcess(model=adjusted_tc_model_from_file, method='stochastic')\n", - "\n", - "pp(adjusted_tc_process)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "32b4be407a09f96", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:17:28.442782Z", - "start_time": "2024-03-15T20:17:14.426242Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "adjusted_tc_process_demo process successfully added to the bi-graph!\n", - "All nodes including the most recently added adjusted_tc_process_demo processes connected!\n", - "Done adding single adjusted_tc_process_demo (CopasiProcess) to the bigraph.\n" - ] - } - ], - "source": [ - "# add the process we just created with the prompter. The prompter will create a new instance of builder for us, if not passed:\n", - "\n", - "prompter.add_single_process(config=adjusted_tc_process)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "d0121977a95c320c", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:17:46.077207Z", - "start_time": "2024-03-15T20:17:45.885890Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "bigraph\n", - "\n", - "\n", - "\n", - "('time_store',)\n", - "\n", - "time_store\n", - "\n", - "\n", - "\n", - "('adjusted_tc_process_demo',)\n", - "\n", - "adjusted_tc_process_demo\n", - "\n", - "\n", - "\n", - "('time_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "time\n", - "\n", - "\n", - "\n", - "('time_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "time\n", - "\n", - "\n", - "\n", - "('floating_species_store',)\n", - "\n", - "floating_species_store\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'T')\n", - "\n", - "T\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'T')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'E')\n", - "\n", - "E\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'E')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store', 'I')\n", - "\n", - "I\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('floating_species_store', 'I')\n", - "\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "floating_species\n", - "\n", - "\n", - "\n", - "('floating_species_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "floating_species\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)\n", - "\n", - "model_parameters_store\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'r2')\n", - "\n", - "r2\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'r2')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'b')\n", - "\n", - "b\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'b')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'a')\n", - "\n", - "a\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'a')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'g2')\n", - "\n", - "g2\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'g2')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'p1')\n", - "\n", - "p1\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'p1')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'g1')\n", - "\n", - "g1\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'g1')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'mu2')\n", - "\n", - "mu2\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'mu2')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'c')\n", - "\n", - "c\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'c')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'p2')\n", - "\n", - "p2\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'p2')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'g3')\n", - "\n", - "g3\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'g3')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'mu3')\n", - "\n", - "mu3\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'mu3')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 'V')\n", - "\n", - "V\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 'V')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 's1')\n", - "\n", - "s1\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 's1')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store', 's2')\n", - "\n", - "s2\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('model_parameters_store', 's2')\n", - "\n", - "\n", - "\n", - "\n", - "('model_parameters_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "model_parameters\n", - "\n", - "\n", - "\n", - "('reactions_store',)\n", - "\n", - "reactions_store\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Induction of tumor')\n", - "\n", - "Induction of tumor\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Induction of tumor')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Removal of tumor from the system by the action of immune response')\n", - "\n", - "Removal of tumor from the system by the action of immune response\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Removal of tumor from the system by the action of immune response')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Activation and transfer of effector cells to the action site')\n", - "\n", - "Activation and transfer of effector cells to the action site\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Activation and transfer of effector cells to the action site')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Deactivation and removal of effector cells from the site of tumor')\n", - "\n", - "Deactivation and removal of effector cells from the site of tumor\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Deactivation and removal of effector cells from the site of tumor')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Activation of interleukin 2')\n", - "\n", - "Activation of interleukin 2\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Activation of interleukin 2')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store', 'Deactivation of interleukin2')\n", - "\n", - "Deactivation of interleukin2\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('reactions_store', 'Deactivation of interleukin2')\n", - "\n", - "\n", - "\n", - "\n", - "('reactions_store',)->('adjusted_tc_process_demo',)\n", - "\n", - "\n", - "reactions\n", - "\n", - "\n", - "\n", - "('emitter',)\n", - "\n", - "emitter\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# visualize the adjusted creation\n", - "\n", - "prompter.visualize_bigraph()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "a6e83469c5b8b93d", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:18:12.068799Z", - "start_time": "2024-03-15T20:18:12.065680Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'emitter': {'_type': 'step',\n", - " 'address': 'local:ram-emitter',\n", - " 'config': {'emit': {}},\n", - " 'inputs': {},\n", - " 'outputs': {}},\n", - " 'adjusted_tc_process_demo': {'_type': 'process',\n", - " 'address': 'local:CopasiProcess',\n", - " 'config': {'model': {'model_source': '../biosimulator_processes/model_files/Caravagna2010.xml',\n", - " 'model_id': 'model_from_Caravagna2010.xml',\n", - " 'model_name': 'model_from_Caravagna2010.xml',\n", - " 'model_language': {'species_changes': {'species_name': 'T',\n", - " 'unit': None,\n", - " 'initial_concentration': 0.234,\n", - " 'initial_particle_number': None,\n", - " 'initial_expression': None,\n", - " 'expression': None},\n", - " 'global_parameter_changes': None,\n", - " 'reaction_changes': None},\n", - " 'model_changes': {'species_changes': None,\n", - " 'global_parameter_changes': None,\n", - " 'reaction_changes': None},\n", - " 'model_units': None},\n", - " 'method': 'stochastic'},\n", - " 'inputs': {'time': ['time_store'],\n", - " 'floating_species': ['floating_species_store'],\n", - " 'model_parameters': ['model_parameters_store'],\n", - " 'reactions': ['reactions_store']},\n", - " 'outputs': {'time': ['time_store'],\n", - " 'floating_species': ['floating_species_store']},\n", - " 'interval': 1.0}}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# view the builder document\n", - "\n", - "prompter.builder_instance.document()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "121064387d7729b0", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:18:40.286441Z", - "start_time": "2024-03-15T20:18:37.849420Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generating composite...\n", - "Composite generated!\n", - "Running generated composite for an interval of 30\n", - "Composite successfully run. Request complete. Done.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/alex/Desktop/uchc_work/repos/biosimulator-processes/notebooks/../biosimulator_processes/processes/copasi_process.py:231: FutureWarning:\n", - "\n", - "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", - "\n" - ] - } - ], - "source": [ - "# run the composite\n", - "\n", - "prompter.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "6918be74a9a99f7d", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-15T20:19:12.088099Z", - "start_time": "2024-03-15T20:19:12.086212Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# stochastic works with Caravagna!!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f160008fa3538b5", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/data_model_demo.ipynb b/notebooks/data_model_demo.ipynb deleted file mode 100644 index 7d81cde8d..000000000 --- a/notebooks/data_model_demo.ipynb +++ /dev/null @@ -1,243 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:11.752324Z", - "start_time": "2024-03-01T17:36:11.749069Z" - }, - "collapsed": true - }, - "outputs": [], - "source": [ - "import sys \n", - "\n", - "sys.path.insert(0, '..')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "3cd5053431aed7e1", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:13.415658Z", - "start_time": "2024-03-01T17:36:11.894800Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CobraProcess registered successfully.\n", - "CopasiProcess not available. Error: No module named 'biosimulator_processes.process_types'\n", - "SmoldynProcess registered successfully.\n", - "TelluriumProcess registered successfully.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/alex/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:151: UserWarning:\n", - "\n", - "Field \"model_id\" has conflict with protected namespace \"model_\".\n", - "\n", - "You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.\n", - "\n", - "/Users/alex/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:151: UserWarning:\n", - "\n", - "Field \"model_source\" has conflict with protected namespace \"model_\".\n", - "\n", - "You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.\n", - "\n", - "/Users/alex/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:151: UserWarning:\n", - "\n", - "Field \"model_language\" has conflict with protected namespace \"model_\".\n", - "\n", - "You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.\n", - "\n", - "/Users/alex/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:151: UserWarning:\n", - "\n", - "Field \"model_name\" has conflict with protected namespace \"model_\".\n", - "\n", - "You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.\n", - "\n", - "/Users/alex/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:151: UserWarning:\n", - "\n", - "Field \"model_changes\" has conflict with protected namespace \"model_\".\n", - "\n", - "You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.\n", - "\n" - ] - } - ], - "source": [ - "from biosimulator_processes.data_model import *\n", - "from process_bigraph import pf" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6bf18cbc74f1f95f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:13.418537Z", - "start_time": "2024-03-01T17:36:13.415607Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "speciesChangesA = SpeciesChanges(\n", - " species_name='A',\n", - " initial_concentration=20.017\n", - ")\n", - "\n", - "speciesChangesB = SpeciesChanges(\n", - " species_name='B',\n", - " expression='A + B = C'\n", - ")\n", - "\n", - "process_changes = TimeCourseModelChanges(\n", - " species_changes=[speciesChangesA, speciesChangesB]\n", - ")\n", - "\n", - "# process_biomodel_id = BiomodelId(value='BIOMD0000000861')\n", - "\n", - "process_model = TimeCourseModel(\n", - " model_id='BioModel',\n", - " model_source='BIOMD0000000861',\n", - " model_name='Bachmann2011',\n", - " model_changes=process_changes\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "6dd932af0c8358aa", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:15.889304Z", - "start_time": "2024-03-01T17:36:15.883583Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "biosimulator_processes.data_model.TimeCourseModel" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(process_model)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "909c4fc3a751659", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:16.365986Z", - "start_time": "2024-03-01T17:36:16.363866Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "copasi_process = CopasiProcessConfigSchema(\n", - " model=process_model,\n", - " method='stochastic'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "2be623d00e2fc495", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-01T17:36:16.957634Z", - "start_time": "2024-03-01T17:36:16.954386Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ 'method': 'stochastic',\n", - " 'model': { 'model_changes': { 'global_parameter_changes': None,\n", - " 'reaction_changes': None,\n", - " 'species_changes': [ { 'expression': None,\n", - " 'initial_concentration': 20.017,\n", - " 'initial_expression': None,\n", - " 'initial_particle_number': None,\n", - " 'species_name': 'A',\n", - " 'unit': None},\n", - " { 'expression': 'A + B = '\n", - " 'C',\n", - " 'initial_concentration': None,\n", - " 'initial_expression': None,\n", - " 'initial_particle_number': None,\n", - " 'species_name': 'B',\n", - " 'unit': None}]},\n", - " 'model_id': 'BioModel',\n", - " 'model_language': 'sbml',\n", - " 'model_name': 'Bachmann2011',\n", - " 'model_source': 'sdfadf'}}\n" - ] - } - ], - "source": [ - "print(pf(copasi_process.model_dump()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7bca99082a8df8ef", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/parameter_scan.ipynb b/notebooks/parameter_scan.ipynb deleted file mode 100644 index 3915b5495..000000000 --- a/notebooks/parameter_scan.ipynb +++ /dev/null @@ -1,334 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.588407Z", - "start_time": "2024-03-05T20:03:37.959396Z" - }, - "collapsed": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CobraProcess registered successfully.\n", - "CopasiProcess registered successfully.\n", - "SmoldynProcess registered successfully.\n", - "TelluriumProcess registered successfully.\n", - "DeterministicTimeCourseParameterScan registered successfully.\n" - ] - } - ], - "source": [ - "import sys\n", - "\n", - "\n", - "sys.path.insert(0, '..')\n", - "import os\n", - "from process_bigraph import pp, pf\n", - "from biosimulator_processes.data_model import *\n", - "import numpy as np \n", - "from biosimulator_processes.biosimulator_builder import BiosimulatorBuilder" - ] - }, - { - "cell_type": "markdown", - "id": "178d4480c4770f6a", - "metadata": { - "collapsed": false - }, - "source": [ - "Choose an entrypoint to a non-spatial, COPASI/Tellurium-like simulation process and perform an n-iteration parameter scan of a selected parameter." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a81c920baf50d227", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.591344Z", - "start_time": "2024-03-05T20:03:39.589391Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "b = BiosimulatorBuilder()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "608d3560b8dca4ab", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.594052Z", - "start_time": "2024-03-05T20:03:39.592267Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# build process config\n", - "process_config = CopasiProcessConfigSchema(\n", - " process_name='parameter_scan',\n", - " model=TimeCourseModel(\n", - " model_source='../biosimulator_processes/model_files/Caravagna2010.xml',\n", - " model_id='Caravagna2010'\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "5965fb0e7363bbfd", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.617339Z", - "start_time": "2024-03-05T20:03:39.595258Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
compartmenttypeunitinitial_concentrationinitial_particle_numberinitial_expressionexpressionconcentrationparticle_numberrateparticle_number_ratekeysbml_id
name
Tcompartmentreactionsmmol/ml1.06.022141e+201.06.022141e+200.1799971.083967e+20Metabolite_0T
Ecompartmentreactionsmmol/ml1.06.022141e+201.06.022141e+20-0.010000-6.022137e+18Metabolite_1E
Icompartmentreactionsmmol/ml1.06.022141e+201.06.022141e+20-9.999512-6.021847e+21Metabolite_2I
\n", - "
" - ], - "text/plain": [ - " compartment type unit initial_concentration \\\n", - "name \n", - "T compartment reactions mmol/ml 1.0 \n", - "E compartment reactions mmol/ml 1.0 \n", - "I compartment reactions mmol/ml 1.0 \n", - "\n", - " initial_particle_number initial_expression expression concentration \\\n", - "name \n", - "T 6.022141e+20 1.0 \n", - "E 6.022141e+20 1.0 \n", - "I 6.022141e+20 1.0 \n", - "\n", - " particle_number rate particle_number_rate key sbml_id \n", - "name \n", - "T 6.022141e+20 0.179997 1.083967e+20 Metabolite_0 T \n", - "E 6.022141e+20 -0.010000 -6.022137e+18 Metabolite_1 E \n", - "I 6.022141e+20 -9.999512 -6.021847e+21 Metabolite_2 I " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from basico import load_model, get_species\n", - "\n", - "model = load_model('../biosimulator_processes/model_files/Caravagna2010.xml')\n", - "\n", - "get_species(model=model)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "46be2668efdfc8e", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.619681Z", - "start_time": "2024-03-05T20:03:39.617917Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "# build parameters to scan\n", - "scanned_parameters = [\n", - " ModelParameter(\n", - " name='T',\n", - " feature='initial_concentration',\n", - " value=25.0,\n", - " scope='species'\n", - " )\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "59a6dd39d4f665e1", - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-05T20:03:39.907069Z", - "start_time": "2024-03-05T20:03:39.620252Z" - }, - "collapsed": false - }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "DeterministicTimeCourseParameterScan.__init__() got an unexpected keyword argument 'core'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mb\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mparameter_scan\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_process\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mDeterministicTimeCourseParameterScan\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_iterations\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mperturbation_magnitude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.25\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mscanned_parameters\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/builder/builder_api.py:148\u001b[0m, in \u001b[0;36mBuilderNode.add_process\u001b[0;34m(self, name, config, inputs, outputs, **kwargs)\u001b[0m\n\u001b[1;32m 139\u001b[0m state \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 140\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m: edge_type,\n\u001b[1;32m 141\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124maddress\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlocal:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;66;03m# TODO -- only support local right now?\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m'\u001b[39m: {} \u001b[38;5;28;01mif\u001b[39;00m outputs \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m outputs,\n\u001b[1;32m 145\u001b[0m }\n\u001b[1;32m 147\u001b[0m set_path(tree\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuilder\u001b[38;5;241m.\u001b[39mtree, path\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpath, value\u001b[38;5;241m=\u001b[39mstate)\n\u001b[0;32m--> 148\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbuilder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcomplete\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/builder/builder_api.py:233\u001b[0m, in \u001b[0;36mBuilder.complete\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcomplete\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 233\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mschema, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtree \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcomplete\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mschema\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtree\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/bigraph_schema/type_system.py:1334\u001b[0m, in \u001b[0;36mTypeSystem.complete\u001b[0;34m(self, initial_schema, initial_state)\u001b[0m\n\u001b[1;32m 1328\u001b[0m state \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhydrate(\n\u001b[1;32m 1329\u001b[0m full_schema,\n\u001b[1;32m 1330\u001b[0m initial_state)\n\u001b[1;32m 1332\u001b[0m \u001b[38;5;66;03m# fill in the parts of the composition schema\u001b[39;00m\n\u001b[1;32m 1333\u001b[0m \u001b[38;5;66;03m# determined by the state\u001b[39;00m\n\u001b[0;32m-> 1334\u001b[0m schema, state \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minfer_schema\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1335\u001b[0m \u001b[43m \u001b[49m\u001b[43mfull_schema\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1336\u001b[0m \u001b[43m \u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1338\u001b[0m final_state \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfill(schema, state)\n\u001b[1;32m 1340\u001b[0m \u001b[38;5;66;03m# TODO: add flag to types.access(copy=True)\u001b[39;00m\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/process_bigraph/composite.py:270\u001b[0m, in \u001b[0;36mProcessTypes.infer_schema\u001b[0;34m(self, schema, state, top_state, path)\u001b[0m\n\u001b[1;32m 267\u001b[0m inner_path \u001b[38;5;241m=\u001b[39m path \u001b[38;5;241m+\u001b[39m (key,)\n\u001b[1;32m 268\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m get_path(schema, inner_path) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m get_path(state, inner_path) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 269\u001b[0m \u001b[38;5;28misinstance\u001b[39m(value, \u001b[38;5;28mdict\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m value):\n\u001b[0;32m--> 270\u001b[0m schema, top_state \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minfer_schema\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 271\u001b[0m \u001b[43m \u001b[49m\u001b[43mschema\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 272\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 273\u001b[0m \u001b[43m \u001b[49m\u001b[43mtop_state\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtop_state\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 274\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minner_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 276\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(state, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 277\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/process_bigraph/composite.py:222\u001b[0m, in \u001b[0;36mProcessTypes.infer_schema\u001b[0;34m(self, schema, state, top_state, path)\u001b[0m\n\u001b[1;32m 219\u001b[0m state_type \u001b[38;5;241m=\u001b[39m state[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 220\u001b[0m state_schema \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maccess(state_type)\n\u001b[0;32m--> 222\u001b[0m hydrated_state \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdeserialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate_schema\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 223\u001b[0m top_state \u001b[38;5;241m=\u001b[39m set_path(\n\u001b[1;32m 224\u001b[0m top_state,\n\u001b[1;32m 225\u001b[0m path,\n\u001b[1;32m 226\u001b[0m hydrated_state)\n\u001b[1;32m 228\u001b[0m schema \u001b[38;5;241m=\u001b[39m set_path(\n\u001b[1;32m 229\u001b[0m schema,\n\u001b[1;32m 230\u001b[0m path,\n\u001b[1;32m 231\u001b[0m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m: state_type})\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/bigraph_schema/type_system.py:675\u001b[0m, in \u001b[0;36mTypeSystem.deserialize\u001b[0;34m(self, schema, encoded)\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoded \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 673\u001b[0m encoded \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdefault(schema)\n\u001b[0;32m--> 675\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdeserialize_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mfound\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoded\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 680\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(encoded, \u001b[38;5;28mdict\u001b[39m):\n\u001b[1;32m 681\u001b[0m result \u001b[38;5;241m=\u001b[39m {}\n", - "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/biosimulator-processes-KVuYbFzt-py3.10/lib/python3.10/site-packages/process_bigraph/composite.py:124\u001b[0m, in \u001b[0;36mdeserialize_step\u001b[0;34m(schema, encoded, core)\u001b[0m\n\u001b[1;32m 119\u001b[0m config \u001b[38;5;241m=\u001b[39m core\u001b[38;5;241m.\u001b[39mhydrate_state(\n\u001b[1;32m 120\u001b[0m instantiate\u001b[38;5;241m.\u001b[39mconfig_schema,\n\u001b[1;32m 121\u001b[0m encoded\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mconfig\u001b[39m\u001b[38;5;124m'\u001b[39m, {}))\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m deserialized:\n\u001b[0;32m--> 124\u001b[0m process \u001b[38;5;241m=\u001b[39m \u001b[43minstantiate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcore\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 125\u001b[0m deserialized[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m process\n\u001b[1;32m 127\u001b[0m deserialized[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mconfig\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m config\n", - "\u001b[0;31mTypeError\u001b[0m: DeterministicTimeCourseParameterScan.__init__() got an unexpected keyword argument 'core'" - ] - } - ], - "source": [ - "b['parameter_scan'].add_process(\n", - " name='DeterministicTimeCourseParameterScan',\n", - " n_iterations=100,\n", - " perturbation_magnitude=0.25,\n", - " parameters=scanned_parameters\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "74c9c1bbdb0058f4", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/playground.ipynb b/notebooks/playground.ipynb deleted file mode 100644 index 25b2dc221..000000000 --- a/notebooks/playground.ipynb +++ /dev/null @@ -1,177 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "initial_id", - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [], - "source": [ - "import sys\n", - "sys.path.insert(0, '..')\n", - "\n", - "import os\n", - "import requests\n", - "\n", - "\n", - "caravagna_model_filepath = '../biosimulator_processes/model_files/Caravagna2010.xml'\n", - "print(os.path.exists(caravagna_model_filepath))\n", - "\n", - "tumor_control_biomodel_id = 'BIOMD0000000749'\n", - "requests.get('https://www.ebi.ac.uk/biomodels/BIOMD0000000749', headers={'accept': 'json'})" - ] - }, - { - "cell_type": "markdown", - "id": "2a5b74c8b92ae5e0", - "metadata": { - "collapsed": false - }, - "source": [ - "#### **_Experiment 1_**: Here we cross a boundary in the stack that is a biological simulation. We go from model configuration, to experiment. Thus, this tooling sits at that level: both experiment specification AND experiment execution. It's not just a way to specify an experiment, but it is also a way to run it, given the many knobs and buttons that you can use predefine and customize the way the actual model is being solved. Our users are seeking to be involved in an experiment as a \"stack\". We should make a bigger distinction between terms like \"model\"." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ac56c8bdfa77040b", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from dataclasses import dataclass, asdict\n", - "from biosimulator_processes.biosimulator_builder import BiosimulatorBuilder, BuildPrompter\n", - "from biosimulator_processes.data_model import TimeCourseProcess, TimeCourseModel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4f88a98e976b773b", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 1. define a model for the process composition. In this case, just one model to be re-used as configuration for the processes we create:\n", - "\n", - "tc_model = TimeCourseModel(model_source=tumor_control_biomodel_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8f1fae37596bd490", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# >> The model is viewable as a dataclass...\n", - "\n", - "tc_model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f597dfd5b844ac66", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# >> ...or a dict:\n", - "\n", - "tc_model.dump()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b0cdfd23eed6ffd5", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 2. instantiate the prompter:\n", - "\n", - "prompter = BuildPrompter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "61f91526ffa94a73", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 3. add process(es) to the bigraph with the Time Course model instance we created above. For now, just one process will be added.\n", - "\n", - "prompter.add_single_process(config=tc_model)" - ] - }, - { - "cell_type": "markdown", - "id": "4d2f67d376ccd700", - "metadata": { - "collapsed": false - }, - "source": [ - "#### **_Experiment 2_**: Load an SBML model from a specified model filepath and add Model changes to the composite before adding it to the bigraph." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "445f7be4212f922a", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from biosimulator_processes.data_model import TimeCourseModelChanges, ModelChanges, ModelChange" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e29fa2bdc7ebc72d", - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/poetry.lock b/poetry.lock index d78fb04f9..98d89eb70 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,190 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +[[package]] +name = "aiobotocore" +version = "2.12.3" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiobotocore-2.12.3-py3-none-any.whl", hash = "sha256:86737685f4625e8f05c4e7a608a07cc97607263279f66cf6b02b640c4eafd324"}, + {file = "aiobotocore-2.12.3.tar.gz", hash = "sha256:e2a2929207bc5d62eb556106c2224c1fd106d5c65be2eb69f15cc8c34c44c236"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4.post0,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +botocore = ">=1.34.41,<1.34.70" +wrapt = ">=1.10.10,<2.0.0" + +[package.extras] +awscli = ["awscli (>=1.32.41,<1.32.70)"] +boto3 = ["boto3 (>=1.34.41,<1.34.70)"] + +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "amici" +version = "0.24.0" +description = "Advanced multi-language Interface to CVODES and IDAS" +optional = false +python-versions = ">=3.9" +files = [ + {file = "amici-0.24.0.tar.gz", hash = "sha256:8ba313822987295d2a9c7d9c125dc8f73616f032d268eeb52b6d090be14f3d77"}, +] + +[package.dependencies] +cmake-build-extension = "0.5.1" +mpmath = "*" +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and python_version != \"3.11\""}, +] +pandas = ">=2.0.2" +pyarrow = "*" +python-libsbml = "*" +setuptools = ">=48" +sympy = ">=1.9" +toposort = "*" +wurlitzer = "*" + +[package.extras] +examples = ["jupyter", "scipy"] +petab = ["petab (>=0.2.9)"] +pysb = ["pysb (>=1.13.1)"] +test = ["antimony (!=2.14)", "antimony (>=2.13)", "coverage", "h5py", "pooch", "pytest", "pytest-cov", "pytest-rerunfailures", "scipy", "shyaml"] +vis = ["matplotlib", "seaborn"] + [[package]] name = "annotated-types" version = "0.6.0" @@ -186,6 +371,17 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + [[package]] name = "attrs" version = "23.2.0" @@ -303,6 +499,25 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] +[[package]] +name = "botocore" +version = "1.34.69" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.8" +files = [ + {file = "botocore-1.34.69-py3-none-any.whl", hash = "sha256:d3802d076d4d507bf506f9845a6970ce43adc3d819dd57c2791f5c19ed6e5950"}, + {file = "botocore-1.34.69.tar.gz", hash = "sha256:d1ab2bff3c2fd51719c2021d9fa2f30fbb9ed0a308f69e9a774ac92c8091380a"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.19.19)"] + [[package]] name = "certifi" version = "2024.2.2" @@ -477,6 +692,66 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cmake" +version = "3.29.2" +description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cmake-3.29.2-py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:1d40c5451d6467b20a0a6015a5a6b6dc86f61b83f71f935740485b259100a34e"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed3108e646cd65a4e23fa1cbe8123569a29334a3f2a8ce214d871406b161bedb"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40aafe612b03a9fa140cca4024ba60b74cd92372f3f349d8062cba1f021e5001"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:027eebe9bb74c31759581a543f27bc1828fc76e6fc45b2b48b51f27847904669"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1f087985fc2460476b0901716fbddb2fd69b7fe7bf1350e1ab5dc508d22600e"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df2c63ce6d504aa4c91a42fd22d3887065ab029569691deb56ec19d0decd0ae9"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ea5ce007893d7d1363e13433dde1c0c7c344372213a90ff3c56e896a335301d"}, + {file = "cmake-3.29.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9e941e73202cfa667ee488d1d88b8a758b516dcfa2a2728e73dbdcbfbdebf57"}, + {file = "cmake-3.29.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:37222e23485338c72b7ea51f865d8c6847d519f7e2222922fb70b4896ca6e897"}, + {file = "cmake-3.29.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:eeed08932c748647488280dc97ac00bcfeae5d760451105200cfe66c52ce6468"}, + {file = "cmake-3.29.2-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:db7a05df020ba67bacd3070dd1645c76ca96fabd06d6aaa63288fd845706e47a"}, + {file = "cmake-3.29.2-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:83b35de822ddabaaa184a7d8f9827381350c42d627689c775b214347f57c9e41"}, + {file = "cmake-3.29.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:cc0e36752e581430a93e58a268e515bb4ec1373b9e9911571f2cac1d2a6b5bec"}, + {file = "cmake-3.29.2-py3-none-win32.whl", hash = "sha256:a941e26fba81cf74832c8a0e17e007452e05b6ad4941b3d2d18c75faa4a677d8"}, + {file = "cmake-3.29.2-py3-none-win_amd64.whl", hash = "sha256:23336c8ca01205d18d92ed8de6c54e570c352a58e378b7f9adc02ef00f433960"}, + {file = "cmake-3.29.2-py3-none-win_arm64.whl", hash = "sha256:e722a949f7c91084dba61f8f17a9854787182ab711ed0b84b1507b24a8e12e25"}, + {file = "cmake-3.29.2.tar.gz", hash = "sha256:6a4c1185cb2eca7263190a5754d0c9edf738d9e50bff464f78f48d0c05318e7c"}, +] + +[package.extras] +test = ["coverage (>=4.2)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)"] + +[[package]] +name = "cmake-build-extension" +version = "0.5.1" +description = "Setuptools extension to build and package CMake projects." +optional = false +python-versions = ">=3.6" +files = [ + {file = "cmake-build-extension-0.5.1.tar.gz", hash = "sha256:8206db07bf60ae1a51e555a15d474429c11aefd84d421324b3d723ac816fa81a"}, + {file = "cmake_build_extension-0.5.1-py3-none-any.whl", hash = "sha256:96ba27de7cf2b722d4af638ac611ef8fcb3d79a46d04c6ca957e5c111ff07254"}, +] + +[package.dependencies] +cmake = "*" +GitPython = "*" +ninja = "*" +setuptools-scm = "*" + [[package]] name = "cobra" version = "0.29.0" @@ -851,6 +1126,25 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "fastapi" +version = "0.109.2" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"}, + {file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.36.3,<0.37.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "fasteners" version = "0.19" @@ -982,6 +1276,92 @@ files = [ {file = "fqdn-1.4.0.tar.gz", hash = "sha256:30e8f2e685ce87cdace4712fd97c5d09f5e6fa519bbb66e8f188f6a7cb3a5c4e"}, ] +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + [[package]] name = "future" version = "1.0.0" @@ -993,6 +1373,38 @@ files = [ {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, ] +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + [[package]] name = "graphviz" version = "0.20.1" @@ -1020,6 +1432,39 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] +[[package]] +name = "h5py" +version = "3.11.0" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731"}, + {file = "h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5"}, + {file = "h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00"}, + {file = "h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007"}, + {file = "h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3"}, + {file = "h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc"}, + {file = "h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb"}, + {file = "h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62"}, + {file = "h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76"}, + {file = "h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b"}, + {file = "h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea"}, + {file = "h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3"}, + {file = "h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9"}, +] + +[package.dependencies] +numpy = ">=1.17.3" + [[package]] name = "httpcore" version = "1.0.4" @@ -1041,6 +1486,54 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.25.0)"] +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + [[package]] name = "httpx" version = "0.27.0" @@ -1273,6 +1766,17 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "json5" version = "0.9.22" @@ -1903,6 +2407,42 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] +[[package]] +name = "ml-dtypes" +version = "0.4.0" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ml_dtypes-0.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93afe37f3a879d652ec9ef1fc47612388890660a2657fbb5747256c3b818fd81"}, + {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb83fd064db43e67e67d021e547698af4c8d5c6190f2e9b1c53c09f6ff5531d"}, + {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03e7cda6ef164eed0abb31df69d2c00c3a5ab3e2610b6d4c42183a43329c72a5"}, + {file = "ml_dtypes-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:a15d96d090aebb55ee85173d1775ae325a001aab607a76c8ea0b964ccd6b5364"}, + {file = "ml_dtypes-0.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdf689be7351cc3c95110c910c1b864002f113e682e44508910c849e144f3df1"}, + {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c83e4d443962d891d51669ff241d5aaad10a8d3d37a81c5532a45419885d591c"}, + {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6"}, + {file = "ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e"}, + {file = "ml_dtypes-0.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ee9f91d4c4f9959a7e1051c141dc565f39e54435618152219769e24f5e9a4d06"}, + {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad6849a2db386b38e4d54fe13eb3293464561780531a918f8ef4c8169170dd49"}, + {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa32979ebfde3a0d7c947cafbf79edc1ec77ac05ad0780ee86c1d8df70f2259"}, + {file = "ml_dtypes-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3b67ec73a697c88c1122038e0de46520e48dc2ec876d42cf61bc5efe3c0b7675"}, + {file = "ml_dtypes-0.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41affb38fdfe146e3db226cf2953021184d6f0c4ffab52136613e9601706e368"}, + {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cf4356a0fe2eeac6d289018d0734e17a403bdf1fd911953c125dd0358edcc0"}, + {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1724ddcdf5edbaf615a62110af47407f1719b8d02e68ccee60683acb5f74da1"}, + {file = "ml_dtypes-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:723af6346447268a3cf0b7356e963d80ecb5732b5279b2aa3fa4b9fc8297c85e"}, + {file = "ml_dtypes-0.4.0.tar.gz", hash = "sha256:eaf197e72f4f7176a19fe3cb8b61846b38c6757607e7bf9cd4b1d84cd3e74deb"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.3", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] + +[package.extras] +dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + [[package]] name = "more-itertools" version = "10.2.0" @@ -1931,6 +2471,105 @@ docs = ["sphinx"] gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + [[package]] name = "mypy" version = "1.9.0" @@ -2105,6 +2744,33 @@ files = [ {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, ] +[[package]] +name = "ninja" +version = "1.11.1.1" +description = "Ninja is a small build system with a focus on speed" +optional = false +python-versions = "*" +files = [ + {file = "ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885"}, + {file = "ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a"}, + {file = "ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c"}, +] + +[package.extras] +test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "pytest (>=4.5.0)", "pytest-cov (>=2.7.1)", "pytest-runner (>=5.1)", "pytest-virtualenv (>=1.7.0)", "virtualenv (>=15.0.3)"] + [[package]] name = "notebook" version = "7.1.2" @@ -2370,8 +3036,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" @@ -2642,12 +3308,12 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "process-bigraph" -version = "0.0.15" +version = "0.0.17" description = "" optional = false python-versions = ">=3.6" files = [ - {file = "process-bigraph-0.0.15.tar.gz", hash = "sha256:8d002aa47ed9a966271f83626d391437d45f12cdf80e83c1dfed5723084797c1"}, + {file = "process-bigraph-0.0.17.tar.gz", hash = "sha256:1b105e419e28a133a6d93c6cd13da551b999208246b01928eff4c294276b6ee3"}, ] [package.dependencies] @@ -2739,6 +3405,54 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "pyarrow" +version = "16.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-16.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:22a1fdb1254e5095d629e29cd1ea98ed04b4bbfd8e42cc670a6b639ccc208b60"}, + {file = "pyarrow-16.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:574a00260a4ed9d118a14770edbd440b848fcae5a3024128be9d0274dbcaf858"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0815d0ddb733b8c1b53a05827a91f1b8bde6240f3b20bf9ba5d650eb9b89cdf"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df0080339387b5d30de31e0a149c0c11a827a10c82f0c67d9afae3981d1aabb7"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:edf38cce0bf0dcf726e074159c60516447e4474904c0033f018c1f33d7dac6c5"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91d28f9a40f1264eab2af7905a4d95320ac2f287891e9c8b0035f264fe3c3a4b"}, + {file = "pyarrow-16.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:99af421ee451a78884d7faea23816c429e263bd3618b22d38e7992c9ce2a7ad9"}, + {file = "pyarrow-16.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d22d0941e6c7bafddf5f4c0662e46f2075850f1c044bf1a03150dd9e189427ce"}, + {file = "pyarrow-16.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:266ddb7e823f03733c15adc8b5078db2df6980f9aa93d6bb57ece615df4e0ba7"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cc23090224b6594f5a92d26ad47465af47c1d9c079dd4a0061ae39551889efe"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56850a0afe9ef37249d5387355449c0f94d12ff7994af88f16803a26d38f2016"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:705db70d3e2293c2f6f8e84874b5b775f690465798f66e94bb2c07bab0a6bb55"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:5448564754c154997bc09e95a44b81b9e31ae918a86c0fcb35c4aa4922756f55"}, + {file = "pyarrow-16.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:729f7b262aa620c9df8b9967db96c1575e4cfc8c25d078a06968e527b8d6ec05"}, + {file = "pyarrow-16.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:fb8065dbc0d051bf2ae2453af0484d99a43135cadabacf0af588a3be81fbbb9b"}, + {file = "pyarrow-16.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20ce707d9aa390593ea93218b19d0eadab56390311cb87aad32c9a869b0e958c"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5823275c8addbbb50cd4e6a6839952682a33255b447277e37a6f518d6972f4e1"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab8b9050752b16a8b53fcd9853bf07d8daf19093533e990085168f40c64d978"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:42e56557bc7c5c10d3e42c3b32f6cff649a29d637e8f4e8b311d334cc4326730"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a7abdee4a4a7cfa239e2e8d721224c4b34ffe69a0ca7981354fe03c1328789b"}, + {file = "pyarrow-16.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ef2f309b68396bcc5a354106741d333494d6a0d3e1951271849787109f0229a6"}, + {file = "pyarrow-16.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ed66e5217b4526fa3585b5e39b0b82f501b88a10d36bd0d2a4d8aa7b5a48e2df"}, + {file = "pyarrow-16.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc8814310486f2a73c661ba8354540f17eef51e1b6dd090b93e3419d3a097b3a"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c2f5e239db7ed43e0ad2baf46a6465f89c824cc703f38ef0fde927d8e0955f7"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f293e92d1db251447cb028ae12f7bc47526e4649c3a9924c8376cab4ad6b98bd"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:dd9334a07b6dc21afe0857aa31842365a62eca664e415a3f9536e3a8bb832c07"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d91073d1e2fef2c121154680e2ba7e35ecf8d4969cc0af1fa6f14a8675858159"}, + {file = "pyarrow-16.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:71d52561cd7aefd22cf52538f262850b0cc9e4ec50af2aaa601da3a16ef48877"}, + {file = "pyarrow-16.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b93c9a50b965ee0bf4fef65e53b758a7e8dcc0c2d86cebcc037aaaf1b306ecc0"}, + {file = "pyarrow-16.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d831690844706e374c455fba2fb8cfcb7b797bfe53ceda4b54334316e1ac4fa4"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35692ce8ad0b8c666aa60f83950957096d92f2a9d8d7deda93fb835e6053307e"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dd3151d098e56f16a8389c1247137f9e4c22720b01c6f3aa6dec29a99b74d80"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bd40467bdb3cbaf2044ed7a6f7f251c8f941c8b31275aaaf88e746c4f3ca4a7a"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:00a1dcb22ad4ceb8af87f7bd30cc3354788776c417f493089e0a0af981bc8d80"}, + {file = "pyarrow-16.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fda9a7cebd1b1d46c97b511f60f73a5b766a6de4c5236f144f41a5d5afec1f35"}, + {file = "pyarrow-16.0.0.tar.gz", hash = "sha256:59bb1f1edbbf4114c72415f039f1359f1a57d166a331c3229788ccbfbb31689a"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + [[package]] name = "pycodestyle" version = "2.11.1" @@ -2871,6 +3585,25 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.2.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.2.1-py3-none-any.whl", hash = "sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091"}, + {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pyflakes" version = "3.2.0" @@ -3105,6 +3838,20 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "python-json-logger" version = "2.0.7" @@ -4088,6 +4835,44 @@ nativelib = ["pyobjc-framework-Cocoa", "pywin32"] objc = ["pyobjc-framework-Cocoa"] win32 = ["pywin32"] +[[package]] +name = "setuptools" +version = "69.5.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "setuptools-scm" +version = "8.0.4" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, + {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, +] + +[package.dependencies] +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -4099,6 +4884,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + [[package]] name = "smoldyn" version = "2.73" @@ -4170,6 +4966,23 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "starlette" +version = "0.36.3" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, + {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + [[package]] name = "swiglpk" version = "5.0.10" @@ -4298,6 +5111,36 @@ files = [ [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] +[[package]] +name = "tensorstore" +version = "0.1.58" +description = "Read and write large, multi-dimensional arrays" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorstore-0.1.58-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:a1b26008c320c3be356c34779b468b7f9fcfdc4d0d366b733e6a77488f79251b"}, + {file = "tensorstore-0.1.58-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:21c6dbbbf878bdaf8fccd8a71b13900954a0825279dd934651cdc59750556c69"}, + {file = "tensorstore-0.1.58-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cfd53a159335d05f0a416c9a02b77f97d7e0fa929489d15ae6487061680f345"}, + {file = "tensorstore-0.1.58-cp310-cp310-win_amd64.whl", hash = "sha256:6fd35bd5e1fe95fcfb4820d37153cfa2653ba7a9c391e9b9d7cf914b46692f0e"}, + {file = "tensorstore-0.1.58-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:ba688c87e116c36d0839fe463688d5ea69c8e4597b6f1c6d3933a4bae1e41b7a"}, + {file = "tensorstore-0.1.58-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fc95b0a25eec2450ee428aacf69e99529dd274317aa45795f79fde336fe2f7f"}, + {file = "tensorstore-0.1.58-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9118762d9f4e508e8675bf11e2bbf5ec6d061c2cd42154aa96195bd25156971d"}, + {file = "tensorstore-0.1.58-cp311-cp311-win_amd64.whl", hash = "sha256:a144a86711639ddba4ec021e71bde9480ab234eed6f124352e167885f655524a"}, + {file = "tensorstore-0.1.58-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:b999068aabab50ca96154783083a9efbdc0c5315745304b5a1ef543aa788c66e"}, + {file = "tensorstore-0.1.58-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bb73015268f0894d23796f3384751fda3d40423d42e129469d91cca7728d4e0"}, + {file = "tensorstore-0.1.58-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e974d0f35d07cdfded317030caa08e18aa522bb950bcf345a0d34cc2ea9035aa"}, + {file = "tensorstore-0.1.58-cp312-cp312-win_amd64.whl", hash = "sha256:6c8bbb75e0cb764325702771bb818f26cf9fb6f39178693174fbc6107d2df156"}, + {file = "tensorstore-0.1.58-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:6a19dddeacac6dbf71eda9b39b25eeac56c06dad55e5abb511dc1b74e0bbd7e0"}, + {file = "tensorstore-0.1.58-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:27031ad80c4c249ebfc83e0a12ef06efc48d1cc41340c2fb20fec6223912a9df"}, + {file = "tensorstore-0.1.58-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e821e914e0697a95fae107eccffa2b210aaf737f5e1c591af91f69d5957b02d4"}, + {file = "tensorstore-0.1.58-cp39-cp39-win_amd64.whl", hash = "sha256:4fb7ac2a88c12bd8b59a6c5e67720fd228873a6e182a7873b01a0a8153ea40be"}, + {file = "tensorstore-0.1.58.tar.gz", hash = "sha256:899bcf2fad09d78a886dc4a9ee70dba7dc9c1fb5a1d7d38f164a97046b5434d9"}, +] + +[package.dependencies] +ml-dtypes = ">=0.3.1" +numpy = ">=1.16.0" + [[package]] name = "termcolor" version = "2.4.0" @@ -4373,6 +5216,17 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "toposort" +version = "1.10" +description = "Implements a topological sort algorithm." +optional = false +python-versions = "*" +files = [ + {file = "toposort-1.10-py3-none-any.whl", hash = "sha256:cbdbc0d0bee4d2695ab2ceec97fe0679e9c10eab4b2a87a9372b929e70563a87"}, + {file = "toposort-1.10.tar.gz", hash = "sha256:bfbb479c53d0a696ea7402601f4e693c97b0367837c8898bc6471adfca37a6bd"}, +] + [[package]] name = "tornado" version = "6.4" @@ -4494,6 +5348,163 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.29.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "watchfiles" +version = "0.21.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + [[package]] name = "wcwidth" version = "0.2.13" @@ -4547,6 +5558,280 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "wurlitzer" +version = "3.1.0" +description = "Capture C-level output in context managers" +optional = false +python-versions = ">=3.5" +files = [ + {file = "wurlitzer-3.1.0-py3-none-any.whl", hash = "sha256:a20994e53681fea8fb9d16dc05ff5f9f9701f09723d894456a6d6b29cfb3188d"}, + {file = "wurlitzer-3.1.0.tar.gz", hash = "sha256:b31d3b18ab6b8394b3adb8b21841ad6d4b6bb195b9b642953872dbbab4c29b2a"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zarr" version = "2.17.1" @@ -4586,4 +5871,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10" -content-hash = "cbc3fcfcd34e266fe3ae30c5439d313a50070d5c0a3e3e340fb0841b2a7d0ab2" +content-hash = "a4b0f01522ab5bbe93cf3e0f637f166025c6f97457c1b9a9beab05468d6784f3" diff --git a/pyproject.toml b/pyproject.toml index a00c37269..6018479f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.0.21" description = "Core implementations of process-bigraph.composite.Process aligning with BioSimulators simulator tools." authors = ["Alex Patrie "] readme = "README.md" -packages = [{include = "biosimulator_processes"}] +packages = [{include = "biosimulator_processes"}, {include = "compare_api"}] [tool.poetry.dependencies] python = ">=3.10" @@ -12,19 +12,30 @@ zarr = "*" termcolor = "*" jupyterlab = "*" bigraph-schema = "*" -process-bigraph = "*" +process-bigraph = "^0.0.17" +bigraph-viz = "*" +bigraph-builder = "*" numpy = "*" # "^1.26.4" copasi-basico = "*" cobra = "*" tellurium = "*" +amici = "^0.24.0" smoldyn = ">=2.72" -bigraph-viz = "*" -bigraph-builder = "*" python-libsbml = "^5.20.2" docker = ">=7.0" python-libnuml = "^1.1.6" # ">=1.0.0" notebook = "^7.1.1" toml = "*" +fastapi = "^0.109.0" # "*" +pyyaml = "*" +pydantic = "*" +h5py = "*" +pydantic-settings = "*" +httpx = "*" +tensorstore = "*" +aiofiles = "*" +aiobotocore = "*" +uvicorn = {extras = ["standard"], version = "*"} # psutil = "^5.9.8" [tool.poetry.group.dev.dependencies] diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..5b769f97a --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --ignore=setup.py +python_files = *.py +# addopts = --doctest-modules --strict-markers +testpaths = biosimulator_processes/tests +markers = + slow: indicates slow tests (deselect with '-m "not slow"') \ No newline at end of file diff --git a/scripts/fix_notebooks.py b/scripts/fix_notebooks.py index b1e1481da..88dc52b15 100644 --- a/scripts/fix_notebooks.py +++ b/scripts/fix_notebooks.py @@ -17,7 +17,7 @@ def fix_execution_count(notebook_path): if __name__ == '__main__': - root = "notebooks" + root = "composer-notebooks" for f in os.listdir(root): fp = os.path.join(root, f) print(fp) diff --git a/scripts/trust-notebooks.sh b/scripts/trust-notebooks.sh index 0dc85c0f0..602272a98 100644 --- a/scripts/trust-notebooks.sh +++ b/scripts/trust-notebooks.sh @@ -1,4 +1,4 @@ #!/bin/bash -# Trust all notebooks in a specific directory +# Trust all composer-notebooks in a specific directory find /app/notebooks -name "*.ipynb" -exec jupyter trust {} \; diff --git a/setup.py b/setup.py index cbb3b8dba..a4b4fd204 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,7 @@ "process-bigraph", "bigraph-builder", "bigraph-viz", + "amici", "numpy", "pytest>=6.2.5", "tellurium", diff --git a/smoldyn-2.73-mac.tgz b/smoldyn-2.73-mac.tgz new file mode 100644 index 000000000..6b5b0afd4 Binary files /dev/null and b/smoldyn-2.73-mac.tgz differ diff --git a/src/bigraph-viz b/src/bigraph-viz deleted file mode 160000 index d8fc111aa..000000000 --- a/src/bigraph-viz +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d8fc111aa0ae6871cbf16d67ea6830524fe022ab diff --git a/src/builder b/src/builder deleted file mode 160000 index 0fa702619..000000000 --- a/src/builder +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0fa702619c0079b9e7d6f98228cb7067a864c3d5 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..bd0205dcf --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,42 @@ +import tempfile +import os +from datetime import datetime +import json +from process_bigraph import Composite +from biosimulator_processes import CORE + + +class ProcessUnitTest: + def __init__(self, instance_doc: dict, duration=10, write_results=False, out_dir=None): + self.instance_doc = instance_doc + self.duration = duration + self._run(write_results, out_dir) + + def create_composite(self) -> Composite: + return Composite( + config={'state': self.instance_doc}, + core=CORE) + + def __run_workflow(self, composite: Composite) -> None: + return composite.run(self.duration) + + def get_results(self, composite: Composite) -> dict: + self.__run_workflow(composite) + return composite.gather_results() + + def write_results(self, results: dict, out_dir: str = None): + results_dest = str(datetime.now()).replace(' ', '__').replace(':', '_') + if out_dir is None: + out_dir = tempfile.mkdtemp() + + save_fp = os.path.join(out_dir, results_dest) + '.json' + with open(save_fp, 'w') as fp: + return json.dump(results, fp, indent=4) + + def _run(self, write_results=False, out_dir: str = None): + composite = self.create_composite() + results = self.get_results(composite) + if write_results: + return self.write_results(results, out_dir) + else: + print(f'THE TEST RESULTS:\n{results}') diff --git a/tests/test_cobra_process.py b/tests/test_cobra_process.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_comparator_process.py b/tests/test_comparator_process.py new file mode 100644 index 000000000..fb5914921 --- /dev/null +++ b/tests/test_comparator_process.py @@ -0,0 +1,16 @@ +import os +import json + +from process_bigraph import Composite, pp +from biosimulator_processes import CORE +from biosimulator_processes.data_model.compare_data_model import ODEComparisonDocument + + +def test_ode_comparison_process(): + biomodel_id = 'BIOMD0000000630' + model_fp = f'biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml' + duration = 30 + + comparison_instance = ODEComparisonDocument( + simulators={''} + ) diff --git a/tests/test_copasi_process.py b/tests/test_copasi_process.py new file mode 100644 index 000000000..760ec22c0 --- /dev/null +++ b/tests/test_copasi_process.py @@ -0,0 +1,40 @@ +import os +import json + +from process_bigraph import Composite, pp +from biosimulator_processes import CORE +from biosimulator_processes.utils import prepare_single_ode_process_document + + +def test_process(): + biomodel_id = 'BIOMD0000000630' + model_fp = f'biosimulator_processes/model_files/sbml/BIOMD0000000630_url.xml' + species_context = 'counts' + species_port_name = f'floating_species_{species_context}' + species_store = [f'floating_species_{species_context}_store'] + duration = 10 + + print(os.path.exists(model_fp)) + + instance = prepare_single_ode_process_document( + simulator_name='copasi', + process_id=f'{biomodel_id}_copasi_process', + sbml_model_fp=model_fp) + + composition = Composite(config={'state': instance}, core=CORE) + composition.run(duration) + results = composition.gather_results() + return pp(results) + + +# def test_process_from_document(): +# # read the document from local file: +# five_process_fp = 'composer-notebooks/out/five_process_composite.json' +# with open(five_process_fp, 'r') as fp: +# instance = json.load(fp) +# +# return ProcessUnitTest(instance, duration=10) + + +if __name__ == '__main__': + test_process() diff --git a/tests/test_smoldyn_process.py b/tests/test_smoldyn_process.py new file mode 100644 index 000000000..9cf1ba79f --- /dev/null +++ b/tests/test_smoldyn_process.py @@ -0,0 +1,43 @@ +import os +from tests import ProcessUnitTest + + +def test_process(): + smoldyn_models_root = 'biosimulator_processes/model_files/smoldyn' + model_name = 'minE_model.txt' + model_fp = os.path.join(smoldyn_models_root, model_name) + + instance = { + 'smoldyn': { + '_type': 'process', + 'address': 'local:smoldyn', + 'config': { + 'model_filepath': model_fp, + }, + 'inputs': { + 'species_counts': ['species_counts_store'], + 'molecules': ['molecules_store']}, + 'outputs': { + 'species_counts': ['species_counts_store'], + 'molecules': ['molecules_store']} + }, + # 'emitter': { + # '_type': 'step', + # 'address': 'local:ram-emitter', + # 'config': { + # 'emit': { + # 'species_counts': 'tree[float]', + # 'molecules': 'tree[float]', + # }, + # }, + # 'inputs': { + # 'floating_species': ['species_counts_store'], + # 'molecules': ['molecules_store'], + # } + # } + } + + return ProcessUnitTest(instance_doc=instance, duration=10) + + +test_process() diff --git a/tests/test_tellurium_process.py b/tests/test_tellurium_process.py new file mode 100644 index 000000000..27b1a8557 --- /dev/null +++ b/tests/test_tellurium_process.py @@ -0,0 +1,65 @@ +import os +from process_bigraph import Composite +from biosimulator_processes import CORE +from tests import ProcessUnitTest + + +def test_process(): + # 1. define the instance of the Composite(in this case singular) by its schema + sbml_model_files_root = 'biosimulator_processes/model_files/sbml' + model_name = 'vilar-discrete-SSA.xml' # 'BIOMD0000000061_url.xml' + model_fp = os.path.join(sbml_model_files_root, model_name) + + instance = { + 'tellurium': { + '_type': 'process', + 'address': 'local:tellurium', + 'config': { + 'sbml_model_path': model_fp, + }, + 'inputs': { + 'time': ['start_time_store'], + 'run_time': ['run_time_store'], + 'floating_species': ['floating_species_store'], + 'boundary_species': ['boundary_species_store'], + 'model_parameters': ['model_parameters_store'], + 'reactions': ['reactions_store'], + # 'interval': ['interval_store'], + }, + 'outputs': { + 'results': ['results_store'], + } + }, + 'emitter': { + '_type': 'step', + 'address': 'local:ram-emitter', + 'config': { + 'emit': { + 'floating_species': 'tree[float]', + 'time': 'float', + }, + }, + 'inputs': { + 'floating_species': ['floating_species_store'], + 'time': ['start_time_store'], + } + } + } + + # 2. make the composite + workflow = Composite( + config={'state': instance}, + core=CORE) + + # 3. run + update = workflow.run(10) + + # 4. gather results + results = workflow.gather_results() + print(f'RESULTS: {pf(results)}') + + return ProcessUnitTest(instance_doc=instance) + + +if __name__ == '__main__': + test_process() diff --git a/wget-log b/wget-log new file mode 100644 index 000000000..2b384d9f9 --- /dev/null +++ b/wget-log @@ -0,0 +1,56 @@ +--2024-05-05 10:56:52-- https://www.smoldyn.org/smoldyn-2.73-mac.tgz +Resolving www.smoldyn.org (www.smoldyn.org)... 2607:7700:0:31::d05e:7520, 208.94.117.32 +Connecting to www.smoldyn.org (www.smoldyn.org)|2607:7700:0:31::d05e:7520|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 20944833 (20M) +Saving to: ‘smoldyn-2.73-mac.tgz’ + + smoldyn-2.73-mac.tgz 9%[=====> ] 1.98M 66.4KB/s eta 4m 29s smoldyn-2.73-mac.tgz 10%[=====> ] 2.00M 68.2KB/s eta 4m 29s smoldyn-2.73-mac.tgz 10%[=====> ] 2.02M 67.8KB/s eta 4m 29s smoldyn-2.73-mac.tgz 10%[=====> ] 2.05M 68.8KB/s eta 4m 26s smoldyn-2.73-mac.tgz 10%[=====> ] 2.07M 69.2KB/s eta 4m 26s smoldyn-2.73-mac.tgz 10%[=====> ] 2.08M 66.0KB/s eta 4m 26s smoldyn-2.73-mac.tgz 10%[=====> ] 2.09M 68.5KB/s eta 4m 26s smoldyn-2.73-mac.tgz 10%[=====> ] 2.12M 70.5KB/s eta 4m 26s smoldyn-2.73-mac.tgz 10%[=====> ] 2.14M 68.0KB/s eta 4m 24s smoldyn-2.73-mac.tgz 10%[=====> ] 2.16M 70.7KB/s eta 4m 24s smoldyn-2.73-mac.tgz 10%[=====> ] 2.18M 68.7KB/s eta 4m 24s smoldyn-2.73-mac.tgz 11%[=====> ] 2.20M 70.0KB/s eta 4m 24s smoldyn-2.73-mac.tgz 11%[=====> ] 2.22M 70.0KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.23M 69.9KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.25M 68.4KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.27M 69.7KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.28M 71.2KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.30M 71.4KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.33M 69.7KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.35M 70.1KB/s eta 4m 23s smoldyn-2.73-mac.tgz 11%[======> ] 2.38M 69.0KB/s eta 4m 21s smoldyn-2.73-mac.tgz 12%[======> ] 2.40M 72.1KB/s eta 4m 21s smoldyn-2.73-mac.tgz 12%[======> ] 2.41M 68.1KB/s eta 4m 21s smoldyn-2.73-mac.tgz 12%[======> ] 2.43M 67.2KB/s eta 4m 21s smoldyn-2.73-mac.tgz 12%[======> ] 2.45M 69.1KB/s eta 4m 20s smoldyn-2.73-mac.tgz 12%[======> ] 2.47M 70.6KB/s eta 4m 20s smoldyn-2.73-mac.tgz 12%[======> ] 2.48M 70.4KB/s eta 4m 20s smoldyn-2.73-mac.tgz 12%[======> ] 2.50M 68.0KB/s eta 4m 20s smoldyn-2.73-mac.tgz 12%[======> ] 2.52M 69.9KB/s eta 4m 18s smoldyn-2.73-mac.tgz 12%[=======> ] 2.54M 69.0KB/s eta 4m 18s smoldyn-2.73-mac.tgz 12%[=======> ] 2.56M 71.4KB/s eta 4m 18s smoldyn-2.73-mac.tgz 12%[=======> ] 2.56M 66.9KB/s eta 4m 18s smoldyn-2.73-mac.tgz 12%[=======> ] 2.59M 71.8KB/s eta 4m 18s smoldyn-2.73-mac.tgz 12%[=======> ] 2.59M 68.6KB/s eta 4m 18s smoldyn-2.73-mac.tgz 13%[=======> ] 2.62M 69.7KB/s eta 4m 18s smoldyn-2.73-mac.tgz 13%[=======> ] 2.63M 69.5KB/s eta 4m 18s smoldyn-2.73-mac.tgz 13%[=======> ] 2.64M 68.7KB/s eta 4m 18s smoldyn-2.73-mac.tgz 13%[=======> ] 2.66M 68.0KB/s eta 4m 17s smoldyn-2.73-mac.tgz 13%[=======> ] 2.68M 66.7KB/s eta 4m 17s smoldyn-2.73-mac.tgz 13%[=======> ] 2.70M 67.2KB/s eta 4m 17s smoldyn-2.73-mac.tgz 13%[=======> ] 2.72M 68.3KB/s eta 4m 17s smoldyn-2.73-mac.tgz 13%[=======> ] 2.74M 69.7KB/s eta 4m 15s smoldyn-2.73-mac.tgz 13%[=======> ] 2.75M 67.6KB/s eta 4m 15s smoldyn-2.73-mac.tgz 13%[=======> ] 2.77M 66.7KB/s eta 4m 15s smoldyn-2.73-mac.tgz 13%[=======> ] 2.79M 68.2KB/s eta 4m 15s smoldyn-2.73-mac.tgz 14%[=======> ] 2.80M 67.5KB/s eta 4m 15s smoldyn-2.73-mac.tgz 14%[=======> ] 2.83M 68.6KB/s eta 4m 15s smoldyn-2.73-mac.tgz 14%[=======> ] 2.85M 66.9KB/s eta 4m 15s smoldyn-2.73-mac.tgz 14%[========> ] 2.86M 68.3KB/s eta 4m 15s smoldyn-2.73-mac.tgz 14%[========> ] 2.88M 67.0KB/s eta 4m 14s smoldyn-2.73-mac.tgz 14%[========> ] 2.91M 68.4KB/s eta 4m 14s smoldyn-2.73-mac.tgz 14%[========> ] 2.92M 67.6KB/s eta 4m 14s smoldyn-2.73-mac.tgz 14%[========> ] 2.94M 65.9KB/s eta 4m 14s smoldyn-2.73-mac.tgz 14%[========> ] 2.96M 65.1KB/s eta 4m 13s smoldyn-2.73-mac.tgz 14%[========> ] 2.98M 69.3KB/s eta 4m 13s smoldyn-2.73-mac.tgz 15%[========> ] 3.00M 69.2KB/s eta 4m 13s smoldyn-2.73-mac.tgz 15%[========> ] 3.02M 58.8KB/s eta 4m 16s smoldyn-2.73-mac.tgz 15%[========> ] 3.05M 60.9KB/s eta 4m 16s smoldyn-2.73-mac.tgz 15%[========> ] 3.08M 64.0KB/s eta 4m 16s smoldyn-2.73-mac.tgz 15%[========> ] 3.12M 67.4KB/s eta 4m 16s smoldyn-2.73-mac.tgz 15%[========> ] 3.14M 69.7KB/s eta 4m 10s smoldyn-2.73-mac.tgz 15%[========> ] 3.15M 67.5KB/s eta 4m 10s smoldyn-2.73-mac.tgz 15%[=========> ] 3.18M 67.3KB/s eta 4m 10s smoldyn-2.73-mac.tgz 15%[=========> ] 3.19M 70.2KB/s eta 4m 10s smoldyn-2.73-mac.tgz 16%[=========> ] 3.20M 68.8KB/s eta 4m 10s smoldyn-2.73-mac.tgz 16%[=========> ] 3.23M 70.7KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.25M 68.0KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.26M 69.0KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.27M 69.4KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.29M 69.4KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.31M 70.0KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.33M 66.8KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.35M 68.8KB/s eta 4m 8s smoldyn-2.73-mac.tgz 16%[=========> ] 3.37M 80.3KB/s eta 4m 6s smoldyn-2.73-mac.tgz 16%[=========> ] 3.38M 79.6KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.40M 77.2KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.42M 76.1KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.42M 68.1KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.44M 66.9KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.46M 68.1KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[=========> ] 3.48M 66.8KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[==========> ] 3.50M 68.8KB/s eta 4m 6s smoldyn-2.73-mac.tgz 17%[==========> ] 3.53M 68.9KB/s eta 4m 4s smoldyn-2.73-mac.tgz 17%[==========> ] 3.54M 67.4KB/s eta 4m 4s smoldyn-2.73-mac.tgz 17%[==========> ] 3.56M 68.6KB/s eta 4m 4s smoldyn-2.73-mac.tgz 17%[==========> ] 3.59M 67.9KB/s eta 4m 4s smoldyn-2.73-mac.tgz 18%[==========> ] 3.61M 69.6KB/s eta 4m 3s smoldyn-2.73-mac.tgz 18%[==========> ] 3.63M 70.0KB/s eta 4m 3s smoldyn-2.73-mac.tgz 18%[==========> ] 3.65M 70.3KB/s eta 4m 3s smoldyn-2.73-mac.tgz 18%[==========> ] 3.66M 68.8KB/s eta 4m 3s smoldyn-2.73-mac.tgz 18%[==========> ] 3.68M 68.2KB/s eta 4m 2s smoldyn-2.73-mac.tgz 18%[==========> ] 3.70M 69.4KB/s eta 4m 2s smoldyn-2.73-mac.tgz 18%[==========> ] 3.71M 67.2KB/s eta 4m 2s smoldyn-2.73-mac.tgz 18%[==========> ] 3.73M 68.1KB/s eta 4m 2s smoldyn-2.73-mac.tgz 18%[==========> ] 3.76M 69.3KB/s eta 4m 1s smoldyn-2.73-mac.tgz 18%[==========> ] 3.78M 69.9KB/s eta 4m 1s smoldyn-2.73-mac.tgz 19%[==========> ] 3.80M 71.0KB/s eta 4m 1s smoldyn-2.73-mac.tgz 19%[===========> ] 3.81M 67.0KB/s eta 4m 1s smoldyn-2.73-mac.tgz 19%[===========> ] 3.84M 71.2KB/s eta 4m 1s smoldyn-2.73-mac.tgz 19%[===========> ] 3.85M 68.8KB/s eta 3m 59s smoldyn-2.73-mac.tgz 19%[===========> ] 3.86M 70.1KB/s eta 3m 59s smoldyn-2.73-mac.tgz 19%[===========> ] 3.88M 69.8KB/s eta 3m 59s smoldyn-2.73-mac.tgz 19%[===========> ] 3.89M 64.6KB/s eta 4m 0s smoldyn-2.73-mac.tgz 19%[===========> ] 3.94M 69.5KB/s eta 4m 0s smoldyn-2.73-mac.tgz 19%[===========> ] 3.96M 68.4KB/s eta 4m 0s smoldyn-2.73-mac.tgz 19%[===========> ] 3.98M 67.9KB/s eta 4m 0s smoldyn-2.73-mac.tgz 20%[===========> ] 4.00M 68.9KB/s eta 3m 57s smoldyn-2.73-mac.tgz 20%[===========> ] 4.02M 69.9KB/s eta 3m 57s smoldyn-2.73-mac.tgz 20%[===========> ] 4.04M 69.5KB/s eta 3m 57s smoldyn-2.73-mac.tgz 20%[===========> ] 4.06M 69.8KB/s eta 3m 57s smoldyn-2.73-mac.tgz 20%[===========> ] 4.07M 71.2KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[===========> ] 4.09M 71.6KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[===========> ] 4.11M 70.2KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[============> ] 4.12M 67.9KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[============> ] 4.15M 62.2KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[============> ] 4.16M 62.4KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[============> ] 4.18M 62.0KB/s eta 3m 56s smoldyn-2.73-mac.tgz 20%[============> ] 4.19M 61.4KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.21M 61.4KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.22M 59.6KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.25M 59.8KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.25M 58.8KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.27M 59.6KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.29M 60.5KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.31M 62.1KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.32M 57.8KB/s eta 3m 56s smoldyn-2.73-mac.tgz 21%[============> ] 4.35M 59.7KB/s eta 3m 54s smoldyn-2.73-mac.tgz 21%[============> ] 4.37M 60.7KB/s eta 3m 54s smoldyn-2.73-mac.tgz 21%[============> ] 4.39M 60.8KB/s eta 3m 54s smoldyn-2.73-mac.tgz 22%[============> ] 4.41M 61.3KB/s eta 3m 54s smoldyn-2.73-mac.tgz 22%[============> ] 4.43M 60.3KB/s eta 3m 53s smoldyn-2.73-mac.tgz 22%[=============> ] 4.44M 65.9KB/s eta 3m 53s smoldyn-2.73-mac.tgz 22%[=============> ] 4.47M 66.5KB/s eta 3m 53s smoldyn-2.73-mac.tgz 22%[=============> ] 4.49M 69.5KB/s eta 3m 53s smoldyn-2.73-mac.tgz 22%[=============> ] 4.50M 68.8KB/s eta 3m 52s smoldyn-2.73-mac.tgz 22%[=============> ] 4.52M 67.5KB/s eta 3m 52s smoldyn-2.73-mac.tgz 22%[=============> ] 4.54M 69.9KB/s eta 3m 52s smoldyn-2.73-mac.tgz 22%[=============> ] 4.56M 71.6KB/s eta 3m 52s smoldyn-2.73-mac.tgz 22%[=============> ] 4.58M 71.2KB/s eta 3m 50s smoldyn-2.73-mac.tgz 23%[=============> ] 4.60M 70.7KB/s eta 3m 50s smoldyn-2.73-mac.tgz 23%[=============> ] 4.61M 66.6KB/s eta 3m 50s smoldyn-2.73-mac.tgz 23%[=============> ] 4.64M 71.9KB/s eta 3m 50s smoldyn-2.73-mac.tgz 23%[=============> ] 4.66M 69.9KB/s eta 3m 49s smoldyn-2.73-mac.tgz 23%[=============> ] 4.67M 68.9KB/s eta 3m 49s smoldyn-2.73-mac.tgz 23%[=============> ] 4.70M 68.1KB/s eta 3m 49s smoldyn-2.73-mac.tgz 23%[=============> ] 4.71M 68.0KB/s eta 3m 49s smoldyn-2.73-mac.tgz 23%[=============> ] 4.73M 69.5KB/s eta 3m 48s smoldyn-2.73-mac.tgz 23%[=============> ] 4.75M 68.3KB/s eta 3m 48s smoldyn-2.73-mac.tgz 23%[==============> ] 4.77M 69.2KB/s eta 3m 48s smoldyn-2.73-mac.tgz 23%[==============> ] 4.78M 69.5KB/s eta 3m 48s smoldyn-2.73-mac.tgz 24%[==============> ] 4.80M 71.1KB/s eta 3m 48s smoldyn-2.73-mac.tgz 24%[==============> ] 4.82M 67.3KB/s eta 3m 47s smoldyn-2.73-mac.tgz 24%[==============> ] 4.84M 68.5KB/s eta 3m 47s smoldyn-2.73-mac.tgz 24%[==============> ] 4.86M 69.8KB/s eta 3m 47s smoldyn-2.73-mac.tgz 24%[==============> ] 4.88M 68.4KB/s eta 3m 47s smoldyn-2.73-mac.tgz 24%[==============> ] 4.91M 70.2KB/s eta 3m 45s smoldyn-2.73-mac.tgz 24%[==============> ] 4.92M 66.9KB/s eta 3m 45s smoldyn-2.73-mac.tgz 24%[==============> ] 4.92M 65.0KB/s eta 3m 45s smoldyn-2.73-mac.tgz 24%[==============> ] 4.94M 66.4KB/s eta 3m 45s smoldyn-2.73-mac.tgz 24%[==============> ] 4.97M 66.8KB/s eta 3m 45s smoldyn-2.73-mac.tgz 24%[==============> ] 4.99M 68.2KB/s eta 3m 45s smoldyn-2.73-mac.tgz 25%[==============> ] 5.00M 65.5KB/s eta 3m 45s smoldyn-2.73-mac.tgz 25%[==============> ] 5.04M 67.3KB/s eta 3m 44s smoldyn-2.73-mac.tgz 25%[==============> ] 5.06M 70.2KB/s eta 3m 44s smoldyn-2.73-mac.tgz 25%[===============> ] 5.08M 69.0KB/s eta 3m 44s smoldyn-2.73-mac.tgz 25%[===============> ] 5.09M 69.3KB/s eta 3m 44s smoldyn-2.73-mac.tgz 25%[===============> ] 5.11M 68.2KB/s eta 3m 44s smoldyn-2.73-mac.tgz 25%[===============> ] 5.13M 70.9KB/s eta 3m 42s smoldyn-2.73-mac.tgz 25%[===============> ] 5.14M 67.7KB/s eta 3m 42s smoldyn-2.73-mac.tgz 25%[===============> ] 5.16M 67.9KB/s eta 3m 42s smoldyn-2.73-mac.tgz 25%[===============> ] 5.18M 67.5KB/s eta 3m 42s smoldyn-2.73-mac.tgz 26%[===============> ] 5.20M 67.2KB/s eta 3m 41s smoldyn-2.73-mac.tgz 26%[===============> ] 5.23M 66.7KB/s eta 3m 41s smoldyn-2.73-mac.tgz 26%[===============> ] 5.24M 69.7KB/s eta 3m 41s smoldyn-2.73-mac.tgz 26%[===============> ] 5.27M 72.0KB/s eta 3m 41s smoldyn-2.73-mac.tgz 26%[===============> ] 5.28M 71.5KB/s eta 3m 40s smoldyn-2.73-mac.tgz 26%[===============> ] 5.30M 70.5KB/s eta 3m 40s smoldyn-2.73-mac.tgz 26%[===============> ] 5.31M 66.7KB/s eta 3m 40s smoldyn-2.73-mac.tgz 26%[===============> ] 5.33M 67.9KB/s eta 3m 40s smoldyn-2.73-mac.tgz 26%[===============> ] 5.35M 69.5KB/s eta 3m 39s smoldyn-2.73-mac.tgz 26%[===============> ] 5.37M 69.7KB/s eta 3m 39s smoldyn-2.73-mac.tgz 26%[===============> ] 5.39M 70.0KB/s eta 3m 39s smoldyn-2.73-mac.tgz 27%[================> ] 5.41M 68.0KB/s eta 3m 39s smoldyn-2.73-mac.tgz 27%[================> ] 5.42M 67.5KB/s eta 3m 38s smoldyn-2.73-mac.tgz 27%[================> ] 5.44M 67.3KB/s eta 3m 38s smoldyn-2.73-mac.tgz 27%[================> ] 5.47M 70.9KB/s eta 3m 38s smoldyn-2.73-mac.tgz 27%[================> ] 5.48M 69.9KB/s eta 3m 38s smoldyn-2.73-mac.tgz 27%[================> ] 5.50M 71.1KB/s eta 3m 36s smoldyn-2.73-mac.tgz 27%[================> ] 5.52M 69.7KB/s eta 3m 36s smoldyn-2.73-mac.tgz 27%[================> ] 5.54M 69.1KB/s eta 3m 36s smoldyn-2.73-mac.tgz 27%[================> ] 5.56M 67.6KB/s eta 3m 36s smoldyn-2.73-mac.tgz 27%[================> ] 5.58M 70.8KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.59M 69.0KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.62M 70.0KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.62M 65.9KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.64M 65.9KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.66M 68.3KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.67M 66.5KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[================> ] 5.70M 70.1KB/s eta 3m 35s smoldyn-2.73-mac.tgz 28%[=================> ] 5.71M 67.8KB/s eta 3m 34s smoldyn-2.73-mac.tgz 28%[=================> ] 5.72M 66.8KB/s eta 3m 34s smoldyn-2.73-mac.tgz 28%[=================> ] 5.75M 69.0KB/s eta 3m 34s smoldyn-2.73-mac.tgz 28%[=================> ] 5.77M 68.2KB/s eta 3m 34s smoldyn-2.73-mac.tgz 28%[=================> ] 5.78M 67.7KB/s eta 3m 34s smoldyn-2.73-mac.tgz 29%[=================> ] 5.80M 70.2KB/s eta 3m 32s smoldyn-2.73-mac.tgz 29%[=================> ] 5.81M 68.5KB/s eta 3m 32s smoldyn-2.73-mac.tgz 29%[=================> ] 5.84M 69.6KB/s eta 3m 32s smoldyn-2.73-mac.tgz 29%[=================> ] 5.85M 69.1KB/s eta 3m 32s smoldyn-2.73-mac.tgz 29%[=================> ] 5.86M 69.3KB/s eta 3m 32s smoldyn-2.73-mac.tgz 29%[=================> ] 5.88M 70.3KB/s eta 3m 31s smoldyn-2.73-mac.tgz 29%[=================> ] 5.90M 65.3KB/s eta 3m 31s smoldyn-2.73-mac.tgz 29%[=================> ] 5.92M 64.7KB/s eta 3m 31s smoldyn-2.73-mac.tgz 29%[=================> ] 5.94M 69.6KB/s eta 3m 30s smoldyn-2.73-mac.tgz 29%[=================> ] 5.98M 68.2KB/s eta 3m 30s smoldyn-2.73-mac.tgz 29%[=================> ] 5.98M 66.0KB/s eta 3m 30s smoldyn-2.73-mac.tgz 30%[=================> ] 6.00M 63.4KB/s eta 3m 30s smoldyn-2.73-mac.tgz 30%[==================> ] 6.02M 66.2KB/s eta 3m 30s smoldyn-2.73-mac.tgz 30%[==================> ] 6.05M 64.4KB/s eta 3m 30s smoldyn-2.73-mac.tgz 30%[==================> ] 6.07M 66.2KB/s eta 3m 29s smoldyn-2.73-mac.tgz 30%[==================> ] 6.10M 67.4KB/s eta 3m 29s smoldyn-2.73-mac.tgz 30%[==================> ] 6.11M 66.4KB/s eta 3m 29s smoldyn-2.73-mac.tgz 30%[==================> ] 6.13M 66.0KB/s eta 3m 29s smoldyn-2.73-mac.tgz 30%[==================> ] 6.14M 66.2KB/s eta 3m 27s smoldyn-2.73-mac.tgz 30%[==================> ] 6.17M 65.5KB/s eta 3m 27s smoldyn-2.73-mac.tgz 31%[==================> ] 6.20M 68.0KB/s eta 3m 27s smoldyn-2.73-mac.tgz 31%[==================> ] 6.21M 67.1KB/s eta 3m 27s smoldyn-2.73-mac.tgz 31%[==================> ] 6.23M 64.0KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.23M 63.9KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.25M 63.4KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.26M 61.8KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.29M 62.6KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.32M 69.6KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[==================> ] 6.34M 69.7KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[===================> ] 6.35M 66.2KB/s eta 3m 26s smoldyn-2.73-mac.tgz 31%[===================> ] 6.37M 69.5KB/s eta 3m 24s smoldyn-2.73-mac.tgz 31%[===================> ] 6.39M 67.9KB/s eta 3m 24s smoldyn-2.73-mac.tgz 32%[===================> ] 6.42M 68.3KB/s eta 3m 24s smoldyn-2.73-mac.tgz 32%[===================> ] 6.43M 67.2KB/s eta 3m 24s smoldyn-2.73-mac.tgz 32%[===================> ] 6.45M 69.0KB/s eta 3m 23s smoldyn-2.73-mac.tgz 32%[===================> ] 6.47M 65.7KB/s eta 3m 23s smoldyn-2.73-mac.tgz 32%[===================> ] 6.49M 69.7KB/s eta 3m 23s smoldyn-2.73-mac.tgz 32%[===================> ] 6.50M 67.8KB/s eta 3m 23s smoldyn-2.73-mac.tgz 32%[===================> ] 6.52M 65.8KB/s eta 3m 22s smoldyn-2.73-mac.tgz 32%[===================> ] 6.53M 67.2KB/s eta 3m 22s smoldyn-2.73-mac.tgz 32%[===================> ] 6.55M 65.6KB/s eta 3m 22s smoldyn-2.73-mac.tgz 32%[===================> ] 6.56M 67.3KB/s eta 3m 22s smoldyn-2.73-mac.tgz 32%[===================> ] 6.58M 72.7KB/s eta 3m 22s smoldyn-2.73-mac.tgz 33%[===================> ] 6.61M 72.9KB/s eta 3m 21s smoldyn-2.73-mac.tgz 33%[===================> ] 6.63M 73.0KB/s eta 3m 21s smoldyn-2.73-mac.tgz 33%[===================> ] 6.66M 68.6KB/s eta 3m 21s smoldyn-2.73-mac.tgz 33%[====================> ] 6.67M 69.3KB/s eta 3m 21s smoldyn-2.73-mac.tgz 33%[====================> ] 6.70M 70.8KB/s eta 3m 19s smoldyn-2.73-mac.tgz 33%[====================> ] 6.72M 71.9KB/s eta 3m 19s smoldyn-2.73-mac.tgz 33%[====================> ] 6.72M 68.0KB/s eta 3m 19s smoldyn-2.73-mac.tgz 33%[====================> ] 6.74M 70.0KB/s eta 3m 19s smoldyn-2.73-mac.tgz 33%[====================> ] 6.77M 69.4KB/s eta 3m 18s smoldyn-2.73-mac.tgz 33%[====================> ] 6.79M 69.2KB/s eta 3m 18s smoldyn-2.73-mac.tgz 34%[====================> ] 6.80M 69.8KB/s eta 3m 18s smoldyn-2.73-mac.tgz 34%[====================> ] 6.82M 69.5KB/s eta 3m 18s smoldyn-2.73-mac.tgz 34%[====================> ] 6.84M 71.0KB/s eta 3m 17s smoldyn-2.73-mac.tgz 34%[====================> ] 6.86M 69.5KB/s eta 3m 17s smoldyn-2.73-mac.tgz 34%[====================> ] 6.88M 66.9KB/s eta 3m 17s smoldyn-2.73-mac.tgz 34%[====================> ] 6.90M 70.6KB/s eta 3m 17s smoldyn-2.73-mac.tgz 34%[====================> ] 6.92M 69.0KB/s eta 3m 16s smoldyn-2.73-mac.tgz 34%[====================> ] 6.95M 67.8KB/s eta 3m 16s smoldyn-2.73-mac.tgz 34%[====================> ] 6.97M 66.4KB/s eta 3m 16s smoldyn-2.73-mac.tgz 34%[=====================> ] 6.98M 66.1KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.01M 68.8KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.03M 60.1KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.05M 61.0KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.08M 63.1KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.12M 70.0KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.13M 69.0KB/s eta 3m 15s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.13M 64.7KB/s eta 3m 13s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.14M 58.8KB/s eta 3m 13s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.14M 55.4KB/s eta 3m 13s smoldyn-2.73-mac.tgz 35%[=====================> ] 7.19M 60.0KB/s eta 3m 13s smoldyn-2.73-mac.tgz 36%[=====================> ] 7.21M 60.3KB/s eta 3m 13s smoldyn-2.73-mac.tgz 36%[=====================> ] 7.23M 61.1KB/s eta 3m 13s smoldyn-2.73-mac.tgz 36%[=====================> ] 7.27M 65.8KB/s eta 3m 13s smoldyn-2.73-mac.tgz 36%[======================> ] 7.30M 66.7KB/s eta 3m 10s smoldyn-2.73-mac.tgz 36%[======================> ] 7.31M 65.6KB/s eta 3m 10s smoldyn-2.73-mac.tgz 36%[======================> ] 7.35M 70.0KB/s eta 3m 10s smoldyn-2.73-mac.tgz 36%[======================> ] 7.36M 64.5KB/s eta 3m 10s smoldyn-2.73-mac.tgz 36%[======================> ] 7.38M 63.9KB/s eta 3m 10s smoldyn-2.73-mac.tgz 37%[======================> ] 7.41M 73.5KB/s eta 3m 10s smoldyn-2.73-mac.tgz 37%[======================> ] 7.42M 73.3KB/s eta 3m 10s smoldyn-2.73-mac.tgz 37%[======================> ] 7.45M 72.1KB/s eta 3m 8s smoldyn-2.73-mac.tgz 37%[======================> ] 7.46M 70.1KB/s eta 3m 8s smoldyn-2.73-mac.tgz 37%[======================> ] 7.48M 65.6KB/s eta 3m 8s smoldyn-2.73-mac.tgz 37%[======================> ] 7.50M 71.6KB/s eta 3m 8s smoldyn-2.73-mac.tgz 37%[======================> ] 7.51M 74.3KB/s eta 3m 7s smoldyn-2.73-mac.tgz 37%[======================> ] 7.53M 81.7KB/s eta 3m 7s smoldyn-2.73-mac.tgz 37%[======================> ] 7.55M 76.3KB/s eta 3m 7s smoldyn-2.73-mac.tgz 37%[======================> ] 7.57M 75.6KB/s eta 3m 7s smoldyn-2.73-mac.tgz 37%[======================> ] 7.59M 75.4KB/s eta 3m 6s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.61M 75.4KB/s eta 3m 6s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.62M 68.3KB/s eta 3m 6s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.65M 68.6KB/s eta 3m 6s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.67M 73.4KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.69M 72.4KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.71M 71.4KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.72M 67.2KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.74M 66.9KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.77M 69.2KB/s eta 3m 4s smoldyn-2.73-mac.tgz 38%[=======================> ] 7.78M 69.1KB/s eta 3m 4s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.80M 67.0KB/s eta 3m 3s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.82M 69.6KB/s eta 3m 3s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.85M 69.6KB/s eta 3m 3s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.85M 68.9KB/s eta 3m 3s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.87M 67.7KB/s eta 3m 3s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.89M 69.8KB/s eta 3m 1s smoldyn-2.73-mac.tgz 39%[=======================> ] 7.91M 64.1KB/s eta 3m 1s smoldyn-2.73-mac.tgz 39%[========================> ] 7.93M 65.9KB/s eta 3m 1s smoldyn-2.73-mac.tgz 39%[========================> ] 7.96M 68.9KB/s eta 3m 0s smoldyn-2.73-mac.tgz 39%[========================> ] 7.98M 69.7KB/s eta 3m 0s smoldyn-2.73-mac.tgz 40%[========================> ] 7.99M 61.9KB/s eta 3m 0s smoldyn-2.73-mac.tgz 40%[========================> ] 8.04M 69.3KB/s eta 2m 59s smoldyn-2.73-mac.tgz 40%[========================> ] 8.06M 70.0KB/s eta 2m 59s smoldyn-2.73-mac.tgz 40%[========================> ] 8.07M 67.2KB/s eta 2m 59s smoldyn-2.73-mac.tgz 40%[========================> ] 8.09M 72.4KB/s eta 2m 59s smoldyn-2.73-mac.tgz 40%[========================> ] 8.11M 70.9KB/s eta 2m 59s smoldyn-2.73-mac.tgz 40%[========================> ] 8.13M 68.6KB/s eta 2m 57s smoldyn-2.73-mac.tgz 40%[========================> ] 8.15M 69.2KB/s eta 2m 57s smoldyn-2.73-mac.tgz 40%[========================> ] 8.17M 70.9KB/s eta 2m 57s smoldyn-2.73-mac.tgz 41%[========================> ] 8.19M 70.5KB/s eta 2m 57s smoldyn-2.73-mac.tgz 41%[========================> ] 8.21M 69.7KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[========================> ] 8.23M 68.8KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.25M 69.7KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.27M 70.3KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.29M 71.4KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.31M 72.2KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.32M 68.3KB/s eta 2m 56s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.35M 74.7KB/s eta 2m 54s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.37M 70.1KB/s eta 2m 54s smoldyn-2.73-mac.tgz 41%[=========================> ] 8.39M 68.0KB/s eta 2m 54s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.41M 69.2KB/s eta 2m 54s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.43M 67.4KB/s eta 2m 53s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.45M 69.1KB/s eta 2m 53s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.47M 69.4KB/s eta 2m 53s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.49M 69.4KB/s eta 2m 53s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.50M 68.1KB/s eta 2m 52s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.52M 69.2KB/s eta 2m 52s smoldyn-2.73-mac.tgz 42%[=========================> ] 8.54M 69.1KB/s eta 2m 52s smoldyn-2.73-mac.tgz 42%[==========================> ] 8.56M 70.3KB/s eta 2m 52s smoldyn-2.73-mac.tgz 42%[==========================> ] 8.57M 70.8KB/s eta 2m 51s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.60M 68.0KB/s eta 2m 51s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.62M 70.4KB/s eta 2m 51s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.65M 70.3KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.67M 68.5KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.70M 69.4KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.70M 60.2KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.72M 60.5KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.75M 64.0KB/s eta 2m 50s smoldyn-2.73-mac.tgz 43%[==========================> ] 8.78M 66.7KB/s eta 2m 50s smoldyn-2.73-mac.tgz 44%[==========================> ] 8.81M 64.5KB/s eta 2m 48s smoldyn-2.73-mac.tgz 44%[==========================> ] 8.85M 68.2KB/s eta 2m 48s smoldyn-2.73-mac.tgz 44%[==========================> ] 8.88M 69.2KB/s eta 2m 48s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.89M 68.6KB/s eta 2m 48s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.91M 68.8KB/s eta 2m 46s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.93M 70.7KB/s eta 2m 46s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.94M 69.0KB/s eta 2m 46s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.96M 70.3KB/s eta 2m 46s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.98M 70.4KB/s eta 2m 46s smoldyn-2.73-mac.tgz 44%[===========================> ] 8.98M 62.7KB/s eta 2m 45s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.00M 62.0KB/s eta 2m 45s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.02M 64.1KB/s eta 2m 45s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.06M 68.4KB/s eta 2m 45s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.07M 67.1KB/s eta 2m 45s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.09M 74.4KB/s eta 2m 43s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.12M 75.3KB/s eta 2m 43s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.14M 75.8KB/s eta 2m 43s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.15M 73.2KB/s eta 2m 43s smoldyn-2.73-mac.tgz 45%[===========================> ] 9.17M 70.6KB/s eta 2m 42s smoldyn-2.73-mac.tgz 46%[===========================> ] 9.19M 71.3KB/s eta 2m 42s smoldyn-2.73-mac.tgz 46%[============================> ] 9.20M 67.0KB/s eta 2m 42s smoldyn-2.73-mac.tgz 46%[============================> ] 9.23M 68.7KB/s eta 2m 42s smoldyn-2.73-mac.tgz 46%[============================> ] 9.24M 66.5KB/s eta 2m 41s smoldyn-2.73-mac.tgz 46%[============================> ] 9.27M 68.7KB/s eta 2m 41s smoldyn-2.73-mac.tgz 46%[============================> ] 9.29M 69.0KB/s eta 2m 41s smoldyn-2.73-mac.tgz 46%[============================> ] 9.30M 68.2KB/s eta 2m 41s smoldyn-2.73-mac.tgz 46%[============================> ] 9.33M 68.1KB/s eta 2m 39s smoldyn-2.73-mac.tgz 46%[============================> ] 9.35M 75.4KB/s eta 2m 39s smoldyn-2.73-mac.tgz 46%[============================> ] 9.37M 76.3KB/s eta 2m 39s smoldyn-2.73-mac.tgz 46%[============================> ] 9.39M 71.0KB/s eta 2m 39s smoldyn-2.73-mac.tgz 47%[============================> ] 9.40M 71.7KB/s eta 2m 38s smoldyn-2.73-mac.tgz 47%[============================> ] 9.41M 63.3KB/s eta 2m 38s smoldyn-2.73-mac.tgz 47%[============================> ] 9.43M 66.7KB/s eta 2m 38s smoldyn-2.73-mac.tgz 47%[============================> ] 9.46M 67.3KB/s eta 2m 38s smoldyn-2.73-mac.tgz 47%[============================> ] 9.48M 70.0KB/s eta 2m 37s smoldyn-2.73-mac.tgz 47%[============================> ] 9.49M 69.5KB/s eta 2m 37s smoldyn-2.73-mac.tgz 47%[=============================> ] 9.52M 71.4KB/s eta 2m 37s smoldyn-2.73-mac.tgz 47%[=============================> ] 9.55M 69.7KB/s eta 2m 37s smoldyn-2.73-mac.tgz 47%[=============================> ] 9.56M 67.7KB/s eta 2m 36s smoldyn-2.73-mac.tgz 47%[=============================> ] 9.59M 69.9KB/s eta 2m 36s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.60M 69.1KB/s eta 2m 36s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.62M 66.9KB/s eta 2m 36s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.64M 70.0KB/s eta 2m 35s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.66M 61.7KB/s eta 2m 35s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.70M 65.6KB/s eta 2m 34s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.72M 67.5KB/s eta 2m 34s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.74M 72.3KB/s eta 2m 34s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.77M 72.2KB/s eta 2m 34s smoldyn-2.73-mac.tgz 48%[=============================> ] 9.78M 69.8KB/s eta 2m 33s smoldyn-2.73-mac.tgz 49%[=============================> ] 9.80M 68.6KB/s eta 2m 33s smoldyn-2.73-mac.tgz 49%[=============================> ] 9.82M 68.1KB/s eta 2m 33s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.84M 68.7KB/s eta 2m 33s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.86M 67.3KB/s eta 2m 31s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.88M 67.9KB/s eta 2m 31s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.90M 68.3KB/s eta 2m 31s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.92M 69.1KB/s eta 2m 31s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.93M 65.8KB/s eta 2m 30s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.95M 69.0KB/s eta 2m 30s smoldyn-2.73-mac.tgz 49%[==============================> ] 9.97M 67.6KB/s eta 2m 30s smoldyn-2.73-mac.tgz 50%[==============================> ] 9.99M 68.1KB/s eta 2m 30s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.00M 75.0KB/s eta 2m 30s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.02M 70.1KB/s eta 2m 29s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.05M 69.8KB/s eta 2m 29s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.07M 69.1KB/s eta 2m 29s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.09M 69.1KB/s eta 2m 29s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.11M 67.7KB/s eta 2m 28s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.13M 70.3KB/s eta 2m 28s smoldyn-2.73-mac.tgz 50%[==============================> ] 10.14M 67.9KB/s eta 2m 28s smoldyn-2.73-mac.tgz 50%[===============================> ] 10.16M 68.7KB/s eta 2m 28s smoldyn-2.73-mac.tgz 50%[===============================> ] 10.18M 68.1KB/s eta 2m 27s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.20M 68.5KB/s eta 2m 27s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.23M 69.1KB/s eta 2m 27s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.24M 67.2KB/s eta 2m 26s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.27M 69.4KB/s eta 2m 26s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.29M 69.0KB/s eta 2m 26s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.31M 67.3KB/s eta 2m 26s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.33M 68.2KB/s eta 2m 24s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.34M 68.6KB/s eta 2m 24s smoldyn-2.73-mac.tgz 51%[===============================> ] 10.37M 67.1KB/s eta 2m 24s smoldyn-2.73-mac.tgz 52%[===============================> ] 10.39M 67.5KB/s eta 2m 23s smoldyn-2.73-mac.tgz 52%[===============================> ] 10.42M 70.3KB/s eta 2m 23s smoldyn-2.73-mac.tgz 52%[===============================> ] 10.43M 68.8KB/s eta 2m 23s smoldyn-2.73-mac.tgz 52%[===============================> ] 10.45M 68.5KB/s eta 2m 23s smoldyn-2.73-mac.tgz 52%[================================> ] 10.47M 68.7KB/s eta 2m 22s smoldyn-2.73-mac.tgz 52%[================================> ] 10.49M 70.3KB/s eta 2m 22s smoldyn-2.73-mac.tgz 52%[================================> ] 10.51M 69.5KB/s eta 2m 22s smoldyn-2.73-mac.tgz 52%[================================> ] 10.52M 68.5KB/s eta 2m 22s smoldyn-2.73-mac.tgz 52%[================================> ] 10.53M 69.1KB/s eta 2m 21s smoldyn-2.73-mac.tgz 52%[================================> ] 10.55M 69.6KB/s eta 2m 21s smoldyn-2.73-mac.tgz 52%[================================> ] 10.58M 68.3KB/s eta 2m 21s smoldyn-2.73-mac.tgz 53%[================================> ] 10.60M 73.2KB/s eta 2m 21s smoldyn-2.73-mac.tgz 53%[================================> ] 10.61M 68.3KB/s eta 2m 20s smoldyn-2.73-mac.tgz 53%[================================> ] 10.63M 71.0KB/s eta 2m 20s smoldyn-2.73-mac.tgz 53%[================================> ] 10.65M 71.0KB/s eta 2m 20s smoldyn-2.73-mac.tgz 53%[================================> ] 10.66M 69.7KB/s eta 2m 20s smoldyn-2.73-mac.tgz 53%[================================> ] 10.68M 71.8KB/s eta 2m 19s smoldyn-2.73-mac.tgz 53%[================================> ] 10.71M 69.3KB/s eta 2m 19s smoldyn-2.73-mac.tgz 53%[================================> ] 10.73M 71.3KB/s eta 2m 19s smoldyn-2.73-mac.tgz 53%[================================> ] 10.73M 67.1KB/s eta 2m 19s smoldyn-2.73-mac.tgz 53%[================================> ] 10.75M 69.4KB/s eta 2m 18s smoldyn-2.73-mac.tgz 53%[=================================> ] 10.78M 69.0KB/s eta 2m 18s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.79M 68.1KB/s eta 2m 18s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.81M 69.5KB/s eta 2m 18s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.83M 72.6KB/s eta 2m 17s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.84M 68.0KB/s eta 2m 17s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.86M 69.5KB/s eta 2m 17s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.88M 66.8KB/s eta 2m 17s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.90M 70.2KB/s eta 2m 16s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.91M 68.4KB/s eta 2m 16s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.93M 69.4KB/s eta 2m 16s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.95M 69.4KB/s eta 2m 16s smoldyn-2.73-mac.tgz 54%[=================================> ] 10.97M 69.5KB/s eta 2m 15s smoldyn-2.73-mac.tgz 55%[=================================> ] 10.99M 68.6KB/s eta 2m 15s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.00M 69.6KB/s eta 2m 15s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.02M 69.2KB/s eta 2m 15s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.05M 70.9KB/s eta 2m 13s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.06M 67.7KB/s eta 2m 13s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.08M 69.4KB/s eta 2m 13s smoldyn-2.73-mac.tgz 55%[=================================> ] 11.09M 68.5KB/s eta 2m 13s smoldyn-2.73-mac.tgz 55%[==================================> ] 11.12M 68.0KB/s eta 2m 12s smoldyn-2.73-mac.tgz 55%[==================================> ] 11.14M 68.8KB/s eta 2m 12s smoldyn-2.73-mac.tgz 55%[==================================> ] 11.16M 68.3KB/s eta 2m 12s smoldyn-2.73-mac.tgz 55%[==================================> ] 11.18M 68.8KB/s eta 2m 12s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.20M 69.1KB/s eta 2m 11s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.22M 69.0KB/s eta 2m 11s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.23M 69.0KB/s eta 2m 11s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.26M 68.2KB/s eta 2m 11s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.28M 69.1KB/s eta 2m 10s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.30M 67.9KB/s eta 2m 10s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.32M 66.9KB/s eta 2m 10s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.34M 68.2KB/s eta 2m 10s smoldyn-2.73-mac.tgz 56%[==================================> ] 11.36M 67.5KB/s eta 2m 9s smoldyn-2.73-mac.tgz 57%[==================================> ] 11.39M 68.2KB/s eta 2m 9s smoldyn-2.73-mac.tgz 57%[==================================> ] 11.41M 68.7KB/s eta 2m 9s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.43M 67.6KB/s eta 2m 8s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.45M 70.2KB/s eta 2m 8s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.47M 70.1KB/s eta 2m 8s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.49M 69.8KB/s eta 2m 8s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.50M 69.5KB/s eta 2m 7s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.52M 69.1KB/s eta 2m 7s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.53M 67.5KB/s eta 2m 7s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.55M 66.9KB/s eta 2m 7s smoldyn-2.73-mac.tgz 57%[===================================> ] 11.58M 68.6KB/s eta 2m 5s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.59M 66.9KB/s eta 2m 5s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.62M 71.8KB/s eta 2m 5s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.63M 71.3KB/s eta 2m 5s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.65M 70.3KB/s eta 2m 4s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.66M 69.3KB/s eta 2m 4s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.68M 68.9KB/s eta 2m 4s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.70M 70.5KB/s eta 2m 4s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.71M 69.9KB/s eta 2m 4s smoldyn-2.73-mac.tgz 58%[===================================> ] 11.73M 68.3KB/s eta 2m 3s smoldyn-2.73-mac.tgz 58%[====================================> ] 11.76M 70.3KB/s eta 2m 3s smoldyn-2.73-mac.tgz 58%[====================================> ] 11.78M 68.8KB/s eta 2m 3s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.79M 67.5KB/s eta 2m 3s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.80M 69.7KB/s eta 2m 2s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.83M 69.1KB/s eta 2m 2s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.85M 72.6KB/s eta 2m 2s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.86M 69.0KB/s eta 2m 2s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.88M 69.4KB/s eta 2m 1s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.91M 71.1KB/s eta 2m 1s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.93M 64.3KB/s eta 2m 1s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.97M 68.6KB/s eta 2m 0s smoldyn-2.73-mac.tgz 59%[====================================> ] 11.98M 65.3KB/s eta 2m 0s smoldyn-2.73-mac.tgz 60%[====================================> ] 12.02M 67.8KB/s eta 2m 0s smoldyn-2.73-mac.tgz 60%[====================================> ] 12.04M 67.2KB/s eta 1m 59s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.06M 67.9KB/s eta 1m 59s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.08M 69.7KB/s eta 1m 59s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.09M 67.4KB/s eta 1m 59s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.11M 67.9KB/s eta 1m 58s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.13M 68.0KB/s eta 1m 58s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.16M 68.6KB/s eta 1m 58s smoldyn-2.73-mac.tgz 60%[=====================================> ] 12.17M 68.3KB/s eta 1m 58s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.20M 69.0KB/s eta 1m 56s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.21M 70.5KB/s eta 1m 56s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.23M 70.1KB/s eta 1m 56s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.25M 69.9KB/s eta 1m 56s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.26M 67.4KB/s eta 1m 56s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.28M 69.5KB/s eta 1m 55s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.29M 71.8KB/s eta 1m 55s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.30M 66.8KB/s eta 1m 55s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.33M 66.5KB/s eta 1m 55s smoldyn-2.73-mac.tgz 61%[=====================================> ] 12.35M 71.5KB/s eta 1m 54s smoldyn-2.73-mac.tgz 61%[======================================> ] 12.38M 70.8KB/s eta 1m 54s smoldyn-2.73-mac.tgz 61%[======================================> ] 12.38M 70.1KB/s eta 1m 54s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.41M 70.8KB/s eta 1m 54s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.41M 67.7KB/s eta 1m 54s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.43M 69.3KB/s eta 1m 53s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.45M 70.4KB/s eta 1m 53s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.47M 69.8KB/s eta 1m 53s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.49M 71.1KB/s eta 1m 53s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.50M 68.3KB/s eta 1m 52s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.52M 69.1KB/s eta 1m 52s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.53M 68.9KB/s eta 1m 52s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.55M 67.9KB/s eta 1m 52s smoldyn-2.73-mac.tgz 62%[======================================> ] 12.58M 69.4KB/s eta 1m 50s smoldyn-2.73-mac.tgz 63%[======================================> ] 12.58M 68.3KB/s eta 1m 50s smoldyn-2.73-mac.tgz 63%[======================================> ] 12.60M 68.0KB/s eta 1m 50s smoldyn-2.73-mac.tgz 63%[======================================> ] 12.63M 70.4KB/s eta 1m 50s smoldyn-2.73-mac.tgz 63%[======================================> ] 12.65M 72.2KB/s eta 1m 49s smoldyn-2.73-mac.tgz 63%[======================================> ] 12.66M 69.1KB/s eta 1m 49s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.68M 68.7KB/s eta 1m 49s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.70M 65.2KB/s eta 1m 49s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.72M 69.8KB/s eta 1m 48s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.74M 71.0KB/s eta 1m 48s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.76M 69.5KB/s eta 1m 48s smoldyn-2.73-mac.tgz 63%[=======================================> ] 12.78M 71.1KB/s eta 1m 48s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.80M 68.0KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.82M 71.0KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.84M 70.4KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.85M 59.2KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.87M 60.1KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.88M 58.9KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.93M 66.4KB/s eta 1m 47s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.97M 66.6KB/s eta 1m 45s smoldyn-2.73-mac.tgz 64%[=======================================> ] 12.98M 64.9KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[=======================================> ] 12.99M 60.5KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[=======================================> ] 12.99M 56.1KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.02M 57.5KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.04M 58.1KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.06M 59.4KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.09M 59.8KB/s eta 1m 45s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.12M 61.7KB/s eta 1m 43s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.16M 65.6KB/s eta 1m 43s smoldyn-2.73-mac.tgz 65%[========================================> ] 13.18M 64.4KB/s eta 1m 43s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.20M 66.1KB/s eta 1m 43s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.22M 78.1KB/s eta 1m 41s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.24M 78.1KB/s eta 1m 41s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.26M 72.8KB/s eta 1m 41s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.28M 70.2KB/s eta 1m 41s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.29M 70.1KB/s eta 1m 40s smoldyn-2.73-mac.tgz 66%[========================================> ] 13.30M 74.2KB/s eta 1m 40s smoldyn-2.73-mac.tgz 66%[=========================================> ] 13.34M 83.8KB/s eta 1m 40s smoldyn-2.73-mac.tgz 66%[=========================================> ] 13.36M 80.7KB/s eta 99s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.38M 82.9KB/s eta 99s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.39M 78.3KB/s eta 99s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.42M 78.2KB/s eta 99s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.44M 76.0KB/s eta 98s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.45M 66.8KB/s eta 98s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.47M 70.0KB/s eta 98s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.48M 65.9KB/s eta 97s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.51M 63.4KB/s eta 97s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.53M 64.4KB/s eta 97s smoldyn-2.73-mac.tgz 67%[=========================================> ] 13.56M 68.5KB/s eta 97s smoldyn-2.73-mac.tgz 68%[=========================================> ] 13.58M 67.0KB/s eta 96s smoldyn-2.73-mac.tgz 68%[=========================================> ] 13.60M 67.6KB/s eta 96s smoldyn-2.73-mac.tgz 68%[=========================================> ] 13.62M 71.3KB/s eta 96s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.64M 70.1KB/s eta 96s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.65M 69.1KB/s eta 96s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.66M 68.9KB/s eta 94s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.69M 69.5KB/s eta 94s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.71M 68.7KB/s eta 94s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.72M 69.3KB/s eta 94s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.74M 67.2KB/s eta 93s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.75M 66.5KB/s eta 93s smoldyn-2.73-mac.tgz 68%[==========================================> ] 13.77M 65.9KB/s eta 93s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.80M 75.1KB/s eta 93s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.81M 73.8KB/s eta 93s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.82M 70.7KB/s eta 92s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.85M 73.3KB/s eta 92s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.87M 71.6KB/s eta 92s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.90M 69.2KB/s eta 92s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.91M 69.6KB/s eta 91s smoldyn-2.73-mac.tgz 69%[==========================================> ] 13.93M 67.3KB/s eta 91s smoldyn-2.73-mac.tgz 69%[===========================================> ] 13.95M 68.6KB/s eta 91s smoldyn-2.73-mac.tgz 69%[===========================================> ] 13.98M 71.2KB/s eta 91s smoldyn-2.73-mac.tgz 70%[===========================================> ] 13.99M 69.2KB/s eta 89s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.01M 68.3KB/s eta 89s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.02M 68.6KB/s eta 89s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.05M 69.9KB/s eta 89s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.06M 68.1KB/s eta 88s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.08M 70.3KB/s eta 88s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.10M 73.6KB/s eta 88s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.11M 71.0KB/s eta 88s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.12M 66.0KB/s eta 87s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.16M 68.1KB/s eta 87s smoldyn-2.73-mac.tgz 70%[===========================================> ] 14.17M 72.2KB/s eta 87s smoldyn-2.73-mac.tgz 71%[===========================================> ] 14.20M 72.7KB/s eta 87s smoldyn-2.73-mac.tgz 71%[===========================================> ] 14.20M 69.0KB/s eta 87s smoldyn-2.73-mac.tgz 71%[===========================================> ] 14.22M 70.6KB/s eta 86s smoldyn-2.73-mac.tgz 71%[===========================================> ] 14.24M 69.5KB/s eta 86s smoldyn-2.73-mac.tgz 71%[===========================================> ] 14.27M 69.7KB/s eta 86s smoldyn-2.73-mac.tgz 71%[============================================> ] 14.28M 69.4KB/s eta 86s smoldyn-2.73-mac.tgz 71%[============================================> ] 14.30M 68.2KB/s eta 85s smoldyn-2.73-mac.tgz 71%[============================================> ] 14.31M 61.8KB/s eta 85s smoldyn-2.73-mac.tgz 71%[============================================> ] 14.35M 64.7KB/s eta 84s smoldyn-2.73-mac.tgz 71%[============================================> ] 14.38M 67.0KB/s eta 84s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.40M 70.0KB/s eta 84s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.42M 67.5KB/s eta 84s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.43M 67.2KB/s eta 83s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.45M 66.9KB/s eta 83s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.47M 67.9KB/s eta 83s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.48M 68.4KB/s eta 83s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.51M 67.9KB/s eta 82s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.54M 68.0KB/s eta 82s smoldyn-2.73-mac.tgz 72%[============================================> ] 14.55M 66.5KB/s eta 82s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.59M 67.1KB/s eta 80s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.61M 68.3KB/s eta 80s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.64M 69.2KB/s eta 80s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.64M 68.2KB/s eta 80s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.66M 69.9KB/s eta 80s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.67M 75.7KB/s eta 79s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.70M 73.4KB/s eta 79s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.73M 70.0KB/s eta 79s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.75M 70.1KB/s eta 78s smoldyn-2.73-mac.tgz 73%[=============================================> ] 14.77M 71.2KB/s eta 78s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.79M 70.7KB/s eta 78s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.81M 70.6KB/s eta 78s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.83M 72.9KB/s eta 77s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.85M 70.5KB/s eta 77s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.87M 70.1KB/s eta 77s smoldyn-2.73-mac.tgz 74%[=============================================> ] 14.88M 71.6KB/s eta 77s smoldyn-2.73-mac.tgz 74%[==============================================> ] 14.91M 70.7KB/s eta 76s smoldyn-2.73-mac.tgz 74%[==============================================> ] 14.92M 68.3KB/s eta 76s smoldyn-2.73-mac.tgz 74%[==============================================> ] 14.94M 68.3KB/s eta 76s smoldyn-2.73-mac.tgz 74%[==============================================> ] 14.96M 67.3KB/s eta 76s smoldyn-2.73-mac.tgz 75%[==============================================> ] 14.99M 68.3KB/s eta 74s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.00M 71.0KB/s eta 74s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.01M 67.0KB/s eta 74s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.03M 70.7KB/s eta 74s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.04M 68.6KB/s eta 74s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.06M 69.8KB/s eta 73s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.08M 68.7KB/s eta 73s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.10M 67.8KB/s eta 73s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.12M 66.5KB/s eta 73s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.14M 70.4KB/s eta 72s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.16M 68.4KB/s eta 72s smoldyn-2.73-mac.tgz 75%[==============================================> ] 15.17M 68.4KB/s eta 72s smoldyn-2.73-mac.tgz 76%[==============================================> ] 15.19M 67.5KB/s eta 72s smoldyn-2.73-mac.tgz 76%[==============================================> ] 15.21M 70.1KB/s eta 71s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.23M 70.5KB/s eta 71s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.25M 70.9KB/s eta 71s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.26M 67.7KB/s eta 71s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.29M 71.5KB/s eta 70s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.30M 69.0KB/s eta 70s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.32M 65.8KB/s eta 70s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.35M 67.9KB/s eta 69s smoldyn-2.73-mac.tgz 76%[===============================================> ] 15.38M 69.1KB/s eta 69s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.39M 71.0KB/s eta 69s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.41M 69.1KB/s eta 69s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.42M 69.9KB/s eta 68s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.45M 71.4KB/s eta 68s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.45M 70.4KB/s eta 68s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.47M 69.5KB/s eta 68s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.49M 70.5KB/s eta 68s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.50M 68.8KB/s eta 67s smoldyn-2.73-mac.tgz 77%[===============================================> ] 15.52M 69.8KB/s eta 67s smoldyn-2.73-mac.tgz 77%[================================================> ] 15.54M 65.7KB/s eta 67s smoldyn-2.73-mac.tgz 77%[================================================> ] 15.57M 67.2KB/s eta 66s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.59M 70.8KB/s eta 66s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.61M 68.6KB/s eta 66s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.64M 67.7KB/s eta 65s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.66M 73.5KB/s eta 65s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.67M 70.4KB/s eta 65s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.68M 66.6KB/s eta 65s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.70M 68.4KB/s eta 65s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.73M 69.8KB/s eta 63s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.73M 68.8KB/s eta 63s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.76M 69.6KB/s eta 63s smoldyn-2.73-mac.tgz 78%[================================================> ] 15.77M 67.9KB/s eta 63s smoldyn-2.73-mac.tgz 79%[================================================> ] 15.79M 69.6KB/s eta 63s smoldyn-2.73-mac.tgz 79%[================================================> ] 15.80M 66.8KB/s eta 62s smoldyn-2.73-mac.tgz 79%[================================================> ] 15.83M 67.0KB/s eta 62s smoldyn-2.73-mac.tgz 79%[================================================> ] 15.85M 69.4KB/s eta 62s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.87M 70.4KB/s eta 62s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.89M 70.3KB/s eta 61s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.91M 69.2KB/s eta 61s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.93M 70.5KB/s eta 61s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.94M 69.8KB/s eta 61s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.96M 72.1KB/s eta 61s smoldyn-2.73-mac.tgz 79%[=================================================> ] 15.98M 67.8KB/s eta 60s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.00M 71.2KB/s eta 60s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.02M 69.3KB/s eta 60s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.04M 69.5KB/s eta 60s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.05M 69.3KB/s eta 59s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.07M 68.4KB/s eta 59s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.09M 70.0KB/s eta 59s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.10M 67.7KB/s eta 59s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.12M 71.1KB/s eta 58s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.14M 72.2KB/s eta 58s smoldyn-2.73-mac.tgz 80%[=================================================> ] 16.15M 70.3KB/s eta 58s smoldyn-2.73-mac.tgz 80%[==================================================> ] 16.18M 69.0KB/s eta 58s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.19M 68.2KB/s eta 58s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.21M 68.3KB/s eta 56s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.22M 68.0KB/s eta 56s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.24M 66.9KB/s eta 56s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.27M 70.1KB/s eta 56s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.28M 69.1KB/s eta 55s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.30M 68.7KB/s eta 55s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.31M 71.5KB/s eta 55s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.33M 69.4KB/s eta 55s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.35M 66.1KB/s eta 54s smoldyn-2.73-mac.tgz 81%[==================================================> ] 16.38M 69.1KB/s eta 54s smoldyn-2.73-mac.tgz 82%[==================================================> ] 16.40M 70.6KB/s eta 54s smoldyn-2.73-mac.tgz 82%[==================================================> ] 16.41M 68.9KB/s eta 54s smoldyn-2.73-mac.tgz 82%[==================================================> ] 16.44M 69.0KB/s eta 53s smoldyn-2.73-mac.tgz 82%[==================================================> ] 16.45M 67.1KB/s eta 53s smoldyn-2.73-mac.tgz 82%[==================================================> ] 16.48M 69.0KB/s eta 53s smoldyn-2.73-mac.tgz 82%[===================================================> ] 16.50M 69.4KB/s eta 53s smoldyn-2.73-mac.tgz 82%[===================================================> ] 16.52M 67.8KB/s eta 52s smoldyn-2.73-mac.tgz 82%[===================================================> ] 16.54M 70.7KB/s eta 52s smoldyn-2.73-mac.tgz 82%[===================================================> ] 16.56M 69.9KB/s eta 52s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.58M 68.7KB/s eta 52s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.59M 67.2KB/s eta 51s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.61M 68.5KB/s eta 51s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.63M 68.2KB/s eta 51s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.66M 67.7KB/s eta 51s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.68M 73.3KB/s eta 49s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.69M 69.1KB/s eta 49s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.71M 69.9KB/s eta 49s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.73M 67.2KB/s eta 48s smoldyn-2.73-mac.tgz 83%[===================================================> ] 16.76M 67.8KB/s eta 48s smoldyn-2.73-mac.tgz 84%[===================================================> ] 16.78M 70.1KB/s eta 48s smoldyn-2.73-mac.tgz 84%[===================================================> ] 16.79M 68.3KB/s eta 48s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.81M 68.2KB/s eta 47s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.84M 70.2KB/s eta 47s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.84M 67.3KB/s eta 47s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.86M 69.5KB/s eta 47s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.87M 68.6KB/s eta 47s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.90M 68.7KB/s eta 46s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.92M 67.4KB/s eta 46s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.95M 68.5KB/s eta 46s smoldyn-2.73-mac.tgz 84%[====================================================> ] 16.97M 68.9KB/s eta 45s smoldyn-2.73-mac.tgz 85%[====================================================> ] 16.99M 68.8KB/s eta 45s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.01M 71.4KB/s eta 45s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.02M 67.7KB/s eta 45s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.05M 71.3KB/s eta 44s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.07M 68.9KB/s eta 44s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.09M 70.0KB/s eta 44s smoldyn-2.73-mac.tgz 85%[====================================================> ] 17.11M 70.4KB/s eta 44s smoldyn-2.73-mac.tgz 85%[=====================================================> ] 17.13M 69.4KB/s eta 42s smoldyn-2.73-mac.tgz 85%[=====================================================> ] 17.15M 65.2KB/s eta 42s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.18M 71.2KB/s eta 42s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.20M 66.4KB/s eta 42s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.22M 70.1KB/s eta 41s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.23M 67.5KB/s eta 41s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.25M 70.9KB/s eta 41s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.27M 65.4KB/s eta 41s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.29M 68.8KB/s eta 40s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.31M 68.8KB/s eta 40s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.34M 72.1KB/s eta 40s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.35M 70.9KB/s eta 40s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.37M 70.7KB/s eta 39s smoldyn-2.73-mac.tgz 86%[=====================================================> ] 17.38M 67.7KB/s eta 39s smoldyn-2.73-mac.tgz 87%[=====================================================> ] 17.40M 68.4KB/s eta 39s smoldyn-2.73-mac.tgz 87%[=====================================================> ] 17.41M 67.4KB/s eta 39s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.44M 70.8KB/s eta 38s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.46M 70.3KB/s eta 38s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.48M 72.7KB/s eta 38s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.50M 68.3KB/s eta 38s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.51M 67.1KB/s eta 37s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.53M 66.9KB/s eta 37s smoldyn-2.73-mac.tgz 87%[======================================================> ] 17.55M 70.7KB/s eta 37s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.58M 68.2KB/s eta 37s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.59M 64.7KB/s eta 36s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.62M 65.3KB/s eta 36s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.63M 64.4KB/s eta 36s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.66M 64.2KB/s eta 35s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.69M 68.9KB/s eta 35s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.70M 69.6KB/s eta 35s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.71M 64.1KB/s eta 35s smoldyn-2.73-mac.tgz 88%[======================================================> ] 17.74M 68.0KB/s eta 33s smoldyn-2.73-mac.tgz 88%[=======================================================> ] 17.77M 68.9KB/s eta 33s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.79M 69.3KB/s eta 33s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.79M 66.9KB/s eta 33s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.83M 68.9KB/s eta 32s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.84M 72.2KB/s eta 32s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.86M 69.2KB/s eta 32s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.88M 70.0KB/s eta 32s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.91M 69.4KB/s eta 31s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.93M 71.0KB/s eta 31s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.95M 71.2KB/s eta 31s smoldyn-2.73-mac.tgz 89%[=======================================================> ] 17.96M 73.4KB/s eta 31s smoldyn-2.73-mac.tgz 90%[=======================================================> ] 17.99M 71.7KB/s eta 30s smoldyn-2.73-mac.tgz 90%[=======================================================> ] 18.01M 68.4KB/s eta 30s smoldyn-2.73-mac.tgz 90%[=======================================================> ] 18.02M 73.8KB/s eta 30s smoldyn-2.73-mac.tgz 90%[=======================================================> ] 18.05M 72.4KB/s eta 30s smoldyn-2.73-mac.tgz 90%[=======================================================> ] 18.06M 66.5KB/s eta 29s smoldyn-2.73-mac.tgz 90%[========================================================> ] 18.08M 70.8KB/s eta 29s smoldyn-2.73-mac.tgz 90%[========================================================> ] 18.10M 68.5KB/s eta 29s smoldyn-2.73-mac.tgz 90%[========================================================> ] 18.12M 65.6KB/s eta 29s smoldyn-2.73-mac.tgz 90%[========================================================> ] 18.14M 69.2KB/s eta 29s smoldyn-2.73-mac.tgz 90%[========================================================> ] 18.16M 60.6KB/s eta 27s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.18M 60.4KB/s eta 27s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.21M 63.3KB/s eta 27s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.22M 57.0KB/s eta 26s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.23M 58.0KB/s eta 26s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.24M 56.0KB/s eta 26s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.27M 53.9KB/s eta 26s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.28M 54.3KB/s eta 25s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.30M 53.5KB/s eta 25s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.30M 51.2KB/s eta 25s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M 52.2KB/s eta 25s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M 44.9KB/s eta 25s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 36s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 36s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 37s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 38s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 39s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 47s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 48s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 49s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 50s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 51s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 52s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 53s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 54s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 55s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 56s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 57s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 58s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 59s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 60s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 61s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 62s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 63s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 64s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 65s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 66s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 67s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 68s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 69s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 70s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 71s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 72s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 73s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 74s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 75s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 76s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 77s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 78s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 79s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 80s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 81s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 82s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 83s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 84s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 85s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 86s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 87s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 88s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 89s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 90s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 91s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 92s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 93s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 94s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 95s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 96s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 97s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 98s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 99s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 40s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 41s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 42s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 43s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 44s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 45s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s eta 1m 46s smoldyn-2.73-mac.tgz 91%[========================================================> ] 18.32M --.-KB/s in 19m 35s + +2024-05-05 11:16:27 (16.0 KB/s) - Read error at byte 19211816/20944833 (Operation timed out). Retrying. + +--2024-05-05 11:16:28-- (try: 2) https://www.smoldyn.org/smoldyn-2.73-mac.tgz +Connecting to www.smoldyn.org (www.smoldyn.org)|2607:7700:0:31::d05e:7520|:443... connected. +HTTP request sent, awaiting response... 206 Partial Content +Length: 20944833 (20M), 1733017 (1.7M) remaining +Saving to: ‘smoldyn-2.73-mac.tgz’ + + [ skipping 18750K ] + 18750K ,,,,,,,,,, ,......... .......... .......... .......... 91% 583K 4s + 18800K .......... .......... .......... .......... .......... 92% 374K 4s + 18850K .......... .......... .......... .......... .......... 92% 48.2K 14s + 18900K .......... .......... .......... .......... .......... 92% 50.3K 18s + 18950K .......... .......... .......... .......... .......... 92% 150K 16s + 19000K .......... .......... .......... .......... .......... 93% 115K 15s + 19050K .......... .......... .......... .......... .......... 93% 57.7K 16s + 19100K .......... .......... .......... .......... .......... 93% 64.0K 16s + 19150K .......... .......... .......... .......... .......... 93% 69.8K 15s + 19200K .......... .......... .......... .......... .......... 94% 59.1K 15s + 19250K .......... .......... .......... .......... .......... 94% 72.0K 15s + 19300K .......... .......... .......... .......... .......... 94% 71.0K 14s + 19350K .......... .......... .......... .......... .......... 94% 57.8K 14s + 19400K .......... .......... .......... .......... .......... 95% 58.6K 14s + 19450K .......... .......... .......... .......... .......... 95% 78.0K 13s + 19500K .......... .......... .......... .......... .......... 95% 52.6K 13s + 19550K .......... .......... .......... .......... .......... 95% 92.3K 12s + 19600K .......... .......... .......... .......... .......... 96% 57.5K 11s + 19650K .......... .......... .......... .......... .......... 96% 64.0K 11s + 19700K .......... .......... .......... .......... .......... 96% 75.5K 10s + 19750K .......... .......... .......... .......... .......... 96% 71.1K 9s + 19800K .......... .......... .......... .......... .......... 97% 71.0K 8s + 19850K .......... .......... .......... .......... .......... 97% 60.9K 8s + 19900K .......... .......... .......... .......... .......... 97% 51.7K 7s + 19950K .......... .......... .......... .......... .......... 97% 97.3K 6s + 20000K .......... .......... .......... .......... .......... 98% 56.7K 6s + 20050K .......... .......... .......... .......... .......... 98% 70.5K 5s + 20100K .......... .......... .......... .......... .......... 98% 55.7K 4s + 20150K .......... .......... .......... .......... .......... 98% 55.2K 4s + 20200K .......... .......... .......... .......... .......... 99% 94.8K 3s + 20250K .......... .......... .......... .......... .......... 99% 62.9K 2s + 20300K .......... .......... .......... .......... .......... 99% 71.9K 1s + 20350K .......... .......... .......... .......... .......... 99% 61.9K 1s + 20400K .......... .......... .......... .......... .......... 99% 64.3K 0s + 20450K ... 100% 78.8K=25s + +2024-05-05 11:16:53 (69.1 KB/s) - ‘smoldyn-2.73-mac.tgz’ saved [20944833/20944833] +