diff --git a/doc/htmldoc/examples/index.rst b/doc/htmldoc/examples/index.rst index f59eef2794..fd70e54ac4 100644 --- a/doc/htmldoc/examples/index.rst +++ b/doc/htmldoc/examples/index.rst @@ -54,6 +54,13 @@ PyNEST examples * :doc:`../auto_examples/pong/run_simulations` * :doc:`../auto_examples/pong/generate_gif` + .. grid-item-card:: Astrocytes + :img-top: ../static/img/astrocyte_tripartite.png + + * :doc:`../auto_examples/astrocyte_single` + * :doc:`../auto_examples/astrocyte_tripartite` + + .. grid:: 1 1 2 3 .. grid-item-card:: Random balanced networks (Brunel) @@ -318,6 +325,8 @@ PyNEST examples ../auto_examples/csa_example ../auto_examples/csa_spatial_example ../auto_examples/hpc_benchmark + ../auto_examples/astrocyte_single + ../auto_examples/astrocyte_tripartite .. toctree:: :hidden: diff --git a/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb b/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb new file mode 100644 index 0000000000..f75876799f --- /dev/null +++ b/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "17ef5228", + "metadata": {}, + "source": [ + "# NEST implementation of the `astrocyte_lr_1994` model\n", + "\n", + "The purpose of this notebook is to provide a reference solution for the the _astrocyte_lr_1994_ model in NEST. The model is based on Li, Y. X., & Rinzel, J. (1994), De Young, G. W., & Keizer, J. (1992), and Nadkarni, S., & Jung, P. (2003).\n", + "\n", + "This notebook demonstrates how the dynamics of _astrocyte_lr_1994_ is implemented, and generates a recording of the dynamics (test_astrocyte.dat). This recording serves as a reference for the verification of _astrocyte_lr_1994_ using test_astrocyte.py in the PyNEST tests.\n", + "\n", + "## The problem\n", + "\n", + "The equations governing the evolution of the astrocyte model are\n", + "\n", + "$$\\left\\lbrace\\begin{array}{rcl}\n", + " \\frac{d[\\mathrm{Ca^{2+}}](t)}{dt} &=& J_{\\mathrm{channel}}(t) - J_{\\mathrm{pump}}(t) + J_{\\mathrm{leak}}(t) \\\\\n", + " J_{\\mathrm{channel}}(t) &=& \\mathrm{r_{ER,cyt}} \\cdot \\mathrm{v_{IP_3R}} \\cdot m_{\\infty}(t)^3 \\cdot n_{\\infty}(t)^3\\cdot h_{\\mathrm{\\mathrm{IP_3R}}}(t)^3 \\cdot \\left([\\mathrm{Ca^{2+}}]_{\\mathrm{ER}} - [\\mathrm{Ca^{2+}}](t)\\right) \\\\\n", + " J_{\\mathrm{pump},k}(t) &=& \\frac{\\mathrm{v_{SERCA}} \\cdot [\\mathrm{Ca^{2+}}](t)^2}{K_{\\mathrm{m,SERCA}}^2+[\\mathrm{Ca^{2+}}](t)^2} \\\\\n", + " J_{\\mathrm{leak}}(t) &=& \\mathrm{r_{ER,cyt}} \\cdot \\mathrm{v_L} \\cdot \\left( [\\mathrm{Ca^{2+}}]_{\\mathrm{ER}}(t) - [\\mathrm{Ca^{2+}}](t) \\right) \\\\\n", + " m_{\\infty}(t) &=& \\frac{[\\mathrm{IP_3}](t)}{[\\mathrm{IP_3}](t) + \\mathrm{K_{d,IP_3,1}}} \\\\\n", + " n_{\\infty}(t) &=& \\frac{[\\mathrm{Ca^{2+}}](t)}{[\\mathrm{Ca^{2+}}](t) + \\mathrm{K_{d,act}}} \\\\\n", + " [\\mathrm{Ca^{2+}}]_{\\mathrm{ER}}(t) &=& \\frac{[\\mathrm{Ca^{2+}}]_{\\mathrm{tot}}-[\\mathrm{Ca^{2+}}](t)}{\\mathrm{r_{ER,cyt}}} \\\\\n", + " \\frac{dh_{\\mathrm{IP_3}}(t)}{dt} &=& \\alpha_{h_{\\mathrm{IP_3}}}(t) \\cdot (1-h_{\\mathrm{IP_3}}(t)) - \\beta_{h_{\\mathrm{IP_3}}}(t) \\cdot h_{\\mathrm{IP_3}} (t) \\\\\n", + " \\alpha_{h_{\\mathrm{IP_3}}}(t) &=& \\mathrm{k_{IP_3R}} \\cdot \\mathrm{K_{d,inh}} \\cdot \\frac{[\\mathrm{IP_3}](t) + \\mathrm{K_{d,IP_3,1}}}{[\\mathrm{IP_3}](t)+\\mathrm{K_{d,IP_3,2}}} \\\\\n", + " \\beta_{h_{\\mathrm{IP_3}}}(t) &=& \\mathrm{k_{IP_3R}} \\cdot [\\mathrm{Ca^{2+}}](t) \\\\\n", + " \\frac{d[\\mathrm{IP_3}](t)}{dt} &=& \\frac{[\\mathrm{IP_3}]^{*} - [\\mathrm{IP_3}](t)}{\\tau_\\mathrm{IP_3}} + \\Delta_\\mathrm{IP3} \\cdot J_\\mathrm{syn}(t)\n", + "\\end{array}\\right.$$\n", + "\n", + "where $[\\mathrm{IP_3}]$, $[\\mathrm{Ca^{2+}}]$, and $h_{\\mathrm{IP_3}}$ are the state variables of interest." + ] + }, + { + "cell_type": "markdown", + "id": "622a93cb", + "metadata": {}, + "source": [ + "## Technical details and requirements\n", + "\n", + "### Implementation of the functions\n", + "\n", + "* The reference solution is implemented through [scipy](http://www.scipy.org/).\n", + "\n", + "### Requirements\n", + "\n", + "To run this notebook, you need:\n", + "\n", + "* [numpy](http://www.numpy.org/) and [scipy](http://www.scipy.org/)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "76d05384", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from scipy.integrate import odeint" + ] + }, + { + "cell_type": "markdown", + "id": "17cecb4d", + "metadata": {}, + "source": [ + "## Reference solution\n", + "### Right hand side function" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "967b18fb", + "metadata": {}, + "outputs": [], + "source": [ + "def rhs(y, _, p):\n", + " \"\"\"\n", + " Implementation of astrocyte dynamics.\n", + "\n", + " Parameters\n", + " ----------\n", + " y : list\n", + " Vector containing the state variables [IP3, Ca, h_IP3R]\n", + " _ : unused var\n", + " p : Params instance\n", + " Object containing the astrocyte parameters.\n", + "\n", + " Returns\n", + " -------\n", + " dCa : double\n", + " Derivative of Ca\n", + " dIP3 : double\n", + " Derivative of IP3\n", + " dh_IP3R : double\n", + " Derivative of h_IP3R\n", + " \"\"\"\n", + " IP3 = y[0]\n", + " Ca = y[1]\n", + " h_IP3R = y[2]\n", + "\n", + " Ca = max(0, min(Ca, p.Ca_tot * (1 + p.ratio_ER_cyt)))\n", + " alpha = p.k_IP3R * p.Kd_inh * (IP3 + p.Kd_IP3_1) / (IP3 + p.Kd_IP3_2)\n", + " beta = p.k_IP3R * Ca\n", + " Ca_ER = (p.Ca_tot - Ca) / p.ratio_ER_cyt\n", + " m_inf = IP3 / (IP3 + p.Kd_IP3_1)\n", + " n_inf = Ca / (Ca + p.Kd_act)\n", + " J_ch = p.ratio_ER_cyt * p.rate_IP3R * ((m_inf * n_inf * h_IP3R) ** 3) * (Ca_ER - Ca)\n", + " J_pump = p.rate_SERCA * (Ca**2) / (p.Km_SERCA**2 + Ca**2)\n", + " J_leak = p.ratio_ER_cyt * p.rate_L * (Ca_ER - Ca)\n", + "\n", + " dCa = J_ch - J_pump + J_leak\n", + " dIP3 = (p.IP3_0 - IP3) / p.tau_IP3\n", + " dh_IP3R = alpha * (1 - h_IP3R) - beta * h_IP3R\n", + "\n", + " return dIP3, dCa, dh_IP3R" + ] + }, + { + "cell_type": "markdown", + "id": "6f9246f9", + "metadata": {}, + "source": [ + "### Complete model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6276334c", + "metadata": {}, + "outputs": [], + "source": [ + "def scipy_astrocyte(p, f, simtime, dt, spk_ts, spk_ws):\n", + " \"\"\"\n", + " Complete astrocyte model using scipy `odeint` solver.\n", + "\n", + " Parameters\n", + " ----------\n", + " p : Params instance\n", + " Object containing the astrocyte parameters.\n", + " f : function\n", + " Right-hand side function\n", + " simtime : double\n", + " Duration of the simulation (will run between\n", + " 0 and tmax)\n", + " dt : double\n", + " Time increment.\n", + " spk_ts, spk_ws : list\n", + " Times and weights of spike input to the astrocyte\n", + "\n", + " Returns\n", + " -------\n", + " t : list\n", + " Times at which the astrocyte state was evaluated.\n", + " y : list\n", + " State values associated to the times in `t`\n", + " fos : list\n", + " List of dictionaries containing additional output\n", + " information from `odeint`\n", + " \"\"\"\n", + " t = np.arange(0, simtime, dt) # time axis\n", + " n = len(t)\n", + " y = np.zeros((n, 3)) # state variables: IP3, Ca, h_IP3R\n", + " # for the state variables, assign the same initial values as in test_astrocyte.py\n", + " y[0, 0] = 1.0\n", + " y[0, 1] = 1.0\n", + " y[0, 2] = 1.0\n", + " fos = [] # full output dict from odeint()\n", + " delta_ip3 = 5.0 # parameter determining the increase in IP3 induced by synaptic input\n", + "\n", + " # update time-step by time-step\n", + " for k in range(1, n):\n", + " # solve ODE from t_k-1 to t_k\n", + " d, fo = odeint(f, y[k - 1, :], t[k - 1 : k + 1], (p,), full_output=True)\n", + " y[k, :] = d[1, :]\n", + "\n", + " # apply synaptic inputs (spikes)\n", + " if t[k] in spk_ts:\n", + " y[k, 0] += delta_ip3 * spk_ws[spk_ts.index(t[k])]\n", + "\n", + " fos.append(fo)\n", + "\n", + " return t, y, fos" + ] + }, + { + "cell_type": "markdown", + "id": "246ef086", + "metadata": {}, + "source": [ + "### Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3fb81ba9", + "metadata": {}, + "outputs": [], + "source": [ + "astro_param = {\n", + " \"Ca_tot\": 2.0,\n", + " \"IP3_0\": 0.16,\n", + " \"Kd_act\": 0.08234,\n", + " \"Kd_inh\": 1.049,\n", + " \"Kd_IP3_1\": 0.13,\n", + " \"Kd_IP3_2\": 0.9434,\n", + " \"Km_SERCA\": 0.1,\n", + " \"ratio_ER_cyt\": 0.185,\n", + " \"delta_IP3\": 5.0,\n", + " \"k_IP3R\": 0.0002,\n", + " \"rate_L\": 0.00011,\n", + " \"tau_IP3\": 7142.0,\n", + " \"rate_IP3R\": 0.006,\n", + " \"rate_SERCA\": 0.0009,\n", + "}\n", + "\n", + "\n", + "class Params:\n", + " \"\"\"\n", + " Class giving access to the astrocyte parameters.\n", + " \"\"\"\n", + "\n", + " def __init__(self):\n", + " self.params = astro_param\n", + " self.Ca_tot = astro_param[\"Ca_tot\"]\n", + " self.IP3_0 = astro_param[\"IP3_0\"]\n", + " self.Kd_act = astro_param[\"Kd_act\"]\n", + " self.Kd_inh = astro_param[\"Kd_inh\"]\n", + " self.Kd_IP3_1 = astro_param[\"Kd_IP3_1\"]\n", + " self.Kd_IP3_2 = astro_param[\"Kd_IP3_2\"]\n", + " self.Km_SERCA = astro_param[\"Km_SERCA\"]\n", + " self.ratio_ER_cyt = astro_param[\"ratio_ER_cyt\"]\n", + " self.delta_IP3 = astro_param[\"delta_IP3\"]\n", + " self.k_IP3R = astro_param[\"k_IP3R\"]\n", + " self.rate_L = astro_param[\"rate_L\"]\n", + " self.tau_IP3 = astro_param[\"tau_IP3\"]\n", + " self.rate_IP3R = astro_param[\"rate_IP3R\"]\n", + " self.rate_SERCA = astro_param[\"rate_SERCA\"]\n", + "\n", + "\n", + "p = Params()" + ] + }, + { + "cell_type": "markdown", + "id": "854edc71", + "metadata": {}, + "source": [ + "### Simulate the implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c83f56f0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters for the simulation\n", + "simtime = 100.0\n", + "resolution = 0.1\n", + "spike_times = [10.0]\n", + "spike_weights = [1.0]\n", + "\n", + "# Simulate and get the recording\n", + "t, y, fos = scipy_astrocyte(p, rhs, simtime, resolution, spike_times, spike_weights)\n", + "data = np.concatenate((np.array([t]).T, y), axis=1)\n", + "\n", + "# Save the recording (excluding the initial values)\n", + "np.savetxt(\n", + " \"test_astrocyte.dat\",\n", + " data[1:, :],\n", + " header=\"\"\"\\ntest_astrocyte.dat\\n\n", + "This file is part of NEST.\\n\n", + "This .dat file contains the recordings of the state variables of an\n", + "astrocyte, simulated using the ODEINT solver of SciPy, with the\n", + "implementation detailed in\n", + "``doc/htmldoc/model_details/astrocyte_model_implementation.ipynb``.\n", + "This data is used as reference for the tests in ``test_astrocyte.py``.\\n\n", + " Times IP3 Ca h_IP3R \"\"\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "df8ff655", + "metadata": {}, + "source": [ + "-----------------------------\n", + "### License\n", + "\n", + "This file is part of NEST. Copyright (C) 2004 The NEST Initiative\n", + "\n", + "NEST is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.\n", + "\n", + "NEST is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details." + ] + } + ], + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/htmldoc/static/img/astrocyte_tripartite.png b/doc/htmldoc/static/img/astrocyte_tripartite.png new file mode 100644 index 0000000000..bffc8da56f Binary files /dev/null and b/doc/htmldoc/static/img/astrocyte_tripartite.png differ diff --git a/models/aeif_cond_alpha.h b/models/aeif_cond_alpha.h index 28e66cfc71..805a89d0af 100644 --- a/models/aeif_cond_alpha.h +++ b/models/aeif_cond_alpha.h @@ -100,7 +100,7 @@ and \tau_w \frac{dw}{dt} = a(V-E_L) - w -For implementation details see the +For the reference implementation of this model, see `aeif_models_implementation <../model_details/aeif_models_implementation.ipynb>`_ notebook. See also [1]_. diff --git a/models/aeif_cond_alpha_astro.cpp b/models/aeif_cond_alpha_astro.cpp new file mode 100644 index 0000000000..6e77cb841b --- /dev/null +++ b/models/aeif_cond_alpha_astro.cpp @@ -0,0 +1,584 @@ +/* + * aeif_cond_alpha_astro.cpp + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + +#include "aeif_cond_alpha_astro.h" + +#ifdef HAVE_GSL + +// C++ includes: +#include +#include +#include +#include + +// Includes from libnestutil: +#include "dict_util.h" +#include "numerics.h" + +// Includes from nestkernel: +#include "exceptions.h" +#include "kernel_manager.h" +#include "nest_names.h" +#include "universal_data_logger_impl.h" + +// Includes from sli: +#include "dictutils.h" + +/* ---------------------------------------------------------------- + * Recordables map + * ---------------------------------------------------------------- */ + +nest::RecordablesMap< nest::aeif_cond_alpha_astro > nest::aeif_cond_alpha_astro::recordablesMap_; + +namespace nest // template specialization must be placed in namespace +{ +// Override the create() method with one call to RecordablesMap::insert_() +// for each quantity to be recorded. +template <> +void +RecordablesMap< aeif_cond_alpha_astro >::create() +{ + // use standard names whereever you can for consistency! + insert_( names::V_m, &aeif_cond_alpha_astro::get_y_elem_< aeif_cond_alpha_astro::State_::V_M > ); + insert_( names::g_ex, &aeif_cond_alpha_astro::get_y_elem_< aeif_cond_alpha_astro::State_::G_EXC > ); + insert_( names::g_in, &aeif_cond_alpha_astro::get_y_elem_< aeif_cond_alpha_astro::State_::G_INH > ); + insert_( names::w, &aeif_cond_alpha_astro::get_y_elem_< aeif_cond_alpha_astro::State_::W > ); + insert_( names::I_SIC, &aeif_cond_alpha_astro::get_I_sic_ ); +} +} + +extern "C" int +nest::aeif_cond_alpha_astro_dynamics( double, const double y[], double f[], void* pnode ) +{ + // a shorthand + typedef nest::aeif_cond_alpha_astro::State_ S; + + // get access to node so we can almost work as in a member function + assert( pnode ); + const nest::aeif_cond_alpha_astro& node = *( reinterpret_cast< nest::aeif_cond_alpha_astro* >( pnode ) ); + + const bool is_refractory = node.S_.r_ > 0; + + // y[] here is---and must be---the state vector supplied by the integrator, + // not the state vector in the node, node.S_.y[]. + + // The following code is verbose for the sake of clarity. We assume that a + // good compiler will optimize the verbosity away ... + + // Clamp membrane potential to V_reset while refractory, otherwise bound + // it to V_peak. Do not use V_.V_peak_ here, since that is set to V_th if + // Delta_T == 0. + const double& V = is_refractory ? node.P_.V_reset_ : std::min( y[ S::V_M ], node.P_.V_peak_ ); + // shorthand for the other state variables + const double& dg_ex = y[ S::DG_EXC ]; + const double& g_ex = y[ S::G_EXC ]; + const double& dg_in = y[ S::DG_INH ]; + const double& g_in = y[ S::G_INH ]; + const double& w = y[ S::W ]; + + const double I_syn_exc = g_ex * ( V - node.P_.E_ex ); + const double I_syn_inh = g_in * ( V - node.P_.E_in ); + + const double I_spike = + node.P_.Delta_T == 0. ? 0. : ( node.P_.g_L * node.P_.Delta_T * std::exp( ( V - node.P_.V_th ) / node.P_.Delta_T ) ); + + // dv/dt + f[ S::V_M ] = is_refractory ? 0. + : ( -node.P_.g_L * ( V - node.P_.E_L ) + I_spike - I_syn_exc - I_syn_inh - w + node.P_.I_e + + node.B_.I_stim_ + node.B_.I_sic_ ) + / node.P_.C_m; + + f[ S::DG_EXC ] = -dg_ex / node.P_.tau_syn_ex; + // Synaptic Conductance (nS) + f[ S::G_EXC ] = dg_ex - g_ex / node.P_.tau_syn_ex; + + f[ S::DG_INH ] = -dg_in / node.P_.tau_syn_in; + // Synaptic Conductance (nS) + f[ S::G_INH ] = dg_in - g_in / node.P_.tau_syn_in; + + // Adaptation current w. + f[ S::W ] = ( node.P_.a * ( V - node.P_.E_L ) - w ) / node.P_.tau_w; + + return GSL_SUCCESS; +} + + +/* ---------------------------------------------------------------- + * Default constructors defining default parameters and state + * ---------------------------------------------------------------- */ + +nest::aeif_cond_alpha_astro::Parameters_::Parameters_() + : V_peak_( 0.0 ) // mV + , V_reset_( -60.0 ) // mV + , t_ref_( 0.0 ) // ms + , g_L( 30.0 ) // nS + , C_m( 281.0 ) // pF + , E_ex( 0.0 ) // mV + , E_in( -85.0 ) // mV + , E_L( -70.6 ) // mV + , Delta_T( 2.0 ) // mV + , tau_w( 144.0 ) // ms + , a( 4.0 ) // nS + , b( 80.5 ) // pA + , V_th( -50.4 ) // mV + , tau_syn_ex( 0.2 ) // ms + , tau_syn_in( 2.0 ) // ms + , I_e( 0.0 ) // pA + , gsl_error_tol( 1e-6 ) +{ +} + +nest::aeif_cond_alpha_astro::State_::State_( const Parameters_& p ) + : r_( 0 ) +{ + y_[ 0 ] = p.E_L; + for ( size_t i = 1; i < STATE_VEC_SIZE; ++i ) + { + y_[ i ] = 0; + } +} + +nest::aeif_cond_alpha_astro::State_::State_( const State_& s ) + : r_( s.r_ ) +{ + for ( size_t i = 0; i < STATE_VEC_SIZE; ++i ) + { + y_[ i ] = s.y_[ i ]; + } +} + +nest::aeif_cond_alpha_astro::State_& +nest::aeif_cond_alpha_astro::State_::operator=( const State_& s ) +{ + r_ = s.r_; + for ( size_t i = 0; i < STATE_VEC_SIZE; ++i ) + { + y_[ i ] = s.y_[ i ]; + } + return *this; +} + +/* ---------------------------------------------------------------- + * Parameter and state extractions and manipulation functions + * ---------------------------------------------------------------- */ + +void +nest::aeif_cond_alpha_astro::Parameters_::get( DictionaryDatum& d ) const +{ + def< double >( d, names::C_m, C_m ); + def< double >( d, names::V_th, V_th ); + def< double >( d, names::t_ref, t_ref_ ); + def< double >( d, names::g_L, g_L ); + def< double >( d, names::E_L, E_L ); + def< double >( d, names::V_reset, V_reset_ ); + def< double >( d, names::E_ex, E_ex ); + def< double >( d, names::E_in, E_in ); + def< double >( d, names::tau_syn_ex, tau_syn_ex ); + def< double >( d, names::tau_syn_in, tau_syn_in ); + def< double >( d, names::a, a ); + def< double >( d, names::b, b ); + def< double >( d, names::Delta_T, Delta_T ); + def< double >( d, names::tau_w, tau_w ); + def< double >( d, names::I_e, I_e ); + def< double >( d, names::V_peak, V_peak_ ); + def< double >( d, names::gsl_error_tol, gsl_error_tol ); +} + +void +nest::aeif_cond_alpha_astro::Parameters_::set( const DictionaryDatum& d, Node* node ) +{ + updateValueParam< double >( d, names::V_th, V_th, node ); + updateValueParam< double >( d, names::V_peak, V_peak_, node ); + updateValueParam< double >( d, names::t_ref, t_ref_, node ); + updateValueParam< double >( d, names::E_L, E_L, node ); + updateValueParam< double >( d, names::V_reset, V_reset_, node ); + updateValueParam< double >( d, names::E_ex, E_ex, node ); + updateValueParam< double >( d, names::E_in, E_in, node ); + + updateValueParam< double >( d, names::C_m, C_m, node ); + updateValueParam< double >( d, names::g_L, g_L, node ); + + updateValueParam< double >( d, names::tau_syn_ex, tau_syn_ex, node ); + updateValueParam< double >( d, names::tau_syn_in, tau_syn_in, node ); + + updateValueParam< double >( d, names::a, a, node ); + updateValueParam< double >( d, names::b, b, node ); + updateValueParam< double >( d, names::Delta_T, Delta_T, node ); + updateValueParam< double >( d, names::tau_w, tau_w, node ); + + updateValueParam< double >( d, names::I_e, I_e, node ); + + updateValueParam< double >( d, names::gsl_error_tol, gsl_error_tol, node ); + + if ( V_reset_ >= V_peak_ ) + { + throw BadProperty( "Ensure that: V_reset < V_peak ." ); + } + + if ( Delta_T < 0. ) + { + throw BadProperty( "Delta_T must be positive." ); + } + else if ( Delta_T > 0. ) + { + // check for possible numerical overflow with the exponential divergence at + // spike time, keep a 1e20 margin for the subsequent calculations + const double max_exp_arg = std::log( std::numeric_limits< double >::max() / 1e20 ); + if ( ( V_peak_ - V_th ) / Delta_T >= max_exp_arg ) + { + throw BadProperty( + "The current combination of V_peak, V_th and Delta_T" + "will lead to numerical overflow at spike time; try" + "for instance to increase Delta_T or to reduce V_peak" + "to avoid this problem." ); + } + } + + if ( V_peak_ < V_th ) + { + throw BadProperty( "V_peak >= V_th required." ); + } + + if ( C_m <= 0 ) + { + throw BadProperty( "Capacitance must be strictly positive." ); + } + + if ( t_ref_ < 0 ) + { + throw BadProperty( "Refractory time cannot be negative." ); + } + + if ( tau_syn_ex <= 0 or tau_syn_in <= 0 or tau_w <= 0 ) + { + throw BadProperty( "All time constants must be strictly positive." ); + } + + if ( gsl_error_tol <= 0. ) + { + throw BadProperty( "The gsl_error_tol must be strictly positive." ); + } +} + +void +nest::aeif_cond_alpha_astro::State_::get( DictionaryDatum& d ) const +{ + def< double >( d, names::V_m, y_[ V_M ] ); + def< double >( d, names::g_ex, y_[ G_EXC ] ); + def< double >( d, names::dg_ex, y_[ DG_EXC ] ); + def< double >( d, names::g_in, y_[ G_INH ] ); + def< double >( d, names::dg_in, y_[ DG_INH ] ); + def< double >( d, names::w, y_[ W ] ); +} + +void +nest::aeif_cond_alpha_astro::State_::set( const DictionaryDatum& d, const Parameters_&, Node* node ) +{ + updateValueParam< double >( d, names::V_m, y_[ V_M ], node ); + updateValueParam< double >( d, names::g_ex, y_[ G_EXC ], node ); + updateValueParam< double >( d, names::dg_ex, y_[ DG_EXC ], node ); + updateValueParam< double >( d, names::g_in, y_[ G_INH ], node ); + updateValueParam< double >( d, names::dg_in, y_[ DG_INH ], node ); + updateValueParam< double >( d, names::w, y_[ W ], node ); + if ( y_[ G_EXC ] < 0 || y_[ G_INH ] < 0 ) + { + throw BadProperty( "Conductances must not be negative." ); + } +} + +nest::aeif_cond_alpha_astro::Buffers_::Buffers_( aeif_cond_alpha_astro& n ) + : logger_( n ) + , s_( nullptr ) + , c_( nullptr ) + , e_( nullptr ) +{ + // Initialization of the remaining members is deferred to + // init_buffers_(). +} + +nest::aeif_cond_alpha_astro::Buffers_::Buffers_( const Buffers_&, aeif_cond_alpha_astro& n ) + : logger_( n ) + , s_( nullptr ) + , c_( nullptr ) + , e_( nullptr ) +{ + // Initialization of the remaining members is deferred to + // init_buffers_(). +} + +/* ---------------------------------------------------------------- + * Default and copy constructor for node, and destructor + * ---------------------------------------------------------------- */ + +nest::aeif_cond_alpha_astro::aeif_cond_alpha_astro() + : ArchivingNode() + , P_() + , S_( P_ ) + , B_( *this ) +{ + recordablesMap_.create(); +} + +nest::aeif_cond_alpha_astro::aeif_cond_alpha_astro( const aeif_cond_alpha_astro& n ) + : ArchivingNode( n ) + , P_( n.P_ ) + , S_( n.S_ ) + , B_( n.B_, *this ) +{ +} + +nest::aeif_cond_alpha_astro::~aeif_cond_alpha_astro() +{ + // GSL structs may not have been allocated, so we need to protect destruction + if ( B_.s_ ) + { + gsl_odeiv_step_free( B_.s_ ); + } + if ( B_.c_ ) + { + gsl_odeiv_control_free( B_.c_ ); + } + if ( B_.e_ ) + { + gsl_odeiv_evolve_free( B_.e_ ); + } +} + +/* ---------------------------------------------------------------- + * Node initialization functions + * ---------------------------------------------------------------- */ + +void +nest::aeif_cond_alpha_astro::init_buffers_() +{ + B_.spike_exc_.clear(); // includes resize + B_.spike_inh_.clear(); // includes resize + B_.currents_.clear(); // includes resize + B_.sic_currents_.clear(); // includes resize + ArchivingNode::clear_history(); + + B_.logger_.reset(); + + B_.step_ = Time::get_resolution().get_ms(); + + // We must integrate this model with high-precision to obtain decent results + B_.IntegrationStep_ = std::min( 0.01, B_.step_ ); + + if ( not B_.s_ ) + { + B_.s_ = gsl_odeiv_step_alloc( gsl_odeiv_step_rkf45, State_::STATE_VEC_SIZE ); + } + else + { + gsl_odeiv_step_reset( B_.s_ ); + } + + if ( not B_.c_ ) + { + B_.c_ = gsl_odeiv_control_yp_new( P_.gsl_error_tol, P_.gsl_error_tol ); + } + else + { + gsl_odeiv_control_init( B_.c_, P_.gsl_error_tol, P_.gsl_error_tol, 0.0, 1.0 ); + } + + if ( not B_.e_ ) + { + B_.e_ = gsl_odeiv_evolve_alloc( State_::STATE_VEC_SIZE ); + } + else + { + gsl_odeiv_evolve_reset( B_.e_ ); + } + + B_.sys_.jacobian = nullptr; + B_.sys_.dimension = State_::STATE_VEC_SIZE; + B_.sys_.params = reinterpret_cast< void* >( this ); + B_.sys_.function = aeif_cond_alpha_astro_dynamics; + + B_.I_stim_ = 0.0; + B_.I_sic_ = 0.0; +} + +void +nest::aeif_cond_alpha_astro::pre_run_hook() +{ + // ensures initialization in case mm connected after Simulate + B_.logger_.init(); + + // set the right threshold and GSL function depending on Delta_T + if ( P_.Delta_T > 0. ) + { + V_.V_peak = P_.V_peak_; + } + else + { + V_.V_peak = P_.V_th; // same as IAF dynamics for spikes if Delta_T == 0. + } + + V_.g0_ex_ = 1.0 * numerics::e / P_.tau_syn_ex; + V_.g0_in_ = 1.0 * numerics::e / P_.tau_syn_in; + V_.refractory_counts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); +} + +/* ---------------------------------------------------------------- + * Update and spike handling functions + * ---------------------------------------------------------------- */ + +void +nest::aeif_cond_alpha_astro::update( Time const& origin, const long from, const long to ) +{ + assert( State_::V_M == 0 ); + + for ( long lag = from; lag < to; ++lag ) + { + double t = 0.0; + + // numerical integration with adaptive step size control: + // ------------------------------------------------------ + // gsl_odeiv_evolve_apply performs only a single numerical + // integration step, starting from t and bounded by step; + // the while-loop ensures integration over the whole simulation + // step (0, step] if more than one integration step is needed due + // to a small integration step size; + // note that (t+IntegrationStep > step) leads to integration over + // (t, step] and afterwards setting t to step, but it does not + // enforce setting IntegrationStep to step-t; this is of advantage + // for a consistent and efficient integration across subsequent + // simulation intervals + + while ( t < B_.step_ ) + { + const int status = gsl_odeiv_evolve_apply( B_.e_, + B_.c_, + B_.s_, + &B_.sys_, // system of ODE + &t, // from t + B_.step_, // to t <= step + &B_.IntegrationStep_, // integration step size + S_.y_ ); // neuronal state + if ( status != GSL_SUCCESS ) + { + throw GSLSolverFailure( get_name(), status ); + } + + // check for unreasonable values; we allow V_M to explode + if ( S_.y_[ State_::V_M ] < -1e3 or S_.y_[ State_::W ] < -1e6 or S_.y_[ State_::W ] > 1e6 ) + { + throw NumericalInstability( get_name() ); + } + + // spikes are handled inside the while-loop + // due to spike-driven adaptation + if ( S_.r_ > 0 ) + { + S_.y_[ State_::V_M ] = P_.V_reset_; + } + else if ( S_.y_[ State_::V_M ] >= V_.V_peak ) + { + S_.y_[ State_::V_M ] = P_.V_reset_; + S_.y_[ State_::W ] += P_.b; // spike-driven adaptation + + /* Initialize refractory step counter. + * - We need to add 1 to compensate for count-down immediately after + * while loop. + * - If neuron has no refractory time, set to 0 to avoid refractory + * artifact inside while loop. + */ + S_.r_ = V_.refractory_counts_ > 0 ? V_.refractory_counts_ + 1 : 0; + + set_spiketime( Time::step( origin.get_steps() + lag + 1 ) ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + } + } + + // decrement refractory count + if ( S_.r_ > 0 ) + { + --S_.r_; + } + + // apply spikes + S_.y_[ State_::DG_EXC ] += B_.spike_exc_.get_value( lag ) * V_.g0_ex_; + S_.y_[ State_::DG_INH ] += B_.spike_inh_.get_value( lag ) * V_.g0_in_; + + // set new input currents + B_.I_stim_ = B_.currents_.get_value( lag ); + B_.I_sic_ = B_.sic_currents_.get_value( lag ); + + // log state data + B_.logger_.record_data( origin.get_steps() + lag ); + } +} + +void +nest::aeif_cond_alpha_astro::handle( SpikeEvent& e ) +{ + assert( e.get_delay_steps() > 0 ); + + if ( e.get_weight() > 0.0 ) + { + B_.spike_exc_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), + e.get_weight() * e.get_multiplicity() ); + } + else + { + B_.spike_inh_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), + -e.get_weight() * e.get_multiplicity() ); + } +} + +void +nest::aeif_cond_alpha_astro::handle( CurrentEvent& e ) +{ + assert( e.get_delay_steps() > 0 ); + + const double c = e.get_current(); + const double w = e.get_weight(); + + B_.currents_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), w * c ); +} + +void +nest::aeif_cond_alpha_astro::handle( SICEvent& e ) +{ + const double weight = e.get_weight(); + const long delay = e.get_delay_steps() - kernel().connection_manager.get_min_delay(); + + size_t i = 0; + std::vector< unsigned int >::iterator it = e.begin(); + // The call to get_coeffvalue( it ) in this loop also advances the iterator it + while ( it != e.end() ) + { + B_.sic_currents_.add_value( delay + i, weight * e.get_coeffvalue( it ) ); + ++i; + } +} + +void +nest::aeif_cond_alpha_astro::handle( DataLoggingRequest& e ) +{ + B_.logger_.handle( e ); +} + +#endif // HAVE_GSL diff --git a/models/aeif_cond_alpha_astro.h b/models/aeif_cond_alpha_astro.h new file mode 100644 index 0000000000..a44e51aae5 --- /dev/null +++ b/models/aeif_cond_alpha_astro.h @@ -0,0 +1,488 @@ +/* + * aeif_cond_alpha_astro.h + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + +#ifndef AEIF_COND_ALPHA_ASTRO_H +#define AEIF_COND_ALPHA_ASTRO_H + +// Generated includes: +#include "config.h" + +#ifdef HAVE_GSL + +// External includes: +#include +#include +#include + +// Includes from nestkernel: +#include "archiving_node.h" +#include "connection.h" +#include "event.h" +#include "nest_types.h" +#include "recordables_map.h" +#include "ring_buffer.h" +#include "universal_data_logger.h" + +namespace nest +{ +/** + * Function computing right-hand side of ODE for GSL solver if Delta_T != 0. + * @note Must be declared here so we can befriend it in class. + * @note Must have C-linkage for passing to GSL. Internally, it is + * a first-class C++ function, but cannot be a member function + * because of the C-linkage. + * @note No point in declaring it inline, since it is called + * through a function pointer. + * @param void* Pointer to model neuron instance. + */ +extern "C" int aeif_cond_alpha_astro_dynamics( double, const double*, double*, void* ); + +/** + * Function computing right-hand side of ODE for GSL solver if Delta_T == 0. + * @note Must be declared here so we can befriend it in class. + * @note Must have C-linkage for passing to GSL. Internally, it is + * a first-class C++ function, but cannot be a member function + * because of the C-linkage. + * @note No point in declaring it inline, since it is called + * through a function pointer. + * @param void* Pointer to model neuron instance. + */ +extern "C" int aeif_cond_alpha_astro_dynamics_DT0( double, const double*, double*, void* ); + +/* BeginUserDocs: neuron, integrate-and-fire, adaptive threshold, conductance-based, astrocyte + +Short description ++++++++++++++++++ + +Conductance based exponential integrate-and-fire neuron model with support for +neuron-astrocyte interactions + +Description ++++++++++++ + +``aeif_cond_alpha_astro`` is an adaptive exponential integrate-and-fire neuron +(AdEx) that can receive inputs from astrocytes, in addition to receiving +synaptic inputs from other neurons. It is adapted from the standard NEST +implementation of AdEx neurons (``aeif_cond_alpha``). The connection with +astrocytes is established through ``sic_connection``, which sends slow inward +current (SIC) from an astrocyte to ``aeif_cond_alpha_astro``. + +The membrane potential is given by the following differential equation +(adapted from ``aeif_cond_alpha``): + +.. math:: + + C_m \frac{dV}{dt} = + -g_L(V-E_L)+g_L\Delta_T\exp\left(\frac{V-V_{th}}{\Delta_T}\right) - + g_e(t)(V-E_e) \\ + -g_i(t)(V-E_i)-w +I_e + I_{\text{SIC}} + +and + +.. math:: + + \tau_w \frac{dw}{dt} = a(V-E_L) - w + +Here, :math:`I_{\text{SIC}}` is the sum of slow inward currents received from all +astrocytes connected to the neuron. The other parameters and +variables are the same as in ``aeif_cond_alpha``. + +For implementation details of the adaptive exponential integrate-and-fire neuron +model, see the +`aeif_models_implementation <../model_details/aeif_models_implementation.ipynb>`_ notebook. + +See also [1]_. + +Parameters +++++++++++ + +The following parameters can be set in the status dictionary. + +======== ======= ======================================= +**Dynamic state variables** +-------------------------------------------------------- + V_m mV Membrane potential + g_ex nS Excitatory synaptic conductance + dg_ex nS/ms First derivative of g_ex + g_in nS Inhibitory synaptic conductance + dg_in nS/ms First derivative of g_in + w pA Spike-adaptation current +======== ======= ======================================= + +======== ======= ======================================= +**Membrane Parameters** +-------------------------------------------------------- + C_m pF Capacity of the membrane + t_ref ms Duration of refractory period + V_reset mV Reset value for V_m after a spike + E_L mV Leak reversal potential + g_L nS Leak conductance + I_e pA Constant external input current +======== ======= ======================================= + +======== ======= ================================== +**Spike adaptation parameters** +--------------------------------------------------- + a ns Subthreshold adaptation + b pA Spike-triggered adaptation + Delta_T mV Slope factor + tau_w ms Adaptation time constant + V_th mV Spike initiation threshold + V_peak mV Spike detection threshold +======== ======= ================================== + +=========== ======= =========================================================== +**Synaptic parameters** +------------------------------------------------------------------------------- + E_ex mV Excitatory reversal potential + tau_syn_ex ms Rise time of the excitatory synaptic conductance (alpha + function) + E_in mV Inhibitory reversal potential + tau_syn_in ms Rise time of the inhibitory synaptic conductance + (alpha function) +=========== ======= =========================================================== + +============= ======= ========================================================= +**Integration parameters** +------------------------------------------------------------------------------- +gsl_error_tol real This parameter controls the admissible error of the + GSL integrator. Reduce it if NEST complains about + numerical instabilities. +============= ======= ========================================================= + +Sends ++++++ + +SpikeEvent + +Receives +++++++++ + +SpikeEvent, CurrentEvent, DataLoggingRequest, SICEvent + +References +++++++++++ + +.. [1] Brette R and Gerstner W (2005). Adaptive exponential + integrate-and-fire model as an effective description of neuronal + activity. Journal of Neurophysiology. 943637-3642 + DOI: https://doi.org/10.1152/jn.00686.2005 + +See also +++++++++ + +iaf_cond_alpha, aeif_cond_exp, astrocyte_lr_1994, sic_connection + +EndUserDocs */ + +class aeif_cond_alpha_astro : public ArchivingNode +{ + +public: + aeif_cond_alpha_astro(); + aeif_cond_alpha_astro( const aeif_cond_alpha_astro& ); + ~aeif_cond_alpha_astro() override; + + /** + * Import sets of overloaded virtual functions. + * @see Technical Issues / Virtual Functions: Overriding, Overloading, and + * Hiding + */ + using Node::handle; + using Node::handles_test_event; + + size_t send_test_event( Node&, size_t, synindex, bool ) override; + + void handle( SpikeEvent& ) override; + void handle( CurrentEvent& ) override; + void handle( SICEvent& ) override; + void handle( DataLoggingRequest& ) override; + + size_t handles_test_event( SpikeEvent&, size_t ) override; + size_t handles_test_event( CurrentEvent&, size_t ) override; + size_t handles_test_event( SICEvent&, size_t ) override; + size_t handles_test_event( DataLoggingRequest&, size_t ) override; + + void get_status( DictionaryDatum& ) const override; + void set_status( const DictionaryDatum& ) override; + +private: + void init_buffers_() override; + void pre_run_hook() override; + void update( Time const&, const long, const long ) override; + + // END Boilerplate function declarations ---------------------------- + + // Friends -------------------------------------------------------- + + // make dynamics function quasi-member + friend int aeif_cond_alpha_astro_dynamics( double, const double*, double*, void* ); + + // The next two classes need to be friends to access the State_ class/member + friend class RecordablesMap< aeif_cond_alpha_astro >; + friend class UniversalDataLogger< aeif_cond_alpha_astro >; + +private: + // ---------------------------------------------------------------- + + //! Independent parameters + struct Parameters_ + { + double V_peak_; //!< Spike detection threshold in mV + double V_reset_; //!< Reset Potential in mV + double t_ref_; //!< Refractory period in ms + + double g_L; //!< Leak Conductance in nS + double C_m; //!< Membrane Capacitance in pF + double E_ex; //!< Excitatory reversal Potential in mV + double E_in; //!< Inhibitory reversal Potential in mV + double E_L; //!< Leak reversal Potential (aka resting potential) in mV + double Delta_T; //!< Slope factor in mV + double tau_w; //!< Adaptation time-constant in ms + double a; //!< Subthreshold adaptation in nS + double b; //!< Spike-triggered adaptation in pA + double V_th; //!< Spike threshold in mV + double tau_syn_ex; //!< Excitatory synaptic rise time + double tau_syn_in; //!< Excitatory synaptic rise time + double I_e; //!< Intrinsic current in pA + + double gsl_error_tol; //!< Error bound for GSL integrator + + Parameters_(); //!< Sets default parameter values + + void get( DictionaryDatum& ) const; //!< Store current values in dictionary + void set( const DictionaryDatum&, Node* node ); //!< Set values from dictionary + }; + +public: + // ---------------------------------------------------------------- + + /** + * State variables of the model. + * @note Copy constructor required because of C-style array. + */ + struct State_ + { + /** + * Enumeration identifying elements in state array State_::y_. + * The state vector must be passed to GSL as a C array. This enum + * identifies the elements of the vector. It must be public to be + * accessible from the iteration function. + */ + enum StateVecElems + { + V_M = 0, + DG_EXC, // 1 + G_EXC, // 2 + DG_INH, // 3 + G_INH, // 4 + W, // 5 + STATE_VEC_SIZE + }; + + double y_[ STATE_VEC_SIZE ]; //!< neuron state, must be C-array for + //!< GSL solver + unsigned int r_; //!< number of refractory steps remaining + + State_( const Parameters_& ); //!< Default initialization + State_( const State_& ); + State_& operator=( const State_& ); + + void get( DictionaryDatum& ) const; + void set( const DictionaryDatum&, const Parameters_&, Node* ); + }; + + // ---------------------------------------------------------------- + + /** + * Buffers of the model. + */ + struct Buffers_ + { + Buffers_( aeif_cond_alpha_astro& ); //!< Sets buffer pointers to 0 + Buffers_( const Buffers_&, aeif_cond_alpha_astro& ); //!< Sets buffer pointers to 0 + + //! Logger for all analog data + UniversalDataLogger< aeif_cond_alpha_astro > logger_; + + /** buffers and sums up incoming spikes/currents */ + RingBuffer spike_exc_; + RingBuffer spike_inh_; + RingBuffer currents_; + + /** GSL ODE stuff */ + gsl_odeiv_step* s_; //!< stepping function + gsl_odeiv_control* c_; //!< adaptive stepsize control function + gsl_odeiv_evolve* e_; //!< evolution function + gsl_odeiv_system sys_; //!< struct describing the GSL system + + // Since IntergrationStep_ is initialized with step_, and the resolution + // cannot change after nodes have been created, it is safe to place both + // here. + double step_; //!< step size in ms + double IntegrationStep_; //!< current integration time step, updated by GSL + + RingBuffer sic_currents_; + + /** + * Input current injected by CurrentEvent. + * This variable is used to transport the current applied into the + * _dynamics function computing the derivative of the state vector. + * It must be a part of Buffers_, since it is initialized once before + * the first simulation, but not modified before later Simulate calls. + */ + double I_stim_; + double I_sic_; + }; + + // ---------------------------------------------------------------- + + /** + * Internal variables of the model. + */ + struct Variables_ + { + /** initial value to normalise excitatory synaptic conductance */ + double g0_ex_; + + /** initial value to normalise inhibitory synaptic conductance */ + double g0_in_; + + /** + * Threshold detection for spike events: P.V_peak if Delta_T > 0., + * P.V_th if Delta_T == 0. + */ + double V_peak; + + unsigned int refractory_counts_; + }; + + // Access functions for UniversalDataLogger ------------------------------- + + //! Read out state vector elements, used by UniversalDataLogger + template < State_::StateVecElems elem > + double + get_y_elem_() const + { + return S_.y_[ elem ]; + } + + // Read out SIC current + double + get_I_sic_() const + { + return B_.I_sic_; + } + + // ---------------------------------------------------------------- + + Parameters_ P_; + State_ S_; + Variables_ V_; + Buffers_ B_; + + //! Mapping of recordables names to access functions + static RecordablesMap< aeif_cond_alpha_astro > recordablesMap_; +}; + +inline size_t +aeif_cond_alpha_astro::send_test_event( Node& target, size_t receptor_type, synindex, bool ) +{ + SpikeEvent e; + e.set_sender( *this ); + + return target.handles_test_event( e, receptor_type ); +} + +inline size_t +aeif_cond_alpha_astro::handles_test_event( SpikeEvent&, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return 0; +} + +inline size_t +aeif_cond_alpha_astro::handles_test_event( CurrentEvent&, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return 0; +} + +inline size_t +aeif_cond_alpha_astro::handles_test_event( SICEvent&, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return 0; +} + +inline size_t +aeif_cond_alpha_astro::handles_test_event( DataLoggingRequest& dlr, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return B_.logger_.connect_logging_device( dlr, recordablesMap_ ); +} + +inline void +aeif_cond_alpha_astro::get_status( DictionaryDatum& d ) const +{ + P_.get( d ); + S_.get( d ); + ArchivingNode::get_status( d ); + + ( *d )[ names::recordables ] = recordablesMap_.get_list(); +} + +inline void +aeif_cond_alpha_astro::set_status( const DictionaryDatum& d ) +{ + Parameters_ ptmp = P_; // temporary copy in case of errors + ptmp.set( d, this ); // throws if BadProperty + State_ stmp = S_; // temporary copy in case of errors + stmp.set( d, ptmp, this ); // throws if BadProperty + + // We now know that (ptmp, stmp) are consistent. We do not + // write them back to (P_, S_) before we are also sure that + // the properties to be set in the parent class are internally + // consistent. + ArchivingNode::set_status( d ); + + // if we get here, temporaries contain consistent set of properties + P_ = ptmp; + S_ = stmp; +} + +} // namespace + +#endif // HAVE_GSL +#endif // AEIF_COND_ALPHA_ASTRO_H diff --git a/models/astrocyte_lr_1994.cpp b/models/astrocyte_lr_1994.cpp new file mode 100644 index 0000000000..03405e7de8 --- /dev/null +++ b/models/astrocyte_lr_1994.cpp @@ -0,0 +1,531 @@ +/* + * astrocyte_lr_1994.cpp + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + + +#include "astrocyte_lr_1994.h" + +#ifdef HAVE_GSL + +// C++ includes: +#include +#include +#include + +// Includes from libnestutil: +#include "dict_util.h" +#include "numerics.h" + +// Includes from nestkernel: +#include "exceptions.h" +#include "kernel_manager.h" +#include "universal_data_logger_impl.h" + +// Includes from sli: +#include "dictutils.h" + +nest::RecordablesMap< nest::astrocyte_lr_1994 > nest::astrocyte_lr_1994::recordablesMap_; + +namespace nest +{ +// Override the create() method with one call to RecordablesMap::insert_() +// for each quantity to be recorded. +template <> +void +RecordablesMap< astrocyte_lr_1994 >::create() +{ + // use standard names whereever you can for consistency! + insert_( names::IP3, &astrocyte_lr_1994::get_y_elem_< astrocyte_lr_1994::State_::IP3 > ); + insert_( names::Ca, &astrocyte_lr_1994::get_y_elem_< astrocyte_lr_1994::State_::Ca > ); + insert_( names::h_IP3R, &astrocyte_lr_1994::get_y_elem_< astrocyte_lr_1994::State_::h_IP3R > ); +} + +extern "C" int +astrocyte_lr_1994_dynamics( double time, const double y[], double f[], void* pnode ) +{ + // a shorthand + typedef nest::astrocyte_lr_1994::State_ S; + + // get access to node so we can almost work as in a member function + assert( pnode ); + const nest::astrocyte_lr_1994& node = *( reinterpret_cast< nest::astrocyte_lr_1994* >( pnode ) ); + + // y[] here is---and must be---the state vector supplied by the integrator, + // not the state vector in the node, node.S_.y[]. + + // The following code is verbose for the sake of clarity. We assume that a + // good compiler will optimize the verbosity away ... + + // shorthand for state variables + const double& ip3 = y[ S::IP3 ]; + // Ca_tot_ corresponds to the c_0 (total [Ca++] in terms of cytosolic vol) + // in De Young & Keizer (1992) and Li & Rinzel (1994) + const double& calc = std::max( 0.0, std::min( y[ S::Ca ], node.P_.Ca_tot_ ) ); // keep calcium within limits + const double& h_ip3r = y[ S::h_IP3R ]; + + const double alpha_h_ip3r = + node.P_.k_IP3R_ * node.P_.Kd_inh_ * ( ip3 + node.P_.Kd_IP3_1_ ) / ( ip3 + node.P_.Kd_IP3_2_ ); + const double beta_h_ip3r = node.P_.k_IP3R_ * calc; + const double J_pump = + node.P_.rate_SERCA_ * std::pow( calc, 2 ) / ( std::pow( node.P_.Km_SERCA_, 2 ) + std::pow( calc, 2 ) ); + const double m_inf = ip3 / ( ip3 + node.P_.Kd_IP3_1_ ); + const double n_inf = calc / ( calc + node.P_.Kd_act_ ); + const double calc_ER = ( node.P_.Ca_tot_ - calc ) / node.P_.ratio_ER_cyt_; + const double J_leak = node.P_.ratio_ER_cyt_ * node.P_.rate_L_ * ( calc_ER - calc ); + const double J_channel = node.P_.ratio_ER_cyt_ * node.P_.rate_IP3R_ * std::pow( m_inf, 3 ) * std::pow( n_inf, 3 ) + * std::pow( h_ip3r, 3 ) * ( calc_ER - calc ); + + f[ S::IP3 ] = ( node.P_.IP3_0_ - ip3 ) / node.P_.tau_IP3_; + f[ S::Ca ] = J_channel - J_pump + J_leak + node.B_.J_noise_; + f[ S::h_IP3R ] = alpha_h_ip3r * ( 1.0 - h_ip3r ) - beta_h_ip3r * h_ip3r; + + return GSL_SUCCESS; +} +} + +/* ---------------------------------------------------------------- + * Default constructors defining default parameters and state + * ---------------------------------------------------------------- */ + +nest::astrocyte_lr_1994::Parameters_::Parameters_() + // parameters based on Nadkarni & Jung (2003) + : Ca_tot_( 2.0 ) // µM + , IP3_0_( 0.16 ) // µM + , Kd_IP3_1_( 0.13 ) // µM + , Kd_IP3_2_( 0.9434 ) // µM + , Kd_act_( 0.08234 ) // µM + , Kd_inh_( 1.049 ) // µM + , Km_SERCA_( 0.1 ) // µM + , SIC_scale_( 1.0 ) + , SIC_th_( 0.19669 ) // µM + , delta_IP3_( 5.0 ) // µM + , k_IP3R_( 0.0002 ) // 1/(µM*ms) + , rate_IP3R_( 0.006 ) // 1/ms + , rate_L_( 0.00011 ) // 1/ms + , rate_SERCA_( 0.0009 ) // µM/ms + , ratio_ER_cyt_( 0.185 ) + , tau_IP3_( 7142.0 ) // ms +{ +} + +nest::astrocyte_lr_1994::State_::State_( const Parameters_& p ) +{ + // initial values based on Li & Rinzel (1994) and Nadkarni & Jung (2003) + y_[ IP3 ] = p.IP3_0_; + y_[ Ca ] = 0.073; + y_[ h_IP3R ] = 0.793; +} + +nest::astrocyte_lr_1994::State_::State_( const State_& s ) +{ + for ( size_t i = 0; i < STATE_VEC_SIZE; ++i ) + { + y_[ i ] = s.y_[ i ]; + } +} + +nest::astrocyte_lr_1994::State_& +nest::astrocyte_lr_1994::State_::operator=( const State_& s ) +{ + for ( size_t i = 0; i < STATE_VEC_SIZE; ++i ) + { + y_[ i ] = s.y_[ i ]; + } + return *this; +} + +/* ---------------------------------------------------------------- + * Parameter and state extractions and manipulation functions + * ---------------------------------------------------------------- */ + +void +nest::astrocyte_lr_1994::Parameters_::get( DictionaryDatum& d ) const +{ + def< double >( d, names::Ca_tot, Ca_tot_ ); + def< double >( d, names::IP3_0, IP3_0_ ); + def< double >( d, names::Kd_act, Kd_act_ ); + def< double >( d, names::Kd_inh, Kd_inh_ ); + def< double >( d, names::Kd_IP3_1, Kd_IP3_1_ ); + def< double >( d, names::Kd_IP3_2, Kd_IP3_2_ ); + def< double >( d, names::Km_SERCA, Km_SERCA_ ); + def< double >( d, names::ratio_ER_cyt, ratio_ER_cyt_ ); + def< double >( d, names::delta_IP3, delta_IP3_ ); + def< double >( d, names::k_IP3R, k_IP3R_ ); + def< double >( d, names::SIC_scale, SIC_scale_ ); + def< double >( d, names::SIC_th, SIC_th_ ); + def< double >( d, names::rate_L, rate_L_ ); + def< double >( d, names::rate_IP3R, rate_IP3R_ ); + def< double >( d, names::rate_SERCA, rate_SERCA_ ); + def< double >( d, names::tau_IP3, tau_IP3_ ); +} + +void +nest::astrocyte_lr_1994::Parameters_::set( const DictionaryDatum& d, Node* node ) +{ + updateValueParam< double >( d, names::Ca_tot, Ca_tot_, node ); + updateValueParam< double >( d, names::IP3_0, IP3_0_, node ); + updateValueParam< double >( d, names::Kd_act, Kd_act_, node ); + updateValueParam< double >( d, names::Kd_inh, Kd_inh_, node ); + updateValueParam< double >( d, names::Kd_IP3_1, Kd_IP3_1_, node ); + updateValueParam< double >( d, names::Kd_IP3_2, Kd_IP3_2_, node ); + updateValueParam< double >( d, names::Km_SERCA, Km_SERCA_, node ); + updateValueParam< double >( d, names::ratio_ER_cyt, ratio_ER_cyt_, node ); + updateValueParam< double >( d, names::delta_IP3, delta_IP3_, node ); + updateValueParam< double >( d, names::k_IP3R, k_IP3R_, node ); + updateValueParam< double >( d, names::SIC_scale, SIC_scale_, node ); + updateValueParam< double >( d, names::SIC_th, SIC_th_, node ); + updateValueParam< double >( d, names::rate_L, rate_L_, node ); + updateValueParam< double >( d, names::rate_IP3R, rate_IP3R_, node ); + updateValueParam< double >( d, names::rate_SERCA, rate_SERCA_, node ); + updateValueParam< double >( d, names::tau_IP3, tau_IP3_, node ); + + if ( Ca_tot_ <= 0 ) + { + throw BadProperty( "Total free astrocytic calcium concentration in terms of cytosolic volume must be positive." ); + } + if ( IP3_0_ < 0 ) + { + throw BadProperty( "Baseline value of the astrocytic IP3 concentration must be non-negative." ); + } + if ( Kd_act_ <= 0 ) + { + throw BadProperty( "Astrocytic IP3R dissociation constant of calcium (activation) must be positive." ); + } + if ( Kd_inh_ < 0 ) + { + throw BadProperty( "Astrocytic IP3R dissociation constant of calcium (inhibition) must be non-negative." ); + } + if ( Kd_IP3_1_ <= 0 ) + { + throw BadProperty( "First astrocytic IP3R dissociation constant of IP3 must be positive." ); + } + if ( Kd_IP3_2_ <= 0 ) + { + throw BadProperty( "Second astrocytic IP3R dissociation constant of IP3 must be positive." ); + } + if ( Km_SERCA_ <= 0 ) + { + throw BadProperty( "Activation constant of astrocytic SERCA pump must be positive." ); + } + if ( ratio_ER_cyt_ <= 0 ) + { + throw BadProperty( "Ratio between astrocytic ER and cytosol volumes must be positive." ); + } + if ( delta_IP3_ < 0 ) + { + throw BadProperty( + "Parameter determining the increase in astrocytic IP3 concentration induced by synaptic input must be " + "non-negative." ); + } + if ( k_IP3R_ < 0 ) + { + throw BadProperty( "Astrocytic IP3R binding constant for calcium inhibition must be non-negative." ); + } + if ( SIC_scale_ <= 0 ) + { + throw BadProperty( "Parameter determining the scale of astrocytic SIC output must be positive." ); + } + if ( SIC_th_ < 0 ) + { + throw BadProperty( + "Threshold that determines the minimal level of intracellular astrocytic calcium sufficient to induce SIC must " + "be non-negative." ); + } + if ( rate_L_ < 0 ) + { + throw BadProperty( "Rate constant of calcium leak from astrocytic ER to cytosol must be non-negative." ); + } + if ( rate_IP3R_ < 0 ) + { + throw BadProperty( "Maximum rate of calcium release via astrocytic IP3R must be non-negative." ); + } + if ( rate_SERCA_ < 0 ) + { + throw BadProperty( "Maximum rate of calcium uptake by astrocytic SERCA pump must be non-negative." ); + } + if ( tau_IP3_ <= 0 ) + { + throw BadProperty( "Time constant of the exponential decay of astrocytic IP3 must be positive." ); + } +} + +void +nest::astrocyte_lr_1994::State_::get( DictionaryDatum& d ) const +{ + def< double >( d, names::IP3, y_[ IP3 ] ); + def< double >( d, names::Ca, y_[ Ca ] ); + def< double >( d, names::h_IP3R, y_[ h_IP3R ] ); +} + +void +nest::astrocyte_lr_1994::State_::set( const DictionaryDatum& d, const Parameters_&, Node* node ) +{ + updateValueParam< double >( d, names::IP3, y_[ IP3 ], node ); + updateValueParam< double >( d, names::Ca, y_[ Ca ], node ); + updateValueParam< double >( d, names::h_IP3R, y_[ h_IP3R ], node ); + + if ( y_[ IP3 ] < 0 ) + { + throw BadProperty( "IP3 concentration must be non-negative." ); + } + if ( y_[ Ca ] < 0 ) + { + throw BadProperty( "Calcium concentration must be non-negative." ); + } + if ( y_[ h_IP3R ] < 0 || y_[ h_IP3R ] > 1 ) + { + throw BadProperty( "The fraction of active IP3 receptors on the astrocytic ER must be between 0 and 1." ); + } +} + +nest::astrocyte_lr_1994::Buffers_::Buffers_( astrocyte_lr_1994& n ) + : logger_( n ) + , s_( nullptr ) + , c_( nullptr ) + , e_( nullptr ) +{ + // Initialization of the remaining members is deferred to + // init_buffers_(). +} + +nest::astrocyte_lr_1994::Buffers_::Buffers_( const Buffers_&, astrocyte_lr_1994& n ) + : logger_( n ) + , s_( nullptr ) + , c_( nullptr ) + , e_( nullptr ) +{ + // Initialization of the remaining members is deferred to + // init_buffers_(). +} + +/* ---------------------------------------------------------------- + * Default and copy constructor for node, and destructor + * ---------------------------------------------------------------- */ + +nest::astrocyte_lr_1994::astrocyte_lr_1994() + : ArchivingNode() + , P_() + , S_( P_ ) + , B_( *this ) +{ + recordablesMap_.create(); +} + +nest::astrocyte_lr_1994::astrocyte_lr_1994( const astrocyte_lr_1994& n ) + : ArchivingNode( n ) + , P_( n.P_ ) + , S_( n.S_ ) + , B_( n.B_, *this ) +{ +} + +nest::astrocyte_lr_1994::~astrocyte_lr_1994() +{ + // GSL structs may not have been allocated, so we need to protect destruction + if ( B_.s_ ) + { + gsl_odeiv_step_free( B_.s_ ); + } + if ( B_.c_ ) + { + gsl_odeiv_control_free( B_.c_ ); + } + if ( B_.e_ ) + { + gsl_odeiv_evolve_free( B_.e_ ); + } +} + +/* ---------------------------------------------------------------- + * Node initialization functions + * ---------------------------------------------------------------- */ + +void +nest::astrocyte_lr_1994::init_buffers_() +{ + B_.spike_exc_.clear(); // includes resize + B_.currents_.clear(); + B_.sic_values.resize( + kernel().connection_manager.get_min_delay(), 0.0 ); // set size of SIC buffer according to min_delay + + ArchivingNode::clear_history(); + + B_.logger_.reset(); + + B_.step_ = Time::get_resolution().get_ms(); + B_.IntegrationStep_ = B_.step_; + + if ( not B_.s_ ) + { + B_.s_ = gsl_odeiv_step_alloc( gsl_odeiv_step_rkf45, State_::STATE_VEC_SIZE ); + } + else + { + gsl_odeiv_step_reset( B_.s_ ); + } + + if ( not B_.c_ ) + { + B_.c_ = gsl_odeiv_control_y_new( 1e-3, 0.0 ); + } + else + { + gsl_odeiv_control_init( B_.c_, 1e-3, 0.0, 1.0, 0.0 ); + } + + if ( not B_.e_ ) + { + B_.e_ = gsl_odeiv_evolve_alloc( State_::STATE_VEC_SIZE ); + } + else + { + gsl_odeiv_evolve_reset( B_.e_ ); + } + + B_.sys_.function = astrocyte_lr_1994_dynamics; + B_.sys_.jacobian = nullptr; + B_.sys_.dimension = State_::STATE_VEC_SIZE; + B_.sys_.params = reinterpret_cast< void* >( this ); + + B_.J_noise_ = 0.0; +} + +void +nest::astrocyte_lr_1994::pre_run_hook() +{ + // ensures initialization in case mm connected after Simulate + B_.logger_.init(); +} + +/* ---------------------------------------------------------------- + * Update and spike handling functions + * + * Spikes are not generated by astrocytes and the related functions + * are not needed. However, it is kept here to avoid possible + * inconsistencies with the rest of the code. + * TO DO: Check how to safely remove spike handling functions. + * ---------------------------------------------------------------- */ + +inline void +nest::astrocyte_lr_1994::update( Time const& origin, const long from, const long to ) +{ + for ( long lag = from; lag < to; ++lag ) + { + double t = 0.0; + + // numerical integration with adaptive step size control: + // ------------------------------------------------------ + // gsl_odeiv_evolve_apply performs only a single numerical + // integration step, starting from t and bounded by step; + // the while-loop ensures integration over the whole simulation + // step (0, step] if more than one integration step is needed due + // to a small integration step size; + // note that (t+IntegrationStep > step) leads to integration over + // (t, step] and afterwards setting t to step, but it does not + // enforce setting IntegrationStep to step-t; this is of advantage + // for a consistent and efficient integration across subsequent + // simulation intervals + while ( t < B_.step_ ) + { + const int status = gsl_odeiv_evolve_apply( B_.e_, + B_.c_, + B_.s_, + &B_.sys_, // system of ODE + &t, // from t + B_.step_, // to t <= step + &B_.IntegrationStep_, // integration step size + S_.y_ ); // neuronal state + if ( status != GSL_SUCCESS ) + { + throw GSLSolverFailure( get_name(), status ); + } + } + + // keep calcium within limits + S_.y_[ State_::Ca ] = std::max( 0.0, std::min( S_.y_[ State_::Ca ], P_.Ca_tot_ ) ); + + // this is to add the incoming spikes to IP3 + S_.y_[ State_::IP3 ] += P_.delta_IP3_ * B_.spike_exc_.get_value( lag ); + + // SIC generation according to Nadkarni & Jung, 2003 + // Suprathreshold log of calcium concentration determines SIC generation + // 1000.0: change unit to nM as in the original paper + const double calc_thr = ( S_.y_[ State_::Ca ] - P_.SIC_th_ ) * 1000.0; + const double sic_value = calc_thr > 1.0 ? std::log( calc_thr ) * P_.SIC_scale_ : 0.0; + B_.sic_values[ lag ] = sic_value; + + // log state data + B_.logger_.record_data( origin.get_steps() + lag ); + + // set new input current + B_.J_noise_ = B_.currents_.get_value( lag ); + } + + // send SIC event + SICEvent sic; + sic.set_coeffarray( B_.sic_values ); + kernel().event_delivery_manager.send_secondary( *this, sic ); +} + +/** + * Default implementation of register_stdp_connection() just + * throws IllegalConnection + */ +void +nest::astrocyte_lr_1994::register_stdp_connection( double, double ) +{ + throw IllegalConnection( "The target node does not support STDP synapses." ); +} + +void +nest::astrocyte_lr_1994::handle( SpikeEvent& e ) +{ + assert( e.get_delay_steps() > 0 ); + + if ( e.get_weight() >= 0.0 ) + { + B_.spike_exc_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), + e.get_weight() * e.get_multiplicity() ); + } + else + { + throw KernelException( "astrocyte_lr_1994 cannot handle input spikes with negative weights." ); + } +} + +void +nest::astrocyte_lr_1994::handle( CurrentEvent& e ) +{ + assert( e.get_delay_steps() > 0 ); + + const double c = e.get_current(); + const double w = e.get_weight(); + + B_.currents_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), w * c ); +} + +void +nest::astrocyte_lr_1994::handle( DataLoggingRequest& e ) +{ + B_.logger_.handle( e ); +} + +#endif // HAVE_GSL diff --git a/models/astrocyte_lr_1994.h b/models/astrocyte_lr_1994.h new file mode 100644 index 0000000000..4dd2995395 --- /dev/null +++ b/models/astrocyte_lr_1994.h @@ -0,0 +1,497 @@ +/* + * astrocyte_lr_1994.h + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + +#ifndef ASTROCYTE_LR_1994_H +#define ASTROCYTE_LR_1994_H + +#include "config.h" + +#ifdef HAVE_GSL + +// C includes: +#include +#include +#include +#include + +// Includes from nestkernel: +#include "archiving_node.h" +#include "connection.h" +#include "event.h" +#include "nest_types.h" +#include "node.h" +#include "recordables_map.h" +#include "ring_buffer.h" +#include "universal_data_logger.h" + +namespace nest +{ + +/** + * Function computing right-hand side of ODE for GSL solver. + * @note Must be declared here so we can befriend it in class. + * @note Must have C-linkage for passing to GSL. Internally, it is + * a first-class C++ function, but cannot be a member function + * because of the C-linkage. + * @note No point in declaring it inline, since it is called + * through a function pointer. + * @param void* Pointer to model neuron instance. + */ +extern "C" int astrocyte_lr_1994_dynamics( double, const double*, double*, void* ); + +/* BeginUserDocs: astrocyte + +Short description ++++++++++++++++++ + +An astrocyte model based on Li & Rinzel (1994) + +Description ++++++++++++ + +``astrocyte_lr_1994`` is a model of astrocytic calcium dynamics. The model was +first proposed by Li & Rinzel (1994) [1]_ and it is based on earlier work of De +Young & Kaiser (1992) [2]_. The input and output of the model are implemented +according to Nadkarni & Jung (2003) [3]_. + +The model has three dynamic state variables: the concentration of inositol +1,4,5-trisphosphate in the astrocyte (:math:`\mathrm{[IP3]}`), the calcium +concentration in the astrocytic cytosol (:math:`\mathrm{[Ca^{2+}]}`), and the +fraction of IP3 receptors on the astrocytic endoplasmic reticulum (ER) that are +not yet inactivated by calcium (:math:`h_\mathrm{IP3R}`). + +In this model, excitatory synaptic inputs to the astrocyte trigger IP3 +generation and change in calcium dynamics in the astrocyte. This might induce an +astrocytic output in the form of a slow inward current (SIC), which is dependent +on its calcium dynamics, to its target neurons. The input and output are based +on the equations in [3]_ but with adaptations, as described in the following. + +Spike input +----------- + +The astrocyte receives inputs from excitatory (glutamatergic) +synapses. The synaptic inputs directly affect IP3 concentration according to the +following equation: + +.. math:: + + \frac{d[\mathrm{IP3}]}{dt} = + \frac{[\mathrm{IP3}]_0 - [\mathrm{IP3}]}{\tau_\mathrm{IP3}} + \Delta_\mathrm{IP3} \cdot J_\mathrm{syn}(t) + +In the absence of inputs, :math:`\mathrm{[IP3]}` decays to its baseline value +(:math:`[\mathrm{IP3}]_0`) with the time constant (:math:`\tau_\mathrm{IP3}`). Each time when an +astrocyte receives an excitatory synaptic input, it triggers an instantaneous +increase of :math:`\mathrm{[IP3]}`. In this implementation, the inputs are spike events +sent from neurons or generators. The summed synaptic weight the astrocyte receives at time +:math:`t` is given by :math:`J_\mathrm{syn}(t)`. The parameter +:math:`\Delta_\mathrm{IP3}` scales the impact of synaptic inputs on the +IP3 dynamics. + +Calcium current input +--------------------- + +In this implementation, a current input to the astrocyte is directly +added to its cytosolic calcium concentration. Generators that send out currents +can be connected to astrocytes to directly generate fluctuations in cytosolic +calcium: + +.. math:: + + \frac{d[\mathrm{Ca^{2+}}]}{dt} = + J_\mathrm{channel} - J_\mathrm{pump} + J_\mathrm{leak} + J_\mathrm{noise} + +Here, :math:`\mathrm{[Ca^{2+}]}` is the cytosolic calcium concentration, and +:math:`J_\mathrm{noise}` is the current input. :math:`J_\mathrm{channel}`, +:math:`J_\mathrm{pump}`, :math:`J_\mathrm{leak}` are the calcium fluxes defined +as in [3]_. + +Output +------ + +If the astrocyte receives excitatory synaptic inputs, it might +output SIC to its target neurons. This current depends on the cytosolic +calcium concentration. This dependency is modeled according to the expressions +first proposed in [3]: + +.. math:: + + I_\mathrm{SIC} = \mathrm{SIC_{scale}} \cdot \mathrm{H}\left(\mathrm{ln}(y)\right) \cdot \mathrm{ln}(y) + +where + +.. math:: + + y = \left( \mathrm{[Ca^{2+}]} - \mathrm{SIC_{th}} \right)/\mathrm{nM} + +When the cytosolic calcium concentration of the astrocyte exceeds the threshold +value (:math:`\mathrm{SIC_{th}}`), a SIC output (:math:`I_\mathrm{SIC}`) is +generated. This thresholding is modeled as a Heaviside function +(:math:`\mathrm{H(\cdot)}`). In this implementation, the SIC threshold +:math:`\mathrm{SIC_{th}}` as well as the scaling constant +:math:`\mathrm{SIC_{scale}}` are treated as model parameters that can be set +together with other parameters. Nadkarni & Jung (2003) [3]_ proposed values for +these parameters by fitting the equation for SIC to an experimental data set. + +The output is implemented as SICEvent sent from the astrocyte to its target +neurons through the ``sic_connection``. + +For the reference implementation of this model, see the +`astrocyte_model_implementation <../model_details/astrocyte_model_implementation.ipynb>`_ notebook. + +See also [1]_, [2]_, [3]_. + +Parameters +++++++++++ + +The following parameters can be set in the status dictionary. + +====== ========= ============================================================= +**Dynamic state variables** +------------------------------------------------------------------------------- +IP3 µM Inositol 1,4,5-trisphosphate concentration in the astrocytic + cytosol +Ca µM Calcium concentration in the astrocytic cytosol +h_IP3R unitless Fraction of IP3 receptors on the astrocytic ER that are not + yet inactivated by calcium +====== ========= ============================================================= + +=============== ========= ===================================================== +**Parameters** +------------------------------------------------------------------------------- +Ca_tot µM Total free astrocytic calcium concentration in terms + of cytosolic volume +IP3_0 µM Baseline value of astrocytic IP3 concentration +Kd_IP3_1 µM First astrocytic IP3R dissociation constant of IP3 +Kd_IP3_2 µM Second astrocytic IP3R dissociation constant of IP3 +Kd_act µM Astrocytic IP3R dissociation constant of calcium + (activation) +Kd_inh µM Astrocytic IP3R dissociation constant of calcium + (inhibition) +Km_SERCA µM Half-activation constant of astrocytic SERCA pump +SIC_scale unitless Parameter determining the scale of astrocytic SIC + output +SIC_th µM Threshold that determines the minimal level of + astrocytic cytosolic calcium sufficient to induce + SIC +delta_IP3 µM Parameter determining the increase in astrocytic IP3 + concentration induced by synaptic input +k_IP3R 1/(µM*ms) Astrocytic IP3R binding constant for calcium + inhibition +rate_IP3R 1/ms Maximum rate of calcium release via astrocytic IP3R +rate_L 1/ms Rate constant of calcium leak from astrocytic ER to + cytosol +rate_SERCA µM/ms Maximum rate of calcium uptake by astrocytic SERCA + pump +ratio_ER_cyt unitless Ratio between astrocytic ER and cytosol volumes +tau_IP3 ms Time constant of the exponential decay of astrocytic + IP3 +=============== ========= ===================================================== + +References +++++++++++ + +.. [1] Li, Y. X., & Rinzel, J. (1994). Equations for InsP3 receptor-mediated + [Ca2+]i oscillations derived from a detailed kinetic model: a + Hodgkin-Huxley like formalism. Journal of theoretical Biology, 166(4), + 461-473. DOI: https://doi.org/10.1006/jtbi.1994.1041 + +.. [2] De Young, G. W., & Keizer, J. (1992). A single-pool inositol + 1,4,5-trisphosphate-receptor-based model for agonist-stimulated + oscillations in Ca2+ concentration. Proceedings of the National Academy + of Sciences, 89(20), 9895-9899. DOI: + https://doi.org/10.1073/pnas.89.20.9895 + +.. [3] Nadkarni, S., & Jung, P. (2003). Spontaneous oscillations of dressed + neurons: a new mechanism for epilepsy?. Physical review letters, 91(26), + 268101. DOI: https://doi.org/10.1103/PhysRevLett.91.268101 + +Sends ++++++ + +SICEvent + +Receives +++++++++ + +SpikeEvent, DataLoggingRequest + +See also +++++++++ + +aeif_cond_alpha_astro, sic_connection + +EndUserDocs */ + +class astrocyte_lr_1994 : public ArchivingNode +{ + +public: + astrocyte_lr_1994(); + astrocyte_lr_1994( const astrocyte_lr_1994& ); + ~astrocyte_lr_1994() override; + + /** + * Import sets of overloaded virtual functions. + * @see Technical Issues / Virtual Functions: Overriding, Overloading, and + * Hiding + */ + using Node::handle; + using Node::handles_test_event; + using Node::sends_secondary_event; + + + void handle( SpikeEvent& ) override; + void handle( CurrentEvent& ) override; + void handle( DataLoggingRequest& ) override; + + size_t handles_test_event( SpikeEvent&, size_t ) override; + size_t handles_test_event( CurrentEvent&, size_t ) override; + size_t handles_test_event( DataLoggingRequest&, size_t ) override; + + void + sends_secondary_event( SICEvent& ) override + { + } + + // disable the use of STDP connections in this model + void register_stdp_connection( double t_first_read, double delay ) override; + + void get_status( DictionaryDatum& ) const override; + void set_status( const DictionaryDatum& ) override; + +private: + void init_buffers_() override; + void pre_run_hook() override; + + /** This is the actual update function. The additional boolean parameter + * determines if the function is called by update (false) or wfr_update (true) + */ + // bool update_( Time const&, const long, const long, const bool ); + + void update( Time const&, const long, const long ) override; + + // END Boilerplate function declarations ---------------------------- + + // Friends -------------------------------------------------------- + + // make dynamics function quasi-member + friend int astrocyte_lr_1994_dynamics( double, const double*, double*, void* ); + + // The next two classes need to be friend to access the State_ class/member + friend class RecordablesMap< astrocyte_lr_1994 >; + friend class UniversalDataLogger< astrocyte_lr_1994 >; + + // ---------------------------------------------------------------- + + //! Model parameters + struct Parameters_ + { + // parameters based on Nadkarni & Jung (2003) + double Ca_tot_; //!< Total free astrocytic calcium concentration in terms of cytosolic volume in µM + double IP3_0_; //!< Baseline value of the astrocytic IP3 concentration in µM + double Kd_IP3_1_; //!< First astrocytic IP3R dissociation constant of IP3 in µM + double Kd_IP3_2_; //!< Second astrocytic IP3R dissociation constant of IP3 in µM + double Kd_act_; //!< Astrocytic IP3R dissociation constant of calcium (activation) in µM + double Kd_inh_; //!< Astrocytic IP3R dissociation constant of calcium (inhibition) in µM + double Km_SERCA_; //!< Half-activation constant of astrocytic SERCA pump in µM + double SIC_scale_; //!< Parameter determining the scale of astrocytic SIC output + double SIC_th_; //!< Threshold that determines the minimal level of intracellular astrocytic calcium sufficient to + //!< induce SIC in µM + double delta_IP3_; //!< Parameter determining the increase in astrocytic IP3 concentration induced by synaptic input + //!< in µM + double k_IP3R_; //!< Astrocytic IP3R binding constant for calcium inhibition in 1/(µM*ms) + double rate_IP3R_; //!< Maximum rate of calcium release via astrocytic IP3R in 1/ms + double rate_L_; //!< Rate constant of calcium leak from astrocytic ER to cytosol in 1/ms + double rate_SERCA_; //!< Maximum rate of calcium uptake by astrocytic SERCA pump in µM/ms + double ratio_ER_cyt_; //!< Ratio between astrocytic ER and cytosol volumes + double tau_IP3_; //!< Time constant of the exponential decay of astrocytic IP3 in ms + + Parameters_(); //!< Sets default parameter values + + void get( DictionaryDatum& ) const; //!< Store current values in dictionary + void set( const DictionaryDatum&, Node* node ); //!< Set values from dicitonary + }; + +public: + // ---------------------------------------------------------------- + + /** + * State variables of the model. + * @note Copy constructor required because of C-style array. + */ + struct State_ + { + + /** + * Enumeration identifying elements in state array State_::y_. + * The state vector must be passed to GSL as a C array. This enum + * identifies the elements of the vector. It must be public to be + * accessible from the iteration function. + */ + enum StateVecElems + { + IP3 = 0, + Ca, // 1 + h_IP3R, // 2 + STATE_VEC_SIZE + }; + + //! cell state, must be C-array for GSL solver + double y_[ STATE_VEC_SIZE ]; + + State_( const Parameters_& ); //!< Default initialization + State_( const State_& ); + + State_& operator=( const State_& ); + + void get( DictionaryDatum& ) const; + void set( const DictionaryDatum&, const Parameters_&, Node* ); + }; + + // ---------------------------------------------------------------- + + /** + * Buffers of the model. + */ + struct Buffers_ + { + Buffers_( astrocyte_lr_1994& ); //!< Sets buffer pointers to 0 + Buffers_( const Buffers_&, astrocyte_lr_1994& ); //!< Sets buffer pointers to 0 + + //! Logger for all analog data + UniversalDataLogger< astrocyte_lr_1994 > logger_; + + /** buffers and sums up incoming spikes/currents */ + RingBuffer spike_exc_; + RingBuffer currents_; + + /** GSL ODE stuff */ + gsl_odeiv_step* s_; //!< stepping function + gsl_odeiv_control* c_; //!< adaptive stepsize control function + gsl_odeiv_evolve* e_; //!< evolution function + gsl_odeiv_system sys_; //!< struct describing system + + // Since IntergrationStep_ is initialized with step_, and the resolution + // cannot change after nodes have been created, it is safe to place both + // here. + double step_; //!< step size in ms + double IntegrationStep_; //!< current integration time step, updated by GSL + + /** + * Input current injected by CurrentEvent. + * This variable is used to transport the current applied into the + * _dynamics function computing the derivative of the state vector. + * It must be a part of Buffers_, since it is initialized once before + * the first simulation, but not modified before later Simulate calls. + */ + double J_noise_; + + // values to be sent by SIC event + std::vector< double > sic_values; + }; + + // ---------------------------------------------------------------- + + // Access functions for UniversalDataLogger ------------------------------- + + //! Read out state vector elements, used by UniversalDataLogger + template < State_::StateVecElems elem > + double + get_y_elem_() const + { + return S_.y_[ elem ]; + } + + // ---------------------------------------------------------------- + + Parameters_ P_; + State_ S_; + Buffers_ B_; + + //! Mapping of recordables names to access functions + static RecordablesMap< astrocyte_lr_1994 > recordablesMap_; +}; + + +inline size_t +astrocyte_lr_1994::handles_test_event( SpikeEvent&, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return 0; +} + +inline size_t +astrocyte_lr_1994::handles_test_event( CurrentEvent&, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return 0; +} + +inline size_t +astrocyte_lr_1994::handles_test_event( DataLoggingRequest& dlr, size_t receptor_type ) +{ + if ( receptor_type != 0 ) + { + throw UnknownReceptorType( receptor_type, get_name() ); + } + return B_.logger_.connect_logging_device( dlr, recordablesMap_ ); +} + +inline void +astrocyte_lr_1994::get_status( DictionaryDatum& d ) const +{ + P_.get( d ); + S_.get( d ); + ArchivingNode::get_status( d ); + + ( *d )[ names::recordables ] = recordablesMap_.get_list(); +} + +inline void +astrocyte_lr_1994::set_status( const DictionaryDatum& d ) +{ + Parameters_ ptmp = P_; // temporary copy in case of errors + ptmp.set( d, this ); // throws if BadProperty + State_ stmp = S_; // temporary copy in case of errors + stmp.set( d, ptmp, this ); // throws if BadProperty + + // We now know that (ptmp, stmp) are consistent. We do not + // write them back to (P_, S_) before we are also sure that + // the properties to be set in the parent class are internally + // consistent. + ArchivingNode::set_status( d ); + + // if we get here, temporaries contain consistent set of properties + P_ = ptmp; + S_ = stmp; +} + +} // namespace + +#endif // HAVE_GSL +#endif // ASTROCYTE_LR_1994_H diff --git a/models/sic_connection.h b/models/sic_connection.h new file mode 100644 index 0000000000..668b13b368 --- /dev/null +++ b/models/sic_connection.h @@ -0,0 +1,164 @@ +/* + * sic_connection.h + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + +#ifndef SIC_CONNECTION_H +#define SIC_CONNECTION_H + +#include "connection.h" + +namespace nest +{ + +/* BeginUserDocs: synapse, astrocyte + +Short description ++++++++++++++++++ + +Synapse type for astrocyte-neuron connections + +Description ++++++++++++ + +``sic_connection`` connects an astrocyte to a target neuron. It exposes the target neuron to a slow inward current (SIC) +induced by the astrocyte. The amplitude of the current is the product of the astrocytic current and the weight of the +``sic_connection``. + +The source node of a ``sic_connection`` must be an astrocyte emitting a slow inward current, and the target node must be +able to handle slow inward current input. Currently, :doc:`aeif_conda_alpha_astro` is the only neuron model that can +receive ``sic_connection``. The connection may have a delay. + +Sends ++++++ + +SICEvent + +See also +++++++++ + +astrocyte_lr_1994, aeif_cond_alpha_astro + +EndUserDocs */ + +template < typename targetidentifierT > +class sic_connection : public Connection< targetidentifierT > +{ + +public: + // this line determines which common properties to use + typedef CommonSynapseProperties CommonPropertiesType; + typedef Connection< targetidentifierT > ConnectionBase; + typedef SICEvent EventType; + static constexpr ConnectionModelProperties properties = ConnectionModelProperties::HAS_DELAY; + + /** + * Default Constructor. + * Sets default values for all parameters. Needed by GenericConnectorModel. + */ + sic_connection() + : ConnectionBase() + , weight_( 1.0 ) + { + } + + SecondaryEvent* get_secondary_event(); + + // Explicitly declare all methods inherited from the dependent base + // ConnectionBase. This avoids explicit name prefixes in all places these + // functions are used. Since ConnectionBase depends on the template parameter, + // they are not automatically found in the base class. + using ConnectionBase::get_delay_steps; + using ConnectionBase::get_rport; + using ConnectionBase::get_target; + + void + check_connection( Node& s, Node& t, size_t receptor_type, const CommonPropertiesType& ) + { + EventType ge; + + s.sends_secondary_event( ge ); + ge.set_sender( s ); + Connection< targetidentifierT >::target_.set_rport( t.handles_test_event( ge, receptor_type ) ); + Connection< targetidentifierT >::target_.set_target( &t ); + } + + /** + * Send an event to the receiver of this connection. + * \param e The event to send + * \param p The port under which this connection is stored in the Connector. + */ + void + send( Event& e, size_t t, const CommonSynapseProperties& ) + { + e.set_weight( weight_ ); + e.set_delay_steps( get_delay_steps() ); + e.set_receiver( *get_target( t ) ); + e.set_rport( get_rport() ); + e(); + } + + void get_status( DictionaryDatum& d ) const; + + void set_status( const DictionaryDatum& d, ConnectorModel& cm ); + + void + set_weight( double w ) + { + weight_ = w; + } + +private: + double weight_; //!< connection weight +}; + +template < typename targetidentifierT > +constexpr ConnectionModelProperties sic_connection< targetidentifierT >::properties; + +template < typename targetidentifierT > +void +sic_connection< targetidentifierT >::get_status( DictionaryDatum& d ) const +{ + // We have to include the delay here to prevent + // errors due to internal calls of + // this function in SLI/pyNEST + ConnectionBase::get_status( d ); + def< double >( d, names::weight, weight_ ); + def< long >( d, names::size_of, sizeof( *this ) ); +} + +template < typename targetidentifierT > +SecondaryEvent* +sic_connection< targetidentifierT >::get_secondary_event() +{ + return new SICEvent(); +} + +template < typename targetidentifierT > +void +sic_connection< targetidentifierT >::set_status( const DictionaryDatum& d, ConnectorModel& cm ) +{ + ConnectionBase::set_status( d, cm ); + updateValue< double >( d, names::weight, weight_ ); +} + +} // namespace + +#endif /* #ifndef SIC_CONNECTION_H */ diff --git a/modelsets/full b/modelsets/full index 9f7ff8bbed..16704a8d0f 100644 --- a/modelsets/full +++ b/modelsets/full @@ -3,6 +3,7 @@ ac_generator aeif_cond_alpha +aeif_cond_alpha_astro aeif_cond_alpha_multisynapse aeif_cond_beta_multisynapse aeif_cond_exp @@ -11,6 +12,7 @@ aeif_psc_exp aeif_psc_delta aeif_psc_delta_clopath amat2_psc_exp +astrocyte_lr_1994 bernoulli_synapse cm_default clopath_synapse @@ -84,6 +86,7 @@ pulsepacket_generator quantal_stp_synapse rate_connection_delayed rate_connection_instantaneous +sic_connection siegert_neuron sigmoid_rate sigmoid_rate_gg_1998 diff --git a/nestkernel/event.cpp b/nestkernel/event.cpp index a0dca0b17b..6af31424d9 100644 --- a/nestkernel/event.cpp +++ b/nestkernel/event.cpp @@ -150,4 +150,10 @@ DiffusionConnectionEvent::operator()() receiver_->handle( *this ); } +void +SICEvent::operator()() +{ + receiver_->handle( *this ); +} + } // namespace nest diff --git a/nestkernel/genericmodel.h b/nestkernel/genericmodel.h index b95661c8cf..91509e4d0a 100644 --- a/nestkernel/genericmodel.h +++ b/nestkernel/genericmodel.h @@ -81,6 +81,8 @@ class GenericModel : public Model void sends_secondary_event( DelayedRateConnectionEvent& re ) override; + void sends_secondary_event( SICEvent& sic ) override; + Node const& get_prototype() const override; void set_model_id( int ) override; @@ -213,6 +215,13 @@ GenericModel< ElementT >::sends_secondary_event( DelayedRateConnectionEvent& re return proto_.sends_secondary_event( re ); } +template < typename ElementT > +inline void +GenericModel< ElementT >::sends_secondary_event( SICEvent& sic ) +{ + return proto_.sends_secondary_event( sic ); +} + template < typename ElementT > inline nest::SignalType GenericModel< ElementT >::sends_signal() const diff --git a/nestkernel/model.h b/nestkernel/model.h index 231228f7ce..7bd8942a62 100644 --- a/nestkernel/model.h +++ b/nestkernel/model.h @@ -159,6 +159,7 @@ class Model virtual void sends_secondary_event( InstantaneousRateConnectionEvent& re ) = 0; virtual void sends_secondary_event( DiffusionConnectionEvent& de ) = 0; virtual void sends_secondary_event( DelayedRateConnectionEvent& re ) = 0; + virtual void sends_secondary_event( SICEvent& sic ) = 0; /** * Check what type of signal this model is sending. diff --git a/nestkernel/nest_names.cpp b/nestkernel/nest_names.cpp index 79062793d5..d24e1f1968 100644 --- a/nestkernel/nest_names.cpp +++ b/nestkernel/nest_names.cpp @@ -26,10 +26,6 @@ namespace nest namespace names { - -const Name AMPA( "AMPA" ); -const Name ASCurrents( "ASCurrents" ); -const Name ASCurrents_sum( "ASCurrents_sum" ); const Name A_LTD( "A_LTD" ); const Name A_LTD_const( "A_LTD_const" ); const Name A_LTP( "A_LTP" ); @@ -37,10 +33,13 @@ const Name A_minus( "A_minus" ); const Name A_plus( "A_plus" ); const Name Act_m( "Act_m" ); const Name Act_n( "Act_n" ); +const Name AMPA( "AMPA" ); const Name Aminus( "Aminus" ); const Name Aminus_triplet( "Aminus_triplet" ); const Name Aplus( "Aplus" ); const Name Aplus_triplet( "Aplus_triplet" ); +const Name ASCurrents( "ASCurrents" ); +const Name ASCurrents_sum( "ASCurrents_sum" ); const Name a( "a" ); const Name a_acausal( "a_acausal" ); const Name a_causal( "a_causal" ); @@ -79,16 +78,13 @@ const Name beta( "beta" ); const Name beta_Ca( "beta_Ca" ); const Name biological_time( "biological_time" ); const Name box( "box" ); -const Name spike_buffer_shrink_limit( "spike_buffer_shrink_limit" ); -const Name spike_buffer_shrink_spare( "spike_buffer_shrink_spare" ); -const Name spike_buffer_grow_extra( "spike_buffer_grow_extra" ); -const Name spike_buffer_resize_log( "spike_buffer_resize_log" ); const Name buffer_size( "buffer_size" ); const Name buffer_size_spike_data( "buffer_size_spike_data" ); const Name buffer_size_target_data( "buffer_size_target_data" ); const Name C_m( "C_m" ); const Name Ca( "Ca" ); +const Name Ca_tot( "Ca_tot" ); const Name c( "c" ); const Name c_1( "c_1" ); const Name c_2( "c_2" ); @@ -97,7 +93,9 @@ const Name capacity( "capacity" ); const Name center( "center" ); const Name circular( "circular" ); const Name clear( "clear" ); +const Name comp_idx( "comp_idx" ); const Name comparator( "comparator" ); +const Name compartments( "compartments" ); const Name configbit_0( "configbit_0" ); const Name configbit_1( "configbit_1" ); const Name connection_count( "connection_count" ); @@ -108,15 +106,10 @@ const Name continuous( "continuous" ); const Name count_covariance( "count_covariance" ); const Name count_histogram( "count_histogram" ); const Name covariance( "covariance" ); -const Name compartments( "compartments" ); -const Name comp_idx( "comp_idx" ); const Name Delta_T( "Delta_T" ); const Name Delta_V( "Delta_V" ); const Name d( "d" ); -const Name dI_syn_ex( "dI_syn_ex" ); -const Name dI_syn_in( "dI_syn_in" ); -const Name dU( "U" ); const Name data( "data" ); const Name data_path( "data_path" ); const Name data_prefix( "data_prefix" ); @@ -127,6 +120,7 @@ const Name delay( "delay" ); const Name delay_u_bars( "delay_u_bars" ); const Name deliver_interval( "deliver_interval" ); const Name delta( "delta" ); +const Name delta_IP3( "delta_IP3" ); const Name delta_P( "delta_P" ); const Name delta_tau( "delta_tau" ); const Name dendritic_curr( "dendritic_curr" ); @@ -135,6 +129,8 @@ const Name dendritic_inh( "dendritic_inh" ); const Name dg( "dg" ); const Name dg_ex( "dg_ex" ); const Name dg_in( "dg_in" ); +const Name dI_syn_ex( "dI_syn_ex" ); +const Name dI_syn_in( "dI_syn_in" ); const Name dict_miss_is_error( "dict_miss_is_error" ); const Name diffusion_factor( "diffusion_factor" ); const Name dimension( "dimension" ); @@ -144,24 +140,26 @@ const Name distal_inh( "distal_inh" ); const Name drift_factor( "drift_factor" ); const Name driver_readout_time( "driver_readout_time" ); const Name dt( "dt" ); +const Name dU( "U" ); -const Name E_K( "E_K" ); -const Name E_L( "E_L" ); -const Name E_Na( "E_Na" ); const Name E_ahp( "E_ahp" ); const Name E_ex( "E_ex" ); const Name E_in( "E_in" ); +const Name E_K( "E_K" ); +const Name E_L( "E_L" ); +const Name E_Na( "E_Na" ); const Name E_rev( "E_rev" ); const Name E_rev_AMPA( "E_rev_AMPA" ); const Name E_rev_GABA_A( "E_rev_GABA_A" ); const Name E_rev_GABA_B( "E_rev_GABA_B" ); +const Name E_rev_h( "E_rev_h" ); const Name E_rev_KNa( "E_rev_KNa" ); -const Name E_rev_NMDA( "E_rev_NMDA" ); const Name E_rev_NaP( "E_rev_NaP" ); +const Name E_rev_NMDA( "E_rev_NMDA" ); const Name E_rev_T( "E_rev_T" ); -const Name E_rev_h( "E_rev_h" ); const Name E_rr( "E_rr" ); const Name E_sfa( "E_sfa" ); +const Name e_L( "e_L" ); const Name edge_wrap( "edge_wrap" ); const Name element_type( "element_type" ); const Name elements( "elements" ); @@ -173,7 +171,6 @@ const Name equilibrate( "equilibrate" ); const Name eta( "eta" ); const Name events( "events" ); const Name extent( "extent" ); -const Name e_L( "e_L" ); const Name file_extension( "file_extension" ); const Name filename( "filename" ); @@ -185,29 +182,30 @@ const Name GABA_A( "GABA_A" ); const Name GABA_B( "GABA_B" ); const Name g( "g" ); const Name g_AMPA( "g_AMPA" ); +const Name g_ahp( "g_ahp" ); +const Name g_C( "g_C" ); +const Name g_ex( "g_ex" ); const Name g_GABA_A( "g_GABA_A" ); const Name g_GABA_B( "g_GABA_B" ); +const Name g_in( "g_in" ); const Name g_K( "g_K" ); const Name g_KL( "g_KL" ); const Name g_Kv1( "g_Kv1" ); const Name g_Kv3( "g_Kv3" ); const Name g_L( "g_L" ); -const Name g_NMDA( "g_NMDA" ); +const Name g_m( "g_m" ); const Name g_Na( "g_Na" ); const Name g_NaL( "g_NaL" ); -const Name g_ahp( "g_ahp" ); -const Name g_ex( "g_ex" ); -const Name g_in( "g_in" ); -const Name g_m( "g_m" ); +const Name g_NMDA( "g_NMDA" ); const Name g_pd( "g_pd" ); const Name g_peak_AMPA( "g_peak_AMPA" ); const Name g_peak_GABA_A( "g_peak_GABA_A" ); const Name g_peak_GABA_B( "g_peak_GABA_B" ); +const Name g_peak_h( "g_peak_h" ); const Name g_peak_KNa( "g_peak_KNa" ); -const Name g_peak_NMDA( "g_peak_NMDA" ); const Name g_peak_NaP( "g_peak_NaP" ); +const Name g_peak_NMDA( "g_peak_NMDA" ); const Name g_peak_T( "g_peak_T" ); -const Name g_peak_h( "g_peak_h" ); const Name g_ps( "g_ps" ); const Name g_rr( "g_rr" ); const Name g_sfa( "g_sfa" ); @@ -223,28 +221,31 @@ const Name growth_factor_buffer_spike_data( "growth_factor_buffer_spike_data" ); const Name growth_factor_buffer_target_data( "growth_factor_buffer_target_data" ); const Name growth_rate( "growth_rate" ); const Name gsl_error_tol( "gsl_error_tol" ); -const Name g_C( "g_C" ); const Name h( "h" ); +const Name h_IP3R( "h_IP3R" ); const Name has_connections( "has_connections" ); const Name has_delay( "has_delay" ); const Name histogram( "histogram" ); const Name histogram_correction( "histogram_correction" ); const Name I( "I" ); -const Name I_KNa( "I_KNa" ); -const Name I_NaP( "I_NaP" ); -const Name I_T( "I_T" ); const Name I_ahp( "I_ahp" ); const Name I_e( "I_e" ); const Name I_h( "I_h" ); +const Name I_KNa( "I_KNa" ); +const Name I_NaP( "I_NaP" ); +const Name I_SIC( "I_SIC" ); const Name I_sp( "I_sp" ); const Name I_stc( "I_stc" ); const Name I_syn( "I_syn" ); const Name I_syn_ex( "I_syn_ex" ); const Name I_syn_in( "I_syn_in" ); +const Name I_T( "I_T" ); const Name Inact_h( "Inact_h" ); const Name Inact_p( "Inact_p" ); +const Name IP3( "IP3" ); +const Name IP3_0( "IP3_0" ); const Name indegree( "indegree" ); const Name index_map( "index_map" ); const Name individual_spike_trains( "individual_spike_trains" ); @@ -255,8 +256,14 @@ const Name instantiations( "instantiations" ); const Name interval( "interval" ); const Name is_refractory( "is_refractory" ); +const Name Kd_act( "Kd_act" ); +const Name Kd_IP3_1( "Kd_IP3_1" ); +const Name Kd_IP3_2( "Kd_IP3_2" ); +const Name Kd_inh( "Kd_inh" ); +const Name Km_SERCA( "Km_SERCA" ); const Name Kplus( "Kplus" ); const Name Kplus_triplet( "Kplus_triplet" ); +const Name k_IP3R( "k_IP3R" ); const Name keep_source_table( "keep_source_table" ); const Name kernel( "kernel" ); @@ -290,9 +297,9 @@ const Name min( "min" ); const Name min_delay( "min_delay" ); const Name min_update_time( "min_update_time" ); const Name minor_axis( "minor_axis" ); -const Name mpi_address( "mpi_address" ); const Name model( "model" ); const Name model_id( "model_id" ); +const Name mpi_address( "mpi_address" ); const Name ms_per_tic( "ms_per_tic" ); const Name mu( "mu" ); const Name mu_minus( "mu_minus" ); @@ -301,10 +308,10 @@ const Name mult_coupling( "mult_coupling" ); const Name music_channel( "music_channel" ); const Name N( "N" ); -const Name NMDA( "NMDA" ); const Name N_channels( "N_channels" ); const Name N_NaP( "N_NaP" ); const Name N_T( "N_T" ); +const Name NMDA( "NMDA" ); const Name n( "n" ); const Name n_events( "n_events" ); const Name n_messages( "n_messages" ); @@ -340,6 +347,8 @@ const Name p_copy( "p_copy" ); const Name p_transmit( "p_transmit" ); const Name pairwise_bernoulli_on_source( "pairwise_bernoulli_on_source" ); const Name pairwise_bernoulli_on_target( "pairwise_bernoulli_on_target" ); +const Name params( "params" ); +const Name parent_idx( "parent_idx" ); const Name phase( "phase" ); const Name phi_max( "phi_max" ); const Name polar_angle( "polar_angle" ); @@ -362,8 +371,6 @@ const Name proximal_inh( "proximal_inh" ); const Name psi( "psi" ); const Name published( "published" ); const Name pulse_times( "pulse_times" ); -const Name parent_idx( "parent_idx" ); -const Name params( "params" ); const Name q_rr( "q_rr" ); const Name q_sfa( "q_sfa" ); @@ -371,10 +378,15 @@ const Name q_stc( "q_stc" ); const Name radius( "radius" ); const Name rate( "rate" ); +const Name rate_IP3R( "rate_IP3R" ); +const Name rate_L( "rate_L" ); +const Name rate_SERCA( "rate_SERCA" ); const Name rate_slope( "rate_slope" ); const Name rate_times( "rate_times" ); const Name rate_values( "rate_values" ); +const Name ratio_ER_cyt( "ratio_ER_cyt" ); const Name readout_cycle_duration( "readout_cycle_duration" ); +const Name receptor_idx( "receptor_idx" ); const Name receptor_type( "receptor_type" ); const Name receptor_types( "receptor_types" ); const Name receptors( "receptors" ); @@ -399,10 +411,11 @@ const Name rng_type( "rng_type" ); const Name rng_types( "rng_types" ); const Name rport( "receptor" ); const Name rule( "rule" ); -const Name receptor_idx( "receptor_idx" ); const Name S( "S" ); const Name S_act_NMDA( "S_act_NMDA" ); +const Name SIC_scale( "SIC_scale" ); +const Name SIC_th( "SIC_th" ); const Name sdev( "sdev" ); const Name send_buffer_size_secondary_events( "send_buffer_size_secondary_events" ); const Name senders( "senders" ); @@ -420,6 +433,10 @@ const Name soma_exc( "soma_exc" ); const Name soma_inh( "soma_inh" ); const Name source( "source" ); const Name spherical( "spherical" ); +const Name spike_buffer_grow_extra( "spike_buffer_grow_extra" ); +const Name spike_buffer_resize_log( "spike_buffer_resize_log" ); +const Name spike_buffer_shrink_limit( "spike_buffer_shrink_limit" ); +const Name spike_buffer_shrink_spare( "spike_buffer_shrink_spare" ); const Name spike_dependent_threshold( "spike_dependent_threshold" ); const Name spike_multiplicities( "spike_multiplicities" ); const Name spike_times( "spike_times" ); @@ -437,8 +454,8 @@ const Name structural_plasticity_update_interval( "structural_plasticity_update_ const Name synapse_id( "synapse_id" ); const Name synapse_label( "synapse_label" ); const Name synapse_model( "synapse_model" ); -const Name synapse_models( "synapse_models" ); const Name synapse_modelid( "synapse_modelid" ); +const Name synapse_models( "synapse_models" ); const Name synapse_parameters( "synapse_parameters" ); const Name synapses_per_driver( "synapses_per_driver" ); const Name synaptic_elements( "synaptic_elements" ); @@ -461,30 +478,30 @@ const Name targets( "targets" ); const Name tau( "tau" ); const Name tau_1( "tau_1" ); const Name tau_2( "tau_2" ); +const Name tau_ahp( "tau_ahp" ); const Name tau_Ca( "tau_Ca" ); +const Name tau_c( "tau_c" ); const Name tau_D_KNa( "tau_D_KNa" ); const Name tau_Delta( "tau_Delta" ); -const Name tau_Mg_fast_NMDA( "tau_Mg_fast_NMDA" ); -const Name tau_Mg_slow_NMDA( "tau_Mg_slow_NMDA" ); -const Name tau_P( "tau_P" ); -const Name tau_V_th( "tau_V_th" ); -const Name tau_ahp( "tau_ahp" ); -const Name tau_c( "tau_c" ); const Name tau_decay( "tau_decay" ); const Name tau_decay_AMPA( "tau_decay_AMPA" ); +const Name tau_decay_ex( "tau_decay_ex" ); const Name tau_decay_GABA_A( "tau_decay_GABA_A" ); const Name tau_decay_GABA_B( "tau_decay_GABA_B" ); -const Name tau_decay_NMDA( "tau_decay_NMDA" ); -const Name tau_decay_ex( "tau_decay_ex" ); const Name tau_decay_in( "tau_decay_in" ); +const Name tau_decay_NMDA( "tau_decay_NMDA" ); const Name tau_epsp( "tau_epsp" ); const Name tau_fac( "tau_fac" ); +const Name tau_IP3( "tau_IP3" ); +const Name tau_Mg_fast_NMDA( "tau_Mg_fast_NMDA" ); +const Name tau_Mg_slow_NMDA( "tau_Mg_slow_NMDA" ); const Name tau_m( "tau_m" ); const Name tau_max( "tau_max" ); const Name tau_minus( "tau_minus" ); const Name tau_minus_stdp( "tau_minus_stdp" ); const Name tau_minus_triplet( "tau_minus_triplet" ); const Name tau_n( "tau_n" ); +const Name tau_P( "tau_P" ); const Name tau_plus( "tau_plus" ); const Name tau_plus_triplet( "tau_plus_triplet" ); const Name tau_psc( "tau_psc" ); @@ -492,11 +509,11 @@ const Name tau_rec( "tau_rec" ); const Name tau_reset( "tau_reset" ); const Name tau_rise( "tau_rise" ); const Name tau_rise_AMPA( "tau_rise_AMPA" ); +const Name tau_rise_ex( "tau_rise_ex" ); const Name tau_rise_GABA_A( "tau_rise_GABA_A" ); const Name tau_rise_GABA_B( "tau_rise_GABA_B" ); -const Name tau_rise_NMDA( "tau_rise_NMDA" ); -const Name tau_rise_ex( "tau_rise_ex" ); const Name tau_rise_in( "tau_rise_in" ); +const Name tau_rise_NMDA( "tau_rise_NMDA" ); const Name tau_rr( "tau_rr" ); const Name tau_sfa( "tau_sfa" ); const Name tau_spike( "tau_spike" ); @@ -510,6 +527,7 @@ const Name tau_theta( "tau_theta" ); const Name tau_u_bar_bar( "tau_u_bar_bar" ); const Name tau_u_bar_minus( "tau_u_bar_minus" ); const Name tau_u_bar_plus( "tau_u_bar_plus" ); +const Name tau_V_th( "tau_V_th" ); const Name tau_v( "tau_v" ); const Name tau_vacant( "tau_vacant" ); const Name tau_w( "tau_w" ); @@ -532,20 +550,18 @@ const Name threshold_spike( "threshold_spike" ); const Name threshold_voltage( "threshold_voltage" ); const Name tics_per_ms( "tics_per_ms" ); const Name tics_per_step( "tics_per_step" ); -#ifdef TIMER_DETAILED const Name time_collocate_spike_data( "time_collocate_spike_data" ); +const Name time_communicate_prepare( "time_communicate_prepare" ); const Name time_communicate_spike_data( "time_communicate_spike_data" ); const Name time_communicate_target_data( "time_communicate_target_data" ); +const Name time_construction_connect( "time_construction_connect" ); +const Name time_construction_create( "time_construction_create" ); const Name time_deliver_spike_data( "time_deliver_spike_data" ); const Name time_gather_spike_data( "time_gather_spike_data" ); const Name time_gather_target_data( "time_gather_target_data" ); -const Name time_update( "time_update" ); -#endif -const Name time_communicate_prepare( "time_communicate_prepare" ); -const Name time_construction_connect( "time_construction_connect" ); -const Name time_construction_create( "time_construction_create" ); const Name time_in_steps( "time_in_steps" ); const Name time_simulate( "time_simulate" ); +const Name time_update( "time_update" ); const Name times( "times" ); const Name to_do( "to_do" ); const Name total_num_virtual_procs( "total_num_virtual_procs" ); @@ -563,8 +579,6 @@ const Name upper_right( "upper_right" ); const Name use_compressed_spikes( "use_compressed_spikes" ); const Name use_wfr( "use_wfr" ); -const Name V_T( "V_T" ); -const Name V_T_star( "V_T_star" ); const Name V_act_NMDA( "V_act_NMDA" ); const Name V_clamp( "V_clamp" ); const Name V_epsp( "V_epsp" ); @@ -573,6 +587,8 @@ const Name V_min( "V_min" ); const Name V_noise( "V_noise" ); const Name V_peak( "V_peak" ); const Name V_reset( "V_reset" ); +const Name V_T( "V_T" ); +const Name V_T_star( "V_T_star" ); const Name V_th( "V_th" ); const Name V_th_alpha_1( "V_th_alpha_1" ); const Name V_th_alpha_2( "V_th_alpha_2" ); @@ -582,8 +598,8 @@ const Name V_th_v( "V_th_v" ); const Name voltage_clamp( "voltage_clamp" ); const Name voltage_reset_add( "voltage_reset_add" ); const Name voltage_reset_fraction( "voltage_reset_fraction" ); -const Name vp( "vp" ); const Name volume_transmitter( "volume_transmitter" ); +const Name vp( "vp" ); const Name Wmax( "Wmax" ); const Name Wmin( "Wmin" ); @@ -607,7 +623,6 @@ const Name y_1( "y_1" ); const Name z( "z" ); const Name z_connected( "z_connected" ); - } // namespace names } // namespace nest diff --git a/nestkernel/nest_names.h b/nestkernel/nest_names.h index 73936460bb..c2469d8f62 100644 --- a/nestkernel/nest_names.h +++ b/nestkernel/nest_names.h @@ -52,9 +52,6 @@ namespace nest */ namespace names { -extern const Name AMPA; -extern const Name ASCurrents; -extern const Name ASCurrents_sum; extern const Name A_LTD; extern const Name A_LTD_const; extern const Name A_LTP; @@ -62,10 +59,13 @@ extern const Name A_minus; extern const Name A_plus; extern const Name Act_m; extern const Name Act_n; +extern const Name AMPA; extern const Name Aminus; extern const Name Aminus_triplet; extern const Name Aplus; extern const Name Aplus_triplet; +extern const Name ASCurrents; +extern const Name ASCurrents_sum; extern const Name a; extern const Name a_acausal; extern const Name a_causal; @@ -104,16 +104,13 @@ extern const Name beta; extern const Name beta_Ca; extern const Name biological_time; extern const Name box; -extern const Name spike_buffer_grow_extra; -extern const Name spike_buffer_resize_log; -extern const Name spike_buffer_shrink_limit; -extern const Name spike_buffer_shrink_spare; extern const Name buffer_size; extern const Name buffer_size_spike_data; extern const Name buffer_size_target_data; extern const Name C_m; extern const Name Ca; +extern const Name Ca_tot; extern const Name c; extern const Name c_1; extern const Name c_2; @@ -139,9 +136,6 @@ extern const Name covariance; extern const Name Delta_T; extern const Name Delta_V; extern const Name d; -extern const Name dI_syn_ex; -extern const Name dI_syn_in; -extern const Name dU; extern const Name data; extern const Name data_path; extern const Name data_prefix; @@ -152,6 +146,7 @@ extern const Name delay; extern const Name delay_u_bars; extern const Name deliver_interval; extern const Name delta; +extern const Name delta_IP3; extern const Name delta_P; extern const Name delta_tau; extern const Name dendritic_curr; @@ -160,6 +155,8 @@ extern const Name dendritic_inh; extern const Name dg; extern const Name dg_ex; extern const Name dg_in; +extern const Name dI_syn_ex; +extern const Name dI_syn_in; extern const Name dict_miss_is_error; extern const Name diffusion_factor; extern const Name dimension; @@ -169,25 +166,26 @@ extern const Name distal_inh; extern const Name drift_factor; extern const Name driver_readout_time; extern const Name dt; +extern const Name dU; -extern const Name E_K; -extern const Name E_L; -extern const Name E_Na; extern const Name E_ahp; extern const Name E_ex; extern const Name E_in; -extern const Name e_L; +extern const Name E_K; +extern const Name E_L; +extern const Name E_Na; extern const Name E_rev; extern const Name E_rev_AMPA; extern const Name E_rev_GABA_A; extern const Name E_rev_GABA_B; +extern const Name E_rev_h; extern const Name E_rev_KNa; -extern const Name E_rev_NMDA; extern const Name E_rev_NaP; +extern const Name E_rev_NMDA; extern const Name E_rev_T; -extern const Name E_rev_h; extern const Name E_rr; extern const Name E_sfa; +extern const Name e_L; extern const Name edge_wrap; extern const Name element_type; extern const Name elements; @@ -210,30 +208,30 @@ extern const Name GABA_A; extern const Name GABA_B; extern const Name g; extern const Name g_AMPA; +extern const Name g_ahp; extern const Name g_C; +extern const Name g_ex; extern const Name g_GABA_A; extern const Name g_GABA_B; +extern const Name g_in; extern const Name g_K; extern const Name g_KL; extern const Name g_Kv1; extern const Name g_Kv3; extern const Name g_L; -extern const Name g_NMDA; +extern const Name g_m; extern const Name g_Na; extern const Name g_NaL; -extern const Name g_ahp; -extern const Name g_ex; -extern const Name g_in; -extern const Name g_m; +extern const Name g_NMDA; extern const Name g_pd; extern const Name g_peak_AMPA; extern const Name g_peak_GABA_A; extern const Name g_peak_GABA_B; +extern const Name g_peak_h; extern const Name g_peak_KNa; -extern const Name g_peak_NMDA; extern const Name g_peak_NaP; +extern const Name g_peak_NMDA; extern const Name g_peak_T; -extern const Name g_peak_h; extern const Name g_ps; extern const Name g_rr; extern const Name g_sfa; @@ -241,8 +239,8 @@ extern const Name g_sp; extern const Name gamma_shape; extern const Name gaussian; extern const Name global_id; -extern const Name grid3d; extern const Name grid; +extern const Name grid3d; extern const Name growth_curve; extern const Name growth_curves; extern const Name growth_factor_buffer_spike_data; @@ -251,25 +249,29 @@ extern const Name growth_rate; extern const Name gsl_error_tol; extern const Name h; +extern const Name h_IP3R; extern const Name has_connections; extern const Name has_delay; extern const Name histogram; extern const Name histogram_correction; extern const Name I; -extern const Name I_KNa; -extern const Name I_NaP; -extern const Name I_T; extern const Name I_ahp; extern const Name I_e; extern const Name I_h; +extern const Name I_KNa; +extern const Name I_NaP; +extern const Name I_SIC; extern const Name I_sp; extern const Name I_stc; extern const Name I_syn; extern const Name I_syn_ex; extern const Name I_syn_in; +extern const Name I_T; extern const Name Inact_h; extern const Name Inact_p; +extern const Name IP3; +extern const Name IP3_0; extern const Name indegree; extern const Name index_map; extern const Name individual_spike_trains; @@ -280,8 +282,14 @@ extern const Name instantiations; extern const Name interval; extern const Name is_refractory; +extern const Name Kd_act; +extern const Name Kd_IP3_1; +extern const Name Kd_IP3_2; +extern const Name Kd_inh; +extern const Name Km_SERCA; extern const Name Kplus; extern const Name Kplus_triplet; +extern const Name k_IP3R; extern const Name keep_source_table; extern const Name kernel; @@ -315,9 +323,9 @@ extern const Name min; extern const Name min_delay; extern const Name min_update_time; extern const Name minor_axis; -extern const Name mpi_address; extern const Name model; extern const Name model_id; +extern const Name mpi_address; extern const Name ms_per_tic; extern const Name mu; extern const Name mu_minus; @@ -326,10 +334,10 @@ extern const Name mult_coupling; extern const Name music_channel; extern const Name N; -extern const Name NMDA; extern const Name N_channels; extern const Name N_NaP; extern const Name N_T; +extern const Name NMDA; extern const Name n; extern const Name n_events; extern const Name n_messages; @@ -396,9 +404,13 @@ extern const Name q_stc; extern const Name radius; extern const Name rate; +extern const Name rate_IP3R; +extern const Name rate_L; +extern const Name rate_SERCA; extern const Name rate_slope; extern const Name rate_times; extern const Name rate_values; +extern const Name ratio_ER_cyt; extern const Name readout_cycle_duration; extern const Name receptor_idx; extern const Name receptor_type; @@ -428,9 +440,11 @@ extern const Name rule; extern const Name S; extern const Name S_act_NMDA; +extern const Name SIC_scale; +extern const Name SIC_th; extern const Name sdev; -extern const Name senders; extern const Name send_buffer_size_secondary_events; +extern const Name senders; extern const Name shape; extern const Name shift_now_spikes; extern const Name shrink_factor_buffer_spike_data; @@ -445,6 +459,10 @@ extern const Name soma_exc; extern const Name soma_inh; extern const Name source; extern const Name spherical; +extern const Name spike_buffer_grow_extra; +extern const Name spike_buffer_resize_log; +extern const Name spike_buffer_shrink_limit; +extern const Name spike_buffer_shrink_spare; extern const Name spike_dependent_threshold; extern const Name spike_multiplicities; extern const Name spike_times; @@ -462,8 +480,8 @@ extern const Name structural_plasticity_update_interval; extern const Name synapse_id; extern const Name synapse_label; extern const Name synapse_model; -extern const Name synapse_models; extern const Name synapse_modelid; +extern const Name synapse_models; extern const Name synapse_parameters; extern const Name synapses_per_driver; extern const Name synaptic_elements; @@ -486,30 +504,30 @@ extern const Name targets; extern const Name tau; extern const Name tau_1; extern const Name tau_2; +extern const Name tau_ahp; extern const Name tau_Ca; +extern const Name tau_c; extern const Name tau_D_KNa; extern const Name tau_Delta; -extern const Name tau_Mg_fast_NMDA; -extern const Name tau_Mg_slow_NMDA; -extern const Name tau_P; -extern const Name tau_V_th; -extern const Name tau_ahp; -extern const Name tau_c; extern const Name tau_decay; extern const Name tau_decay_AMPA; +extern const Name tau_decay_ex; extern const Name tau_decay_GABA_A; extern const Name tau_decay_GABA_B; -extern const Name tau_decay_NMDA; -extern const Name tau_decay_ex; extern const Name tau_decay_in; +extern const Name tau_decay_NMDA; extern const Name tau_epsp; extern const Name tau_fac; +extern const Name tau_IP3; +extern const Name tau_Mg_fast_NMDA; +extern const Name tau_Mg_slow_NMDA; extern const Name tau_m; extern const Name tau_max; extern const Name tau_minus; extern const Name tau_minus_stdp; extern const Name tau_minus_triplet; extern const Name tau_n; +extern const Name tau_P; extern const Name tau_plus; extern const Name tau_plus_triplet; extern const Name tau_psc; @@ -517,11 +535,11 @@ extern const Name tau_rec; extern const Name tau_reset; extern const Name tau_rise; extern const Name tau_rise_AMPA; +extern const Name tau_rise_ex; extern const Name tau_rise_GABA_A; extern const Name tau_rise_GABA_B; -extern const Name tau_rise_NMDA; -extern const Name tau_rise_ex; extern const Name tau_rise_in; +extern const Name tau_rise_NMDA; extern const Name tau_rr; extern const Name tau_sfa; extern const Name tau_spike; @@ -535,6 +553,7 @@ extern const Name tau_theta; extern const Name tau_u_bar_bar; extern const Name tau_u_bar_minus; extern const Name tau_u_bar_plus; +extern const Name tau_V_th; extern const Name tau_v; extern const Name tau_vacant; extern const Name tau_w; @@ -557,20 +576,18 @@ extern const Name threshold_spike; extern const Name threshold_voltage; extern const Name tics_per_ms; extern const Name tics_per_step; -#ifdef TIMER_DETAILED extern const Name time_collocate_spike_data; +extern const Name time_communicate_prepare; extern const Name time_communicate_spike_data; extern const Name time_communicate_target_data; +extern const Name time_construction_connect; +extern const Name time_construction_create; extern const Name time_deliver_spike_data; extern const Name time_gather_spike_data; extern const Name time_gather_target_data; -extern const Name time_update; -#endif -extern const Name time_communicate_prepare; -extern const Name time_construction_connect; -extern const Name time_construction_create; extern const Name time_in_steps; extern const Name time_simulate; +extern const Name time_update; extern const Name times; extern const Name to_do; extern const Name total_num_virtual_procs; @@ -588,8 +605,6 @@ extern const Name upper_right; extern const Name use_compressed_spikes; extern const Name use_wfr; -extern const Name V_T; -extern const Name V_T_star; extern const Name V_act_NMDA; extern const Name V_clamp; extern const Name V_epsp; @@ -598,6 +613,8 @@ extern const Name V_min; extern const Name V_noise; extern const Name V_peak; extern const Name V_reset; +extern const Name V_T; +extern const Name V_T_star; extern const Name V_th; extern const Name V_th_alpha_1; extern const Name V_th_alpha_2; @@ -607,9 +624,11 @@ extern const Name V_th_v; extern const Name voltage_clamp; extern const Name voltage_reset_add; extern const Name voltage_reset_fraction; -extern const Name vp; extern const Name volume_transmitter; +extern const Name vp; +extern const Name Wmax; +extern const Name Wmin; extern const Name w; extern const Name weight; extern const Name weight_per_lut_entry; @@ -620,8 +639,6 @@ extern const Name wfr_interpolation_order; extern const Name wfr_max_iterations; extern const Name wfr_tol; extern const Name with_reset; -extern const Name Wmax; -extern const Name Wmin; extern const Name x; extern const Name x_bar; @@ -632,7 +649,6 @@ extern const Name y_1; extern const Name z; extern const Name z_connected; - } // namespace names } // namespace nest diff --git a/nestkernel/node.cpp b/nestkernel/node.cpp index 8ac5c357f1..d490e40330 100644 --- a/nestkernel/node.cpp +++ b/nestkernel/node.cpp @@ -398,6 +398,23 @@ Node::sends_secondary_event( DelayedRateConnectionEvent& ) throw IllegalConnection( "The source node does not support delayed rate output." ); } +void +Node::handle( SICEvent& ) +{ + throw UnexpectedEvent(); +} + +size_t +Node::handles_test_event( SICEvent&, size_t ) +{ + throw IllegalConnection(); +} + +void +Node::sends_secondary_event( SICEvent& ) +{ + throw IllegalConnection(); +} double Node::get_LTD_value( double ) diff --git a/nestkernel/node.h b/nestkernel/node.h index e47b06e3d0..42dc1fa2a7 100644 --- a/nestkernel/node.h +++ b/nestkernel/node.h @@ -420,6 +420,7 @@ class Node virtual size_t handles_test_event( InstantaneousRateConnectionEvent&, size_t receptor_type ); virtual size_t handles_test_event( DiffusionConnectionEvent&, size_t receptor_type ); virtual size_t handles_test_event( DelayedRateConnectionEvent&, size_t receptor_type ); + virtual size_t handles_test_event( SICEvent&, size_t receptor_type ); /** * Required to check, if source neuron may send a SecondaryEvent. @@ -461,6 +462,16 @@ class Node */ virtual void sends_secondary_event( DelayedRateConnectionEvent& re ); + /** + * Required to check, if source node may send a SICEvent. + * + * This base class implementation throws IllegalConnection + * and needs to be overwritten in the derived class. + * @ingroup event_interface + * @throws IllegalConnection + */ + virtual void sends_secondary_event( SICEvent& sic ); + /** * Register a STDP connection * @@ -587,6 +598,14 @@ class Node */ virtual void handle( DelayedRateConnectionEvent& e ); + /** + * Handler for slow inward current events (SICEvents). + * @see handle(thread,SICEvent&) + * @ingroup event_interface + * @throws UnexpectedEvent + */ + virtual void handle( SICEvent& e ); + /** * @defgroup SP_functions Structural Plasticity in NEST. * diff --git a/nestkernel/node_manager.cpp b/nestkernel/node_manager.cpp index 363877061c..13e31192ab 100644 --- a/nestkernel/node_manager.cpp +++ b/nestkernel/node_manager.cpp @@ -736,6 +736,7 @@ NodeManager::check_wfr_use() InstantaneousRateConnectionEvent::set_coeff_length( kernel().connection_manager.get_min_delay() ); DelayedRateConnectionEvent::set_coeff_length( kernel().connection_manager.get_min_delay() ); DiffusionConnectionEvent::set_coeff_length( kernel().connection_manager.get_min_delay() ); + SICEvent::set_coeff_length( kernel().connection_manager.get_min_delay() ); } void diff --git a/nestkernel/proxynode.cpp b/nestkernel/proxynode.cpp index 74697d876a..596d4ad5c2 100644 --- a/nestkernel/proxynode.cpp +++ b/nestkernel/proxynode.cpp @@ -73,6 +73,12 @@ proxynode::sends_secondary_event( DelayedRateConnectionEvent& re ) kernel().model_manager.get_node_model( get_model_id() )->sends_secondary_event( re ); } +void +proxynode::sends_secondary_event( SICEvent& sic ) +{ + kernel().model_manager.get_node_model( get_model_id() )->sends_secondary_event( sic ); +} + nest::SignalType proxynode::sends_signal() const { diff --git a/nestkernel/proxynode.h b/nestkernel/proxynode.h index 2c2ba75bd7..0726988b7f 100644 --- a/nestkernel/proxynode.h +++ b/nestkernel/proxynode.h @@ -97,6 +97,8 @@ class proxynode : public Node void sends_secondary_event( DelayedRateConnectionEvent& ) override; + void sends_secondary_event( SICEvent& ) override; + void handle( SpikeEvent& ) override { diff --git a/nestkernel/secondary_event.h b/nestkernel/secondary_event.h index 438935cf4b..1ba3800f06 100644 --- a/nestkernel/secondary_event.h +++ b/nestkernel/secondary_event.h @@ -434,6 +434,29 @@ DiffusionConnectionEvent::get_diffusion_factor() const return diffusion_factor_; } +/** + * Event for slow inward current (SIC) connections between astrocytes and neurons. + * + * The event transmits the slow inward current to the connected neurons. + */ +class SICEvent : public DataSecondaryEvent< double, SICEvent > +{ + +public: + SICEvent() + { + } + + void operator()(); + SICEvent* clone() const; +}; + +inline SICEvent* +SICEvent::clone() const +{ + return new SICEvent( *this ); +} + } // namespace nest #endif /* #ifndef SECONDARY_EVENT_H */ diff --git a/pynest/examples/astrocyte_single.py b/pynest/examples/astrocyte_single.py new file mode 100644 index 0000000000..a74eef36e6 --- /dev/null +++ b/pynest/examples/astrocyte_single.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# +# astrocyte_single.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +""" +A model using a single astrocyte with calcium dynamics +------------------------------------------------------- + +This script simulates an astrocyte with the model ``astrocyte_lr_1994``, which +implements the dynamics in the astrocyte based on [1]_, [2]_, and +[3]_. Recordings are made for two variables in the astrocyte, +inositol 1,4,5-trisphosphate (IP3) and cytosolic calcium. The astrocyte is driven +by a Poissonian spike train which induces the +generation of IP3 in the astrocyte, which in turn influences the calcium dynamics in +the astrocyte. + +See Also +~~~~~~~~ + +:doc:`astrocyte_tripartite` + +References +~~~~~~~~~~ + +.. [1] Li, Y. X., & Rinzel, J. (1994). Equations for InsP3 receptor-mediated + [Ca2+]i oscillations derived from a detailed kinetic model: a + Hodgkin-Huxley like formalism. Journal of theoretical Biology, 166(4), + 461-473. DOI: https://doi.org/10.1006/jtbi.1994.1041 + +.. [2] De Young, G. W., & Keizer, J. (1992). A single-pool inositol + 1,4,5-trisphosphate-receptor-based model for agonist-stimulated + oscillations in Ca2+ concentration. Proceedings of the National Academy + of Sciences, 89(20), 9895-9899. DOI: + https://doi.org/10.1073/pnas.89.20.9895 + +.. [3] Nadkarni, S., & Jung, P. (2003). Spontaneous oscillations of dressed + neurons: a new mechanism for epilepsy?. Physical review letters, 91(26), + 268101. DOI: https://doi.org/10.1103/PhysRevLett.91.268101 + +""" + +############################################################################### +# Import all necessary modules for simulation and plotting. + +import matplotlib.pyplot as plt + +import nest + +############################################################################### +# Set parameters for the simulation. + +# simulation time +sim_time = 60000 +# astrocyte parameters +params_astro = {"IP3_0": 0.16} +# Poisson input for the astrocyte +poisson_rate = 1.0 +poisson_weight = 0.1 + +############################################################################### +# Create astrocyte and devices and connect them. + +astrocyte = nest.Create("astrocyte_lr_1994", params=params_astro) +ps_astro = nest.Create("poisson_generator", params={"rate": poisson_rate}) +mm_astro = nest.Create("multimeter", params={"record_from": ["IP3", "Ca"]}) +nest.Connect(ps_astro, astrocyte, syn_spec={"weight": poisson_weight}) +nest.Connect(mm_astro, astrocyte) + +############################################################################### +# Run simulation and get results. + +nest.Simulate(sim_time) +data = mm_astro.events + +############################################################################### +# Create and show plots. + +fig, axes = plt.subplots(2, 1, sharex=True, figsize=(6.4, 4.8), dpi=100) +axes[0].plot(data["times"], data["IP3"]) +axes[1].plot(data["times"], data["Ca"]) +axes[0].set_ylabel(r"[IP$_{3}$] ($\mu$M)") +axes[1].set_ylabel(r"[Ca$^{2+}$] ($\mu$M)") +axes[1].set_xlabel("Time (ms)") +plt.tight_layout() +plt.show() +plt.close() diff --git a/pynest/examples/astrocyte_tripartite.py b/pynest/examples/astrocyte_tripartite.py new file mode 100644 index 0000000000..a522b0d6a8 --- /dev/null +++ b/pynest/examples/astrocyte_tripartite.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +# +# astrocyte_tripartite.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +""" +A tripartite interaction between two neurons and one astrocyte +-------------------------------------------------------------- + +This script simulates a tripartite interaction between two neurons and one +astrocyte. This interaction is part of the astrocyte biology described in +[1]_ that involves the neuron-astrocyte glutamate signaling and the astrocytic +calcium dynamics. + +``astrocyte_lr_1994`` is used to model the astrocyte, which implements the +dynamics in the astrocyte based on the articles [2]_, [3]_, and [4]_. +``tsodyks_synapse`` is used to create connections from the presynaptic neuron +to the postsynaptic neuron, and from the presynaptic neuron to the astrocyte. +``sic_connection`` is used to create a connection from the astrocyte to the +postsynaptic neuron. Recordings are made for the following variables: membrance +voltage of the presynaptic neuron, inositol 1,4,5-trisphosphate (IP3), and +calcium in the astrocyte, and slow inward current (SIC) in the postsynaptic +neuron. The result demonstrates a tripartite interaction where the presynaptic +spikes induce changes in IP3 and calcium in the astrocyte, which then induces +the generation of SIC in the postsynaptic neuron. + +See Also +~~~~~~~~ + +:doc:`astrocyte_single` + +References +~~~~~~~~~~ + +.. [1] Bazargani, N., & Attwell, D. (2016). Astrocyte calcium signaling: the + third wave. Nature neuroscience, 19(2), 182-189. DOI: + https://doi.org/10.1038/nn.4201 + +.. [2] Li, Y. X., & Rinzel, J. (1994). Equations for InsP3 receptor-mediated + [Ca2+]i oscillations derived from a detailed kinetic model: a + Hodgkin-Huxley like formalism. Journal of theoretical Biology, 166(4), + 461-473. DOI: https://doi.org/10.1006/jtbi.1994.1041 + +.. [3] De Young, G. W., & Keizer, J. (1992). A single-pool inositol + 1,4,5-trisphosphate-receptor-based model for agonist-stimulated + oscillations in Ca2+ concentration. Proceedings of the National Academy + of Sciences, 89(20), 9895-9899. DOI: + https://doi.org/10.1073/pnas.89.20.9895 + +.. [4] Nadkarni, S., & Jung, P. (2003). Spontaneous oscillations of dressed + neurons: a new mechanism for epilepsy?. Physical review letters, 91(26), + 268101. DOI: https://doi.org/10.1103/PhysRevLett.91.268101 + +""" + +############################################################################### +# Import all necessary modules for simulation and plotting. + +import matplotlib.pyplot as plt + +import nest + +############################################################################### +# Set parameters for the simulation. + +# simulation time +sim_time = 60000 +# Poisson input for the presynaptic neuron +poisson_rate_neuro = 1500.0 +# neuron parameters +params_neuro = {"tau_syn_ex": 2.0} +# astrocyte parameters +params_astro = {"IP3_0": 0.16} +# weights of connections +w_pre2astro = 1.0 +w_pre2post = 1.0 +w_astro2post = 1.0 + +############################################################################### +# Create and connect the astrocyte and its devices. + +astrocyte = nest.Create("astrocyte_lr_1994", params=params_astro) +mm_astro = nest.Create("multimeter", params={"record_from": ["IP3", "Ca"]}) +nest.Connect(mm_astro, astrocyte) + +############################################################################### +# Create and connect the neurons and their devices. + +pre_neuron = nest.Create("aeif_cond_alpha_astro", params=params_neuro) +post_neuron = nest.Create("aeif_cond_alpha_astro", params=params_neuro) +ps_pre = nest.Create("poisson_generator", params={"rate": poisson_rate_neuro}) +mm_pre = nest.Create("multimeter", params={"record_from": ["V_m"]}) +mm_post = nest.Create("multimeter", params={"record_from": ["I_SIC"]}) +nest.Connect(ps_pre, pre_neuron) +nest.Connect(mm_pre, pre_neuron) +nest.Connect(mm_post, post_neuron) + +############################################################################### +# Create tripartite connectivity. + +nest.Connect(pre_neuron, post_neuron, syn_spec={"weight": w_pre2post}) +nest.Connect(pre_neuron, astrocyte, syn_spec={"weight": w_pre2astro}) +nest.Connect(astrocyte, post_neuron, syn_spec={"synapse_model": "sic_connection", "weight": w_astro2post}) + +############################################################################### +# Run simulation and get results. + +nest.Simulate(sim_time) +data_pre = mm_pre.events +data_post = mm_post.events +data_astro = mm_astro.events + +############################################################################### +# Create and show plots. + +fig, ax = plt.subplots(2, 2, sharex=True, figsize=(6.4, 4.8), dpi=100) +axes = ax.flat +axes[0].plot(data_pre["times"], data_pre["V_m"]) +axes[1].plot(data_astro["times"], data_astro["IP3"]) +axes[2].plot(data_post["times"], data_post["I_SIC"]) +axes[3].plot(data_astro["times"], data_astro["Ca"]) +axes[0].set_title(f"Presynaptic neuron\n(Poisson rate = {poisson_rate_neuro} Hz)") +axes[0].set_ylabel("Membrane potential (mV)") +axes[2].set_title("Postsynaptic neuron") +axes[2].set_ylabel("Slow inward current (pA)") +axes[2].set_xlabel("Time (ms)") +axes[1].set_title("Astrocyte") +axes[1].set_ylabel(r"[IP$_{3}$] ($\mu$M)") +axes[3].set_ylabel(r"[Ca$^{2+}$] ($\mu$M)") +axes[3].set_xlabel("Time (ms)") +plt.tight_layout() +plt.show() +plt.close() diff --git a/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py b/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py index 1812745e2c..6bd94960de 100644 --- a/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py +++ b/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py @@ -67,6 +67,7 @@ "music_message_out_proxy", # music device "music_rate_in_proxy", # music device "music_rate_out_proxy", # music device + "astrocyte_lr_1994", # does not have V_m ] extra_params = { diff --git a/testsuite/pytests/sli2py_regressions/test_issue_77.py b/testsuite/pytests/sli2py_regressions/test_issue_77.py index 020c827590..86264a74b0 100644 --- a/testsuite/pytests/sli2py_regressions/test_issue_77.py +++ b/testsuite/pytests/sli2py_regressions/test_issue_77.py @@ -57,6 +57,7 @@ "music_message_in_proxy", # MUSIC device "music_rate_in_proxy", # MUSIC device "music_rate_out_proxy", # MUSIC device + "astrocyte_lr_1994", # does not send spikes ] # The following models require connections to rport 1 or other specific parameters: diff --git a/testsuite/pytests/test_astrocyte.dat b/testsuite/pytests/test_astrocyte.dat new file mode 100644 index 0000000000..c3da10673c --- /dev/null +++ b/testsuite/pytests/test_astrocyte.dat @@ -0,0 +1,1011 @@ +# +# test_astrocyte.dat +# +# This file is part of NEST. +# +# This .dat file contains the recordings of the state variables of an +# astrocyte, simulated using the ODEINT solver of SciPy, with the +# implementation detailed in +# ``doc/htmldoc/model_details/astrocyte_model_implementation.ipynb``. +# This data is used as reference for the tests in ``test_astrocyte.py``. +# +# Times IP3 Ca h_IP3R +1.000000000000000056e-01 9.999882386709698645e-01 1.000187105302611235e+00 9.999799984511013040e-01 +2.000000000000000111e-01 9.999764775066160016e-01 1.000374129429669079e+00 9.999599938057039950e-01 +3.000000000000000444e-01 9.999647165069364130e-01 1.000561072405474095e+00 9.999399860656773553e-01 +4.000000000000000222e-01 9.999529556719287671e-01 1.000747934254335503e+00 9.999199752328901125e-01 +5.000000000000000000e-01 9.999411950015908435e-01 1.000934715000570074e+00 9.998999613092101058e-01 +6.000000000000000888e-01 9.999294344959200886e-01 1.001121414668503018e+00 9.998799442965047302e-01 +7.000000000000000666e-01 9.999176741549142822e-01 1.001308033282468646e+00 9.998599241966409368e-01 +8.000000000000000444e-01 9.999059139785712036e-01 1.001494570866809264e+00 9.998399010114844554e-01 +9.000000000000000222e-01 9.998941539668886325e-01 1.001681027445875172e+00 9.998198747429011268e-01 +1.000000000000000000e+00 9.998823941198641263e-01 1.001867403044024440e+00 9.997998453927560147e-01 +1.100000000000000089e+00 9.998706344374955757e-01 1.002053697685624467e+00 9.997798129629132946e-01 +1.200000000000000178e+00 9.998588749197805381e-01 1.002239911395049976e+00 9.997597774552365868e-01 +1.300000000000000044e+00 9.998471155667166821e-01 1.002426044196683685e+00 9.997397388715890676e-01 +1.400000000000000133e+00 9.998353563783016762e-01 1.002612096114917195e+00 9.997196972138331361e-01 +1.500000000000000000e+00 9.998235973545340771e-01 1.002798067167786744e+00 9.996996524833487996e-01 +1.600000000000000089e+00 9.998118384954114424e-01 1.002983957378794200e+00 9.996796046819298454e-01 +1.700000000000000178e+00 9.998000798009313295e-01 1.003169766772143534e+00 9.996595538114220192e-01 +1.800000000000000044e+00 9.997883212710916290e-01 1.003355495372325157e+00 9.996394998736913839e-01 +1.900000000000000133e+00 9.997765629058902315e-01 1.003541143203928732e+00 9.996194428706103308e-01 +2.000000000000000000e+00 9.997648047053245834e-01 1.003726710291327873e+00 9.995993828040340423e-01 +2.100000000000000089e+00 9.997530466693924645e-01 1.003912196659003886e+00 9.995793196758239185e-01 +2.200000000000000178e+00 9.997412887980915430e-01 1.004097602331188055e+00 9.995592534878219304e-01 +2.300000000000000266e+00 9.997295310914194877e-01 1.004282927332646347e+00 9.995391842419087958e-01 +2.400000000000000355e+00 9.997177735493741890e-01 1.004468171687658673e+00 9.995191119399277069e-01 +2.500000000000000000e+00 9.997060161719530935e-01 1.004653335420725657e+00 9.994990365837371771e-01 +2.600000000000000089e+00 9.996942589591540917e-01 1.004838418556414981e+00 9.994789581751990504e-01 +2.700000000000000178e+00 9.996825019109746302e-01 1.005023421119090266e+00 9.994588767161595166e-01 +2.800000000000000266e+00 9.996707450274125994e-01 1.005208343133394244e+00 9.994387922084837506e-01 +2.900000000000000355e+00 9.996589883084657790e-01 1.005393184623797787e+00 9.994187046540236041e-01 +3.000000000000000000e+00 9.996472317541317265e-01 1.005577945614810620e+00 9.993986140546320396e-01 +3.100000000000000089e+00 9.996354753644079993e-01 1.005762626130903392e+00 9.993785204121580223e-01 +3.200000000000000178e+00 9.996237191392927102e-01 1.005947226196700628e+00 9.993584237284610650e-01 +3.300000000000000266e+00 9.996119630787833055e-01 1.006131745836687852e+00 9.993383240053890226e-01 +3.400000000000000355e+00 9.996002071828776758e-01 1.006316185075397884e+00 9.993182212447920820e-01 +3.500000000000000000e+00 9.995884514515732677e-01 1.006500543937431269e+00 9.992981154485242046e-01 +3.600000000000000089e+00 9.995766958848679717e-01 1.006684822447352579e+00 9.992780066184355769e-01 +3.700000000000000178e+00 9.995649404827591233e-01 1.006869020629761691e+00 9.992578947563781622e-01 +3.800000000000000266e+00 9.995531852452448351e-01 1.007053138509160783e+00 9.992377798641949305e-01 +3.900000000000000355e+00 9.995414301723225536e-01 1.007237176110203469e+00 9.992176619437391771e-01 +4.000000000000000000e+00 9.995296752639900584e-01 1.007421133457441664e+00 9.991975409968556487e-01 +4.100000000000000533e+00 9.995179205202451289e-01 1.007605010575468585e+00 9.991774170253909793e-01 +4.200000000000000178e+00 9.995061659410854338e-01 1.007788807488936955e+00 9.991572900311946892e-01 +4.299999999999999822e+00 9.994944115265088636e-01 1.007972524222447097e+00 9.991371600161117472e-01 +4.400000000000000355e+00 9.994826572765127537e-01 1.008156160800613765e+00 9.991170269819868999e-01 +4.500000000000000000e+00 9.994709031910949948e-01 1.008339717248087020e+00 9.990968909306660040e-01 +4.600000000000000533e+00 9.994591492702533664e-01 1.008523193589492717e+00 9.990767518639924738e-01 +4.700000000000000178e+00 9.994473955139853150e-01 1.008706589849486912e+00 9.990566097838107229e-01 +4.800000000000000711e+00 9.994356419222887311e-01 1.008889906052709673e+00 9.990364646919626113e-01 +4.900000000000000355e+00 9.994238884951611723e-01 1.009073142223811281e+00 9.990163165902894438e-01 +5.000000000000000000e+00 9.994121352326004182e-01 1.009256298387477102e+00 9.989961654806346347e-01 +5.100000000000000533e+00 9.994003821346041372e-01 1.009439374568378511e+00 9.989760113648389339e-01 +5.200000000000000178e+00 9.993886292011703310e-01 1.009622370791188439e+00 9.989558542447422029e-01 +5.300000000000000711e+00 9.993768764322962239e-01 1.009805287080595582e+00 9.989356941221844144e-01 +5.400000000000000355e+00 9.993651238279797067e-01 1.009988123461303289e+00 9.989155309990054299e-01 +5.500000000000000000e+00 9.993533713882185587e-01 1.010170879958015133e+00 9.988953648770441118e-01 +5.600000000000000533e+00 9.993416191130105597e-01 1.010353556595421143e+00 9.988751957581368801e-01 +5.700000000000000178e+00 9.993298670023533781e-01 1.010536153398247761e+00 9.988550236441219310e-01 +5.800000000000000711e+00 9.993181150562444603e-01 1.010718670391218099e+00 9.988348485368364615e-01 +5.900000000000000355e+00 9.993063632746818081e-01 1.010901107599068149e+00 9.988146704381166696e-01 +6.000000000000000000e+00 9.992946116576629789e-01 1.011083465046525021e+00 9.987944893497979759e-01 +6.100000000000000533e+00 9.992828602051855302e-01 1.011265742758326036e+00 9.987743052737143579e-01 +6.200000000000000178e+00 9.992711089172474637e-01 1.011447940759222508e+00 9.987541182117009031e-01 +6.300000000000000711e+00 9.992593577938463367e-01 1.011630059073967969e+00 9.987339281655907008e-01 +6.400000000000000355e+00 9.992476068349797069e-01 1.011812097727338156e+00 9.987137351372180616e-01 +6.500000000000000000e+00 9.992358560406453538e-01 1.011994056744092596e+00 9.986935391284145203e-01 +6.600000000000000533e+00 9.992241054108410570e-01 1.012175936149002364e+00 9.986733401410119448e-01 +6.700000000000000178e+00 9.992123549455647069e-01 1.012357735966858518e+00 9.986531381768419813e-01 +6.800000000000000711e+00 9.992006046448136392e-01 1.012539456222433687e+00 9.986329332377341661e-01 +6.900000000000000355e+00 9.991888545085856332e-01 1.012721096940534249e+00 9.986127253255191460e-01 +7.000000000000000000e+00 9.991771045368785797e-01 1.012902658145957258e+00 9.985925144420262356e-01 +7.100000000000000533e+00 9.991653547296899252e-01 1.013084139863512645e+00 9.985723005890841941e-01 +7.200000000000000178e+00 9.991536050870176711e-01 1.013265542118011897e+00 9.985520837685208928e-01 +7.300000000000000711e+00 9.991418556088595970e-01 1.013446864934269609e+00 9.985318639821637587e-01 +7.400000000000000355e+00 9.991301062952130385e-01 1.013628108337114808e+00 9.985116412318396639e-01 +7.500000000000000000e+00 9.991183571460757751e-01 1.013809272351385626e+00 9.984914155193752583e-01 +7.600000000000000533e+00 9.991066081614455863e-01 1.013990357001919973e+00 9.984711868465959705e-01 +7.700000000000000178e+00 9.990948593413201406e-01 1.014171362313554203e+00 9.984509552153264522e-01 +7.800000000000000711e+00 9.990831106856971067e-01 1.014352288311156647e+00 9.984307206273922430e-01 +7.900000000000000355e+00 9.990713621945742640e-01 1.014533135019574983e+00 9.984104830846163292e-01 +8.000000000000000000e+00 9.990596138679491700e-01 1.014713902463670880e+00 9.983902425888219190e-01 +8.099999999999999645e+00 9.990478657058198264e-01 1.014894590668307783e+00 9.983699991418307773e-01 +8.200000000000001066e+00 9.990361177081835686e-01 1.015075199658371785e+00 9.983497527454656684e-01 +8.300000000000000711e+00 9.990243698750385093e-01 1.015255729458740319e+00 9.983295034015480240e-01 +8.400000000000000355e+00 9.990126222063819839e-01 1.015436180094298813e+00 9.983092511118977219e-01 +8.500000000000000000e+00 9.990008747022116609e-01 1.015616551589947791e+00 9.982889958783356388e-01 +8.599999999999999645e+00 9.989891273625254309e-01 1.015796843970581342e+00 9.982687377026810971e-01 +8.700000000000001066e+00 9.989773801873209624e-01 1.015977057261108207e+00 9.982484765867526422e-01 +8.800000000000000711e+00 9.989656331765960351e-01 1.016157191486443789e+00 9.982282125323690414e-01 +8.900000000000000355e+00 9.989538863303482064e-01 1.016337246671495498e+00 9.982079455413469526e-01 +9.000000000000000000e+00 9.989421396485754778e-01 1.016517222841192503e+00 9.981876756155040331e-01 +9.099999999999999645e+00 9.989303931312751850e-01 1.016697120020459089e+00 9.981674027566558305e-01 +9.200000000000001066e+00 9.989186467784452184e-01 1.016876938234227756e+00 9.981471269666182256e-01 +9.300000000000000711e+00 9.989069005900832465e-01 1.017056677507438778e+00 9.981268482472064330e-01 +9.400000000000000355e+00 9.988951545661870490e-01 1.017236337865053075e+00 9.981065666002357784e-01 +9.500000000000000000e+00 9.988834087067540723e-01 1.017415919332009810e+00 9.980862820275192560e-01 +9.600000000000001421e+00 9.988716630117822071e-01 1.017595421933268129e+00 9.980659945308703040e-01 +9.700000000000001066e+00 9.988599174812692327e-01 1.017774845693790953e+00 9.980457041121012507e-01 +9.800000000000000711e+00 9.988481721152127069e-01 1.017954190638546974e+00 9.980254107730242019e-01 +9.900000000000000355e+00 9.988364269136102980e-01 1.018133456792510882e+00 9.980051145154504866e-01 +1.000000000000000000e+01 5.998824681876460119e+00 1.018312644180662252e+00 9.979848153411911005e-01 +1.010000000000000142e+01 5.998742929092975018e+00 1.018583490423119020e+00 9.979645251557320851e-01 +1.020000000000000107e+01 5.998661177454162718e+00 1.018854189799071497e+00 9.979442303550029036e-01 +1.030000000000000071e+01 5.998579426960006344e+00 1.019124742361360747e+00 9.979239309423314497e-01 +1.040000000000000036e+01 5.998497677610489909e+00 1.019395148162870912e+00 9.979036269210456167e-01 +1.050000000000000000e+01 5.998415929405597424e+00 1.019665407256519662e+00 9.978833182944716329e-01 +1.060000000000000142e+01 5.998334182345312016e+00 1.019935519695264414e+00 9.978630050659342832e-01 +1.070000000000000107e+01 5.998252436429618584e+00 1.020205485532088119e+00 9.978426872387569091e-01 +1.080000000000000071e+01 5.998170691658501141e+00 1.020475304820019247e+00 9.978223648162619641e-01 +1.090000000000000036e+01 5.998088948031942813e+00 1.020744977612122462e+00 9.978020378017703473e-01 +1.100000000000000000e+01 5.998007205549928500e+00 1.021014503961490627e+00 9.977817061986018476e-01 +1.110000000000000142e+01 5.997925464212442215e+00 1.021283883921258129e+00 9.977613700100749217e-01 +1.120000000000000107e+01 5.997843724019468858e+00 1.021553117544587552e+00 9.977410292395062497e-01 +1.130000000000000071e+01 5.997761984970988891e+00 1.021822204884684115e+00 9.977206838902121788e-01 +1.140000000000000036e+01 5.997680247066988990e+00 1.022091145994782790e+00 9.977003339655068359e-01 +1.150000000000000000e+01 5.997598510307454056e+00 1.022359940928156741e+00 9.976799794687036815e-01 +1.160000000000000142e+01 5.997516774692367214e+00 1.022628589738109106e+00 9.976596204031144000e-01 +1.170000000000000107e+01 5.997435040221713365e+00 1.022897092477980996e+00 9.976392567720497873e-01 +1.180000000000000071e+01 5.997353306895473857e+00 1.023165449201144828e+00 9.976188885788187521e-01 +1.190000000000000036e+01 5.997271574713635367e+00 1.023433659961011211e+00 9.975985158267299813e-01 +1.200000000000000000e+01 5.997189843676179244e+00 1.023701724811022062e+00 9.975781385190899408e-01 +1.210000000000000142e+01 5.997108113783093053e+00 1.023969643804649943e+00 9.975577566592036538e-01 +1.220000000000000107e+01 5.997026385034359031e+00 1.024237416995406713e+00 9.975373702503753659e-01 +1.230000000000000071e+01 5.996944657429959413e+00 1.024505044436837542e+00 9.975169792959082127e-01 +1.240000000000000036e+01 5.996862930969880878e+00 1.024772526182514687e+00 9.974965837991034423e-01 +1.250000000000000000e+01 5.996781205654106550e+00 1.025039862286049708e+00 9.974761837632614148e-01 +1.260000000000000142e+01 5.996699481482620442e+00 1.025307052801084806e+00 9.974557791916810467e-01 +1.270000000000000107e+01 5.996617758455406566e+00 1.025574097781294380e+00 9.974353700876597006e-01 +1.280000000000000071e+01 5.996536036572447159e+00 1.025840997280388356e+00 9.974149564544937396e-01 +1.290000000000000036e+01 5.996454315833728010e+00 1.026107751352104636e+00 9.973945382954783057e-01 +1.300000000000000000e+01 5.996372596239233133e+00 1.026374360050218426e+00 9.973741156139069863e-01 +1.310000000000000142e+01 5.996290877788945650e+00 1.026640823428535132e+00 9.973536884130721480e-01 +1.320000000000000107e+01 5.996209160482850464e+00 1.026907141540891022e+00 9.973332566962647139e-01 +1.330000000000000071e+01 5.996127444320931588e+00 1.027173314441157670e+00 9.973128204667748298e-01 +1.340000000000000036e+01 5.996045729303173921e+00 1.027439342183237070e+00 9.972923797278905322e-01 +1.350000000000000000e+01 5.995964015429560590e+00 1.027705224821060082e+00 9.972719344828991916e-01 +1.360000000000000142e+01 5.995882302700075606e+00 1.027970962408592870e+00 9.972514847350866241e-01 +1.370000000000000107e+01 5.995800591114701206e+00 1.028236554999832020e+00 9.972310304877370912e-01 +1.380000000000000071e+01 5.995718880673422291e+00 1.028502002648803648e+00 9.972105717441338557e-01 +1.390000000000000036e+01 5.995637171376224650e+00 1.028767305409566735e+00 9.971901085075591809e-01 +1.400000000000000000e+01 5.995555463223091408e+00 1.029032463336211567e+00 9.971696407812931096e-01 +1.410000000000000142e+01 5.995473756214005689e+00 1.029297476482859519e+00 9.971491685686153517e-01 +1.420000000000000107e+01 5.995392050348952395e+00 1.029562344903661719e+00 9.971286918728036186e-01 +1.430000000000000071e+01 5.995310345627915538e+00 1.029827068652801048e+00 9.971082106971345116e-01 +1.440000000000000036e+01 5.995228642050880019e+00 1.030091647784488584e+00 9.970877250448835216e-01 +1.450000000000000000e+01 5.995146939617827186e+00 1.030356082352967606e+00 9.970672349193244743e-01 +1.460000000000000142e+01 5.995065238328743717e+00 1.030620372412511143e+00 9.970467403237300852e-01 +1.470000000000000107e+01 5.994983538183612737e+00 1.030884518017422646e+00 9.970262412613717373e-01 +1.480000000000000071e+01 5.994901839182418257e+00 1.031148519222035542e+00 9.970057377355195927e-01 +1.490000000000000036e+01 5.994820141325145180e+00 1.031412376080712567e+00 9.969852297494422588e-01 +1.500000000000000000e+01 5.994738444611776629e+00 1.031676088647845768e+00 9.969647173064072332e-01 +1.510000000000000142e+01 5.994656749042293953e+00 1.031939656977857611e+00 9.969442004096804588e-01 +1.520000000000000107e+01 5.994575054616683829e+00 1.032203081125200539e+00 9.969236790625268796e-01 +1.530000000000000071e+01 5.994493361334931159e+00 1.032466361144353639e+00 9.969031532682096630e-01 +1.540000000000000036e+01 5.994411669197019066e+00 1.032729497089826420e+00 9.968826230299910884e-01 +1.550000000000000000e+01 5.994329978202930675e+00 1.032992489016158366e+00 9.968620883511321029e-01 +1.560000000000000142e+01 5.994248288352652665e+00 1.033255336977917160e+00 9.968415492348918772e-01 +1.570000000000000107e+01 5.994166599646165494e+00 1.033518041029699130e+00 9.968210056845289158e-01 +1.580000000000000071e+01 5.994084912083454952e+00 1.033780601226128804e+00 9.968004577032998359e-01 +1.590000000000000036e+01 5.994003225664505941e+00 1.034043017621859128e+00 9.967799052944600335e-01 +1.600000000000000000e+01 5.993921540389299807e+00 1.034305290271572142e+00 9.967593484612640164e-01 +1.610000000000000142e+01 5.993839856257823229e+00 1.034567419229976970e+00 9.967387872069644050e-01 +1.619999999999999929e+01 5.993758173270058442e+00 1.034829404551812049e+00 9.967182215348128205e-01 +1.630000000000000071e+01 5.993676491425991237e+00 1.035091246291843792e+00 9.966976514480594407e-01 +1.640000000000000213e+01 5.993594810725604738e+00 1.035352944504864148e+00 9.966770769499530003e-01 +1.650000000000000000e+01 5.993513131168882957e+00 1.035614499245695264e+00 9.966564980437411236e-01 +1.660000000000000142e+01 5.993431452755809019e+00 1.035875910569184599e+00 9.966359147326703249e-01 +1.669999999999999929e+01 5.993349775486368713e+00 1.036137178530208702e+00 9.966153270199853420e-01 +1.680000000000000071e+01 5.993268099360544277e+00 1.036398303183670322e+00 9.965947349089294693e-01 +1.690000000000000213e+01 5.993186424378321497e+00 1.036659284584499296e+00 9.965741384027450023e-01 +1.700000000000000000e+01 5.993104750539682612e+00 1.036920122787654330e+00 9.965535375046731259e-01 +1.710000000000000142e+01 5.993023077844614299e+00 1.037180817848116776e+00 9.965329322179531379e-01 +1.719999999999999929e+01 5.992941406293096129e+00 1.037441369820899517e+00 9.965123225458234479e-01 +1.730000000000000071e+01 5.992859735885116557e+00 1.037701778761041860e+00 9.964917084915209111e-01 +1.740000000000000213e+01 5.992778066620657818e+00 1.037962044723603316e+00 9.964710900582809394e-01 +1.750000000000000000e+01 5.992696398499703037e+00 1.038222167763676040e+00 9.964504672493379456e-01 +1.760000000000000142e+01 5.992614731522238891e+00 1.038482147936375499e+00 9.964298400679247880e-01 +1.769999999999999929e+01 5.992533065688246730e+00 1.038741985296844472e+00 9.964092085172729929e-01 +1.780000000000000071e+01 5.992451400997711453e+00 1.039001679900253272e+00 9.963885726006128651e-01 +1.790000000000000213e+01 5.992369737450616185e+00 1.039261231801792862e+00 9.963679323211732664e-01 +1.800000000000000000e+01 5.992288075046946716e+00 1.039520641056684847e+00 9.963472876821818369e-01 +1.810000000000000142e+01 5.992206413786686170e+00 1.039779907720173924e+00 9.963266386868648850e-01 +1.819999999999999929e+01 5.992124753669817672e+00 1.040039031847530770e+00 9.963059853384470532e-01 +1.830000000000000071e+01 5.992043094696327898e+00 1.040298013494051821e+00 9.962853276401519853e-01 +1.840000000000000213e+01 5.991961436866198198e+00 1.040556852715058600e+00 9.962646655952019925e-01 +1.850000000000000000e+01 5.991879780179414361e+00 1.040815549565896614e+00 9.962439992068178318e-01 +1.860000000000000142e+01 5.991798124635958622e+00 1.041074104101937348e+00 9.962233284782190390e-01 +1.869999999999999929e+01 5.991716470235816772e+00 1.041332516378574935e+00 9.962026534126239286e-01 +1.880000000000000071e+01 5.991634816978972822e+00 1.041590786451231931e+00 9.961819740132492607e-01 +1.890000000000000213e+01 5.991553164865410785e+00 1.041848914375353985e+00 9.961612902833103522e-01 +1.900000000000000000e+01 5.991471513895112899e+00 1.042106900206410058e+00 9.961406022260217430e-01 +1.910000000000000142e+01 5.991389864068063176e+00 1.042364743999893539e+00 9.961199098445960853e-01 +1.920000000000000284e+01 5.991308215384249181e+00 1.042622445811322018e+00 9.960992131422446993e-01 +1.930000000000000071e+01 5.991226567843651374e+00 1.042880005696238843e+00 9.960785121221782390e-01 +1.940000000000000213e+01 5.991144921446253768e+00 1.043137423710209122e+00 9.960578067876052488e-01 +1.950000000000000000e+01 5.991063276192043041e+00 1.043394699908820833e+00 9.960370971417330521e-01 +1.960000000000000142e+01 5.990981632081000541e+00 1.043651834347689933e+00 9.960163831877678620e-01 +1.970000000000000284e+01 5.990899989113112944e+00 1.043908827082452362e+00 9.959956649289144481e-01 +1.980000000000000071e+01 5.990818347288360712e+00 1.044165678168768707e+00 9.959749423683763592e-01 +1.990000000000000213e+01 5.990736706606731410e+00 1.044422387662322871e+00 9.959542155093557003e-01 +2.000000000000000000e+01 5.990655067068208162e+00 1.044678955618821403e+00 9.959334843550530225e-01 +2.010000000000000142e+01 5.990573428672773204e+00 1.044935382093994836e+00 9.959127489086678775e-01 +2.020000000000000284e+01 5.990491791420411438e+00 1.045191667143594350e+00 9.958920091733981517e-01 +2.030000000000000071e+01 5.990410155311109541e+00 1.045447810823396217e+00 9.958712651524407322e-01 +2.040000000000000213e+01 5.990328520344848862e+00 1.045703813189198694e+00 9.958505168489907300e-01 +2.050000000000000000e+01 5.990246886521611636e+00 1.045959674296822683e+00 9.958297642662423677e-01 +2.060000000000000142e+01 5.990165253841384541e+00 1.046215394202112181e+00 9.958090074073882025e-01 +2.070000000000000284e+01 5.990083622304152478e+00 1.046470972960932277e+00 9.957882462756196817e-01 +2.080000000000000071e+01 5.990001991909898571e+00 1.046726410629169823e+00 9.957674808741266981e-01 +2.090000000000000213e+01 5.989920362658605058e+00 1.046981707262734984e+00 9.957467112060977010e-01 +2.100000000000000000e+01 5.989838734550256838e+00 1.047236862917560574e+00 9.957259372747202519e-01 +2.110000000000000142e+01 5.989757107584837925e+00 1.047491877649599168e+00 9.957051590831800247e-01 +2.120000000000000284e+01 5.989675481762334108e+00 1.047746751514827990e+00 9.956843766346614721e-01 +2.130000000000000071e+01 5.989593857082727624e+00 1.048001484569242914e+00 9.956635899323480476e-01 +2.140000000000000213e+01 5.989512233546003372e+00 1.048256076868863129e+00 9.956427989794217615e-01 +2.150000000000000000e+01 5.989430611152146255e+00 1.048510528469727365e+00 9.956220037790626254e-01 +2.160000000000000142e+01 5.989348989901138509e+00 1.048764839427897888e+00 9.956012043344502072e-01 +2.170000000000000284e+01 5.989267369792964146e+00 1.049019009799455615e+00 9.955804006487620761e-01 +2.180000000000000071e+01 5.989185750827609844e+00 1.049273039640504335e+00 9.955595927251748023e-01 +2.190000000000000213e+01 5.989104133005056063e+00 1.049526929007169596e+00 9.955387805668635126e-01 +2.200000000000000000e+01 5.989022516325288592e+00 1.049780677955595598e+00 9.955179641770018906e-01 +2.210000000000000142e+01 5.988940900788292332e+00 1.050034286541947415e+00 9.954971435587622874e-01 +2.220000000000000284e+01 5.988859286394048631e+00 1.050287754822410990e+00 9.954763187153156112e-01 +2.230000000000000071e+01 5.988777673142545055e+00 1.050541082853193364e+00 9.954554896498317706e-01 +2.240000000000000213e+01 5.988696061033761175e+00 1.050794270690521781e+00 9.954346563654788982e-01 +2.250000000000000000e+01 5.988614450067685446e+00 1.051047318390642582e+00 9.954138188654242381e-01 +2.260000000000000142e+01 5.988532840244299216e+00 1.051300226009823424e+00 9.953929771528332582e-01 +2.270000000000000284e+01 5.988451231563588273e+00 1.051552993604352171e+00 9.953721312308699831e-01 +2.280000000000000071e+01 5.988369624025535742e+00 1.051805621230534893e+00 9.953512811026974383e-01 +2.290000000000000213e+01 5.988288017630125637e+00 1.052058108944697867e+00 9.953304267714774278e-01 +2.300000000000000000e+01 5.988206412377340193e+00 1.052310456803188687e+00 9.953095682403696465e-01 +2.310000000000000142e+01 5.988124808267166976e+00 1.052562664862372710e+00 9.952887055125332338e-01 +2.320000000000000284e+01 5.988043205299587335e+00 1.052814733178635054e+00 9.952678385911254422e-01 +2.330000000000000071e+01 5.987961603474587058e+00 1.053066661808381044e+00 9.952469674793026355e-01 +2.340000000000000213e+01 5.987880002792149270e+00 1.053318450808033102e+00 9.952260921802194016e-01 +2.350000000000000000e+01 5.987798403252257096e+00 1.053570100234034745e+00 9.952052126970291068e-01 +2.360000000000000142e+01 5.987716804854897212e+00 1.053821610142848586e+00 9.951843290328838965e-01 +2.370000000000000284e+01 5.987635207600051857e+00 1.054072980590953668e+00 9.951634411909342504e-01 +2.380000000000000071e+01 5.987553611487705041e+00 1.054324211634851238e+00 9.951425491743295382e-01 +2.390000000000000213e+01 5.987472016517840778e+00 1.054575303331057201e+00 9.951216529862176863e-01 +2.400000000000000000e+01 5.987390422690442193e+00 1.054826255736109664e+00 9.951007526297452888e-01 +2.410000000000000142e+01 5.987308830005495075e+00 1.055077068906561832e+00 9.950798481080576074e-01 +2.420000000000000284e+01 5.987227238462984324e+00 1.055327742898987120e+00 9.950589394242984609e-01 +2.430000000000000071e+01 5.987145648062891290e+00 1.055578277769977591e+00 9.950380265816102243e-01 +2.440000000000000213e+01 5.987064058805199984e+00 1.055828673576141963e+00 9.950171095831341628e-01 +2.450000000000000000e+01 5.986982470689895308e+00 1.056078930374107383e+00 9.949961884320100980e-01 +2.460000000000000142e+01 5.986900883716963939e+00 1.056329048220518541e+00 9.949752631313762974e-01 +2.470000000000000284e+01 5.986819297886386337e+00 1.056579027172039220e+00 9.949543336843699182e-01 +2.480000000000000071e+01 5.986737713198150068e+00 1.056828867285348528e+00 9.949334000941266742e-01 +2.490000000000000213e+01 5.986656129652234704e+00 1.057078568617145109e+00 9.949124623637806142e-01 +2.500000000000000000e+01 5.986574547248627809e+00 1.057328131224144707e+00 9.948915204964645653e-01 +2.510000000000000142e+01 5.986492965987311621e+00 1.057577555163079053e+00 9.948705744953104668e-01 +2.520000000000000284e+01 5.986411385868271040e+00 1.057826840490698306e+00 9.948496243634483704e-01 +2.530000000000000071e+01 5.986329806891490968e+00 1.058075987263769058e+00 9.948286701040072177e-01 +2.540000000000000213e+01 5.986248229056952752e+00 1.058324995539075664e+00 9.948077117201143960e-01 +2.550000000000000000e+01 5.986166652364643070e+00 1.058573865373417799e+00 9.947867492148958490e-01 +2.560000000000000142e+01 5.986085076814545047e+00 1.058822596823612461e+00 9.947657825914766327e-01 +2.570000000000000284e+01 5.986003502406640919e+00 1.059071189946494185e+00 9.947448118529798045e-01 +2.580000000000000071e+01 5.985921929140914699e+00 1.059319644798913496e+00 9.947238370025276444e-01 +2.590000000000000213e+01 5.985840357017353952e+00 1.059567961437737349e+00 9.947028580432406564e-01 +2.600000000000000000e+01 5.985758786035940027e+00 1.059816139919848688e+00 9.946818749782381230e-01 +2.610000000000000142e+01 5.985677216196657824e+00 1.060064180302147552e+00 9.946608878106379947e-01 +2.620000000000000284e+01 5.985595647499492244e+00 1.060312082641549081e+00 9.946398965435567785e-01 +2.630000000000000071e+01 5.985514079944424637e+00 1.060559846994984845e+00 9.946189011801098712e-01 +2.640000000000000213e+01 5.985432513531442567e+00 1.060807473419402402e+00 9.945979017234108932e-01 +2.650000000000000000e+01 5.985350948260527382e+00 1.061054961971764632e+00 9.945768981765722438e-01 +2.660000000000000142e+01 5.985269384131663983e+00 1.061302312709050844e+00 9.945558905427046570e-01 +2.670000000000000284e+01 5.985187821144837272e+00 1.061549525688254558e+00 9.945348788249182004e-01 +2.680000000000000071e+01 5.985106259300031262e+00 1.061796600966386839e+00 9.945138630263212765e-01 +2.690000000000000213e+01 5.985024698597229076e+00 1.062043538600472070e+00 9.944928431500205113e-01 +2.700000000000000000e+01 5.984943139036413839e+00 1.062290338647551513e+00 9.944718191991215317e-01 +2.710000000000000142e+01 5.984861580617572230e+00 1.062537001164680639e+00 9.944507911767286323e-01 +2.720000000000000284e+01 5.984780023340685595e+00 1.062783526208929574e+00 9.944297590859445535e-01 +2.730000000000000071e+01 5.984698467205737948e+00 1.063029913837384433e+00 9.944087229298711472e-01 +2.740000000000000213e+01 5.984616912212716855e+00 1.063276164107145538e+00 9.943876827116079342e-01 +2.750000000000000000e+01 5.984535358361603663e+00 1.063522277075329203e+00 9.943666384342541020e-01 +2.760000000000000142e+01 5.984453805652384162e+00 1.063768252799064618e+00 9.943455901009066178e-01 +2.770000000000000284e+01 5.984372254085038811e+00 1.064014091335495182e+00 9.943245377146614494e-01 +2.780000000000000071e+01 5.984290703659555177e+00 1.064259792741780730e+00 9.943034812786133436e-01 +2.790000000000000213e+01 5.984209154375915496e+00 1.064505357075095082e+00 9.942824207958554927e-01 +2.800000000000000000e+01 5.984127606234103780e+00 1.064750784392625604e+00 9.942613562694799789e-01 +2.810000000000000142e+01 5.984046059234105819e+00 1.064996074751572541e+00 9.942402877025771080e-01 +2.820000000000000284e+01 5.983964513375902960e+00 1.065241228209152791e+00 9.942192150982358534e-01 +2.830000000000000071e+01 5.983882968659480994e+00 1.065486244822595463e+00 9.941981384595440785e-01 +2.840000000000000213e+01 5.983801425084823045e+00 1.065731124649143435e+00 9.941770577895879812e-01 +2.850000000000000000e+01 5.983719882651914013e+00 1.065975867746054462e+00 9.941559730914525383e-01 +2.860000000000000142e+01 5.983638341360738799e+00 1.066220474170598509e+00 9.941348843682215053e-01 +2.870000000000000284e+01 5.983556801211279641e+00 1.066464943980060642e+00 9.941137916229770832e-01 +2.880000000000000071e+01 5.983475262203521439e+00 1.066709277231738140e+00 9.940926948587999190e-01 +2.890000000000000213e+01 5.983393724337449093e+00 1.066953473982941603e+00 9.940715940787695493e-01 +2.900000000000000000e+01 5.983312187613043953e+00 1.067197534290995398e+00 9.940504892859642894e-01 +2.910000000000000142e+01 5.983230652030293584e+00 1.067441458213237215e+00 9.940293804834604563e-01 +2.920000000000000284e+01 5.983149117589178445e+00 1.067685245807017180e+00 9.940082676743337009e-01 +2.930000000000000071e+01 5.983067584289685215e+00 1.067928897129698740e+00 9.939871508616580087e-01 +2.940000000000000213e+01 5.982986052131798793e+00 1.068172412238657776e+00 9.939660300485059219e-01 +2.950000000000000000e+01 5.982904521115500529e+00 1.068415791191282826e+00 9.939449052379485394e-01 +2.960000000000000142e+01 5.982822991240776211e+00 1.068659034044975531e+00 9.939237764330557390e-01 +2.970000000000000284e+01 5.982741462507607189e+00 1.068902140857149963e+00 9.939026436368960660e-01 +2.980000000000000071e+01 5.982659934915981026e+00 1.069145111685232186e+00 9.938815068525362895e-01 +2.990000000000000213e+01 5.982578408465879072e+00 1.069387946586661808e+00 9.938603660830424014e-01 +3.000000000000000000e+01 5.982496883157286227e+00 1.069630645618889098e+00 9.938392213314788393e-01 +3.010000000000000142e+01 5.982415358990189169e+00 1.069873208839376755e+00 9.938180726009081534e-01 +3.020000000000000284e+01 5.982333835964569246e+00 1.070115636305601248e+00 9.937969198943921167e-01 +3.030000000000000071e+01 5.982252314080411359e+00 1.070357928075048592e+00 9.937757632149908371e-01 +3.040000000000000213e+01 5.982170793337698633e+00 1.070600084205218350e+00 9.937546025657633120e-01 +3.050000000000000000e+01 5.982089273736415080e+00 1.070842104753621182e+00 9.937334379497665404e-01 +3.060000000000000142e+01 5.982007755276546490e+00 1.071083989777779300e+00 9.937122693700569664e-01 +3.070000000000000284e+01 5.981926237958073322e+00 1.071325739335226679e+00 9.936910968296891467e-01 +3.080000000000000071e+01 5.981844721780982255e+00 1.071567353483508844e+00 9.936699203317163054e-01 +3.090000000000000213e+01 5.981763206745259076e+00 1.071808832280182866e+00 9.936487398791904457e-01 +3.100000000000000000e+01 5.981681692850886023e+00 1.072050175782816250e+00 9.936275554751620165e-01 +3.110000000000000142e+01 5.981600180097846220e+00 1.072291384048988272e+00 9.936063671226799121e-01 +3.120000000000000284e+01 5.981518668486123680e+00 1.072532457136289974e+00 9.935851748247923609e-01 +3.130000000000000071e+01 5.981437158015702416e+00 1.072773395102321725e+00 9.935639785845453709e-01 +3.140000000000000213e+01 5.981355648686568216e+00 1.073014198004696773e+00 9.935427784049840616e-01 +3.150000000000000000e+01 5.981274140498704206e+00 1.073254865901037913e+00 9.935215742891519985e-01 +3.160000000000000142e+01 5.981192633452095286e+00 1.073495398848978821e+00 9.935003662400915259e-01 +3.170000000000000284e+01 5.981111127546723694e+00 1.073735796906164497e+00 9.934791542608434334e-01 +3.180000000000000071e+01 5.981029622782576105e+00 1.073976060130248600e+00 9.934579383544471787e-01 +3.190000000000000213e+01 5.980948119159634757e+00 1.074216188578897446e+00 9.934367185239406650e-01 +3.200000000000000000e+01 5.980866616677882774e+00 1.074456182309786900e+00 9.934154947723610185e-01 +3.210000000000000142e+01 5.980785115337305946e+00 1.074696041380601930e+00 9.933942671027432558e-01 +3.220000000000000284e+01 5.980703615137887397e+00 1.074935765849039937e+00 9.933730355181213945e-01 +3.230000000000000426e+01 5.980622116079612915e+00 1.075175355772805874e+00 9.933518000215278976e-01 +3.239999999999999858e+01 5.980540618162464739e+00 1.075414811209616683e+00 9.933305606159940071e-01 +3.250000000000000000e+01 5.980459121386425103e+00 1.075654132217198189e+00 9.933093173045495217e-01 +3.260000000000000142e+01 5.980377625751482462e+00 1.075893318853286429e+00 9.932880700902227966e-01 +3.270000000000000284e+01 5.980296131257618164e+00 1.076132371175626545e+00 9.932668189760409660e-01 +3.280000000000000426e+01 5.980214637904817110e+00 1.076371289241974116e+00 9.932455639650294987e-01 +3.289999999999999858e+01 5.980133145693062424e+00 1.076610073110093602e+00 9.932243050602127532e-01 +3.300000000000000000e+01 5.980051654622340784e+00 1.076848722837759009e+00 9.932030422646136447e-01 +3.310000000000000142e+01 5.979970164692631762e+00 1.077087238482753895e+00 9.931817755812535342e-01 +3.320000000000000284e+01 5.979888675903922923e+00 1.077325620102871140e+00 9.931605050131524504e-01 +3.330000000000000426e+01 5.979807188256197392e+00 1.077563867755912286e+00 9.931392305633294226e-01 +3.339999999999999858e+01 5.979725701749438294e+00 1.077801981499688422e+00 9.931179522348014821e-01 +3.350000000000000000e+01 5.979644216383629640e+00 1.078039961392018853e+00 9.930966700305846606e-01 +3.360000000000000142e+01 5.979562732158758109e+00 1.078277807490732432e+00 9.930753839536935468e-01 +3.370000000000000284e+01 5.979481249074805937e+00 1.078515519853667337e+00 9.930540940071413969e-01 +3.380000000000000426e+01 5.979399767131756249e+00 1.078753098538669519e+00 9.930328001939396909e-01 +3.389999999999999858e+01 5.979318286329593946e+00 1.078990543603593810e+00 9.930115025170990206e-01 +3.400000000000000000e+01 5.979236806668304816e+00 1.079227855106303036e+00 9.929902009796286455e-01 +3.410000000000000142e+01 5.979155328147871096e+00 1.079465033104670901e+00 9.929688955845360487e-01 +3.420000000000000284e+01 5.979073850768276799e+00 1.079702077656575554e+00 9.929475863348272702e-01 +3.430000000000000426e+01 5.978992374529505938e+00 1.079938988819906243e+00 9.929262732335074615e-01 +3.439999999999999858e+01 5.978910899431543413e+00 1.080175766652560210e+00 9.929049562835796650e-01 +3.450000000000000000e+01 5.978829425474375014e+00 1.080412411212441359e+00 9.928836354880461457e-01 +3.460000000000000142e+01 5.978747952657981202e+00 1.080648922557462921e+00 9.928623108499078365e-01 +3.470000000000000284e+01 5.978666480982346876e+00 1.080885300745545674e+00 9.928409823721640048e-01 +3.480000000000000426e+01 5.978585010447457826e+00 1.081121545834617503e+00 9.928196500578122530e-01 +3.489999999999999858e+01 5.978503541053295400e+00 1.081357657882614953e+00 9.927983139098494059e-01 +3.500000000000000000e+01 5.978422072799847165e+00 1.081593636947482118e+00 9.927769739312706232e-01 +3.510000000000000142e+01 5.978340605687094467e+00 1.081829483087170418e+00 9.927556301250696214e-01 +3.520000000000000284e+01 5.978259139715020432e+00 1.082065196359638382e+00 9.927342824942390065e-01 +3.530000000000000426e+01 5.978177674883611736e+00 1.082300776822852972e+00 9.927129310417693864e-01 +3.539999999999999858e+01 5.978096211192851506e+00 1.082536224534788039e+00 9.926915757706504806e-01 +3.550000000000000000e+01 5.978014748642725529e+00 1.082771539553424089e+00 9.926702166838705654e-01 +3.560000000000000142e+01 5.977933287233214266e+00 1.083006721936749406e+00 9.926488537844165849e-01 +3.570000000000000284e+01 5.977851826964303505e+00 1.083241771742758930e+00 9.926274870752735957e-01 +3.580000000000000426e+01 5.977770367835978149e+00 1.083476689029454265e+00 9.926061165594260993e-01 +3.589999999999999858e+01 5.977688909848221321e+00 1.083711473854845453e+00 9.925847422398565989e-01 +3.600000000000000000e+01 5.977607453001017923e+00 1.083946126276947641e+00 9.925633641195464874e-01 +3.610000000000000142e+01 5.977525997294351967e+00 1.084180646353783528e+00 9.925419822014751592e-01 +3.620000000000000284e+01 5.977444542728205690e+00 1.084415034143382472e+00 9.925205964886214538e-01 +3.630000000000000426e+01 5.977363089302565768e+00 1.084649289703779385e+00 9.924992069839626563e-01 +3.639999999999999858e+01 5.977281637017414440e+00 1.084883413093016946e+00 9.924778136904743864e-01 +3.650000000000000000e+01 5.977200185872735716e+00 1.085117404369143612e+00 9.924564166111309316e-01 +3.660000000000000142e+01 5.977118735868515387e+00 1.085351263590214499e+00 9.924350157489052471e-01 +3.670000000000000284e+01 5.977037287004736577e+00 1.085584990814290718e+00 9.924136111067688448e-01 +3.680000000000000426e+01 5.976955839281382410e+00 1.085818586099438932e+00 9.923922026876920155e-01 +3.689999999999999858e+01 5.976874392698437788e+00 1.086052049503733130e+00 9.923707904946436065e-01 +3.700000000000000000e+01 5.976792947255885835e+00 1.086285381085252411e+00 9.923493745305909108e-01 +3.710000000000000142e+01 5.976711502953712341e+00 1.086518580902081643e+00 9.923279547984997784e-01 +3.720000000000000284e+01 5.976630059791901317e+00 1.086751649012311249e+00 9.923065313013350597e-01 +3.730000000000000426e+01 5.976548617770434113e+00 1.086984585474038978e+00 9.922851040420599400e-01 +3.739999999999999858e+01 5.976467176889297406e+00 1.087217390345366574e+00 9.922636730236362723e-01 +3.750000000000000000e+01 5.976385737148476096e+00 1.087450063684402668e+00 9.922422382490243553e-01 +3.760000000000000142e+01 5.976304298547952421e+00 1.087682605549259440e+00 9.922207997211831554e-01 +3.770000000000000284e+01 5.976222861087709504e+00 1.087915015998055956e+00 9.921993574430707508e-01 +3.780000000000000426e+01 5.976141424767734023e+00 1.088147295088917055e+00 9.921779114176431102e-01 +3.789999999999999858e+01 5.976059989588007326e+00 1.088379442879971348e+00 9.921564616478552034e-01 +3.800000000000000000e+01 5.975978555548513427e+00 1.088611459429353667e+00 9.921350081366606677e-01 +3.810000000000000142e+01 5.975897122649239890e+00 1.088843344795203061e+00 9.921135508870113640e-01 +3.820000000000000284e+01 5.975815690890167176e+00 1.089075099035664795e+00 9.920920899018581540e-01 +3.830000000000000426e+01 5.975734260271281073e+00 1.089306722208887912e+00 9.920706251841505674e-01 +3.840000000000000568e+01 5.975652830792567372e+00 1.089538214373027447e+00 9.920491567368363572e-01 +3.850000000000000000e+01 5.975571402454006531e+00 1.089769575586241546e+00 9.920276845628619444e-01 +3.860000000000000142e+01 5.975489975255586117e+00 1.090000805906694570e+00 9.920062086651725286e-01 +3.870000000000000284e+01 5.975408549197288366e+00 1.090231905392554879e+00 9.919847290467120882e-01 +3.880000000000000426e+01 5.975327124279095514e+00 1.090462874101994828e+00 9.919632457104230472e-01 +3.890000000000000568e+01 5.975245700500994239e+00 1.090693712093192547e+00 9.919417586592461644e-01 +3.900000000000000000e+01 5.975164277862968554e+00 1.090924419424328828e+00 9.919202678961210884e-01 +3.910000000000000142e+01 5.975082856365001582e+00 1.091154996153590240e+00 9.918987734239861354e-01 +3.920000000000000284e+01 5.975001436007078226e+00 1.091385442339166900e+00 9.918772752457780673e-01 +3.930000000000000426e+01 5.974920016789181609e+00 1.091615758039253148e+00 9.918557733644324248e-01 +3.940000000000000568e+01 5.974838598711294857e+00 1.091845943312047096e+00 9.918342677828830833e-01 +3.950000000000000000e+01 5.974757181773402870e+00 1.092075998215751742e+00 9.918127585040629191e-01 +3.960000000000000142e+01 5.974675765975491437e+00 1.092305922808572749e+00 9.917912455309030317e-01 +3.970000000000000284e+01 5.974594351317544572e+00 1.092535717148720442e+00 9.917697288663333000e-01 +3.980000000000000426e+01 5.974512937799545398e+00 1.092765381294408922e+00 9.917482085132823810e-01 +3.990000000000000568e+01 5.974431525421476152e+00 1.092994915303855175e+00 9.917266844746772669e-01 +4.000000000000000000e+01 5.974350114183323512e+00 1.093224319235280850e+00 9.917051567534436174e-01 +4.010000000000000142e+01 5.974268704085069714e+00 1.093453593146910263e+00 9.916836253525056488e-01 +4.020000000000000284e+01 5.974187295126700548e+00 1.093682737096971058e+00 9.916620902747865784e-01 +4.030000000000000426e+01 5.974105887308198248e+00 1.093911751143695321e+00 9.916405515232077361e-01 +4.040000000000000568e+01 5.974024480629547718e+00 1.094140635345317136e+00 9.916190091006892304e-01 +4.050000000000000000e+01 5.973943075090734744e+00 1.094369389760074807e+00 9.915974630101499487e-01 +4.060000000000000142e+01 5.973861670691739789e+00 1.094598014446209078e+00 9.915759132545070020e-01 +4.070000000000000284e+01 5.973780267432549529e+00 1.094826509461964470e+00 9.915543598366767242e-01 +4.080000000000000426e+01 5.973698865313147088e+00 1.095054874865587946e+00 9.915328027595733396e-01 +4.090000000000000568e+01 5.973617464333516480e+00 1.095283110715329356e+00 9.915112420261101844e-01 +4.100000000000000000e+01 5.973536064493642606e+00 1.095511217069441434e+00 9.914896776391991517e-01 +4.110000000000000142e+01 5.973454665793511253e+00 1.095739193986179805e+00 9.914681096017504691e-01 +4.120000000000000284e+01 5.973373268233101996e+00 1.095967041523803198e+00 9.914465379166733650e-01 +4.130000000000000426e+01 5.973291871812402398e+00 1.096194759740571900e+00 9.914249625868752913e-01 +4.140000000000000568e+01 5.973210476531396473e+00 1.096422348694749971e+00 9.914033836152627011e-01 +4.150000000000000000e+01 5.973129082390064681e+00 1.096649808444603247e+00 9.913818010047402707e-01 +4.160000000000000142e+01 5.973047689388395476e+00 1.096877139048399563e+00 9.913602147582114554e-01 +4.170000000000000284e+01 5.972966297526371093e+00 1.097104340564409419e+00 9.913386248785782673e-01 +4.180000000000000426e+01 5.972884906803975547e+00 1.097331413050905979e+00 9.913170313687416080e-01 +4.190000000000000568e+01 5.972803517221193736e+00 1.097558356566164184e+00 9.912954342316006029e-01 +4.200000000000000000e+01 5.972722128778008788e+00 1.097785171168460971e+00 9.912738334700531562e-01 +4.210000000000000142e+01 5.972640741474404713e+00 1.098011856916075724e+00 9.912522290869958397e-01 +4.220000000000000284e+01 5.972559355310366414e+00 1.098238413867290042e+00 9.912306210853236710e-01 +4.230000000000000426e+01 5.972477970285877014e+00 1.098464842080385973e+00 9.912090094679304464e-01 +4.240000000000000568e+01 5.972396586400921414e+00 1.098691141613648670e+00 9.911873942377084079e-01 +4.250000000000000000e+01 5.972315203655482740e+00 1.098917312525364398e+00 9.911657753975486873e-01 +4.260000000000000142e+01 5.972233822049545005e+00 1.099143354873822087e+00 9.911441529503408621e-01 +4.270000000000000284e+01 5.972152441583092219e+00 1.099369268717310666e+00 9.911225268989727333e-01 +4.280000000000000426e+01 5.972071062256111063e+00 1.099595054114121950e+00 9.911008972463314359e-01 +4.290000000000000568e+01 5.971989684068583770e+00 1.099820711122547978e+00 9.910792639953021066e-01 +4.300000000000000000e+01 5.971908307020493467e+00 1.100046239800883674e+00 9.910576271487687716e-01 +4.310000000000000142e+01 5.971826931111824166e+00 1.100271640207424406e+00 9.910359867096140141e-01 +4.320000000000000284e+01 5.971745556342561656e+00 1.100496912400466210e+00 9.910143426807191958e-01 +4.330000000000000426e+01 5.971664182712688174e+00 1.100722056438307339e+00 9.909926950649640132e-01 +4.340000000000000568e+01 5.971582810222191284e+00 1.100947072379246716e+00 9.909710438652270525e-01 +4.350000000000000000e+01 5.971501438871050560e+00 1.101171960281584150e+00 9.909493890843851238e-01 +4.360000000000000142e+01 5.971420068659253566e+00 1.101396720203620561e+00 9.909277307253140377e-01 +4.370000000000000284e+01 5.971338699586782539e+00 1.101621352203657533e+00 9.909060687908880505e-01 +4.380000000000000426e+01 5.971257331653622380e+00 1.101845856339997987e+00 9.908844032839798643e-01 +4.390000000000000568e+01 5.971175964859757102e+00 1.102070232670945504e+00 9.908627342074611821e-01 +4.400000000000000000e+01 5.971094599205169828e+00 1.102294481254803671e+00 9.908410615642018193e-01 +4.410000000000000142e+01 5.971013234689846350e+00 1.102518602149876958e+00 9.908193853570708143e-01 +4.420000000000000284e+01 5.970931871313768902e+00 1.102742595414470950e+00 9.907977055889352069e-01 +4.430000000000000426e+01 5.970850509076922386e+00 1.102966461106891005e+00 9.907760222626610380e-01 +4.440000000000000568e+01 5.970769147979289926e+00 1.103190199285443152e+00 9.907543353811127940e-01 +4.450000000000000000e+01 5.970687788020857312e+00 1.103413810008433638e+00 9.907326449471537400e-01 +4.460000000000000142e+01 5.970606429201606780e+00 1.103637293334169378e+00 9.907109509636453648e-01 +4.470000000000000284e+01 5.970525071521525007e+00 1.103860649320957288e+00 9.906892534334482692e-01 +4.480000000000000426e+01 5.970443714980594230e+00 1.104083878027104060e+00 9.906675523594213884e-01 +4.490000000000000568e+01 5.970362359578798461e+00 1.104306979510916165e+00 9.906458477444223254e-01 +4.500000000000000000e+01 5.970281005316122602e+00 1.104529953830700961e+00 9.906241395913070180e-01 +4.510000000000000142e+01 5.970199652192549777e+00 1.104752801044765809e+00 9.906024279029302937e-01 +4.520000000000000284e+01 5.970118300208063999e+00 1.104975521211416956e+00 9.905807126821458697e-01 +4.530000000000000426e+01 5.970036949362651946e+00 1.105198114388961095e+00 9.905589939318056869e-01 +4.540000000000000568e+01 5.969955599656294964e+00 1.105420580635704697e+00 9.905372716547601319e-01 +4.550000000000000000e+01 5.969874251088977068e+00 1.105642920009953123e+00 9.905155458538587032e-01 +4.560000000000000142e+01 5.969792903660684047e+00 1.105865132570012621e+00 9.904938165319493448e-01 +4.570000000000000284e+01 5.969711557371399913e+00 1.106087218374187664e+00 9.904720836918782245e-01 +4.580000000000000426e+01 5.969630212221108678e+00 1.106309177480782946e+00 9.904503473364905108e-01 +4.590000000000000568e+01 5.969548868209791692e+00 1.106531009948102051e+00 9.904286074686300401e-01 +4.600000000000000000e+01 5.969467525337435632e+00 1.106752715834448120e+00 9.904068640911388721e-01 +4.610000000000000142e+01 5.969386183604023621e+00 1.106974295198124292e+00 9.903851172068580677e-01 +4.620000000000000284e+01 5.969304843009540562e+00 1.107195748097431487e+00 9.903633668186271333e-01 +4.630000000000000426e+01 5.969223503553970467e+00 1.107417074590670625e+00 9.903416129292840209e-01 +4.640000000000000568e+01 5.969142165237296460e+00 1.107638274736141515e+00 9.903198555416657944e-01 +4.650000000000000000e+01 5.969060828059504331e+00 1.107859348592142856e+00 9.902980946586075195e-01 +4.660000000000000142e+01 5.968979492020576316e+00 1.108080296216972682e+00 9.902763302829433734e-01 +4.670000000000000284e+01 5.968898157120498205e+00 1.108301117668927249e+00 9.902545624175058681e-01 +4.680000000000000426e+01 5.968816823359252233e+00 1.108521813006302370e+00 9.902327910651261833e-01 +4.690000000000000568e+01 5.968735490736823301e+00 1.108742382287392303e+00 9.902110162286340556e-01 +4.700000000000000000e+01 5.968654159253194535e+00 1.108962825570489308e+00 9.901892379108577780e-01 +4.710000000000000142e+01 5.968572828908352612e+00 1.109183142913884978e+00 9.901674561146246445e-01 +4.720000000000000284e+01 5.968491499702278880e+00 1.109403334375869132e+00 9.901456708427601727e-01 +4.730000000000000426e+01 5.968410171634959127e+00 1.109623400014730477e+00 9.901238820980885480e-01 +4.740000000000000568e+01 5.968328844706378256e+00 1.109843339888755720e+00 9.901020898834328454e-01 +4.750000000000000000e+01 5.968247518916519390e+00 1.110063154056229795e+00 9.900802942016143637e-01 +4.760000000000000142e+01 5.968166194265366542e+00 1.110282842575436524e+00 9.900584950554531805e-01 +4.770000000000000284e+01 5.968084870752902837e+00 1.110502405504657508e+00 9.900366924477679298e-01 +4.780000000000000426e+01 5.968003548379113177e+00 1.110721842902172574e+00 9.900148863813760247e-01 +4.790000000000000568e+01 5.967922227143979796e+00 1.110941154826259103e+00 9.899930768590934349e-01 +4.800000000000000000e+01 5.967840907047488486e+00 1.111160341335193369e+00 9.899712638837346868e-01 +4.810000000000000142e+01 5.967759588089625034e+00 1.111379402487249646e+00 9.899494474581126413e-01 +4.820000000000000284e+01 5.967678270270372565e+00 1.111598338340699765e+00 9.899276275850393825e-01 +4.830000000000000426e+01 5.967596953589713316e+00 1.111817148953813117e+00 9.899058042673249957e-01 +4.840000000000000568e+01 5.967515638047632187e+00 1.112035834384857758e+00 9.898839775077787895e-01 +4.850000000000000000e+01 5.967434323644114968e+00 1.112254394692098414e+00 9.898621473092080736e-01 +4.860000000000000142e+01 5.967353010379143896e+00 1.112472829933797813e+00 9.898403136744192699e-01 +4.870000000000000284e+01 5.967271698252702983e+00 1.112691140168216686e+00 9.898184766062170237e-01 +4.880000000000000426e+01 5.967190387264777129e+00 1.112909325453612652e+00 9.897966361074049813e-01 +4.890000000000000568e+01 5.967109077415350349e+00 1.113127385848241557e+00 9.897747921807850124e-01 +4.900000000000000000e+01 5.967027768704405766e+00 1.113345321410355915e+00 9.897529448291579879e-01 +4.910000000000000142e+01 5.966946461131930057e+00 1.113563132198206684e+00 9.897310940553230019e-01 +4.920000000000000284e+01 5.966865154697905460e+00 1.113780818270040829e+00 9.897092398620780385e-01 +4.930000000000000426e+01 5.966783849402315099e+00 1.113998379684102868e+00 9.896873822522196384e-01 +4.940000000000000568e+01 5.966702545245143874e+00 1.114215816498635325e+00 9.896655212285425662e-01 +4.950000000000000000e+01 5.966621242226376687e+00 1.114433128771876724e+00 9.896436567938411422e-01 +4.960000000000000142e+01 5.966539940345995774e+00 1.114650316562063370e+00 9.896217889509072441e-01 +4.970000000000000284e+01 5.966458639603987812e+00 1.114867379927428459e+00 9.895999177025320837e-01 +4.980000000000000426e+01 5.966377340000335039e+00 1.115084318926201634e+00 9.895780430515052073e-01 +4.990000000000000568e+01 5.966296041535023242e+00 1.115301133616609874e+00 9.895561650006146071e-01 +5.000000000000000000e+01 5.966214744208034659e+00 1.115517824056877050e+00 9.895342835526472758e-01 +5.010000000000000142e+01 5.966133448019354191e+00 1.115734390305223478e+00 9.895123987103886520e-01 +5.020000000000000284e+01 5.966052152968966737e+00 1.115950832419865923e+00 9.894905104766227311e-01 +5.030000000000000426e+01 5.965970859056854536e+00 1.116167150459018487e+00 9.894686188541322869e-01 +5.040000000000000568e+01 5.965889566283003376e+00 1.116383344480891715e+00 9.894467238456982061e-01 +5.050000000000000000e+01 5.965808274647395493e+00 1.116599414543691715e+00 9.894248254541008203e-01 +5.060000000000000142e+01 5.965726984150015788e+00 1.116815360705622373e+00 9.894029236821183515e-01 +5.070000000000000284e+01 5.965645694790849163e+00 1.117031183024883578e+00 9.893810185325279116e-01 +5.080000000000000426e+01 5.965564406569880518e+00 1.117246881559670557e+00 9.893591100081052803e-01 +5.090000000000000568e+01 5.965483119487092978e+00 1.117462456368175872e+00 9.893371981116251268e-01 +5.100000000000000000e+01 5.965401833542469667e+00 1.117677907508588087e+00 9.893152828458597892e-01 +5.110000000000000142e+01 5.965320548735996375e+00 1.117893235039091770e+00 9.892933642135812722e-01 +5.120000000000000284e+01 5.965239265067656227e+00 1.118108439017867495e+00 9.892714422175596933e-01 +5.130000000000000426e+01 5.965157982537431458e+00 1.118323519503092722e+00 9.892495168605638378e-01 +5.140000000000000568e+01 5.965076701145309634e+00 1.118538476552939365e+00 9.892275881453611586e-01 +5.150000000000000000e+01 5.964995420891272104e+00 1.118753310225576669e+00 9.892056560747178873e-01 +5.160000000000000142e+01 5.964914141775305545e+00 1.118968020579168998e+00 9.891837206513983682e-01 +5.170000000000000284e+01 5.964832863797390416e+00 1.119182607671876939e+00 9.891617818781659466e-01 +5.180000000000000426e+01 5.964751586957514284e+00 1.119397071561856416e+00 9.891398397577826351e-01 +5.190000000000000568e+01 5.964670311255661161e+00 1.119611412307259135e+00 9.891178942930087814e-01 +5.200000000000000000e+01 5.964589036691812396e+00 1.119825629966233027e+00 9.890959454866036227e-01 +5.210000000000000142e+01 5.964507763265953777e+00 1.120039724596921138e+00 9.890739933413250640e-01 +5.220000000000000284e+01 5.964426490978069317e+00 1.120253696257462073e+00 9.890520378599292339e-01 +5.230000000000000426e+01 5.964345219828144806e+00 1.120467545005990218e+00 9.890300790451712620e-01 +5.240000000000000568e+01 5.964263949816160704e+00 1.120681270900634408e+00 9.890081168998046124e-01 +5.250000000000000000e+01 5.964182680942101911e+00 1.120894873999520147e+00 9.889861514265815279e-01 +5.260000000000000142e+01 5.964101413205954216e+00 1.121108354360767168e+00 9.889641826282530301e-01 +5.270000000000000284e+01 5.964020146607700745e+00 1.121321712042490759e+00 9.889422105075684755e-01 +5.280000000000000426e+01 5.963938881147326398e+00 1.121534947102801993e+00 9.889202350672757769e-01 +5.290000000000000568e+01 5.963857616824815189e+00 1.121748059599806391e+00 9.888982563101218481e-01 +5.300000000000000000e+01 5.963776353640150241e+00 1.121961049591605253e+00 9.888762742388517157e-01 +5.310000000000000142e+01 5.963695091593316455e+00 1.122173917136293664e+00 9.888542888562096289e-01 +5.320000000000000284e+01 5.963613830684297845e+00 1.122386662291963155e+00 9.888323001649381716e-01 +5.330000000000000426e+01 5.963532570913079311e+00 1.122599285116698820e+00 9.888103081677782624e-01 +5.340000000000000568e+01 5.963451312279643979e+00 1.122811785668582196e+00 9.887883128674698208e-01 +5.350000000000000000e+01 5.963370054783974972e+00 1.123024164005687942e+00 9.887663142667512117e-01 +5.360000000000000142e+01 5.963288798426058968e+00 1.123236420186086715e+00 9.887443123683594681e-01 +5.370000000000000284e+01 5.963207543205879091e+00 1.123448554267843180e+00 9.887223071750304015e-01 +5.380000000000000426e+01 5.963126289123418466e+00 1.123660566309016895e+00 9.887002986894980472e-01 +5.390000000000000568e+01 5.963045036178661107e+00 1.123872456367662087e+00 9.886782869144954411e-01 +5.400000000000000000e+01 5.962963784371591913e+00 1.124084224501827212e+00 9.886562718527540650e-01 +5.410000000000000142e+01 5.962882533702194898e+00 1.124295870769555838e+00 9.886342535070038462e-01 +5.420000000000000284e+01 5.962801284170454963e+00 1.124507395228885098e+00 9.886122318799739350e-01 +5.430000000000000426e+01 5.962720035776354344e+00 1.124718797937847015e+00 9.885902069743915943e-01 +5.440000000000000568e+01 5.962638788519878830e+00 1.124930078954468504e+00 9.885681787929827546e-01 +5.450000000000000000e+01 5.962557542401010657e+00 1.125141238336769156e+00 9.885461473384717923e-01 +5.460000000000000142e+01 5.962476297419736504e+00 1.125352276142764341e+00 9.885241126135823064e-01 +5.470000000000000284e+01 5.962395053576038606e+00 1.125563192430462545e+00 9.885020746210361198e-01 +5.480000000000000426e+01 5.962313810869899200e+00 1.125773987257867370e+00 9.884800333635535008e-01 +5.490000000000000568e+01 5.962232569301306739e+00 1.125984660682975758e+00 9.884579888438537187e-01 +5.500000000000000000e+01 5.962151328870243461e+00 1.126195212763779097e+00 9.884359410646547106e-01 +5.510000000000000142e+01 5.962070089576692489e+00 1.126405643558261449e+00 9.884138900286725260e-01 +5.520000000000000284e+01 5.961988851420639612e+00 1.126615953124402880e+00 9.883918357386222153e-01 +5.530000000000000426e+01 5.961907614402068845e+00 1.126826141520175684e+00 9.883697781972172747e-01 +5.540000000000000568e+01 5.961826378520961534e+00 1.127036208803546158e+00 9.883477174071703120e-01 +5.550000000000000000e+01 5.961745143777302580e+00 1.127246155032475494e+00 9.883256533711917147e-01 +5.560000000000000142e+01 5.961663910171077774e+00 1.127455980264916890e+00 9.883035860919910931e-01 +5.570000000000000284e+01 5.961582677702270239e+00 1.127665684558818882e+00 9.882815155722765033e-01 +5.580000000000000426e+01 5.961501446370866653e+00 1.127875267972121787e+00 9.882594418147548909e-01 +5.590000000000000568e+01 5.961420216176848363e+00 1.128084730562761262e+00 9.882373648221313145e-01 +5.600000000000000000e+01 5.961338987120201161e+00 1.128294072388665192e+00 9.882152845971099442e-01 +5.610000000000000142e+01 5.961257759200907280e+00 1.128503293507755689e+00 9.881932011423931739e-01 +5.620000000000000284e+01 5.961176532418951624e+00 1.128712393977947537e+00 9.881711144606823982e-01 +5.630000000000000426e+01 5.961095306774318203e+00 1.128921373857149302e+00 9.881490245546774576e-01 +5.640000000000000568e+01 5.961014082266991920e+00 1.129130233203263112e+00 9.881269314270768600e-01 +5.650000000000000000e+01 5.960932858896955011e+00 1.129338972074183323e+00 9.881048350805775593e-01 +5.660000000000000142e+01 5.960851636664193265e+00 1.129547590527798517e+00 9.880827355178753990e-01 +5.670000000000000284e+01 5.960770415568689806e+00 1.129756088621989951e+00 9.880606327416646684e-01 +5.680000000000000426e+01 5.960689195610430424e+00 1.129964466414631996e+00 9.880385267546379913e-01 +5.690000000000000568e+01 5.960607976789397355e+00 1.130172723963591919e+00 9.880164175594875475e-01 +5.700000000000000000e+01 5.960526759105577277e+00 1.130380861326730102e+00 9.879943051589031855e-01 +5.710000000000000142e+01 5.960445542558949761e+00 1.130588878561900268e+00 9.879721895555738653e-01 +5.720000000000000284e+01 5.960364327149503261e+00 1.130796775726948145e+00 9.879500707521871039e-01 +5.730000000000000426e+01 5.960283112877218237e+00 1.131004552879713021e+00 9.879279487514290858e-01 +5.740000000000000568e+01 5.960201899742081366e+00 1.131212210078026859e+00 9.879058235559842194e-01 +5.750000000000000000e+01 5.960120687744077550e+00 1.131419747379713847e+00 9.878836951685361356e-01 +5.760000000000000142e+01 5.960039476883189913e+00 1.131627164842591515e+00 9.878615635917668003e-01 +5.770000000000000284e+01 5.959958267159399803e+00 1.131834462524469620e+00 9.878394288283567359e-01 +5.780000000000000426e+01 5.959877058572694786e+00 1.132041640483150591e+00 9.878172908809851327e-01 +5.790000000000000568e+01 5.959795851123057986e+00 1.132248698776429752e+00 9.877951497523299595e-01 +5.800000000000000000e+01 5.959714644810473416e+00 1.132455637462094655e+00 9.877730054450677422e-01 +5.810000000000000142e+01 5.959633439634925978e+00 1.132662456597924638e+00 9.877508579618734519e-01 +5.820000000000000284e+01 5.959552235596397907e+00 1.132869156241692821e+00 9.877287073054209499e-01 +5.830000000000000426e+01 5.959471032694874104e+00 1.133075736451163662e+00 9.877065534783827649e-01 +5.840000000000000568e+01 5.959389830930339471e+00 1.133282197284093851e+00 9.876843964834296496e-01 +5.850000000000000000e+01 5.959308630302777132e+00 1.133488538798232970e+00 9.876622363232315793e-01 +5.860000000000000142e+01 5.959227430812171100e+00 1.133694761051322164e+00 9.876400730004564199e-01 +5.870000000000000284e+01 5.959146232458507164e+00 1.133900864101095030e+00 9.876179065177712602e-01 +5.880000000000000426e+01 5.959065035241769337e+00 1.134106848005277834e+00 9.875957368778416345e-01 +5.890000000000000568e+01 5.958983839161939855e+00 1.134312712821587743e+00 9.875735640833317452e-01 +5.900000000000000000e+01 5.958902644219004507e+00 1.134518458607735258e+00 9.875513881369044622e-01 +5.910000000000000142e+01 5.958821450412944642e+00 1.134724085421421336e+00 9.875292090412208790e-01 +5.920000000000000284e+01 5.958740257743748714e+00 1.134929593320340269e+00 9.875070267989413120e-01 +5.930000000000000426e+01 5.958659066211398070e+00 1.135134982362177247e+00 9.874848414127246343e-01 +5.940000000000000568e+01 5.958577875815878500e+00 1.135340252604609690e+00 9.874626528852277207e-01 +5.950000000000000000e+01 5.958496686557173128e+00 1.135545404105306799e+00 9.874404612191067798e-01 +5.960000000000000142e+01 5.958415498435265079e+00 1.135750436921929563e+00 9.874182664170164658e-01 +5.970000000000000284e+01 5.958334311450138365e+00 1.135955351112129863e+00 9.873960684816096567e-01 +5.980000000000000426e+01 5.958253125601777889e+00 1.136160146733552923e+00 9.873738674155385642e-01 +5.990000000000000568e+01 5.958171940890167662e+00 1.136364823843833527e+00 9.873516632214535127e-01 +6.000000000000000000e+01 5.958090757315290809e+00 1.136569382500599801e+00 9.873294559020036054e-01 +6.010000000000000142e+01 5.958009574877134895e+00 1.136773822761470321e+00 9.873072454598368353e-01 +6.020000000000000284e+01 5.957928393575679493e+00 1.136978144684055669e+00 9.872850318975993078e-01 +6.030000000000000426e+01 5.957847213410912168e+00 1.137182348325957104e+00 9.872628152179361294e-01 +6.040000000000000568e+01 5.957766034382815157e+00 1.137386433744767666e+00 9.872405954234907410e-01 +6.050000000000000000e+01 5.957684856491375136e+00 1.137590400998071960e+00 9.872183725169059176e-01 +6.060000000000000142e+01 5.957603679736574342e+00 1.137794250143445485e+00 9.871961465008219916e-01 +6.070000000000000284e+01 5.957522504118397677e+00 1.137997981238455747e+00 9.871739173778789622e-01 +6.080000000000000426e+01 5.957441329636826488e+00 1.138201594340659817e+00 9.871516851507148305e-01 +6.090000000000000568e+01 5.957360156291846565e+00 1.138405089507607881e+00 9.871294498219664870e-01 +6.100000000000000000e+01 5.957278984083441919e+00 1.138608466796839469e+00 9.871072113942692683e-01 +6.110000000000000142e+01 5.957197813011598342e+00 1.138811726265886337e+00 9.870849698702575115e-01 +6.120000000000000284e+01 5.957116643076299844e+00 1.139014867972270473e+00 9.870627252525636663e-01 +6.130000000000000426e+01 5.957035474277528664e+00 1.139217891973505203e+00 9.870404775438192946e-01 +6.140000000000000568e+01 5.956954306615269701e+00 1.139420798327095641e+00 9.870182267466544035e-01 +6.150000000000000000e+01 5.956873140089506080e+00 1.139623587090536239e+00 9.869959728636974461e-01 +6.160000000000000142e+01 5.956791974700222703e+00 1.139826258321312791e+00 9.869737158975757652e-01 +6.170000000000000284e+01 5.956710810447406246e+00 1.140028812076901987e+00 9.869514558509153712e-01 +6.180000000000000426e+01 5.956629647331037170e+00 1.140231248414771192e+00 9.869291927263407205e-01 +6.190000000000000568e+01 5.956548485351099487e+00 1.140433567392379111e+00 9.869069265264749369e-01 +6.200000000000000000e+01 5.956467324507580763e+00 1.140635769067173788e+00 9.868846572539399231e-01 +6.210000000000000142e+01 5.956386164800461458e+00 1.140837853496595278e+00 9.868623849113563606e-01 +6.220000000000000284e+01 5.956305006229728249e+00 1.141039820738072974e+00 9.868401095013431545e-01 +6.230000000000000426e+01 5.956223848795364262e+00 1.141241670849027390e+00 9.868178310265180997e-01 +6.240000000000000568e+01 5.956142692497354396e+00 1.141443403886870378e+00 9.867955494894975477e-01 +6.250000000000000000e+01 5.956061537335680889e+00 1.141645019909002468e+00 9.867732648928965178e-01 +6.260000000000000142e+01 5.955980383310329529e+00 1.141846518972815971e+00 9.867509772393284750e-01 +6.270000000000000284e+01 5.955899230421285218e+00 1.142047901135692323e+00 9.867286865314061073e-01 +6.280000000000000426e+01 5.955818078668529303e+00 1.142249166455004517e+00 9.867063927717402150e-01 +6.290000000000000568e+01 5.955736928052048462e+00 1.142450314988114668e+00 9.866840959629403773e-01 +6.300000000000000000e+01 5.955655778571824044e+00 1.142651346792376454e+00 9.866617961076146193e-01 +6.310000000000000142e+01 5.955574630227843613e+00 1.142852261925132451e+00 9.866394932083700775e-01 +6.320000000000000284e+01 5.955493483020088519e+00 1.143053060443716351e+00 9.866171872678120014e-01 +6.330000000000000426e+01 5.955412336948543661e+00 1.143253742405450746e+00 9.865948782885448631e-01 +6.340000000000000568e+01 5.955331192013193053e+00 1.143454307867649788e+00 9.865725662731712475e-01 +6.350000000000000000e+01 5.955250048214022485e+00 1.143654756887616308e+00 9.865502512242924071e-01 +6.360000000000000142e+01 5.955168905551013303e+00 1.143855089522644031e+00 9.865279331445087063e-01 +6.370000000000000284e+01 5.955087764024151298e+00 1.144055305830016023e+00 9.865056120364187331e-01 +6.380000000000000426e+01 5.955006623633420482e+00 1.144255405867005804e+00 9.864832879026198542e-01 +6.390000000000000568e+01 5.954925484378804867e+00 1.144455389690876235e+00 9.864609607457081042e-01 +6.400000000000000000e+01 5.954844346260288468e+00 1.144655257358880407e+00 9.864386305682780742e-01 +6.410000000000000853e+01 5.954763209277857960e+00 1.144855008928260531e+00 9.864162973729231343e-01 +6.420000000000000284e+01 5.954682073431493805e+00 1.145054644456248827e+00 9.863939611622352110e-01 +6.429999999999999716e+01 5.954600938721181791e+00 1.145254164000067298e+00 9.863716219388048989e-01 +6.440000000000000568e+01 5.954519805146904154e+00 1.145453567616927959e+00 9.863492797052210159e-01 +6.450000000000000000e+01 5.954438672708648461e+00 1.145652855364031719e+00 9.863269344640721581e-01 +6.460000000000000853e+01 5.954357541406396059e+00 1.145852027298569276e+00 9.863045862179442569e-01 +6.470000000000000284e+01 5.954276411240131850e+00 1.146051083477720889e+00 9.862822349694226887e-01 +6.479999999999999716e+01 5.954195282209839846e+00 1.146250023958657049e+00 9.862598807210911644e-01 +6.490000000000000568e+01 5.954114154315504948e+00 1.146448848798536480e+00 9.862375234755323961e-01 +6.500000000000000000e+01 5.954033027557111168e+00 1.146647558054507687e+00 9.862151632353270969e-01 +6.510000000000000853e+01 5.953951901934641633e+00 1.146846151783708745e+00 9.861928000030553143e-01 +6.520000000000000284e+01 5.953870777448081242e+00 1.147044630043266622e+00 9.861704337812952081e-01 +6.529999999999999716e+01 5.953789654097413120e+00 1.147242992890298519e+00 9.861480645726239391e-01 +6.540000000000000568e+01 5.953708531882622168e+00 1.147441240381909644e+00 9.861256923796170026e-01 +6.550000000000000000e+01 5.953627410803692399e+00 1.147639372575195660e+00 9.861033172048490059e-01 +6.560000000000000853e+01 5.953546290860608714e+00 1.147837389527240015e+00 9.860809390508927796e-01 +6.570000000000000284e+01 5.953465172053354237e+00 1.148035291295116611e+00 9.860585579203200446e-01 +6.579999999999999716e+01 5.953384054381913870e+00 1.148233077935886914e+00 9.860361738157008560e-01 +6.590000000000000568e+01 5.953302937846271625e+00 1.148430749506603066e+00 9.860137867396043809e-01 +6.600000000000000000e+01 5.953221822446411515e+00 1.148628306064305216e+00 9.859913966945982322e-01 +6.610000000000000853e+01 5.953140708182317553e+00 1.148825747666023078e+00 9.859690036832482463e-01 +6.620000000000000284e+01 5.953059595053973752e+00 1.149023074368774155e+00 9.859466077081197044e-01 +6.629999999999999716e+01 5.952978483061363235e+00 1.149220286229566179e+00 9.859242087717760006e-01 +6.640000000000000568e+01 5.952897372204471793e+00 1.149417383305394891e+00 9.859018068767790854e-01 +6.650000000000000000e+01 5.952816262483283438e+00 1.149614365653245374e+00 9.858794020256901325e-01 +6.660000000000000853e+01 5.952735153897781295e+00 1.149811233330090943e+00 9.858569942210684278e-01 +6.670000000000000284e+01 5.952654046447949376e+00 1.150007986392893811e+00 9.858345834654721473e-01 +6.679999999999999716e+01 5.952572940133772583e+00 1.150204624898605310e+00 9.858121697614578016e-01 +6.690000000000000568e+01 5.952491834955234040e+00 1.150401148904165227e+00 9.857897531115810130e-01 +6.700000000000000000e+01 5.952410730912321313e+00 1.150597558466501358e+00 9.857673335183959606e-01 +6.710000000000000853e+01 5.952329628005015749e+00 1.150793853642530618e+00 9.857449109844552693e-01 +6.720000000000000284e+01 5.952248526233300474e+00 1.150990034489158376e+00 9.857224855123102314e-01 +6.729999999999999716e+01 5.952167425597161277e+00 1.151186101063278899e+00 9.857000571045112514e-01 +6.740000000000000568e+01 5.952086326096582169e+00 1.151382053421774243e+00 9.856776257636067351e-01 +6.750000000000000000e+01 5.952005227731545389e+00 1.151577891621515137e+00 9.856551914921439783e-01 +6.760000000000000853e+01 5.951924130502037613e+00 1.151773615719360988e+00 9.856327542926690555e-01 +6.770000000000000284e+01 5.951843034408041078e+00 1.151969225772159211e+00 9.856103141677267088e-01 +6.779999999999999716e+01 5.951761939449542460e+00 1.152164721836745898e+00 9.855878711198600151e-01 +6.790000000000000568e+01 5.951680845626523109e+00 1.152360103969944705e+00 9.855654251516111630e-01 +6.800000000000000000e+01 5.951599752938969701e+00 1.152555372228567965e+00 9.855429762655205650e-01 +6.810000000000000853e+01 5.951518661386865361e+00 1.152750526669416908e+00 9.855205244641278561e-01 +6.820000000000000284e+01 5.951437570970192326e+00 1.152945567349279443e+00 9.854980697499705622e-01 +6.829999999999999716e+01 5.951356481688935496e+00 1.153140494324933041e+00 9.854756121255853207e-01 +6.840000000000000568e+01 5.951275393543080661e+00 1.153335307653142072e+00 9.854531515935075481e-01 +6.850000000000000000e+01 5.951194306532612721e+00 1.153530007390660250e+00 9.854306881562708842e-01 +6.860000000000000853e+01 5.951113220657513914e+00 1.153724593594228631e+00 9.854082218164084139e-01 +6.870000000000000284e+01 5.951032135917767363e+00 1.153919066320575615e+00 9.853857525764506686e-01 +6.879999999999999716e+01 5.950951052313357081e+00 1.154113425626418277e+00 9.853632804389279576e-01 +6.890000000000000568e+01 5.950869969844269747e+00 1.154307671568461702e+00 9.853408054063687027e-01 +6.900000000000000000e+01 5.950788888510488484e+00 1.154501804203398763e+00 9.853183274813001047e-01 +6.910000000000000853e+01 5.950707808311998193e+00 1.154695823587909898e+00 9.852958466662479209e-01 +6.920000000000000284e+01 5.950626729248781110e+00 1.154889729778663554e+00 9.852733629637365764e-01 +6.929999999999999716e+01 5.950545651320822138e+00 1.155083522832315968e+00 9.852508763762893862e-01 +6.940000000000000568e+01 5.950464574528107065e+00 1.155277202805510939e+00 9.852283869064282218e-01 +6.950000000000000000e+01 5.950383498870618126e+00 1.155470769754880278e+00 9.852058945566736226e-01 +6.960000000000000853e+01 5.950302424348339336e+00 1.155664223737043583e+00 9.851833993295445735e-01 +6.970000000000000284e+01 5.950221350961255595e+00 1.155857564808606908e+00 9.851609012275588384e-01 +6.979999999999999716e+01 5.950140278709350916e+00 1.156050793026165202e+00 9.851384002532328488e-01 +6.990000000000000568e+01 5.950059207592610200e+00 1.156243908446300761e+00 9.851158964090817038e-01 +7.000000000000000000e+01 5.949978137611015683e+00 1.156436911125583000e+00 9.850933896976193926e-01 +7.010000000000000853e+01 5.949897068764554930e+00 1.156629801120569123e+00 9.850708801213583499e-01 +7.020000000000000284e+01 5.949816001053208403e+00 1.156822578487803677e+00 9.850483676828095669e-01 +7.029999999999999716e+01 5.949734934476961001e+00 1.157015243283818329e+00 9.850258523844828140e-01 +7.040000000000000568e+01 5.949653869035798515e+00 1.157207795565132757e+00 9.850033342288865290e-01 +7.050000000000000000e+01 5.949572804729702291e+00 1.157400235388253318e+00 9.849808132185278176e-01 +7.060000000000000853e+01 5.949491741558659008e+00 1.157592562809674819e+00 9.849582893559124530e-01 +7.070000000000000284e+01 5.949410679522652678e+00 1.157784777885877414e+00 9.849357626435447655e-01 +7.079999999999999716e+01 5.949329618621665539e+00 1.157976880673330378e+00 9.849132330839279748e-01 +7.090000000000000568e+01 5.949248558855683378e+00 1.158168871228489216e+00 9.848907006795637464e-01 +7.100000000000000000e+01 5.949167500224691985e+00 1.158360749607797224e+00 9.848681654329525248e-01 +7.110000000000000853e+01 5.949086442728671820e+00 1.158552515867684374e+00 9.848456273465935329e-01 +7.120000000000000284e+01 5.949005386367609560e+00 1.158744170064567980e+00 9.848230864229843284e-01 +7.129999999999999716e+01 5.948924331141488331e+00 1.158935712254851813e+00 9.848005426646213589e-01 +7.140000000000000568e+01 5.948843277050292144e+00 1.159127142494927654e+00 9.847779960739997396e-01 +7.150000000000000000e+01 5.948762224094005013e+00 1.159318460841173737e+00 9.847554466536131423e-01 +7.160000000000000853e+01 5.948681172272611839e+00 1.159509667349955198e+00 9.847328944059541289e-01 +7.170000000000000284e+01 5.948600121586096634e+00 1.159700762077624736e+00 9.847103393335135957e-01 +7.179999999999999716e+01 5.948519072034443411e+00 1.159891745080521286e+00 9.846877814387814398e-01 +7.190000000000000568e+01 5.948438023617636183e+00 1.160082616414971124e+00 9.846652207242458932e-01 +7.200000000000000000e+01 5.948356976335658075e+00 1.160273376137286760e+00 9.846426571923942994e-01 +7.210000000000000853e+01 5.948275930188494875e+00 1.160464024303768715e+00 9.846200908457123369e-01 +7.220000000000000284e+01 5.948194885176129709e+00 1.160654560970702409e+00 9.845975216866843516e-01 +7.229999999999999716e+01 5.948113841298546589e+00 1.160844986194361939e+00 9.845749497177935794e-01 +7.240000000000000568e+01 5.948032798555732192e+00 1.161035300031006745e+00 9.845523749415214798e-01 +7.250000000000000000e+01 5.947951756947666979e+00 1.161225502536883836e+00 9.845297973603485131e-01 +7.260000000000000853e+01 5.947870716474336739e+00 1.161415593768226673e+00 9.845072169767540293e-01 +7.270000000000000284e+01 5.947789677135725483e+00 1.161605573781255174e+00 9.844846337932157132e-01 +7.279999999999999716e+01 5.947708638931819003e+00 1.161795442632175490e+00 9.844620478122099172e-01 +7.290000000000000568e+01 5.947627601862598645e+00 1.161985200377180893e+00 9.844394590362117725e-01 +7.300000000000000000e+01 5.947546565928050200e+00 1.162174847072451334e+00 9.844168674676951891e-01 +7.310000000000000853e+01 5.947465531128156790e+00 1.162364382774152327e+00 9.843942731091325227e-01 +7.320000000000000284e+01 5.947384497462903319e+00 1.162553807538436734e+00 9.843716759629949076e-01 +7.329999999999999716e+01 5.947303464932275574e+00 1.162743121421443648e+00 9.843490760317520349e-01 +7.340000000000000568e+01 5.947222433536254016e+00 1.162932324479298618e+00 9.843264733178727077e-01 +7.350000000000000000e+01 5.947141403274826210e+00 1.163121416768112981e+00 9.843038678238237305e-01 +7.360000000000000853e+01 5.947060374147974393e+00 1.163310398343985197e+00 9.842812595520710195e-01 +7.370000000000000284e+01 5.946979346155683466e+00 1.163499269262999292e+00 9.842586485050789369e-01 +7.379999999999999716e+01 5.946898319297936553e+00 1.163688029581226413e+00 9.842360346853109565e-01 +7.390000000000000568e+01 5.946817293574718555e+00 1.163876679354723054e+00 9.842134180952287759e-01 +7.400000000000000000e+01 5.946736268986014373e+00 1.164065218639532384e+00 9.841907987372927602e-01 +7.410000000000000853e+01 5.946655245531806244e+00 1.164253647491684029e+00 9.841681766139623866e-01 +7.420000000000000284e+01 5.946574223212079957e+00 1.164441965967193182e+00 9.841455517276952447e-01 +7.429999999999999716e+01 5.946493202026818636e+00 1.164630174122061268e+00 9.841229240809482581e-01 +7.440000000000000568e+01 5.946412181976007183e+00 1.164818272012276390e+00 9.841002936761762410e-01 +7.450000000000000000e+01 5.946331163059629610e+00 1.165006259693812218e+00 9.840776605158332302e-01 +7.460000000000000853e+01 5.946250145277669930e+00 1.165194137222628212e+00 9.840550246023719305e-01 +7.470000000000000284e+01 5.946169128630112155e+00 1.165381904654669842e+00 9.840323859382433813e-01 +7.479999999999999716e+01 5.946088113116942075e+00 1.165569562045869034e+00 9.840097445258977338e-01 +7.490000000000000568e+01 5.946007098738141927e+00 1.165757109452143503e+00 9.839871003677833627e-01 +7.500000000000000000e+01 5.945926085493694835e+00 1.165944546929396752e+00 9.839644534663477549e-01 +7.510000000000000853e+01 5.945845073383587476e+00 1.166131874533518298e+00 9.839418038240368425e-01 +7.520000000000000284e+01 5.945764062407802975e+00 1.166319092320383444e+00 9.839191514432952257e-01 +7.529999999999999716e+01 5.945683052566327120e+00 1.166506200345853062e+00 9.838964963265662833e-01 +7.540000000000000568e+01 5.945602043859141261e+00 1.166693198665774034e+00 9.838738384762918399e-01 +7.550000000000000000e+01 5.945521036286230299e+00 1.166880087335979255e+00 9.838511778949127207e-01 +7.560000000000000853e+01 5.945440029847579133e+00 1.167066866412286519e+00 9.838285145848683078e-01 +7.570000000000000284e+01 5.945359024543170001e+00 1.167253535950499854e+00 9.838058485485966509e-01 +7.579999999999999716e+01 5.945278020372989580e+00 1.167440096006409522e+00 9.837831797885345786e-01 +7.590000000000000568e+01 5.945197017337020995e+00 1.167626546635790685e+00 9.837605083071173651e-01 +7.600000000000000000e+01 5.945116015435248258e+00 1.167812887894404072e+00 9.837378341067790632e-01 +7.610000000000000853e+01 5.945035014667657158e+00 1.167999119837996425e+00 9.837151571899525049e-01 +7.620000000000000284e+01 5.944954015034229933e+00 1.168185242522299605e+00 9.836924775590691894e-01 +7.629999999999999716e+01 5.944873016534951482e+00 1.168371256003031267e+00 9.836697952165592840e-01 +7.640000000000000568e+01 5.944792019169804931e+00 1.168557160335895073e+00 9.836471101648516235e-01 +7.650000000000000000e+01 5.944711022938775180e+00 1.168742955576578701e+00 9.836244224063737107e-01 +7.660000000000000853e+01 5.944630027841847131e+00 1.168928641780756505e+00 9.836017319435514938e-01 +7.670000000000000284e+01 5.944549033879003019e+00 1.169114219004087962e+00 9.835790387788101441e-01 +7.680000000000001137e+01 5.944468041050229523e+00 1.169299687302217672e+00 9.835563429145732783e-01 +7.690000000000000568e+01 5.944387049355509767e+00 1.169485046730776023e+00 9.835336443532627371e-01 +7.700000000000000000e+01 5.944306058794827763e+00 1.169670297345378307e+00 9.835109430972998057e-01 +7.710000000000000853e+01 5.944225069368166636e+00 1.169855439201625158e+00 9.834882391491041043e-01 +7.720000000000000284e+01 5.944144081075513064e+00 1.170040472355102779e+00 9.834655325110939206e-01 +7.730000000000001137e+01 5.944063093916848395e+00 1.170225396861382050e+00 9.834428231856860991e-01 +7.740000000000000568e+01 5.943982107892157529e+00 1.170410212776019865e+00 9.834201111752963742e-01 +7.750000000000000000e+01 5.943901123001426257e+00 1.170594920154557572e+00 9.833973964823391478e-01 +7.760000000000000853e+01 5.943820139244635925e+00 1.170779519052522089e+00 9.833746791092277117e-01 +7.770000000000000284e+01 5.943739156621771436e+00 1.170964009525425231e+00 9.833519590583735814e-01 +7.780000000000001137e+01 5.943658175132818577e+00 1.171148391628764163e+00 9.833292363321872731e-01 +7.790000000000000568e+01 5.943577194777762251e+00 1.171332665418021168e+00 9.833065109330778597e-01 +7.800000000000000000e+01 5.943496215556583806e+00 1.171516830948662768e+00 9.832837828634531929e-01 +7.810000000000000853e+01 5.943415237469267254e+00 1.171700888276141495e+00 9.832610521257196812e-01 +7.820000000000000284e+01 5.943334260515800160e+00 1.171884837455894113e+00 9.832383187222825116e-01 +7.830000000000001137e+01 5.943253284696163874e+00 1.172068678543342957e+00 9.832155826555457612e-01 +7.840000000000000568e+01 5.943172310010343296e+00 1.172252411593895483e+00 9.831928439279120635e-01 +7.850000000000000000e+01 5.943091336458322438e+00 1.172436036662942715e+00 9.831701025417824980e-01 +7.860000000000000853e+01 5.943010364040086202e+00 1.172619553805862358e+00 9.831473584995571446e-01 +7.870000000000000284e+01 5.942929392755617712e+00 1.172802963078015459e+00 9.831246118036345294e-01 +7.880000000000001137e+01 5.942848422604902758e+00 1.172986264534748857e+00 9.831018624564120678e-01 +7.890000000000000568e+01 5.942767453587922688e+00 1.173169458231393403e+00 9.830791104602857322e-01 +7.900000000000000000e+01 5.942686485704663291e+00 1.173352544223265959e+00 9.830563558176502736e-01 +7.910000000000000853e+01 5.942605518955109467e+00 1.173535522565666511e+00 9.830335985308993330e-01 +7.920000000000000284e+01 5.942524553339245230e+00 1.173718393313880615e+00 9.830108386024249967e-01 +7.930000000000001137e+01 5.942443588857052816e+00 1.173901156523179168e+00 9.829880760346179080e-01 +7.940000000000000568e+01 5.942362625508518015e+00 1.174083812248816416e+00 9.829653108298676001e-01 +7.950000000000000000e+01 5.942281663293624838e+00 1.174266360546031951e+00 9.829425429905623846e-01 +7.960000000000000853e+01 5.942200702212357299e+00 1.174448801470050263e+00 9.829197725190890189e-01 +7.970000000000000284e+01 5.942119742264700299e+00 1.174631135076079858e+00 9.828969994178332614e-01 +7.980000000000001137e+01 5.942038783450636963e+00 1.174813361419314361e+00 9.828742236891794271e-01 +7.990000000000000568e+01 5.941957825770152191e+00 1.174995480554930749e+00 9.828514453355104985e-01 +8.000000000000000000e+01 5.941876869223229107e+00 1.175177492538092450e+00 9.828286643592079042e-01 +8.010000000000000853e+01 5.941795913809852614e+00 1.175359397423945351e+00 9.828058807626522952e-01 +8.020000000000000284e+01 5.941714959530006723e+00 1.175541195267621353e+00 9.827830945482228797e-01 +8.030000000000001137e+01 5.941634006383675448e+00 1.175722886124235922e+00 9.827603057182972002e-01 +8.040000000000000568e+01 5.941553054370842801e+00 1.175904470048889428e+00 9.827375142752518000e-01 +8.050000000000000000e+01 5.941472103491495460e+00 1.176085947096666251e+00 9.827147202214620014e-01 +8.060000000000000853e+01 5.941391153745614773e+00 1.176267317322634787e+00 9.826919235593015722e-01 +8.070000000000000284e+01 5.941310205133184752e+00 1.176448580781848774e+00 9.826691242911431701e-01 +8.080000000000001137e+01 5.941229257654190299e+00 1.176629737529345743e+00 9.826463224193581203e-01 +8.090000000000000568e+01 5.941148311308615426e+00 1.176810787620147458e+00 9.826235179463161939e-01 +8.100000000000000000e+01 5.941067366096445035e+00 1.176991731109259254e+00 9.826007108743862739e-01 +8.110000000000000853e+01 5.940986422017663138e+00 1.177172568051672252e+00 9.825779012059356887e-01 +8.120000000000000284e+01 5.940905479072251971e+00 1.177353298502360923e+00 9.825550889433305457e-01 +8.130000000000001137e+01 5.940824537260199101e+00 1.177533922516283305e+00 9.825322740889358419e-01 +8.140000000000000568e+01 5.940743596581484987e+00 1.177714440148383002e+00 9.825094566451145761e-01 +8.150000000000000000e+01 5.940662657036097194e+00 1.177894851453586522e+00 9.824866366142293028e-01 +8.160000000000000853e+01 5.940581718624017959e+00 1.178075156486805053e+00 9.824638139986410224e-01 +8.170000000000000284e+01 5.940500781345231296e+00 1.178255355302933349e+00 9.824409888007089586e-01 +8.180000000000001137e+01 5.940419845199722104e+00 1.178435447956851734e+00 9.824181610227917805e-01 +8.190000000000000568e+01 5.940338910187475285e+00 1.178615434503422543e+00 9.823953306672466024e-01 +8.200000000000000000e+01 5.940257976308472188e+00 1.178795314997492794e+00 9.823724977364290956e-01 +8.210000000000000853e+01 5.940177043562699488e+00 1.178975089493894624e+00 9.823496622326933769e-01 +8.220000000000000284e+01 5.940096111950140312e+00 1.179154758047442852e+00 9.823268241583927862e-01 +8.230000000000001137e+01 5.940015181470779559e+00 1.179334320712936535e+00 9.823039835158792199e-01 +8.240000000000000568e+01 5.939934252124601244e+00 1.179513777545158959e+00 9.822811403075030201e-01 +8.250000000000000000e+01 5.939853323911588490e+00 1.179693128598876983e+00 9.822582945356136408e-01 +8.260000000000000853e+01 5.939772396831726198e+00 1.179872373928841256e+00 9.822354462025589816e-01 +8.270000000000000284e+01 5.939691470885001046e+00 1.180051513589786882e+00 9.822125953106857210e-01 +8.280000000000001137e+01 5.939610546071393493e+00 1.180230547636432092e+00 9.821897418623393161e-01 +8.290000000000000568e+01 5.939529622390888441e+00 1.180409476123479351e+00 9.821668858598640028e-01 +8.300000000000000000e+01 5.939448699843470791e+00 1.180588299105614469e+00 9.821440273056022408e-01 +8.310000000000000853e+01 5.939367778429124556e+00 1.180767016637507272e+00 9.821211662018956012e-01 +8.320000000000000284e+01 5.939286858147835524e+00 1.180945628773811373e+00 9.820983025510845454e-01 +8.330000000000001137e+01 5.939205938999584156e+00 1.181124135569164180e+00 9.820754363555076472e-01 +8.340000000000000568e+01 5.939125020984357128e+00 1.181302537078186443e+00 9.820525676175030361e-01 +8.350000000000000000e+01 5.939044104102139343e+00 1.181480833355483151e+00 9.820296963394066214e-01 +8.360000000000000853e+01 5.938963188352912148e+00 1.181659024455641971e+00 9.820068225235536463e-01 +8.370000000000000284e+01 5.938882273736662221e+00 1.181837110433235249e+00 9.819839461722779106e-01 +8.380000000000001137e+01 5.938801360253373574e+00 1.182015091342818236e+00 9.819610672879119928e-01 +8.390000000000000568e+01 5.938720447903028443e+00 1.182192967238929970e+00 9.819381858727870283e-01 +8.400000000000000000e+01 5.938639536685612619e+00 1.182370738176092839e+00 9.819153019292329310e-01 +8.410000000000000853e+01 5.938558626601109225e+00 1.182548404208812576e+00 9.818924154595781717e-01 +8.420000000000000284e+01 5.938477717649504051e+00 1.182725965391579592e+00 9.818695264661503330e-01 +8.430000000000001137e+01 5.938396809830780221e+00 1.182903421778866537e+00 9.818466349512754432e-01 +8.440000000000000568e+01 5.938315903144921748e+00 1.183080773425129406e+00 9.818237409172784202e-01 +8.450000000000000000e+01 5.938234997591914421e+00 1.183258020384808873e+00 9.818008443664824059e-01 +8.460000000000000853e+01 5.938154093171741366e+00 1.183435162712327848e+00 9.817779453012097646e-01 +8.470000000000000284e+01 5.938073189884383929e+00 1.183612200462093256e+00 9.817550437237815286e-01 +8.480000000000001137e+01 5.937992287729829677e+00 1.183789133688495143e+00 9.817321396365170649e-01 +8.490000000000000568e+01 5.937911386708061734e+00 1.183965962445906905e+00 9.817092330417350743e-01 +8.500000000000000000e+01 5.937830486819065001e+00 1.184142686788685062e+00 9.816863239417523701e-01 +8.510000000000000853e+01 5.937749588062823491e+00 1.184319306771170144e+00 9.816634123388848776e-01 +8.520000000000000284e+01 5.937668690439320329e+00 1.184495822447685143e+00 9.816404982354471898e-01 +8.530000000000001137e+01 5.937587793948542192e+00 1.184672233872536840e+00 9.816175816337524562e-01 +8.540000000000000568e+01 5.937506898590469540e+00 1.184848541100014918e+00 9.815946625361126054e-01 +8.550000000000000000e+01 5.937426004365089049e+00 1.185024744184392409e+00 9.815717409448384556e-01 +8.560000000000000853e+01 5.937345111272382958e+00 1.185200843179925689e+00 9.815488168622392706e-01 +8.570000000000000284e+01 5.937264219312336166e+00 1.185376838140854261e+00 9.815258902906230931e-01 +8.580000000000001137e+01 5.937183328484934464e+00 1.185552729121400306e+00 9.815029612322969665e-01 +8.590000000000000568e+01 5.937102438790160974e+00 1.185728516175769576e+00 9.814800296895663800e-01 +8.600000000000000000e+01 5.937021550228000599e+00 1.185904199358150946e+00 9.814570956647353794e-01 +8.610000000000000853e+01 5.936940662798435575e+00 1.186079778722716194e+00 9.814341591601074555e-01 +8.620000000000000284e+01 5.936859776501450803e+00 1.186255254323620223e+00 9.814112201779838784e-01 +8.630000000000001137e+01 5.936778891337032071e+00 1.186430626215001505e+00 9.813882787206652525e-01 +8.640000000000000568e+01 5.936698007305161617e+00 1.186605894450980525e+00 9.813653347904507385e-01 +8.650000000000000000e+01 5.936617124405825230e+00 1.186781059085661116e+00 9.813423883896381650e-01 +8.660000000000000853e+01 5.936536242639006922e+00 1.186956120173130458e+00 9.813194395205242504e-01 +8.670000000000000284e+01 5.936455362004688041e+00 1.187131077767458853e+00 9.812964881854044918e-01 +8.680000000000001137e+01 5.936374482502856154e+00 1.187305931922698843e+00 9.812735343865727211e-01 +8.690000000000000568e+01 5.936293604133495272e+00 1.187480682692885869e+00 9.812505781263216598e-01 +8.700000000000000000e+01 5.936212726896587633e+00 1.187655330132038944e+00 9.812276194069430302e-01 +8.710000000000000853e+01 5.936131850792119025e+00 1.187829874294159982e+00 9.812046582307272224e-01 +8.720000000000000284e+01 5.936050975820073461e+00 1.188004315233233132e+00 9.811816945999629613e-01 +8.730000000000001137e+01 5.935970101980432290e+00 1.188178653003225671e+00 9.811587285169379724e-01 +8.740000000000000568e+01 5.935889229273183076e+00 1.188352887658087553e+00 9.811357599839387600e-01 +8.750000000000000000e+01 5.935808357698309834e+00 1.188527019251751637e+00 9.811127890032502741e-01 +8.760000000000000853e+01 5.935727487255795687e+00 1.188701047838133462e+00 9.810898155771566875e-01 +8.770000000000000284e+01 5.935646617945624648e+00 1.188874973471131913e+00 9.810668397079405079e-01 +8.780000000000001137e+01 5.935565749767778954e+00 1.189048796204627445e+00 9.810438613978829103e-01 +8.790000000000000568e+01 5.935484882722245281e+00 1.189222516092484749e+00 9.810208806492641820e-01 +8.800000000000000000e+01 5.935404016809007643e+00 1.189396133188549420e+00 9.809978974643631666e-01 +8.810000000000000853e+01 5.935323152028050941e+00 1.189569647546651288e+00 9.809749118454573757e-01 +8.820000000000000284e+01 5.935242288379357412e+00 1.189743059220602195e+00 9.809519237948229886e-01 +8.830000000000001137e+01 5.935161425862914619e+00 1.189916368264196889e+00 9.809289333147352963e-01 +8.840000000000000568e+01 5.935080564478703913e+00 1.190089574731212352e+00 9.809059404074677024e-01 +8.850000000000000000e+01 5.934999704226709305e+00 1.190262678675408026e+00 9.808829450752926116e-01 +8.860000000000000853e+01 5.934918845106914809e+00 1.190435680150526476e+00 9.808599473204814290e-01 +8.870000000000000284e+01 5.934837987119306213e+00 1.190608579210292506e+00 9.808369471453041166e-01 +8.880000000000001137e+01 5.934757130263867531e+00 1.190781375908413597e+00 9.808139445520291932e-01 +8.890000000000000568e+01 5.934676274540581886e+00 1.190954070298579914e+00 9.807909395429242894e-01 +8.900000000000000000e+01 5.934595419949433293e+00 1.191126662434463634e+00 9.807679321202553702e-01 +8.910000000000000853e+01 5.934514566490407539e+00 1.191299152369719838e+00 9.807449222862870686e-01 +8.920000000000000284e+01 5.934433714163486862e+00 1.191471540157985842e+00 9.807219100432833514e-01 +8.930000000000001137e+01 5.934352862968655273e+00 1.191643825852881200e+00 9.806988953935064091e-01 +8.940000000000000568e+01 5.934272012905898563e+00 1.191816009508008367e+00 9.806758783392173218e-01 +8.950000000000000000e+01 5.934191163975202521e+00 1.191988091176952258e+00 9.806528588826758375e-01 +8.960000000000000853e+01 5.934110316176548494e+00 1.192160070913279801e+00 9.806298370261408159e-01 +8.970000000000000284e+01 5.934029469509921384e+00 1.192331948770540384e+00 9.806068127718693406e-01 +8.980000000000001137e+01 5.933948623975305203e+00 1.192503724802265852e+00 9.805837861221172735e-01 +8.990000000000000568e+01 5.933867779572683965e+00 1.192675399061970731e+00 9.805607570791396999e-01 +9.000000000000000000e+01 5.933786936302042569e+00 1.192846971603150452e+00 9.805377256451899282e-01 +9.010000000000000853e+01 5.933706094163364142e+00 1.193018442479284902e+00 9.805146918225201569e-01 +9.020000000000000284e+01 5.933625253156634471e+00 1.193189811743834206e+00 9.804916556133816963e-01 +9.030000000000001137e+01 5.933544413281837571e+00 1.193361079450242279e+00 9.804686170200239692e-01 +9.040000000000000568e+01 5.933463574538956564e+00 1.193532245651934165e+00 9.804455760446955104e-01 +9.050000000000000000e+01 5.933382736927975465e+00 1.193703310402317364e+00 9.804225326896434112e-01 +9.060000000000000853e+01 5.933301900448880062e+00 1.193874273754782278e+00 9.803994869571137638e-01 +9.070000000000000284e+01 5.933221065101652592e+00 1.194045135762701104e+00 9.803764388493512172e-01 +9.080000000000001137e+01 5.933140230886277955e+00 1.194215896479428052e+00 9.803533883685994210e-01 +9.090000000000000568e+01 5.933059397802741941e+00 1.194386555958299345e+00 9.803303355171003597e-01 +9.100000000000000000e+01 5.932978565851026787e+00 1.194557114252634111e+00 9.803072802970949073e-01 +9.110000000000000853e+01 5.932897735031114728e+00 1.194727571415732603e+00 9.802842227108228279e-01 +9.120000000000000284e+01 5.932816905342993330e+00 1.194897927500877532e+00 9.802611627605223310e-01 +9.130000000000001137e+01 5.932736076786645718e+00 1.195068182561334291e+00 9.802381004484309601e-01 +9.140000000000000568e+01 5.932655249362058569e+00 1.195238336650349176e+00 9.802150357767842603e-01 +9.150000000000000000e+01 5.932574423069212344e+00 1.195408389821151829e+00 9.801919687478169996e-01 +9.160000000000000853e+01 5.932493597908091942e+00 1.195578342126952798e+00 9.801688993637625025e-01 +9.170000000000000284e+01 5.932412773878682266e+00 1.195748193620945088e+00 9.801458276268530945e-01 +9.180000000000001137e+01 5.932331950980968216e+00 1.195917944356304163e+00 9.801227535393196577e-01 +9.190000000000000568e+01 5.932251129214931140e+00 1.196087594386186836e+00 9.800996771033916311e-01 +9.200000000000000000e+01 5.932170308580559492e+00 1.196257143763732156e+00 9.800765983212975652e-01 +9.210000000000000853e+01 5.932089489077833733e+00 1.196426592542060741e+00 9.800535171952646785e-01 +9.220000000000000284e+01 5.932008670706741427e+00 1.196595940774275668e+00 9.800304337275184130e-01 +9.230000000000001137e+01 5.931927853467263922e+00 1.196765188513461586e+00 9.800073479202837667e-01 +9.240000000000000568e+01 5.931847037359385233e+00 1.196934335812684935e+00 9.799842597757840723e-01 +9.250000000000000000e+01 5.931766222383092035e+00 1.197103382724994391e+00 9.799611692962413301e-01 +9.260000000000000853e+01 5.931685408538366566e+00 1.197272329303420646e+00 9.799380764838764302e-01 +9.270000000000000284e+01 5.931604595825193726e+00 1.197441175600975516e+00 9.799149813409091525e-01 +9.280000000000001137e+01 5.931523784243558417e+00 1.197609921670653277e+00 9.798918838695579447e-01 +9.290000000000000568e+01 5.931442973793442874e+00 1.197778567565429775e+00 9.798687840720397002e-01 +9.300000000000000000e+01 5.931362164474831999e+00 1.197947113338262204e+00 9.798456819505705351e-01 +9.310000000000000853e+01 5.931281356287711581e+00 1.198115559042089773e+00 9.798225775073650112e-01 +9.320000000000000284e+01 5.931200549232063857e+00 1.198283904729834592e+00 9.797994707446363583e-01 +9.330000000000001137e+01 5.931119743307874614e+00 1.198452150454398790e+00 9.797763616645969176e-01 +9.340000000000000568e+01 5.931038938515126979e+00 1.198620296268667396e+00 9.797532502694575873e-01 +9.350000000000000000e+01 5.930958134853805852e+00 1.198788342225507009e+00 9.797301365614277113e-01 +9.360000000000000853e+01 5.930877332323893469e+00 1.198956288377764912e+00 9.797070205427159673e-01 +9.370000000000000284e+01 5.930796530925376508e+00 1.199124134778271511e+00 9.796839022155294785e-01 +9.380000000000001137e+01 5.930715730658237206e+00 1.199291881479837674e+00 9.796607815820743692e-01 +9.390000000000000568e+01 5.930634931522461351e+00 1.199459528535256725e+00 9.796376586445550982e-01 +9.400000000000000000e+01 5.930554133518032067e+00 1.199627075997303116e+00 9.796145334051750142e-01 +9.410000000000000853e+01 5.930473336644935145e+00 1.199794523918733313e+00 9.795914058661364665e-01 +9.420000000000000284e+01 5.930392540903152820e+00 1.199961872352285130e+00 9.795682760296403613e-01 +9.430000000000001137e+01 5.930311746292669994e+00 1.200129121350677730e+00 9.795451438978864944e-01 +9.440000000000000568e+01 5.930230952813471568e+00 1.200296270966612511e+00 9.795220094730733296e-01 +9.450000000000000000e+01 5.930150160465540665e+00 1.200463321252771776e+00 9.794988727573978871e-01 +9.460000000000000853e+01 5.930069369248861300e+00 1.200630272261819842e+00 9.794757337530562991e-01 +9.470000000000000284e+01 5.929988579163419260e+00 1.200797124046402153e+00 9.794525924622434765e-01 +9.480000000000001137e+01 5.929907790209196783e+00 1.200963876659145946e+00 9.794294488871527760e-01 +9.490000000000000568e+01 5.929827002386180546e+00 1.201130530152660025e+00 9.794063030299762218e-01 +9.500000000000000000e+01 5.929746215694352784e+00 1.201297084579534102e+00 9.793831548929053943e-01 +9.510000000000000853e+01 5.929665430133698401e+00 1.201463539992339902e+00 9.793600044781295422e-01 +9.520000000000000284e+01 5.929584645704199630e+00 1.201629896443630052e+00 9.793368517878375812e-01 +9.530000000000001137e+01 5.929503862405844927e+00 1.201796153985939641e+00 9.793136968242165397e-01 +9.540000000000000568e+01 5.929423080238614752e+00 1.201962312671783550e+00 9.792905395894526688e-01 +9.550000000000000000e+01 5.929342299202494893e+00 1.202128372553659563e+00 9.792673800857307764e-01 +9.560000000000000853e+01 5.929261519297467586e+00 1.202294333684046368e+00 9.792442183152346713e-01 +9.570000000000000284e+01 5.929180740523519511e+00 1.202460196115403779e+00 9.792210542801466078e-01 +9.580000000000001137e+01 5.929099962880633790e+00 1.202625959900173180e+00 9.791978879826475080e-01 +9.590000000000000568e+01 5.929019186368795324e+00 1.202791625090777528e+00 9.791747194249175168e-01 +9.600000000000000000e+01 5.928938410987988128e+00 1.202957191739620235e+00 9.791515486091351139e-01 +9.610000000000000853e+01 5.928857636738196213e+00 1.203122659899086955e+00 9.791283755374778908e-01 +9.620000000000000284e+01 5.928776863619403592e+00 1.203288029621544242e+00 9.791052002121219955e-01 +9.630000000000001137e+01 5.928696091631594278e+00 1.203453300959340000e+00 9.790820226352424660e-01 +9.640000000000000568e+01 5.928615320774751396e+00 1.203618473964803259e+00 9.790588428090128970e-01 +9.650000000000000000e+01 5.928534551048861623e+00 1.203783548690244176e+00 9.790356607356058838e-01 +9.660000000000000853e+01 5.928453782453908971e+00 1.203948525187955143e+00 9.790124764171926897e-01 +9.670000000000000284e+01 5.928373014989875678e+00 1.204113403510207903e+00 9.789892898559436896e-01 +9.680000000000001137e+01 5.928292248656745755e+00 1.204278183709257322e+00 9.789661010540272601e-01 +9.690000000000000568e+01 5.928211483454505881e+00 1.204442865837338283e+00 9.789429100136110007e-01 +9.700000000000000000e+01 5.928130719383137404e+00 1.204607449946667685e+00 9.789197167368616226e-01 +9.710000000000000853e+01 5.928049956442626112e+00 1.204771936089442663e+00 9.788965212259438387e-01 +9.720000000000000284e+01 5.927969194632956906e+00 1.204936324317841922e+00 9.788733234830216956e-01 +9.730000000000001137e+01 5.927888433954112912e+00 1.205100614684025739e+00 9.788501235102580189e-01 +9.740000000000000568e+01 5.927807674406077254e+00 1.205264807240134406e+00 9.788269213098141908e-01 +9.750000000000000000e+01 5.927726915988835721e+00 1.205428902038290673e+00 9.788037168838502611e-01 +9.760000000000000853e+01 5.927646158702372325e+00 1.205592899130597528e+00 9.787805102345253916e-01 +9.770000000000000284e+01 5.927565402546672857e+00 1.205756798569139310e+00 9.787573013639973007e-01 +9.780000000000001137e+01 5.927484647521717775e+00 1.205920600405981258e+00 9.787340902744224858e-01 +9.790000000000000568e+01 5.927403893627493758e+00 1.206084304693170184e+00 9.787108769679562226e-01 +9.800000000000000000e+01 5.927323140863985707e+00 1.206247911482732915e+00 9.786876614467527880e-01 +9.810000000000000853e+01 5.927242389231174968e+00 1.206411420826678293e+00 9.786644437129650154e-01 +9.820000000000000284e+01 5.927161638729048221e+00 1.206574832776995843e+00 9.786412237687445170e-01 +9.830000000000001137e+01 5.927080889357589477e+00 1.206738147385655768e+00 9.786180016162416839e-01 +9.840000000000000568e+01 5.927000141116782750e+00 1.206901364704609625e+00 9.785947772576056858e-01 +9.850000000000000000e+01 5.926919394006612052e+00 1.207064484785789871e+00 9.785715506949844711e-01 +9.860000000000000853e+01 5.926838648027058731e+00 1.207227507681110534e+00 9.785483219305248781e-01 +9.870000000000000284e+01 5.926757903178111242e+00 1.207390433442465438e+00 9.785250909663724128e-01 +9.880000000000001137e+01 5.926677159459752708e+00 1.207553262121729754e+00 9.785018578046713600e-01 +9.890000000000000568e+01 5.926596416871967143e+00 1.207715993770760443e+00 9.784786224475647831e-01 +9.900000000000000000e+01 5.926515675414737672e+00 1.207878628441393376e+00 9.784553848971945245e-01 +9.910000000000000853e+01 5.926434935088049194e+00 1.208041166185447546e+00 9.784321451557013161e-01 +9.920000000000000284e+01 5.926354195891886611e+00 1.208203607054721296e+00 9.784089032252247797e-01 +9.930000000000001137e+01 5.926273457826232161e+00 1.208365951100994762e+00 9.783856591079027609e-01 +9.940000000000000568e+01 5.926192720891073407e+00 1.208528198376028095e+00 9.783624128058723279e-01 +9.950000000000000000e+01 5.926111985086391698e+00 1.208690348931562797e+00 9.783391643212692168e-01 +9.960000000000000853e+01 5.926031250412171936e+00 1.208852402819321936e+00 9.783159136562283864e-01 +9.970000000000000284e+01 5.925950516868398132e+00 1.209014360091007934e+00 9.782926608128829082e-01 +9.980000000000001137e+01 5.925869784455056966e+00 1.209176220798305446e+00 9.782694057933647436e-01 +9.990000000000000568e+01 5.925789053172128895e+00 1.209337984992878035e+00 9.782461485998050765e-01 diff --git a/testsuite/pytests/test_astrocyte.py b/testsuite/pytests/test_astrocyte.py new file mode 100644 index 0000000000..a2bd3c0c56 --- /dev/null +++ b/testsuite/pytests/test_astrocyte.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# +# test_astrocyte.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +""" +Test the astrocyte_lr_1994 model against SciPy reference solution. + +This test compares the output of NEST's implementation of an astrocyte model, +astrocyte_lr_1994, against the reference data stored in ``test_astrocyte.dat``, +which has been generated by the SciPy ODEINT solver (see `NEST implementation of +the astrocyte_lr_1994 model +`_). + +We assess that the difference between the recorded variables and the reference +is smaller than the default tolerance given by pytest.approx(). +""" + +import os +import numpy as np +import pytest + +import nest + +pytestmark = pytest.mark.skipif_missing_gsl +path = os.path.abspath(os.path.dirname(__file__)) + + +def test_closeness_nest_odeint(): + """Compare the astrocyte model to the reference (ODEINT) implementation.""" + + # simulation parameters as in the reference solution + simtime = 100.0 + spike_times = [10.0 - nest.resolution] # compensate for delay + spike_weights = [1.0] + + # get reference data + odeint = np.loadtxt(os.path.join(path, "test_astrocyte.dat")).T + ref_ip3 = odeint[1, :] + ref_ca = odeint[2, :] + ref_h_ip3r = odeint[3, :] + + # create astrocyte and devices + # initial values of the state variables as in the reference solution + astrocyte = nest.Create("astrocyte_lr_1994", params={"IP3": 1.0, "Ca": 1.0, "h_IP3R": 1.0}) + mm = nest.Create( + "multimeter", + {"interval": nest.resolution, "record_from": ["IP3", "Ca", "h_IP3R"]}, + ) + spk_ge = nest.Create("spike_generator", {"spike_times": spike_times, "spike_weights": spike_weights}) + + # connect astrocyte to devices + nest.Connect(mm, astrocyte) + nest.Connect(spk_ge, astrocyte, syn_spec={"delay": nest.resolution}) + + # simulate + nest.Simulate(simtime) + + # compare results with reference data + assert mm.events["IP3"] == pytest.approx(ref_ip3) + assert mm.events["Ca"] == pytest.approx(ref_ca) + assert mm.events["h_IP3R"] == pytest.approx(ref_h_ip3r) diff --git a/testsuite/pytests/test_labeled_synapses.py b/testsuite/pytests/test_labeled_synapses.py index 89146ded37..d9cbf4d854 100644 --- a/testsuite/pytests/test_labeled_synapses.py +++ b/testsuite/pytests/test_labeled_synapses.py @@ -168,6 +168,10 @@ def test_SetLabelToNotLabeledSynapse(self): """Try set a label to an 'un-label-able' synapse.""" for syn in [s for s in nest.synapse_models if not s.endswith("_lbl")]: + if syn == "sic_connection": + # Skip sic_connection since it requires different pre- and post-synaptic neuron models + continue + a, r_type = self.default_network(syn) # see if symmetric connections are required diff --git a/testsuite/pytests/test_sic_connection.py b/testsuite/pytests/test_sic_connection.py new file mode 100644 index 0000000000..0d470d0e83 --- /dev/null +++ b/testsuite/pytests/test_sic_connection.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# test_sic_connection.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +""" +Test functionality of the SIC connection +""" + +import numpy as np +import pytest + +import nest + + +pytestmark = pytest.mark.skipif_missing_gsl + + +SUPPORTED_SOURCES = [ + "astrocyte_lr_1994", +] +SUPPORTED_TARGETS = [ + "aeif_cond_alpha_astro", +] +TEST_MODELS = SUPPORTED_SOURCES + SUPPORTED_TARGETS + ["iaf_psc_exp"] + + +@pytest.mark.parametrize("source_model", TEST_MODELS) +@pytest.mark.parametrize("target_model", TEST_MODELS) +def test_ConnectNeuronsWithSICConnection(source_model, target_model): + """Ensures that the restriction to supported neuron models works.""" + + source = nest.Create(source_model) + target = nest.Create(target_model) + + if source_model in SUPPORTED_SOURCES and target_model in SUPPORTED_TARGETS: + # Connection should work + nest.Connect(source, target, syn_spec={"synapse_model": "sic_connection"}) + else: + # Connection should fail + with pytest.raises(nest.kernel.NESTError): + nest.Connect(source, target, syn_spec={"synapse_model": "sic_connection"}) + + +def test_SynapseFunctionWithAeifModel(): + """Ensure that SICEvent is properly processed""" + + nest.ResetKernel() + resol = nest.resolution + + # Create neurons and devices + astrocyte = nest.Create("astrocyte_lr_1994", {"Ca": 0.2}) # a calcium value which produces SIC + neuron = nest.Create("aeif_cond_alpha_astro") + + mm_neuron = nest.Create("multimeter", params={"record_from": ["I_SIC"], "interval": resol}) + mm_astro = nest.Create("multimeter", params={"record_from": ["Ca"], "interval": resol}) + + nest.Connect(astrocyte, neuron, syn_spec={"synapse_model": "sic_connection"}) + nest.Connect(mm_neuron, neuron) + nest.Connect(mm_astro, astrocyte) + + # Simulation + nest.Simulate(1000.0) + + # Evaluation + # The expected SIC values are calculated based on the astrocyte dynamics + # implemented in astrocyte_lr_1994.cpp. + actual_sic_values = mm_neuron.events["I_SIC"] + Ca = mm_astro.events["Ca"] + f_v = np.vectorize(lambda x: np.log(x * 1000.0 - 196.69) if x * 1000.0 - 196.69 > 1.0 else 0.0) + expected_sic_values = f_v(Ca) + + # The sic_connection has a default delay (1 ms), thus the values after + # the number of steps of delay are compared with the expected values. + sic_delay = nest.GetDefaults("sic_connection")["delay"] + n_step_delay = int(sic_delay / resol) + + assert actual_sic_values[n_step_delay:] == pytest.approx(expected_sic_values[:-n_step_delay]) diff --git a/testsuite/pytests/test_sp/test_disconnect.py b/testsuite/pytests/test_sp/test_disconnect.py index ec4c5c97f3..ed7ab487c1 100644 --- a/testsuite/pytests/test_sp/test_disconnect.py +++ b/testsuite/pytests/test_sp/test_disconnect.py @@ -61,6 +61,7 @@ def setUp(self): "urbanczik_synapse", "urbanczik_synapse_lbl", "urbanczik_synapse_hpc", + "sic_connection", ] def test_synapse_deletion_one_to_one_no_sp(self): diff --git a/testsuite/pytests/test_sp/test_disconnect_multiple.py b/testsuite/pytests/test_sp/test_disconnect_multiple.py index b5f9a9eb67..facd9fcabc 100644 --- a/testsuite/pytests/test_sp/test_disconnect_multiple.py +++ b/testsuite/pytests/test_sp/test_disconnect_multiple.py @@ -48,6 +48,7 @@ def setUp(self): "urbanczik_synapse", "urbanczik_synapse_lbl", "urbanczik_synapse_hpc", + "sic_connection", ] def test_multiple_synapse_deletion_all_to_all(self): diff --git a/testsuite/regressiontests/ticket-421.sli b/testsuite/regressiontests/ticket-421.sli index f714caf65d..a540e1d73b 100644 --- a/testsuite/regressiontests/ticket-421.sli +++ b/testsuite/regressiontests/ticket-421.sli @@ -49,7 +49,7 @@ Author: Hans Ekkehard Plesser, 2010-05-05 % models that should not be tested because they do not initialize V_m to % steady state /exclude_models [/aeif_cond_exp /aeif_cond_alpha /a2eif_cond_exp /a2eif_cond_exp_HW - /aeif_cond_alpha_multisynapse /aeif_psc_delta_clopath + /aeif_cond_alpha_multisynapse /aeif_psc_delta_clopath /aeif_cond_alpha_astro /aeif_psc_exp /aeif_psc_alpha /aeif_psc_delta /aeif_cond_beta_multisynapse /hh_cond_exp_traub /hh_cond_beta_gap_traub /hh_psc_alpha /hh_psc_alpha_clopath /hh_psc_alpha_gap /ht_neuron /ht_neuron_fs /iaf_cond_exp_sfa_rr /izhikevich] def