{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Some notes about recent dolo development" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Toolchain\n", "\n", "- build tool: `poetry`\n", " - simplifies dependency management\n", " - `setup.py` disappeared\n", " - `pyproject.toml`\n", " - install `poetry` then `pip install .`\n", "- tag-based releases:\n", " - automatic release on pypi when tag is pushed to master\n", " - semi-automatic release from pypi to conda\n", "- documentation switch to github/actions + mkdocs:\n", " - old: `www.econforge.org/dolo`\n", " - new: `www.econforge.org/dolo.py`\n", " - built and published on tag-release\n", "- advertisement: try `mamba` instead of `conda` !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Development choices\n", "\n", "\n", "- semi-object oriented programming:\n", " - type hierarchy\n", " - mostly stateless design\n", " - most objects are simple datastructures with simple internal state\n", "- multiple dispatch\n", "- use optional typing:\n", " - mostly for documentation\n", " - almost completely useless at runtime\n", "- performance\n", " - numba-ification out of reach (no @jitclass) but...\n", " - some objects have a typed numba equivalent" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numbaification" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "((0.0, 1.0, 10), (0.0, 1.0, 10))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# numba-ification\n", "from dolo.numeric.grids import UniformCartesianGrid, NonUniformCartesianGrid\n", "grid = UniformCartesianGrid(min=[0.0, 0.0], max=[1.0, 1.0], n=[10, 10])\n", "display(grid)\n", "display(grid.__numba_repr__()) # fully type inferrable by numba / interpolation.py" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "UniTuple(Tuple(float64, float64, int64) x 2)" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numba\n", "numba.typeof(grid.__numba_repr__())" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "UniTuple(array(float64, 1d, C) x 2)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "grid = NonUniformCartesianGrid([np.linspace(0,1,10), np.linspace(0,1,10)])\n", "numba.typeof( grid.__numba_repr__() )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stateless / Statefree" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# problem 1\n", "\n", "class Model:\n", " \n", " def __init__(self, a=1, b=2):\n", " self.a = a\n", " self.b = b\n", " \n", " def solve(self):\n", " return self.a + self.b\n", " \n", " \n", "d = dict(a=1, b=2.5)\n", "model = Model(**d)\n", "model.solve() # -> 3.4\n", "\n", "d['a'] = 1.5 # bad student\n", "model.solve() # -> I paid for this school, why don't I get 4.0 ?\n", "\n", "# solutions:\n", "\n", "# - terminate student\n", "\n", "# - promote no reference style of coding:\n", "\n", "m = Model()\n", "m.a = 1\n", "m.b = 2\n", "\n", "# - educate by providing feedback when parameter is set (see below)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Model:\n", " \n", " def __init__(self, a=1)\n", " self.a\n", " \n", " def update():\n", " self.b = self.a+1\n", " \n", " def solve():\n", " returb self.a+self.b\n", "\n", "model = Model()\n", "model.update() # bad design\n", "model.solve()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0.0, 1.0, 10), (0.0, 1.0, 10))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# stateless / stateful\n", "\n", "class Model:\n", " \n", " a = 1\n", " \n", " def update():\n", " self.b = self.a+1\n", " \n", " def solve():\n", " returb self.a+self.b\n", "\n", "model = Model()\n", "model.update()\n", "model.solve()\n", "\n", "model.a = 2\n", "# model.update() # bad design\n", "model.solve()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "two tools to improve the situation:\n", "- user-experience:\n", " - properties\n", "- developper experience:\n", " - decorators / annotations\n", " - traits" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Model:\n", " \n", " @property\n", " def a():\n", " return self._a_\n", " \n", " @a.setter\n", " def a(self, value):\n", " print(f\"Parameter 'a' set to {value}\") # for the bad student\n", " self._a_ = value\n", " self.update()\n", " \n", " def update():\n", " self.b = self.a+1\n", " \n", " def solve():\n", " returb self.a + self.b\n", "\n", "model = Model()\n", "model.a = 2 # triggers update()\n", "model.solve() # -> 3\n", "\n", "## ok but requires lots of recalculations with many parameters" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# better solution with global flag\n", "\n", "class Model:\n", " \n", " __parameters_reset__ = True\n", " \n", " @property\n", " def a():\n", " return self._a_\n", " \n", " @a.setter\n", " def a(self, value):\n", " print(f\"Parameter 'a' set to {value}\") # for the bad student\n", " self._a_ = value\n", " self.update()\n", " \n", " @property\n", " def b():\n", " return self._b_\n", " \n", " @a.setter\n", " def b(self, value):\n", " print(f\"Parameter 'b' set to {value}\") # for the bad student\n", " self._b_ = value\n", " self.update()\n", " \n", " def update():\n", " if __parameters_reset__:\n", " self.c = self.a+1\n", " __parameters_reset__ = False\n", " \n", " def solve():\n", " returb self.a + self.b\n", "\n", "model = Model()\n", "model.a = 2 # triggers update()\n", "model.solve() # -> 3" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'magiclass' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\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 3\u001b[0m \u001b[0;31m# better solution with global flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;34m@\u001b[0m\u001b[0mmagiclass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mModel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'magiclass' is not defined" ] } ], "source": [ "# same code with traits: (many possible syntaxes)\n", "\n", "# better solution with global flag\n", "\n", "@magiclass\n", "class Model:\n", " \n", " a: Parameter[Float] \n", " b: Parameter[Float]\n", "\n", " @depends(['a', 'b'])\n", " def update():\n", " if __parameters_reset__:\n", " self.c = self.a+1\n", " __parameters_reset__ = False\n", " \n", " @depends(['update'])\n", " def solve():\n", " return self.a + self.b\n", "\n", " \n", "model = Model()\n", "model.a = 2.0 # resets `self.__reset__['update']` and `self.__reset__['solve']` to True\n", "model.b = 2.0 # same\n", "model.solve() # will need to recompute update(), which in turn, will take new values of a and b" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# other approach\n", "\n", "class MagicalDict:\n", " \n", " dependencies: Dict[]\n", " def __init__(self, model):\n", " self.model = model\n", " \n", " def __setitem__(self, k, v):\n", " pass #\n", "\n", " \n", " \n", "\n", "class Model\n", "\n", " calibration: MagicalDict\n", " \n", "model = Model()\n", "model.calibration['a'] = 1 # same behaviour" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stateless approach in dolo" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
xarray.DataArray
  • T: 40
  • N: 10
  • V: 9
  • 0.0 0.0 9.355 0.3296 0.2329 ... 0.2355 0.9913 0.7559 0.03638 1.982
    array([[[ 0.00000000e+00,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00],\n",
           "        [ 2.16900189e-02,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00],\n",
           "        ...,\n",
           "        [ 2.16900189e-02,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35497829e+00, ...,\n",
           "          7.61398778e-01,  3.50741693e-02,  2.02103089e+00]],\n",
           "\n",
           "       [[-2.16900189e-02,  0.00000000e+00,  9.35400230e+00, ...,\n",
           "          7.61384391e-01,  3.50776803e-02,  2.02093125e+00],\n",
           "        [ 2.16900189e-02,  2.16900189e-02,  9.35400230e+00, ...,\n",
           "          7.62822957e-01,  3.60682624e-02,  2.05898938e+00],\n",
           "        [ 2.16900189e-02,  0.00000000e+00,  9.35400230e+00, ...,\n",
           "          7.61384391e-01,  3.50776803e-02,  2.02093125e+00],\n",
           "        ...,\n",
           "        [ 0.00000000e+00,  2.16900189e-02,  9.35400230e+00, ...,\n",
           "          7.62822957e-01,  3.60682624e-02,  2.05898938e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35400230e+00, ...,\n",
           "          7.61384391e-01,  3.50776803e-02,  2.02093125e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35400230e+00, ...,\n",
           "          7.61384391e-01,  3.50776803e-02,  2.02093125e+00]],\n",
           "\n",
           "       [[ 0.00000000e+00, -2.16900189e-02,  9.35306089e+00, ...,\n",
           "          7.59958581e-01,  3.41148441e-02,  1.98356112e+00],\n",
           "        [-2.16900189e-02,  3.90420340e-02,  9.37970083e+00, ...,\n",
           "          7.64374529e-01,  3.67820030e-02,  2.09271518e+00],\n",
           "        [ 0.00000000e+00,  2.16900189e-02,  9.35306089e+00, ...,\n",
           "          7.62809192e-01,  3.60717286e-02,  2.05889192e+00],\n",
           "        ...,\n",
           "        [ 0.00000000e+00,  1.73520151e-02,  9.37970083e+00, ...,\n",
           "          7.62909791e-01,  3.57742049e-02,  2.05396620e+00],\n",
           "        [ 0.00000000e+00,  0.00000000e+00,  9.35306089e+00, ...,\n",
           "          7.61370512e-01,  3.50810677e-02,  2.02083514e+00],\n",
           "        [-2.16900189e-02,  0.00000000e+00,  9.35306089e+00, ...,\n",
           "          7.61370512e-01,  3.50810677e-02,  2.02083514e+00]],\n",
           "\n",
           "       ...,\n",
           "\n",
           "       [[-2.16900189e-02, -1.07439022e-03,  9.61420916e+00, ...,\n",
           "          7.65100181e-01,  3.41202851e-02,  2.04538252e+00],\n",
           "        [-2.16900189e-02,  1.40518882e-02,  9.34551078e+00, ...,\n",
           "          7.62189721e-01,  3.57475889e-02,  2.04462352e+00],\n",
           "        [-2.16900189e-02, -2.45856318e-02,  9.27466543e+00, ...,\n",
           "          7.58599962e-01,  3.42649707e-02,  1.97074028e+00],\n",
           "        ...,\n",
           "        [-2.16900189e-02, -3.32566969e-03,  9.07518640e+00, ...,\n",
           "          7.56987961e-01,  3.59598257e-02,  1.98647444e+00],\n",
           "        [ 2.16900189e-02, -4.46909134e-03,  9.14991498e+00, ...,\n",
           "          7.58044345e-01,  3.56244995e-02,  1.99225926e+00],\n",
           "        [ 0.00000000e+00, -3.56943011e-02,  9.04737363e+00, ...,\n",
           "          7.54422827e-01,  3.45998302e-02,  1.92907212e+00]],\n",
           "\n",
           "       [[-2.16900189e-02, -2.25495311e-02,  9.60281302e+00, ...,\n",
           "          7.63568665e-01,  3.32232268e-02,  2.00702789e+00],\n",
           "        [ 0.00000000e+00, -1.04485083e-02,  9.36204534e+00, ...,\n",
           "          7.60820733e-01,  3.45806083e-02,  2.00369527e+00],\n",
           "        [ 0.00000000e+00, -4.13585243e-02,  9.24721744e+00, ...,\n",
           "          7.57116396e-01,  3.36272937e-02,  1.93988298e+00],\n",
           "        ...,\n",
           "        [-2.16900189e-02, -2.43505546e-02,  9.08023430e+00, ...,\n",
           "          7.55667124e-01,  3.49847249e-02,  1.95134965e+00],\n",
           "        [ 0.00000000e+00,  1.81147458e-02,  9.15088379e+00, ...,\n",
           "          7.59578184e-01,  3.66655795e-02,  2.03152971e+00],\n",
           "        [ 2.16900189e-02, -2.85554409e-02,  9.01536523e+00, ...,\n",
           "          7.54392233e-01,  3.50390162e-02,  1.93766096e+00]],\n",
           "\n",
           "       [[ 4.57115202e-02, -3.97296437e-02,  9.56595110e+00, ...,\n",
           "          7.61963572e-01,  3.26114858e-02,  1.97420672e+00],\n",
           "        [ 0.00000000e+00, -8.35880664e-03,  9.34821961e+00, ...,\n",
           "          7.60752155e-01,  3.47230841e-02,  2.00588815e+00],\n",
           "        [ 0.00000000e+00, -3.30868194e-02,  9.20122029e+00, ...,\n",
           "          7.56944271e-01,  3.41533438e-02,  1.94902275e+00],\n",
           "        ...,\n",
           "        [ 0.00000000e+00, -4.11704626e-02,  9.06019616e+00, ...,\n",
           "          7.54268583e-01,  3.43090827e-02,  1.92133853e+00],\n",
           "        [ 0.00000000e+00,  1.44917966e-02,  9.17926823e+00, ...,\n",
           "          7.59757658e-01,  3.63878793e-02,  2.02815454e+00],\n",
           "        [ 0.00000000e+00, -1.15433383e-03,  8.99282986e+00, ...,\n",
           "          7.55875214e-01,  3.63784208e-02,  1.98159464e+00]]])
    • T
      (T)
      int64
      0 1 2 3 4 5 6 ... 34 35 36 37 38 39
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
             "       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
             "       36, 37, 38, 39])
    • N
      (N)
      int64
      0 1 2 3 4 5 6 7 8 9
      array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    • V
      (V)
      <U3
      'e_z' 'z' 'k' 'n' ... 'c' 'rk' 'w'
      array(['e_z', 'z', 'k', 'n', 'i', 'y', 'c', 'rk', 'w'], dtype='<U3')
" ], "text/plain": [ "\n", "array([[[ 0.00000000e+00, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00],\n", " [ 2.16900189e-02, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00],\n", " ...,\n", " [ 2.16900189e-02, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35497829e+00, ...,\n", " 7.61398778e-01, 3.50741693e-02, 2.02103089e+00]],\n", "\n", " [[-2.16900189e-02, 0.00000000e+00, 9.35400230e+00, ...,\n", " 7.61384391e-01, 3.50776803e-02, 2.02093125e+00],\n", " [ 2.16900189e-02, 2.16900189e-02, 9.35400230e+00, ...,\n", " 7.62822957e-01, 3.60682624e-02, 2.05898938e+00],\n", " [ 2.16900189e-02, 0.00000000e+00, 9.35400230e+00, ...,\n", " 7.61384391e-01, 3.50776803e-02, 2.02093125e+00],\n", " ...,\n", " [ 0.00000000e+00, 2.16900189e-02, 9.35400230e+00, ...,\n", " 7.62822957e-01, 3.60682624e-02, 2.05898938e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35400230e+00, ...,\n", " 7.61384391e-01, 3.50776803e-02, 2.02093125e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35400230e+00, ...,\n", " 7.61384391e-01, 3.50776803e-02, 2.02093125e+00]],\n", "\n", " [[ 0.00000000e+00, -2.16900189e-02, 9.35306089e+00, ...,\n", " 7.59958581e-01, 3.41148441e-02, 1.98356112e+00],\n", " [-2.16900189e-02, 3.90420340e-02, 9.37970083e+00, ...,\n", " 7.64374529e-01, 3.67820030e-02, 2.09271518e+00],\n", " [ 0.00000000e+00, 2.16900189e-02, 9.35306089e+00, ...,\n", " 7.62809192e-01, 3.60717286e-02, 2.05889192e+00],\n", " ...,\n", " [ 0.00000000e+00, 1.73520151e-02, 9.37970083e+00, ...,\n", " 7.62909791e-01, 3.57742049e-02, 2.05396620e+00],\n", " [ 0.00000000e+00, 0.00000000e+00, 9.35306089e+00, ...,\n", " 7.61370512e-01, 3.50810677e-02, 2.02083514e+00],\n", " [-2.16900189e-02, 0.00000000e+00, 9.35306089e+00, ...,\n", " 7.61370512e-01, 3.50810677e-02, 2.02083514e+00]],\n", "\n", " ...,\n", "\n", " [[-2.16900189e-02, -1.07439022e-03, 9.61420916e+00, ...,\n", " 7.65100181e-01, 3.41202851e-02, 2.04538252e+00],\n", " [-2.16900189e-02, 1.40518882e-02, 9.34551078e+00, ...,\n", " 7.62189721e-01, 3.57475889e-02, 2.04462352e+00],\n", " [-2.16900189e-02, -2.45856318e-02, 9.27466543e+00, ...,\n", " 7.58599962e-01, 3.42649707e-02, 1.97074028e+00],\n", " ...,\n", " [-2.16900189e-02, -3.32566969e-03, 9.07518640e+00, ...,\n", " 7.56987961e-01, 3.59598257e-02, 1.98647444e+00],\n", " [ 2.16900189e-02, -4.46909134e-03, 9.14991498e+00, ...,\n", " 7.58044345e-01, 3.56244995e-02, 1.99225926e+00],\n", " [ 0.00000000e+00, -3.56943011e-02, 9.04737363e+00, ...,\n", " 7.54422827e-01, 3.45998302e-02, 1.92907212e+00]],\n", "\n", " [[-2.16900189e-02, -2.25495311e-02, 9.60281302e+00, ...,\n", " 7.63568665e-01, 3.32232268e-02, 2.00702789e+00],\n", " [ 0.00000000e+00, -1.04485083e-02, 9.36204534e+00, ...,\n", " 7.60820733e-01, 3.45806083e-02, 2.00369527e+00],\n", " [ 0.00000000e+00, -4.13585243e-02, 9.24721744e+00, ...,\n", " 7.57116396e-01, 3.36272937e-02, 1.93988298e+00],\n", " ...,\n", " [-2.16900189e-02, -2.43505546e-02, 9.08023430e+00, ...,\n", " 7.55667124e-01, 3.49847249e-02, 1.95134965e+00],\n", " [ 0.00000000e+00, 1.81147458e-02, 9.15088379e+00, ...,\n", " 7.59578184e-01, 3.66655795e-02, 2.03152971e+00],\n", " [ 2.16900189e-02, -2.85554409e-02, 9.01536523e+00, ...,\n", " 7.54392233e-01, 3.50390162e-02, 1.93766096e+00]],\n", "\n", " [[ 4.57115202e-02, -3.97296437e-02, 9.56595110e+00, ...,\n", " 7.61963572e-01, 3.26114858e-02, 1.97420672e+00],\n", " [ 0.00000000e+00, -8.35880664e-03, 9.34821961e+00, ...,\n", " 7.60752155e-01, 3.47230841e-02, 2.00588815e+00],\n", " [ 0.00000000e+00, -3.30868194e-02, 9.20122029e+00, ...,\n", " 7.56944271e-01, 3.41533438e-02, 1.94902275e+00],\n", " ...,\n", " [ 0.00000000e+00, -4.11704626e-02, 9.06019616e+00, ...,\n", " 7.54268583e-01, 3.43090827e-02, 1.92133853e+00],\n", " [ 0.00000000e+00, 1.44917966e-02, 9.17926823e+00, ...,\n", " 7.59757658e-01, 3.63878793e-02, 2.02815454e+00],\n", " [ 0.00000000e+00, -1.15433383e-03, 8.99282986e+00, ...,\n", " 7.55875214e-01, 3.63784208e-02, 1.98159464e+00]]])\n", "Coordinates:\n", " * T (T) int64 0 1 2 3 4 5 6 7 8 9 10 ... 30 31 32 33 34 35 36 37 38 39\n", " * N (N) int64 0 1 2 3 4 5 6 7 8 9\n", " * V (V) , iterations=126, complementarities=True, dprocess=FiniteDistribution(points=array([[-0.04571152],\n", " [-0.02169002],\n", " [ 0. ],\n", " [ 0.02169002],\n", " [ 0.04571152]]), weights=array([0.01125741, 0.22207592, 0.53333333, 0.22207592, 0.01125741]), origin=Normal(Μ=[0.],Σ=[[0.000256]])), x_converged=True, x_tol=1e-06, err=9.689385253586202e-07, log=None, trace=None)" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol = time_iteration(model, details=True, verbose=False)\n", "sol" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'FiniteDistribution' object has no attribute 'model'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscretize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'FiniteDistribution' object has no attribute 'model'" ] } ], "source": [ "model.discretize()[1]" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FiniteDistribution(points=array([[-0.04571152],\n", " [-0.02169002],\n", " [ 0. ],\n", " [ 0.02169002],\n", " [ 0.04571152]]), weights=array([0.01125741, 0.22207592, 0.53333333, 0.22207592, 0.01125741]), origin=Normal(Μ=[0.],Σ=[[0.000256]]))" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol.dprocess" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Towards more separatation between pure objects and discretized ones" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'z': array([-0.05333333, 0.05333333]),\n", " 'k': array([ 4.67748915, 14.03246744])}" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.domain" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " × " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "FiniteDistribution(points=array([[-0.04571152],\n", " [-0.02169002],\n", " [ 0. ],\n", " [ 0.02169002],\n", " [ 0.04571152]]), weights=array([0.01125741, 0.22207592, 0.53333333, 0.22207592, 0.01125741]), origin=Normal(Μ=[0.],Σ=[[0.000256]]))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grid, dprocess = model.discretize()\n", "display( grid )\n", "display( dprocess )\n", "# model.grid will disappear but there might be a DiscretizedModel object with a pointer to its parent." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Processes and Distributions\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Three separate concepts:\n", " \n", "- distribution ($\\epsilon$):\n", "\n", " - does `dist.draw(N: int)`, `dist.integrate(f)`\n", "\n", "- processes $(\\epsilon_t)_{t}$:\n", "\n", " - does `dist.simulate()`\n", "\n", "- discretized process:\n", "\n", " - does `dist.node(i)`, `dist.inode(i,j)`, `dist.iweight(i,j)`\n", " - used to solve models\n", "\n", "With multiple inheritances, it is possible to belong to several classes: \n", "\n", "- a distribution is a process\n", "- a markov chain is both a discretized process and a process" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What matters most to me:\n", "\n", "- establish stable user-facing conventions in yaml file (***)\n", " - processes names must match distributions\n", " - documented here: http://www.econforge.org/dolo.py/processes/\n", " - solution: align with distiributions.jl/R/rvlib for conventions\n", " - a wrapper is almost certainly needed\n", "- define clean language API allowing for more flexibility (**) (truncations, conditional, etc.)\n", "- simplify development process (*)\n", " - transaprent API\n", " - synchronize Python API, with Dolang API\n", " - less code duplication within projects (language_element decoretor @language)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Distributions\n", "\n", "- all distributions are multi-dimensional\n", " - 1d distribution is a special class\n", " - with `pdf`, `cdf` function\n", " - automatic equiprobable discretization\n", " - they carry variable names" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "from dolo.numeric.distribution import *" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "dist = UNormal(μ=0, σ=0.1)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "from matplotlib import pyplot as plt" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "f = lambda x: x**2\n", "scip = dist.integrate(f)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "discr = [dist.discretize(N=n).integrate(f) for n in range(1,10)]\n", "discr_gh = [dist.discretize(N=n, method=\"gauss-hermite\").integrate(f) for n in range(1,10)]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(discr)\n", "plt.plot(discr_gh)\n", "plt.hlines(scip,*plt.xlim())" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "trunc = Truncation[UNormal](dist=dist, lb=0, ub=np.Inf)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "dtrunc = trunc.discretize()" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(dtrunc.points.ravel(), dtrunc.weights, 'o')" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "p = ProductDistribution([dist, trunc])" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "pp = p.discretize()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(pp.points[:,0], pp.points[:,1],'o')" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "index = Bernouilli(π=0.2)" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "mix = Mixture(index=index, distributions={0: dist, 1: trunc})" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.00789516])" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mix.discretize().integrate(f)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mSignature:\u001b[0m\n", "\u001b[0mUNormal\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msimulate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mi0\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mm0\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mstochastic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mxarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataArray\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m \n", "\u001b[0;31mFile:\u001b[0m ~/Mobilhome/econforge/dolo/dolo/numeric/processes.py\n", "\u001b[0;31mType:\u001b[0m function\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "UNormal.simulate?" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from dolo import *" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "model = yaml_import(\"examples/models/rbc.yaml\")" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.exogenous" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }