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