diff --git a/doc/htmldoc/examples/index.rst b/doc/htmldoc/examples/index.rst
index c5fc79b5e3..4a48fabadc 100644
--- a/doc/htmldoc/examples/index.rst
+++ b/doc/htmldoc/examples/index.rst
@@ -60,7 +60,8 @@ PyNEST examples
* :doc:`../auto_examples/astrocytes/astrocyte_single`
* :doc:`../auto_examples/astrocytes/astrocyte_interaction`
* :doc:`../auto_examples/astrocytes/astrocyte_small_network`
- * :doc:`../auto_examples/astrocytes/astrocyte_brunel`
+ * :doc:`../auto_examples/astrocytes/astrocyte_brunel_bernoulli`
+ * :doc:`../auto_examples/astrocytes/astrocyte_brunel_fixed_indegree`
.. grid:: 1 1 2 3
diff --git a/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb b/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb
index fa73230bee..4a3c12cf3c 100644
--- a/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb
+++ b/doc/htmldoc/model_details/astrocyte_model_implementation.ipynb
@@ -170,7 +170,7 @@
" 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",
+ " delta_ip3 = p.delta_IP3 # 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",
@@ -211,7 +211,7 @@
" \"Kd_IP3_2\": 0.9434,\n",
" \"Km_SERCA\": 0.1,\n",
" \"ratio_ER_cyt\": 0.185,\n",
- " \"delta_IP3\": 5.0,\n",
+ " \"delta_IP3\": 0.0002,\n",
" \"k_IP3R\": 0.0002,\n",
" \"rate_L\": 0.00011,\n",
" \"tau_IP3\": 7142.0,\n",
@@ -318,7 +318,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.10"
+ "version": "3.12.1"
}
},
"nbformat": 4,
diff --git a/doc/htmldoc/static/img/astrocyte_interaction.png b/doc/htmldoc/static/img/astrocyte_interaction.png
index bffc8da56f..1560b5b6ce 100644
Binary files a/doc/htmldoc/static/img/astrocyte_interaction.png and b/doc/htmldoc/static/img/astrocyte_interaction.png differ
diff --git a/doc/htmldoc/synapses/connectivity_concepts.rst b/doc/htmldoc/synapses/connectivity_concepts.rst
index 962428ac73..561421e1df 100644
--- a/doc/htmldoc/synapses/connectivity_concepts.rst
+++ b/doc/htmldoc/synapses/connectivity_concepts.rst
@@ -500,18 +500,25 @@ As multapses are per default allowed and possible with this rule, you can disall
.. _tripartite_connectivity:
-Tripartite Bernoulli with pool
-------------------------------
+Third-factor Bernoulli with pool
+--------------------------------
For each possible pair of nodes from a source ``NodeCollection`` (e.g., a neuron population ``S``)
and a target ``NodeCollection`` (e.g., a neuron population ``T``), a connection is
-created with probability ``p_primary``, and these connections are
-called 'primary' connections. For each primary connection, a
+created according to the ``conn_spec`` parameter passed to
+``TripariteConnect``; any one-directional connection specification can
+be used. The connections created between ``S`` and ``T`` are the
+*primary* connections.
+
+For each primary connection, a
third-party connection pair involving a node from a third ``NodeCollection``
-(e.g., an astrocyte population ``A``) is created with the conditional probability
-``p_third_if_primary``. This connection pair includes a connection
+(e.g., an astrocyte population ``A``) is created according to the
+``third_factor_conn_spec`` provided. This connection pair includes a connection
from the ``S`` node to the ``A`` node, and a connection from the ``A`` node to the
-``T`` node. The ``A`` node to connect to is chosen
+``T`` node.
+
+At present, ``third_factor_bernoulli_with_pool`` is the only connection rule
+available for third-factor connectivity. It chooses the ``A`` node to connect
at random from a pool, a subset of the nodes in ``A``. By default,
this pool is all of ``A``.
@@ -548,13 +555,14 @@ up to two randomly selected nodes in ``A`` (given ``pool_size == 2``).
S = nest.Create('aeif_cond_alpha_astro', N_S)
T = nest.Create('aeif_cond_alpha_astro', N_T)
A = nest.Create('astrocyte_lr_1994', N_A)
- conn_spec = {'rule': 'tripartite_bernoulli_with_pool',
- 'p_primary': p_primary,
- 'p_third_if_primary': p_third_if_primary,
- 'pool_type': pool_type,
- 'pool_size': pool_size}
+ conn_spec = {'rule': 'pairwise_bernoulli',
+ 'p': p_primary}
+ third_factor_conn_spec = {'rule': 'third_factor_bernoulli_with_pool',
+ 'p': p_third_if_primary,
+ 'pool_type': pool_type,
+ 'pool_size': pool_size}
syn_specs = {'third_out': 'sic_connection'}
- nest.TripartiteConnect(S, T, A, conn_spec, syn_specs)
+ nest.TripartiteConnect(S, T, A, conn_spec, third_factor_conn_spec, syn_specs)
(B) In
the first example of ``'block'`` pool type, let ``N_T/N_A`` = 2,
@@ -562,20 +570,12 @@ then each node in ``T`` can be connected with one node in ``A``
(``pool_size == 1`` is required because ``N_A < N_T``), and each node in
``A`` can be connected with up to two nodes in ``T``.
+The code for this example is identical to the code for example (A),
+except for the choice of pool type and size:
+
.. code-block:: python
- N_S, N_T, N_A, p_primary, p_third_if_primary = 6, 6, 3, 0.2, 1.0
pool_type, pool_size = 'block', 1
- S = nest.Create('aeif_cond_alpha_astro', N_S)
- T = nest.Create('aeif_cond_alpha_astro', N_T)
- A = nest.Create('astrocyte_lr_1994', N_A)
- conn_spec = {'rule': 'tripartite_bernoulli_with_pool',
- 'p_primary': p_primary,
- 'p_third_if_primary': p_third_if_primary,
- 'pool_type': pool_type,
- 'pool_size': pool_size}
- syn_specs = {'third_out': 'sic_connection'}
- nest.TripartiteConnect(S, T, A, conn_spec, syn_specs)
(C) In the second example
of ``'block'`` pool type, let ``N_A/N_T`` = 2, then each node in
@@ -583,20 +583,13 @@ of ``'block'`` pool type, let ``N_A/N_T`` = 2, then each node in
required because ``N_A/N_T`` = 2), and each node in ``A`` can be
connected to one node in ``T``.
+In this example, we have different values for ``N_T`` and ``N_A`` than
+in examples (A) and (B), and a different pool size than in example (B):
+
.. code-block:: python
N_S, N_T, N_A, p_primary, p_third_if_primary = 6, 3, 6, 0.2, 1.0
pool_type, pool_size = 'block', 2
- S = nest.Create('aeif_cond_alpha_astro', N_S)
- T = nest.Create('aeif_cond_alpha_astro', N_T)
- A = nest.Create('astrocyte_lr_1994', N_A)
- conn_spec = {'rule': 'tripartite_bernoulli_with_pool',
- 'p_primary': p_primary,
- 'p_third_if_primary': p_third_if_primary,
- 'pool_type': pool_type,
- 'pool_size': pool_size}
- syn_specs = {'third_out': 'sic_connection'}
- nest.TripartiteConnect(S, T, A, conn_spec, syn_specs)
References
diff --git a/models/astrocyte_lr_1994.cpp b/models/astrocyte_lr_1994.cpp
index 3e448bb5cf..4db152a27f 100644
--- a/models/astrocyte_lr_1994.cpp
+++ b/models/astrocyte_lr_1994.cpp
@@ -123,7 +123,7 @@ nest::astrocyte_lr_1994::Parameters_::Parameters_()
, Km_SERCA_( 0.1 ) // µM
, SIC_scale_( 1.0 )
, SIC_th_( 0.19669 ) // µM
- , delta_IP3_( 5.0 ) // µM
+ , delta_IP3_( 0.0002 ) // µM
, k_IP3R_( 0.0002 ) // 1/(µM*ms)
, rate_IP3R_( 0.006 ) // 1/ms
, rate_L_( 0.00011 ) // 1/ms
diff --git a/nestkernel/conn_builder.cpp b/nestkernel/conn_builder.cpp
index 12df5c03eb..f70f00f0b4 100644
--- a/nestkernel/conn_builder.cpp
+++ b/nestkernel/conn_builder.cpp
@@ -28,6 +28,7 @@
// Includes from nestkernel:
#include "conn_builder_impl.h"
#include "conn_parameter.h"
+#include "connection_manager.h"
#include "exceptions.h"
#include "kernel_manager.h"
#include "nest_names.h"
@@ -42,12 +43,87 @@
// Includes from C++:
#include
-nest::ConnBuilder::ConnBuilder( NodeCollectionPTR sources,
+
+nest::ConnBuilder::ConnBuilder( const std::string& primary_rule,
+ NodeCollectionPTR sources,
NodeCollectionPTR targets,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
+ : third_in_builder_( nullptr )
+ , third_out_builder_( nullptr )
+ , primary_builder_( kernel().connection_manager.get_conn_builder( primary_rule,
+ sources,
+ targets,
+ third_out_builder_,
+ conn_spec,
+ syn_specs ) )
+{
+}
+
+nest::ConnBuilder::ConnBuilder( const std::string& primary_rule,
+ const std::string& third_rule,
+ NodeCollectionPTR sources,
+ NodeCollectionPTR targets,
+ NodeCollectionPTR third,
+ const DictionaryDatum& conn_spec,
+ const DictionaryDatum& third_conn_spec,
+ const std::map< Name, std::vector< DictionaryDatum > >& syn_specs )
+ : third_in_builder_( new ThirdInBuilder( sources,
+ third,
+ third_conn_spec,
+ const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::third_in ] ) )
+ , third_out_builder_( kernel().connection_manager.get_third_conn_builder( third_rule,
+ third,
+ targets,
+ third_in_builder_,
+ third_conn_spec,
+ // const_cast here seems required, clang complains otherwise; try to clean up when Datums disappear
+ const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::third_out ] ) )
+ , primary_builder_( kernel().connection_manager.get_conn_builder( primary_rule,
+ sources,
+ targets,
+ third_out_builder_,
+ conn_spec,
+ const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::primary ] ) )
+{
+}
+
+nest::ConnBuilder::~ConnBuilder()
+{
+ delete primary_builder_;
+ delete third_in_builder_;
+ delete third_out_builder_;
+}
+
+void
+nest::ConnBuilder::connect()
+{
+ primary_builder_->connect(); // triggers third_out_builder_
+ if ( third_in_builder_ )
+ {
+ third_in_builder_->connect();
+ }
+}
+
+void
+nest::ConnBuilder::disconnect()
+{
+ if ( third_out_builder_ )
+ {
+ throw KernelException( "Disconnect is not supported for connections with third factor." );
+ }
+ primary_builder_->disconnect();
+}
+
+
+nest::BipartiteConnBuilder::BipartiteConnBuilder( NodeCollectionPTR sources,
+ NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
+ const DictionaryDatum& conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs )
: sources_( sources )
, targets_( targets )
+ , third_out_( third_out )
, allow_autapses_( true )
, allow_multapses_( true )
, make_symmetric_( false )
@@ -64,6 +140,11 @@ nest::ConnBuilder::ConnBuilder( NodeCollectionPTR sources,
updateValue< bool >( conn_spec, names::allow_multapses, allow_multapses_ );
updateValue< bool >( conn_spec, names::make_symmetric, make_symmetric_ );
+ if ( make_symmetric_ and third_out_ )
+ {
+ throw BadProperty( "Third-factor connectivity cannot be used with 'make_symmetric == True'." );
+ }
+
// Synapse-specific parameters that should be skipped when we set default synapse parameters
skip_syn_params_ = {
names::weight, names::delay, names::min_delay, names::max_delay, names::num_connections, names::synapse_model
@@ -121,7 +202,7 @@ nest::ConnBuilder::ConnBuilder( NodeCollectionPTR sources,
}
}
-nest::ConnBuilder::~ConnBuilder()
+nest::BipartiteConnBuilder::~BipartiteConnBuilder()
{
for ( auto weight : weights_ )
{
@@ -143,7 +224,10 @@ nest::ConnBuilder::~ConnBuilder()
}
bool
-nest::ConnBuilder::change_connected_synaptic_elements( size_t snode_id, size_t tnode_id, const size_t tid, int update )
+nest::BipartiteConnBuilder::change_connected_synaptic_elements( size_t snode_id,
+ size_t tnode_id,
+ const size_t tid,
+ int update )
{
int local = true;
@@ -186,7 +270,7 @@ nest::ConnBuilder::change_connected_synaptic_elements( size_t snode_id, size_t t
}
void
-nest::ConnBuilder::connect()
+nest::BipartiteConnBuilder::connect()
{
// We test here, and not in the ConnBuilder constructor, so the derived
// classes are fully constructed when the test is executed
@@ -252,7 +336,7 @@ nest::ConnBuilder::connect()
}
void
-nest::ConnBuilder::disconnect()
+nest::BipartiteConnBuilder::disconnect()
{
if ( use_structural_plasticity_ )
{
@@ -274,7 +358,7 @@ nest::ConnBuilder::disconnect()
}
void
-nest::ConnBuilder::update_param_dict_( size_t snode_id,
+nest::BipartiteConnBuilder::update_param_dict_( size_t snode_id,
Node& target,
size_t target_thread,
RngPtr rng,
@@ -302,7 +386,7 @@ nest::ConnBuilder::update_param_dict_( size_t snode_id,
}
void
-nest::ConnBuilder::single_connect_( size_t snode_id, Node& target, size_t target_thread, RngPtr rng )
+nest::BipartiteConnBuilder::single_connect_( size_t snode_id, Node& target, size_t target_thread, RngPtr rng )
{
if ( this->requires_proxies() and not target.has_proxies() )
{
@@ -353,10 +437,16 @@ nest::ConnBuilder::single_connect_( size_t snode_id, Node& target, size_t target
weight );
}
}
+
+ // We connect third-party only once per source-target pair, not per collocated synapse type
+ if ( third_out_ )
+ {
+ third_out_->third_connect( snode_id, target );
+ }
}
void
-nest::ConnBuilder::set_synaptic_element_names( const std::string& pre_name, const std::string& post_name )
+nest::BipartiteConnBuilder::set_synaptic_element_names( const std::string& pre_name, const std::string& post_name )
{
if ( pre_name.empty() or post_name.empty() )
{
@@ -370,7 +460,7 @@ nest::ConnBuilder::set_synaptic_element_names( const std::string& pre_name, cons
}
bool
-nest::ConnBuilder::all_parameters_scalar_() const
+nest::BipartiteConnBuilder::all_parameters_scalar_() const
{
bool all_scalar = true;
@@ -402,14 +492,14 @@ nest::ConnBuilder::all_parameters_scalar_() const
}
bool
-nest::ConnBuilder::loop_over_targets_() const
+nest::BipartiteConnBuilder::loop_over_targets_() const
{
return targets_->size() < kernel().node_manager.size() or not targets_->is_range()
or parameters_requiring_skipping_.size() > 0;
}
void
-nest::ConnBuilder::set_synapse_model_( DictionaryDatum syn_params, size_t synapse_indx )
+nest::BipartiteConnBuilder::set_synapse_model_( DictionaryDatum syn_params, size_t synapse_indx )
{
if ( not syn_params->known( names::synapse_model ) )
{
@@ -427,7 +517,7 @@ nest::ConnBuilder::set_synapse_model_( DictionaryDatum syn_params, size_t synaps
}
void
-nest::ConnBuilder::set_default_weight_or_delay_( DictionaryDatum syn_params, size_t synapse_indx )
+nest::BipartiteConnBuilder::set_default_weight_or_delay_( DictionaryDatum syn_params, size_t synapse_indx )
{
DictionaryDatum syn_defaults = kernel().model_manager.get_connector_defaults( synapse_model_id_[ synapse_indx ] );
@@ -463,7 +553,9 @@ nest::ConnBuilder::set_default_weight_or_delay_( DictionaryDatum syn_params, siz
}
void
-nest::ConnBuilder::set_synapse_params( DictionaryDatum syn_defaults, DictionaryDatum syn_params, size_t synapse_indx )
+nest::BipartiteConnBuilder::set_synapse_params( DictionaryDatum syn_defaults,
+ DictionaryDatum syn_params,
+ size_t synapse_indx )
{
for ( Dictionary::const_iterator default_it = syn_defaults->begin(); default_it != syn_defaults->end(); ++default_it )
{
@@ -502,7 +594,7 @@ nest::ConnBuilder::set_synapse_params( DictionaryDatum syn_defaults, DictionaryD
}
void
-nest::ConnBuilder::set_structural_plasticity_parameters( std::vector< DictionaryDatum > syn_specs )
+nest::BipartiteConnBuilder::set_structural_plasticity_parameters( std::vector< DictionaryDatum > syn_specs )
{
bool have_structural_plasticity_parameters = false;
for ( auto& syn_spec : syn_specs )
@@ -535,7 +627,7 @@ nest::ConnBuilder::set_structural_plasticity_parameters( std::vector< Dictionary
}
void
-nest::ConnBuilder::reset_weights_()
+nest::BipartiteConnBuilder::reset_weights_()
{
for ( auto weight : weights_ )
{
@@ -547,7 +639,7 @@ nest::ConnBuilder::reset_weights_()
}
void
-nest::ConnBuilder::reset_delays_()
+nest::BipartiteConnBuilder::reset_delays_()
{
for ( auto delay : delays_ )
{
@@ -558,11 +650,307 @@ nest::ConnBuilder::reset_delays_()
}
}
+nest::ThirdInBuilder::ThirdInBuilder( NodeCollectionPTR sources,
+ NodeCollectionPTR third,
+ const DictionaryDatum& third_conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs )
+ : BipartiteConnBuilder( sources, third, nullptr, third_conn_spec, syn_specs )
+ , source_third_gids_( kernel().vp_manager.get_num_threads(), nullptr )
+ , source_third_counts_( kernel().vp_manager.get_num_threads(), nullptr )
+{
+#pragma omp parallel
+ {
+ const size_t thrd = kernel().vp_manager.get_thread_id();
+ source_third_gids_[ thrd ] = new BlockVector< SourceThirdInfo_ >();
+ source_third_counts_[ thrd ] = new std::vector< size_t >( kernel().mpi_manager.get_num_processes(), 0 );
+ }
+}
+
+nest::ThirdInBuilder::~ThirdInBuilder()
+{
+#pragma omp parallel
+ {
+ const size_t thrd = kernel().vp_manager.get_thread_id();
+ delete source_third_gids_[ thrd ];
+ delete source_third_counts_[ thrd ];
+ }
+}
+
+void
+nest::ThirdInBuilder::register_connection( size_t primary_source_id, size_t third_node_id )
+{
+ const size_t tid = kernel().vp_manager.get_thread_id();
+ const auto third_node_rank =
+ kernel().mpi_manager.get_process_id_of_vp( kernel().vp_manager.node_id_to_vp( third_node_id ) );
+ source_third_gids_[ tid ]->push_back( { primary_source_id, third_node_id, third_node_rank } );
+ ++( ( *source_third_counts_[ tid ] )[ third_node_rank ] );
+}
+
+void
+nest::ThirdInBuilder::connect_()
+{
+ kernel().vp_manager.assert_single_threaded();
+
+ // count up how many source-third pairs we need to send to each rank
+ const size_t num_ranks = kernel().mpi_manager.get_num_processes();
+ std::vector< size_t > source_third_per_rank( num_ranks, 0 );
+ for ( auto stcp : source_third_counts_ )
+ {
+ const auto& stc = *stcp;
+ for ( size_t rank = 0; rank < stc.size(); ++rank )
+ {
+ source_third_per_rank[ rank ] += stc[ rank ];
+ }
+ }
+
+ // now find global maximum; for simplicity, we will use this to configure buffers
+ std::vector< long > max_stc( num_ranks ); // MPIManager does not support size_t
+ max_stc[ kernel().mpi_manager.get_rank() ] =
+ *std::max_element( source_third_per_rank.begin(), source_third_per_rank.end() );
+ kernel().mpi_manager.communicate( max_stc );
+ const size_t global_max_stc = *std::max_element( max_stc.begin(), max_stc.end() );
+
+ if ( global_max_stc == 0 )
+ {
+ // no rank has any any connections requiring ThirdIn connections
+ return;
+ }
+
+ const size_t slots_per_rank = 2 * global_max_stc;
+
+ // send buffer for third rank-third gid pairs
+ std::vector< size_t > send_stg( num_ranks * slots_per_rank, 0 ); // send buffer
+
+ // vector mapping destination rank to next entry in send_stg to write to
+ // initialization based on example in https://en.cppreference.com/w/cpp/iterator/back_insert_iterator
+ std::vector< size_t > rank_idx;
+ rank_idx.reserve( num_ranks );
+ std::generate_n( std::back_insert_iterator< std::vector< size_t > >( rank_idx ),
+ num_ranks,
+ [ rk = 0, slots_per_rank ]() mutable { return ( rk++ ) * slots_per_rank; } );
+
+ for ( auto stgp : source_third_gids_ )
+ {
+ for ( auto& stg : *stgp )
+ {
+ const auto ix = rank_idx[ stg.third_rank ];
+ send_stg[ ix ] = stg.third_gid; // write third gid first because we need to look at it first below
+ send_stg[ ix + 1 ] = stg.source_gid;
+ rank_idx[ stg.third_rank ] += 2;
+ }
+ }
+
+ std::vector< size_t > recv_stg( num_ranks * slots_per_rank, 0 );
+ const size_t send_recv_count = sizeof( size_t ) / sizeof( unsigned int ) * slots_per_rank;
+
+ // force to master thread for compatibility with MPI standard
+#pragma omp master
+ {
+ kernel().mpi_manager.communicate_Alltoall( send_stg, recv_stg, send_recv_count );
+ }
+
+ // Now recv_stg contains all source-third pairs where third is on current rank
+ // Create connections in parallel
+
+#pragma omp parallel
+ {
+ const size_t tid = kernel().vp_manager.get_thread_id();
+ RngPtr rng = kernel().random_manager.get_vp_specific_rng( tid );
+
+ for ( size_t idx = 0; idx < recv_stg.size(); idx += 2 )
+ {
+ const auto third_gid = recv_stg[ idx ];
+ if ( third_gid == 0 )
+ {
+ // No more entries from this rank, jump to beginning of next rank
+ // Subtract 2 because 2 is added again by the loop increment expression
+ // Since slots_per_rank >= 1 by definition, idx >= 0 is ensured
+ idx = ( idx / slots_per_rank + 1 ) * slots_per_rank - 2;
+ continue;
+ }
+
+ if ( kernel().vp_manager.is_node_id_vp_local( third_gid ) )
+ {
+ const auto source_gid = recv_stg[ idx + 1 ];
+ assert( source_gid > 0 );
+ single_connect_( source_gid, *kernel().node_manager.get_node_or_proxy( third_gid, tid ), tid, rng );
+ }
+ }
+ }
+}
+
+nest::ThirdOutBuilder::ThirdOutBuilder( const NodeCollectionPTR third,
+ const NodeCollectionPTR targets,
+ ThirdInBuilder* third_in,
+ const DictionaryDatum& third_conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs )
+ : BipartiteConnBuilder( third, targets, nullptr, third_conn_spec, syn_specs )
+ , third_in_( third_in )
+{
+}
+
+nest::ThirdBernoulliWithPoolBuilder::ThirdBernoulliWithPoolBuilder( const NodeCollectionPTR third,
+ const NodeCollectionPTR targets,
+ ThirdInBuilder* third_in,
+ const DictionaryDatum& conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs )
+ : ThirdOutBuilder( third, targets, third_in, conn_spec, syn_specs )
+ , p_( 1.0 )
+ , random_pool_( true )
+ , pool_size_( third->size() )
+ , targets_per_third_( targets->size() / third->size() )
+ , pools_( kernel().vp_manager.get_num_threads(), nullptr )
+{
+ updateValue< double >( conn_spec, names::p, p_ );
+ updateValue< long >( conn_spec, names::pool_size, pool_size_ );
+ std::string pool_type;
+ if ( updateValue< std::string >( conn_spec, names::pool_type, pool_type ) )
+ {
+ if ( pool_type == "random" )
+ {
+ random_pool_ = true;
+ }
+ else if ( pool_type == "block" )
+ {
+ random_pool_ = false;
+ }
+ else
+ {
+ throw BadProperty( "pool_type must be 'random' or 'block'" );
+ }
+ }
+
+ if ( p_ < 0 or 1 < p_ )
+ {
+ throw BadProperty( "Conditional probability of third-factor connection 0 ≤ p_third_if_primary ≤ 1 required" );
+ }
+
+ if ( pool_size_ < 1 or third->size() < pool_size_ )
+ {
+ throw BadProperty( "Pool size 1 ≤ pool_size ≤ size of third-factor population required" );
+ }
+
+ if ( not( random_pool_ or ( targets->size() * pool_size_ == third->size() )
+ or ( pool_size_ == 1 and targets->size() % third->size() == 0 ) ) )
+ {
+ throw BadProperty(
+ "The sizes of target and third-factor populations and the chosen pool size do not fit."
+ " If pool_size == 1, the target population size must be a multiple of the third-factor"
+ " population size. For pool_size > 1, size(targets) * pool_size == size(third factor)"
+ " is required. For all other cases, use random pools." );
+ }
+
+#pragma omp parallel
+ {
+ const size_t thrd = kernel().vp_manager.get_thread_id();
+ pools_[ thrd ] = new TgtPoolMap_();
+ }
+
+ if ( not random_pool_ )
+ {
+ // Tell every target neuron its position in the target node collection.
+ // This is necessary to assign the right block pool to it.
+ //
+ // We cannot do this parallel with targets->local_begin() since we need to
+ // count over all elements of the node collection which might be a complex
+ // composition of slices with non-trivial mapping between elements and vps.
+ size_t idx = 0;
+ for ( auto tgt_it = targets_->begin(); tgt_it != targets_->end(); ++tgt_it )
+ {
+ Node* const tgt = kernel().node_manager.get_node_or_proxy( ( *tgt_it ).node_id );
+ if ( not tgt->is_proxy() )
+ {
+ tgt->set_tmp_nc_index( idx++ ); // must be postfix
+ }
+ }
+ }
+}
+
+nest::ThirdBernoulliWithPoolBuilder::~ThirdBernoulliWithPoolBuilder()
+{
+#pragma omp parallel
+ {
+ const size_t thrd = kernel().vp_manager.get_thread_id();
+ delete pools_[ thrd ];
+
+ if ( not random_pool_ )
+ {
+ // Reset tmp_nc_index in target nodes in case a node has never been a target.
+ // We do not want non-invalid values to persist beyond the lifetime of this builder.
+ //
+ // Here we can work in parallel since we just reset to invalid_index
+ for ( auto tgt_it = targets_->thread_local_begin(); tgt_it != targets_->end(); ++tgt_it )
+ {
+ Node* const tgt = kernel().node_manager.get_node_or_proxy( ( *tgt_it ).node_id, thrd );
+ assert( not tgt->is_proxy() );
+ tgt->set_tmp_nc_index( invalid_index );
+ }
+ }
+ }
+}
+
+void
+nest::ThirdBernoulliWithPoolBuilder::third_connect( size_t primary_source_id, Node& primary_target )
+{
+ // We assume target is on this thread
+ const size_t tid = kernel().vp_manager.get_thread_id();
+ RngPtr rng = get_vp_specific_rng( tid );
+
+ // conditionally connect third factor
+ if ( not( rng->drand() < p_ ) )
+ {
+ return;
+ }
+
+ // step 2, build pool if new target
+ const size_t tgt_gid = primary_target.get_node_id();
+ auto pool_it = pools_[ tid ]->find( tgt_gid );
+ if ( pool_it == pools_[ tid ]->end() )
+ {
+ const auto [ new_pool_it, emplace_ok ] = pools_[ tid ]->emplace( tgt_gid, PoolType_() );
+ assert( emplace_ok );
+
+ if ( random_pool_ )
+ {
+ rng->sample( sources_->begin(), sources_->end(), std::back_inserter( new_pool_it->second ), pool_size_ );
+ }
+ else
+ {
+ std::copy_n( sources_->begin() + get_first_pool_index_( primary_target.get_tmp_nc_index() ),
+ pool_size_,
+ std::back_inserter( new_pool_it->second ) );
+ }
+ pool_it = new_pool_it;
+ }
+
+ // select third-factor node randomly from pool for this target
+ const auto third_index = pool_size_ == 1 ? 0 : rng->ulrand( pool_size_ );
+ const auto third_node_id = ( pool_it->second )[ third_index ].node_id;
+
+ single_connect_( third_node_id, primary_target, tid, rng );
+
+ third_in_->register_connection( primary_source_id, third_node_id );
+}
+
+
+size_t
+nest::ThirdBernoulliWithPoolBuilder::get_first_pool_index_( const size_t target_index ) const
+{
+ if ( pool_size_ > 1 )
+ {
+ return target_index * pool_size_;
+ }
+
+ return target_index / targets_per_third_; // intentional integer division
+}
+
+
nest::OneToOneBuilder::OneToOneBuilder( const NodeCollectionPTR sources,
const NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
// make sure that target and source population have the same size
if ( sources_->size() != targets_->size() )
@@ -586,9 +974,9 @@ nest::OneToOneBuilder::connect_()
if ( loop_over_targets_() )
{
- // A more efficient way of doing this might be to use NodeCollection's local_begin(). For this to work we would
- // need to change some of the logic, sources and targets might not be on the same process etc., so therefore
- // we are not doing it at the moment. This also applies to other ConnBuilders below.
+ // A more efficient way of doing this might be to use NodeCollection's local_begin(). For this to work we
+ // would need to change some of the logic, sources and targets might not be on the same process etc., so
+ // therefore we are not doing it at the moment. This also applies to other ConnBuilders below.
NodeCollection::const_iterator target_it = targets_->begin();
NodeCollection::const_iterator source_it = sources_->begin();
for ( ; target_it < targets_->end(); ++target_it, ++source_it )
@@ -1012,9 +1400,10 @@ nest::AllToAllBuilder::sp_disconnect_()
nest::FixedInDegreeBuilder::FixedInDegreeBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
// check for potential errors
long n_sources = static_cast< long >( sources_->size() );
@@ -1176,9 +1565,10 @@ nest::FixedInDegreeBuilder::inner_connect_( const int tid,
nest::FixedOutDegreeBuilder::FixedOutDegreeBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
// check for potential errors
long n_targets = static_cast< long >( targets_->size() );
@@ -1306,9 +1696,10 @@ nest::FixedOutDegreeBuilder::connect_()
nest::FixedTotalNumberBuilder::FixedTotalNumberBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
, N_( ( *conn_spec )[ names::N ] )
{
@@ -1476,9 +1867,10 @@ nest::FixedTotalNumberBuilder::connect_()
nest::BernoulliBuilder::BernoulliBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
ParameterDatum* pd = dynamic_cast< ParameterDatum* >( ( *conn_spec )[ names::p ].datum() );
if ( pd )
@@ -1591,9 +1983,10 @@ nest::BernoulliBuilder::inner_connect_( const int tid, RngPtr rng, Node* target,
nest::PoissonBuilder::PoissonBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
ParameterDatum* pd = dynamic_cast< ParameterDatum* >( ( *conn_spec )[ names::pairwise_avg_num_conns ].datum() );
if ( pd )
@@ -1706,215 +2099,12 @@ nest::PoissonBuilder::inner_connect_( const int tid, RngPtr rng, Node* target, s
}
}
-
-nest::AuxiliaryBuilder::AuxiliaryBuilder( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- const DictionaryDatum& conn_spec,
- const std::vector< DictionaryDatum >& syn_spec )
- : ConnBuilder( sources, targets, conn_spec, syn_spec )
-{
-}
-
-void
-nest::AuxiliaryBuilder::single_connect( size_t snode_id, Node& tgt, size_t tid, RngPtr rng )
-{
- single_connect_( snode_id, tgt, tid, rng );
-}
-
-
-nest::TripartiteBernoulliWithPoolBuilder::TripartiteBernoulliWithPoolBuilder( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- NodeCollectionPTR third,
- const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs )
- : ConnBuilder( sources,
- targets,
- conn_spec,
- // const_cast here seems required, clang complains otherwise; try to clean up when Datums disappear
- const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::primary ] )
- , third_( third )
- , third_in_builder_( sources,
- third,
- conn_spec,
- const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::third_in ] )
- , third_out_builder_( third,
- targets,
- conn_spec,
- const_cast< std::map< Name, std::vector< DictionaryDatum > >& >( syn_specs )[ names::third_out ] )
- , p_primary_( 1.0 )
- , p_third_if_primary_( 1.0 )
- , random_pool_( true )
- , pool_size_( third->size() )
- , targets_per_third_( targets->size() / third->size() )
-{
- updateValue< double >( conn_spec, names::p_primary, p_primary_ );
- updateValue< double >( conn_spec, names::p_third_if_primary, p_third_if_primary_ );
- updateValue< long >( conn_spec, names::pool_size, pool_size_ );
- std::string pool_type;
- if ( updateValue< std::string >( conn_spec, names::pool_type, pool_type ) )
- {
- if ( pool_type == "random" )
- {
- random_pool_ = true;
- }
- else if ( pool_type == "block" )
- {
- random_pool_ = false;
- }
- else
- {
- throw BadProperty( "pool_type must be 'random' or 'block'" );
- }
- }
-
- if ( p_primary_ < 0 or 1 < p_primary_ )
- {
- throw BadProperty( "Probability of primary connection 0 ≤ p_primary ≤ 1 required" );
- }
-
- if ( p_third_if_primary_ < 0 or 1 < p_third_if_primary_ )
- {
- throw BadProperty( "Conditional probability of third-factor connection 0 ≤ p_third_if_primary ≤ 1 required" );
- }
-
- if ( pool_size_ < 1 or third->size() < pool_size_ )
- {
- throw BadProperty( "Pool size 1 ≤ pool_size ≤ size of third-factor population required" );
- }
-
- if ( not( random_pool_ or ( targets->size() * pool_size_ == third->size() )
- or ( pool_size_ == 1 and targets->size() % third->size() == 0 ) ) )
- {
- throw BadProperty(
- "The sizes of target and third-factor populations and the chosen pool size do not fit."
- " If pool_size == 1, the target population size must be a multiple of the third-factor"
- " population size. For pool_size > 1, size(targets) * pool_size == size(third factor)"
- " is required. For all other cases, use random pools." );
- }
-}
-
-size_t
-nest::TripartiteBernoulliWithPoolBuilder::get_first_pool_index_( const size_t target_index ) const
-{
- if ( pool_size_ > 1 )
- {
- return target_index * pool_size_;
- }
-
- return target_index / targets_per_third_; // intentional integer division
-}
-
-void
-nest::TripartiteBernoulliWithPoolBuilder::connect_()
-{
-#pragma omp parallel
- {
- const size_t tid = kernel().vp_manager.get_thread_id();
-
- try
- {
- /* Random number generators:
- * - Use RNG generating same number sequence on all threads to decide which connections to create
- * - Use per-thread random number generator to randomize connection properties
- */
- RngPtr synced_rng = get_vp_synced_rng( tid );
- RngPtr rng = get_vp_specific_rng( tid );
-
- binomial_distribution bino_dist;
- binomial_distribution::param_type bino_param( sources_->size(), p_primary_ );
-
- // Iterate through target neurons. For each, three steps are done:
- // 1. draw indegree 2. select astrocyte pool 3. make connections
- for ( const auto& target : *targets_ )
- {
- const size_t tnode_id = target.node_id;
- Node* target_node = kernel().node_manager.get_node_or_proxy( tnode_id, tid );
- const bool local_target = not target_node->is_proxy();
-
- // step 1, draw indegree for this target
- const auto indegree = bino_dist( synced_rng, bino_param );
- if ( indegree == 0 )
- {
- continue; // no connections for this target
- }
-
- // step 2, build pool for target
- std::vector< NodeIDTriple > pool;
- pool.reserve( pool_size_ );
- if ( random_pool_ )
- {
- synced_rng->sample( third_->begin(), third_->end(), std::back_inserter( pool ), pool_size_ );
- }
- else
- {
- std::copy_n(
- third_->begin() + get_first_pool_index_( target.nc_index ), pool_size_, std::back_inserter( pool ) );
- }
-
- // step 3, iterate through indegree to make connections for this target
- // - by construction, we cannot get multapses
- // - if the target is also among sources, it can be drawn at most once;
- // we ignore it then connecting if no autapses are wanted
- std::vector< NodeIDTriple > sources_to_connect_;
- sources_to_connect_.reserve( indegree );
- synced_rng->sample( sources_->begin(), sources_->end(), std::back_inserter( sources_to_connect_ ), indegree );
-
- for ( const auto source : sources_to_connect_ )
- {
- const auto snode_id = source.node_id;
- if ( not allow_autapses_ and snode_id == tnode_id )
- {
- continue;
- }
-
- if ( local_target )
- {
- // plain connect now with thread-local rng for randomized parameters
- single_connect_( snode_id, *target_node, tid, rng );
- }
-
- // conditionally connect third factor
- if ( not( synced_rng->drand() < p_third_if_primary_ ) )
- {
- continue;
- }
-
- // select third-factor neuron randomly from pool for this target
- const auto third_index = pool_size_ == 1 ? 0 : synced_rng->ulrand( pool_size_ );
- const auto third_node_id = pool[ third_index ].node_id;
- Node* third_node = kernel().node_manager.get_node_or_proxy( third_node_id, tid );
- const bool local_third_node = not third_node->is_proxy();
-
- if ( local_third_node )
- {
- // route via auxiliary builder who handles parameters
- third_in_builder_.single_connect( snode_id, *third_node, tid, rng );
- }
-
- // connection third-factor node to target if local
- if ( local_target )
- {
- // route via auxiliary builder who handles parameters
- third_out_builder_.single_connect( third_node_id, *target_node, tid, rng );
- }
- }
- }
- }
- catch ( std::exception& err )
- {
- // We must create a new exception here, err's lifetime ends at
- // the end of the catch block.
- exceptions_raised_.at( tid ) = std::shared_ptr< WrappedThreadException >( new WrappedThreadException( err ) );
- }
- }
-}
-
-
nest::SymmetricBernoulliBuilder::SymmetricBernoulliBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
, p_( ( *conn_spec )[ names::p ] )
{
// This connector takes care of symmetric connections on its own
@@ -2039,9 +2229,10 @@ nest::SymmetricBernoulliBuilder::connect_()
nest::SPBuilder::SPBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
// Check that both pre and postsynaptic element are provided
if ( not use_structural_plasticity_ )
diff --git a/nestkernel/conn_builder.h b/nestkernel/conn_builder.h
index c5edfd2ccb..801d4bb355 100644
--- a/nestkernel/conn_builder.h
+++ b/nestkernel/conn_builder.h
@@ -35,6 +35,9 @@
#include
#include
+// Includes from libnestutil
+#include "block_vector.h"
+
// Includes from nestkernel:
#include "conn_parameter.h"
#include "nest_time.h"
@@ -50,18 +53,21 @@ namespace nest
class Node;
class ConnParameter;
class SparseNodeArray;
+class BipartiteConnBuilder;
+class ThirdInBuilder;
+class ThirdOutBuilder;
+
/**
- * Abstract base class for ConnBuilders.
+ * Abstract base class for Bipartite ConnBuilders which form the components of ConnBuilder.
*
* The base class extracts and holds parameters and provides
* the connect interface. Derived classes implement the connect
* method.
*
- * @note Naming classes *Builder to avoid name confusion with Connector classes.
+ * @note This class is also the base class for all components of a TripartiteConnBuilder.
*/
-
-class ConnBuilder
+class BipartiteConnBuilder
{
public:
//! Connect with or without structural plasticity
@@ -70,18 +76,22 @@ class ConnBuilder
//! Delete synapses with or without structural plasticity
virtual void disconnect();
- ConnBuilder( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- const DictionaryDatum& conn_spec,
- const std::vector< DictionaryDatum >& syn_specs );
- virtual ~ConnBuilder();
-
/**
- * Mark ConnBuilder subclasses as building tripartite rules or not.
+ * Create new bipartite builder.
*
- * @note This flag is required for template specialisation of ConnBuilderFactory's.
+ * @param sources Source population to connect from
+ * @param targets Target population to connect to
+ * @param third_out `nullptr` if pure bipartite connection, pointer to \class ThirdOutBuilder object if this builder
+ * creates the primary connection of a tripartite connectivity
+ * @param conn_spec Connection specification (if part of tripartite, spec for the specific part)
+ * @param syn_specs Collection of synapse specifications (usually single element, several for collocated synapses)
*/
- static constexpr bool is_tripartite = false;
+ BipartiteConnBuilder( NodeCollectionPTR sources,
+ NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
+ const DictionaryDatum& conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs );
+ virtual ~BipartiteConnBuilder();
size_t
get_synapse_model() const
@@ -105,8 +115,6 @@ class ConnBuilder
void set_synaptic_element_names( const std::string& pre_name, const std::string& post_name );
- bool all_parameters_scalar_() const;
-
/**
* Updates the number of connected synaptic elements in the target and the source.
*
@@ -118,12 +126,14 @@ class ConnBuilder
*/
bool change_connected_synaptic_elements( size_t snode_id, size_t tnode_id, const size_t tid, int update );
+ //! Return true if rule allows creation of symmetric connectivity
virtual bool
supports_symmetric() const
{
return false;
}
+ //! Return true if rule automatically creates symmetric connectivity
virtual bool
is_symmetric() const
{
@@ -153,6 +163,8 @@ class ConnBuilder
//! Implements the actual connection algorithm
virtual void connect_() = 0;
+ bool all_parameters_scalar_() const;
+
virtual void
sp_connect_()
{
@@ -204,15 +216,17 @@ class ConnBuilder
*/
bool loop_over_targets_() const;
- NodeCollectionPTR sources_;
- NodeCollectionPTR targets_;
+ NodeCollectionPTR sources_; //!< Population to connect from
+ NodeCollectionPTR targets_; //!< Population to connect to
+
+ ThirdOutBuilder* third_out_; //!< To be triggered when primary connection is created
bool allow_autapses_;
bool allow_multapses_;
bool make_symmetric_;
bool creates_symmetric_connections_;
- //! buffer for exceptions raised in threads
+ //! Buffer for exceptions raised in threads
std::vector< std::shared_ptr< WrappedThreadException > > exceptions_raised_;
// Name of the pre synaptic and postsynaptic elements for this connection builder
@@ -221,12 +235,18 @@ class ConnBuilder
bool use_structural_plasticity_;
- //! pointers to connection parameters specified as arrays
+ //! Pointers to connection parameters specified as arrays
std::vector< ConnParameter* > parameters_requiring_skipping_;
std::vector< size_t > synapse_model_id_;
- //! dictionaries to pass to connect function, one per thread for every syn_spec
+ /**
+ * Dictionaries to pass to connect function, one per thread for every syn_spec
+ *
+ * Outer dim: syn_spec, inner dim: thread
+ *
+ * @note Each thread can independently modify its dictionary to pass parameters on
+ */
std::vector< std::vector< DictionaryDatum > > param_dicts_;
private:
@@ -291,11 +311,262 @@ class ConnBuilder
void reset_delays_();
};
-class OneToOneBuilder : public ConnBuilder
+
+/**
+ * Builder creating "thírd in" connections based on data from "third out" builder.
+ *
+ * This builder creates the actual connections from primary sources to third-factor nodes
+ * based on the source-third lists generated by the third-out builder.
+ *
+ * The `ThirdOutBuilder::third_connect()` method calls `register_connection()`
+ * for each source node to third-factor node connection that needs to be created to store this
+ * information in the `ThirdIn` builder.
+ *
+ * The `connect_()` method of this class needs to be called after all primary connections
+ * and third-factor to target connections have been created. It then exchanges information
+ * about required source-third connections with the other MPI ranks and creates required
+ * connections locally.
+ *
+ * The class is final because there is no freedom of choice of connection rule at this stage.
+ */
+class ThirdInBuilder final : public BipartiteConnBuilder
+{
+public:
+ /**
+ * Create ThirdInBuilder
+ *
+ * @param sources Source population of primary connection
+ * @param third Third-factor population
+ * @param third_conn_spec is ignored by this builder but required to make base class happy
+ * @param syn_specs Collection of synapse specification for connection from primary source to third factor
+ *
+ * @todo Once DictionaryDatums are gone, see if we can remove `third_conn_spec` and just pass empty conn spec
+ * container to base-class constructor, since \class ThirdInBuilder has no connection rule properties to set.
+ */
+ ThirdInBuilder( NodeCollectionPTR sources,
+ NodeCollectionPTR third,
+ const DictionaryDatum& third_conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs );
+ ~ThirdInBuilder();
+
+ /**
+ * Register required source node to third-factor node connection.
+ *
+ * @param primary_source_id GID of source node to connect from
+ * @param third_node_id GID of target node to connect to
+ */
+ void register_connection( size_t primary_source_id, size_t third_node_id );
+
+private:
+ //! Exchange required connection info via MPI and create needed connections locally
+ void connect_() override;
+
+ /**
+ * Provide information on connections from primary source to third-factor population.
+ *
+ * Data is written by ThirdOutBuilder and communicated and processed by ThirdInBuilder.
+ */
+ struct SourceThirdInfo_
+ {
+ SourceThirdInfo_()
+ : source_gid( 0 )
+ , third_gid( 0 )
+ , third_rank( 0 )
+ {
+ }
+ SourceThirdInfo_( size_t src, size_t trd, size_t rank )
+ : source_gid( src )
+ , third_gid( trd )
+ , third_rank( rank )
+ {
+ }
+
+ size_t source_gid; //!< GID of source node to connect from
+ size_t third_gid; //!< GID of third-factor node to connect to
+ size_t third_rank; //!< Rank of third-factor node (stored locally as it is needed multiple times)
+ };
+
+ //! Container for register source-third connections, one per thread via pointer for collision free operation in
+ //! thread-local storage
+ std::vector< BlockVector< SourceThirdInfo_ >* > source_third_gids_;
+
+ //! Number of source-third pairs to send. Outer dimension is writing thread, inner dimension MPI rank to send to
+ std::vector< std::vector< size_t >* > source_third_counts_;
+};
+
+
+/**
+ * Builder for connections from third-factor nodes to primary target populations.
+ *
+ * This builder creates connections from third-factor nodes to primary targets based on the
+ * third-factor connection rule. It also registers source-third-factor pairs with the
+ * corresponding third-in ConnBuilder for later instantiation.
+ *
+ * This class needs to be subclassed for each third-factor connection rule.
+ */
+class ThirdOutBuilder : public BipartiteConnBuilder
+{
+public:
+ /**
+ * Create ThirdOutBuilder.
+ *
+ * @param third Third-factor population
+ * @param targets Target population of primary connection
+ * @param third_in ThirdInBuilder which will create source-third connections later
+ * @param third_conn_spec Specification for third-factor connectivity
+ * @param syn_specs Collection of synapse specifications for third-target connections
+ */
+ ThirdOutBuilder( const NodeCollectionPTR third,
+ const NodeCollectionPTR targets,
+ ThirdInBuilder* third_in,
+ const DictionaryDatum& third_conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs );
+
+ //! Only call third_connect() on ThirdOutBuilder
+ void
+ connect() override final
+ {
+ assert( false );
+ }
+
+ /**
+ * Create third-factor connection for given primary connection.
+ *
+ * @param source_gid GID of source of primary connection
+ * @param target Target node of primary connection
+ */
+ virtual void third_connect( size_t source_gid, Node& target ) = 0;
+
+protected:
+ ThirdInBuilder* third_in_;
+};
+
+
+/**
+ * Class representing a connection builder which may be bi- or tripartite.
+ *
+ * A ConnBuilder always has a primary BipartiteConnBuilder. It additionally can have a pair of third_in and third_out
+ * Bipartite builders, where the third_in builder must perform one-to-one connections on given source-third pairs.
+ */
+class ConnBuilder
+{
+public:
+ /**
+ * Constructor for bipartite connection
+ *
+ * @param primary_rule Name of conn rule for primary connection
+ * @param sources Source population for primary connection
+ * @param targets Target population for primary connection
+ * @param conn_spec Connection specification dictionary for tripartite bernoulli rule
+ * @param syn_spec Collection of dictionaries with synapse specifications
+ */
+ ConnBuilder( const std::string& primary_rule,
+ NodeCollectionPTR sources,
+ NodeCollectionPTR targets,
+ const DictionaryDatum& conn_spec,
+ const std::vector< DictionaryDatum >& syn_specs );
+
+ /**
+ * Constructor for tripartite connection
+ *
+ * @param primary_rule Name of conn rule for primary connection
+ * @param third_rule Name of conn rule for third-factor connection
+ * @param sources Source population for primary connection
+ * @param targets Target population for primary connection
+ * @param third Third-party population
+ * @param conn_spec Connection specification dictionary for tripartite bernoulli rule
+ * @param syn_specs Dictionary of synapse specifications for the three connections that may be created. Allowed keys
+ * are `"primary"`, `"third_in"`, `"third_out"`, and for each of these the value must be a collection of dictionaries
+ * with synapse specifications as for bipartite connectivity.
+ */
+ ConnBuilder( const std::string& primary_rule,
+ const std::string& third_rule,
+ NodeCollectionPTR sources,
+ NodeCollectionPTR targets,
+ NodeCollectionPTR third,
+ const DictionaryDatum& conn_spec,
+ const DictionaryDatum& third_conn_spec,
+ const std::map< Name, std::vector< DictionaryDatum > >& syn_specs );
+
+ ~ConnBuilder();
+
+ //! Connect with or without structural plasticity
+ void connect();
+
+ //! Delete synapses with or without structural plasticity
+ void disconnect();
+
+private:
+ // Order of declarations based on dependencies, do not change.
+ ThirdInBuilder* third_in_builder_;
+ ThirdOutBuilder* third_out_builder_;
+ BipartiteConnBuilder* primary_builder_;
+};
+
+/**
+ * Build third-factor connectivity based on Bernoulli trials, selecting third factor nodes from a fixed pool per target
+ * node.
+ */
+class ThirdBernoulliWithPoolBuilder : public ThirdOutBuilder
+{
+public:
+ ThirdBernoulliWithPoolBuilder( NodeCollectionPTR,
+ NodeCollectionPTR,
+ ThirdInBuilder*,
+ const DictionaryDatum&,
+ const std::vector< DictionaryDatum >& );
+ ~ThirdBernoulliWithPoolBuilder();
+
+ void third_connect( size_t source_gid, Node& target ) override;
+
+private:
+ void
+ connect_() override
+ {
+ assert( false );
+ } //!< only call third_connect()
+
+ /**
+ * For block pool, return index of first pool element for given target node.
+ *
+ * @param targe_index
+ */
+ size_t get_first_pool_index_( const size_t target_index ) const;
+
+ double p_; //!< probability of creating a third-factor connection
+ bool random_pool_; //!< random or block pool?
+ size_t pool_size_; //!< number of nodes per pool
+ size_t targets_per_third_; //!< number of target nodes per third-factor node
+
+ /**
+ * Type for single pool of third-factor nodes
+ *
+ * @todo Could probably be BlockVector, but currently some problem with back_inserter when sampling pool.
+ */
+ typedef std::vector< NodeIDTriple > PoolType_;
+
+ //! Type mapping target GID to pool for this target
+ typedef std::map< size_t, PoolType_ > TgtPoolMap_;
+
+ /**
+ * Thread-specific pools of third-factor nodes.
+ *
+ * Each thread maintains a map from target node IDs to the third-factor node pool for that target node.
+ * Since each target lives on exactly one thread, there will be no overlap. For each node, the pool is
+ * created when a third-factor connection needs to be made to that node for the first time.
+ * The pools are deleted when the ConnBuilder is destroyed at the end of the connect call.
+ * We store a pointer instead of the map itself to ensure that the map is in thread-local memory.
+ */
+ std::vector< TgtPoolMap_* > pools_; // outer: threads
+};
+
+
+class OneToOneBuilder : public BipartiteConnBuilder
{
public:
OneToOneBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs );
@@ -338,14 +609,15 @@ class OneToOneBuilder : public ConnBuilder
void sp_disconnect_() override;
};
-class AllToAllBuilder : public ConnBuilder
+class AllToAllBuilder : public BipartiteConnBuilder
{
public:
AllToAllBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
{
}
@@ -392,11 +664,12 @@ class AllToAllBuilder : public ConnBuilder
};
-class FixedInDegreeBuilder : public ConnBuilder
+class FixedInDegreeBuilder : public BipartiteConnBuilder
{
public:
FixedInDegreeBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
@@ -408,11 +681,12 @@ class FixedInDegreeBuilder : public ConnBuilder
ParameterDatum indegree_;
};
-class FixedOutDegreeBuilder : public ConnBuilder
+class FixedOutDegreeBuilder : public BipartiteConnBuilder
{
public:
FixedOutDegreeBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
@@ -423,11 +697,12 @@ class FixedOutDegreeBuilder : public ConnBuilder
ParameterDatum outdegree_;
};
-class FixedTotalNumberBuilder : public ConnBuilder
+class FixedTotalNumberBuilder : public BipartiteConnBuilder
{
public:
FixedTotalNumberBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
@@ -438,11 +713,12 @@ class FixedTotalNumberBuilder : public ConnBuilder
long N_;
};
-class BernoulliBuilder : public ConnBuilder
+class BernoulliBuilder : public BipartiteConnBuilder
{
public:
BernoulliBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
@@ -454,99 +730,29 @@ class BernoulliBuilder : public ConnBuilder
ParameterDatum p_; //!< connection probability
};
-class PoissonBuilder : public ConnBuilder
+class PoissonBuilder : public BipartiteConnBuilder
{
public:
- PoissonBuilder( NodeCollectionPTR, NodeCollectionPTR, const DictionaryDatum&, const std::vector< DictionaryDatum >& );
-
-protected:
- void connect_() override;
-
-private:
- void inner_connect_( const int, RngPtr, Node*, size_t );
- ParameterDatum pairwise_avg_num_conns_; //!< Mean number of connections
-};
-/**
- * Helper class to support parameter handling for tripartite builders.
- *
- * In tripartite builders, the actual builder class decides which connections to create and
- * handles parameterization of the primary connection. For each third-party connection,
- * it maintains an AuxiliaryBuilder which handles the parameterization of the corresponding
- * third-party connection.
- */
-class AuxiliaryBuilder : public ConnBuilder
-{
-public:
- AuxiliaryBuilder( NodeCollectionPTR,
+ PoissonBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
- //! forwards to single_connect_() in underlying ConnBuilder
- void single_connect( size_t, Node&, size_t, RngPtr );
-
-protected:
- void
- connect_() override
- {
- // The auxiliary builder does not create connections, it only parameterizes them.
- assert( false );
- }
-};
-
-/**
- * Class representing tripartite Bernoulli connector
- *
- * For each source-target pair, a Bernoulli trial is performed. If a primary connection is created, a third-factor
- * connection is created conditionally on a second Bernoulli trial. The third-party neuron to be connected is
- * chosen from a pool, which can either be set up in blocks or randomized. The third-party neuron receives
- * input from the source neuron and provides output to the target neuron of the primary connection.
- */
-class TripartiteBernoulliWithPoolBuilder : public ConnBuilder
-{
-public:
- /**
- * Constructor
- *
- * @param sources Source population for primary connection
- * @param targets Target population for primary connection
- * @param third Third-party population
- * @param conn_spec Connection specification dictionary for tripartite bernoulli rule
- * @param syn_specs Dictionary of synapse specifications for the three connections that may be created. Allowed keys
- * are `"primary"`, `"third_in"`, `"third_out"`
- */
- TripartiteBernoulliWithPoolBuilder( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- NodeCollectionPTR third,
- const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs );
-
- static constexpr bool is_tripartite = true;
-
protected:
void connect_() override;
private:
- //! Provide index of first third-party node to be assigned to pool for given target node
- size_t get_first_pool_index_( const size_t target_index ) const;
-
- NodeCollectionPTR third_;
-
- AuxiliaryBuilder third_in_builder_;
- AuxiliaryBuilder third_out_builder_;
-
- double p_primary_; //!< connection probability for pre-post connections
- double p_third_if_primary_; //!< probability of third-factor connection if primary connection created
- bool random_pool_; //!< if true, select astrocyte pool at random
- size_t pool_size_; //!< size of third-factor pool
- size_t targets_per_third_; //!< target nodes per third-factor node
+ void inner_connect_( const int, RngPtr, Node*, size_t );
+ ParameterDatum pairwise_avg_num_conns_; //!< Mean number of connections
};
-class SymmetricBernoulliBuilder : public ConnBuilder
+class SymmetricBernoulliBuilder : public BipartiteConnBuilder
{
public:
SymmetricBernoulliBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder* third_out,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
@@ -563,7 +769,7 @@ class SymmetricBernoulliBuilder : public ConnBuilder
double p_; //!< connection probability
};
-class SPBuilder : public ConnBuilder
+class SPBuilder : public BipartiteConnBuilder
{
public:
/**
@@ -577,6 +783,7 @@ class SPBuilder : public ConnBuilder
*/
SPBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_spec );
@@ -620,7 +827,7 @@ class SPBuilder : public ConnBuilder
//! The name of the SPBuilder; used to identify its properties in the structural_plasticity_synapses kernel attributes
std::string name_;
- using ConnBuilder::connect_;
+ using BipartiteConnBuilder::connect_;
void connect_() override;
void connect_( NodeCollectionPTR sources, NodeCollectionPTR targets );
@@ -634,7 +841,7 @@ class SPBuilder : public ConnBuilder
};
inline void
-ConnBuilder::register_parameters_requiring_skipping_( ConnParameter& param )
+BipartiteConnBuilder::register_parameters_requiring_skipping_( ConnParameter& param )
{
if ( param.is_array() )
{
@@ -643,7 +850,7 @@ ConnBuilder::register_parameters_requiring_skipping_( ConnParameter& param )
}
inline void
-ConnBuilder::skip_conn_parameter_( size_t target_thread, size_t n_skip )
+BipartiteConnBuilder::skip_conn_parameter_( size_t target_thread, size_t n_skip )
{
for ( std::vector< ConnParameter* >::iterator it = parameters_requiring_skipping_.begin();
it != parameters_requiring_skipping_.end();
diff --git a/nestkernel/conn_builder_conngen.cpp b/nestkernel/conn_builder_conngen.cpp
index f003512198..7c0547ab34 100644
--- a/nestkernel/conn_builder_conngen.cpp
+++ b/nestkernel/conn_builder_conngen.cpp
@@ -35,12 +35,15 @@ namespace nest
ConnectionGeneratorBuilder::ConnectionGeneratorBuilder( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
- : ConnBuilder( sources, targets, conn_spec, syn_specs )
+ : BipartiteConnBuilder( sources, targets, third_out, conn_spec, syn_specs )
, cg_( ConnectionGeneratorDatum() )
, params_map_()
{
+ assert( third_out == nullptr );
+
updateValue< ConnectionGeneratorDatum >( conn_spec, "cg", cg_ );
if ( cg_->arity() != 0 )
{
diff --git a/nestkernel/conn_builder_conngen.h b/nestkernel/conn_builder_conngen.h
index 05d05eb9bf..87c8445846 100644
--- a/nestkernel/conn_builder_conngen.h
+++ b/nestkernel/conn_builder_conngen.h
@@ -69,7 +69,7 @@ namespace nest
* interface MPI aware and communicating the masks during connection
* setup.
*/
-class ConnectionGeneratorBuilder : public ConnBuilder
+class ConnectionGeneratorBuilder : public BipartiteConnBuilder
{
typedef std::vector< ConnectionGenerator::ClosedInterval > RangeSet;
typedef ConnectionGenerator::ClosedInterval Range;
@@ -77,6 +77,7 @@ class ConnectionGeneratorBuilder : public ConnBuilder
public:
ConnectionGeneratorBuilder( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder*,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& );
diff --git a/nestkernel/conn_builder_factory.h b/nestkernel/conn_builder_factory.h
index a9937611a5..ccc62f0025 100644
--- a/nestkernel/conn_builder_factory.h
+++ b/nestkernel/conn_builder_factory.h
@@ -36,119 +36,93 @@
namespace nest
{
+
/**
- * Generic factory class for ConnBuilder objects.
+ * Generic factory class for bipartite ConnBuilder objects.
*
* This factory allows for flexible registration
- * of ConnBuilder subclasses and object creation.
+ * of bipartite ConnBuilder subclasses and object creation.
*
*/
-class GenericConnBuilderFactory
+class GenericBipartiteConnBuilderFactory
{
public:
- virtual ~GenericConnBuilderFactory()
+ virtual ~GenericBipartiteConnBuilderFactory()
{
}
/**
* Factory method for builders for bipartite connection rules (the default).
+ *
+ * @note
+ * - For plain bipartite connections, pass `nullptr` to `ThirdOutBuilder*`.
+ * - When the bipartite builder creates the primary connection of a tripartite connection,
+ * pass a pointer to a \class ThirdOutBuilder object.
*/
- virtual ConnBuilder* create( NodeCollectionPTR,
+ virtual BipartiteConnBuilder* create( NodeCollectionPTR,
NodeCollectionPTR,
+ ThirdOutBuilder*,
const DictionaryDatum&,
const std::vector< DictionaryDatum >& ) const = 0;
-
- /**
- * Factory method for builders for tripartite connection rules.
- */
- virtual ConnBuilder* create( NodeCollectionPTR,
- NodeCollectionPTR,
- NodeCollectionPTR,
- const DictionaryDatum&,
- const std::map< Name, std::vector< DictionaryDatum > >& ) const = 0;
};
/**
- * Factory class for ConnBuilders
- *
- * This template class provides an interface with bipartite and tripartite `create()` methods.
- * Implementation is delegated to explicit template specialisations below, which only implement
- * the `create()` method with the proper arity depending on the `is_tripartite` flag of
- * the pertaining conn builder.
+ * Factory class for bipartite ConnBuilders
*/
-template < typename ConnBuilderType, bool is_tripartite = ConnBuilderType::is_tripartite >
-class ConnBuilderFactory : public GenericConnBuilderFactory
+template < typename ConnBuilderType >
+class BipartiteConnBuilderFactory : public GenericBipartiteConnBuilderFactory
{
public:
- ConnBuilder*
+ BipartiteConnBuilder*
create( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs ) const override
{
- assert( false ); // only specialisations should be called
- }
-
- //! create tripartite builder
- ConnBuilder*
- create( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- NodeCollectionPTR third,
- const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs ) const override
- {
- assert( false ); // only specialisations should be called
+ return new ConnBuilderType( sources, targets, third_out, conn_spec, syn_specs );
}
};
-
-// Specialisation for bipartite ConnBuilders
-template < typename ConnBuilderType >
-class ConnBuilderFactory< ConnBuilderType, false > : public GenericConnBuilderFactory
+/**
+ * Generic factory class for tripartite ConnBuilder objects.
+ *
+ * This factory allows for flexible registration
+ * of tripartite ConnBuilder subclasses and object creation.
+ *
+ */
+class GenericThirdConnBuilderFactory
{
- ConnBuilder*
- create( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- const DictionaryDatum& conn_spec,
- const std::vector< DictionaryDatum >& syn_specs ) const override
+public:
+ virtual ~GenericThirdConnBuilderFactory()
{
- return new ConnBuilderType( sources, targets, conn_spec, syn_specs );
}
- ConnBuilder*
- create( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- NodeCollectionPTR third,
- const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs ) const override
- {
- throw IllegalConnection( String::compose(
- "Connection rule '%1' does not support tripartite connections.", ( *conn_spec )[ names::rule ] ) );
- }
+ /**
+ * Factory method for builders for tripartite connection rules.
+ */
+ virtual ThirdOutBuilder* create( NodeCollectionPTR,
+ NodeCollectionPTR,
+ ThirdInBuilder*,
+ const DictionaryDatum&,
+ const std::vector< DictionaryDatum >& ) const = 0;
};
-// Specialisation for tripartite ConnBuilders
-template < typename ConnBuilderType >
-class ConnBuilderFactory< ConnBuilderType, true > : public GenericConnBuilderFactory
+/**
+ * Factory class for Third-factor ConnBuilders
+ */
+template < typename ThirdConnBuilderType >
+class ThirdConnBuilderFactory : public GenericThirdConnBuilderFactory
{
- ConnBuilder*
+public:
+ ThirdOutBuilder*
create( NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdInBuilder* third_in,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs ) const override
{
- throw BadProperty(
- String::compose( "Connection rule %1 only supports tripartite connections.", ( *conn_spec )[ names::rule ] ) );
- }
-
- ConnBuilder*
- create( NodeCollectionPTR sources,
- NodeCollectionPTR targets,
- NodeCollectionPTR third,
- const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs ) const override
- {
- return new ConnBuilderType( sources, targets, third, conn_spec, syn_specs );
+ return new ThirdConnBuilderType( sources, targets, third_in, conn_spec, syn_specs );
}
};
diff --git a/nestkernel/conn_builder_impl.h b/nestkernel/conn_builder_impl.h
index 3c9a390ac6..385bb12ec8 100644
--- a/nestkernel/conn_builder_impl.h
+++ b/nestkernel/conn_builder_impl.h
@@ -33,7 +33,7 @@ namespace nest
{
inline void
-ConnBuilder::single_disconnect_( size_t snode_id, Node& target, size_t target_thread )
+BipartiteConnBuilder::single_disconnect_( size_t snode_id, Node& target, size_t target_thread )
{
// index tnode_id = target.get_node_id();
// This is the most simple case in which only the synapse_model_ has been
diff --git a/nestkernel/connection_manager.cpp b/nestkernel/connection_manager.cpp
index e2df068af8..1d47802ff9 100644
--- a/nestkernel/connection_manager.cpp
+++ b/nestkernel/connection_manager.cpp
@@ -68,6 +68,8 @@
nest::ConnectionManager::ConnectionManager()
: connruledict_( new Dictionary() )
, connbuilder_factories_()
+ , thirdconnruledict_( new Dictionary() )
+ , thirdconnbuilder_factories_()
, min_delay_( 1 )
, max_delay_( 1 )
, keep_source_table_( true )
@@ -104,9 +106,9 @@ nest::ConnectionManager::initialize( const bool adjust_number_of_threads_or_rng_
register_conn_builder< FixedOutDegreeBuilder >( "fixed_outdegree" );
register_conn_builder< BernoulliBuilder >( "pairwise_bernoulli" );
register_conn_builder< PoissonBuilder >( "pairwise_poisson" );
- register_conn_builder< TripartiteBernoulliWithPoolBuilder >( "tripartite_bernoulli_with_pool" );
register_conn_builder< SymmetricBernoulliBuilder >( "symmetric_pairwise_bernoulli" );
register_conn_builder< FixedTotalNumberBuilder >( "fixed_total_number" );
+ register_third_conn_builder< ThirdBernoulliWithPoolBuilder >( "third_factor_bernoulli_with_pool" );
#ifdef HAVE_LIBNEUROSIM
register_conn_builder< ConnectionGeneratorBuilder >( "conngen" );
#endif
@@ -171,6 +173,13 @@ nest::ConnectionManager::finalize( const bool adjust_number_of_threads_or_rng_on
}
connbuilder_factories_.clear();
connruledict_->clear();
+
+ for ( auto tcbf : thirdconnbuilder_factories_ )
+ {
+ delete tcbf;
+ }
+ thirdconnbuilder_factories_.clear();
+ thirdconnruledict_->clear();
}
}
@@ -376,29 +385,42 @@ nest::ConnectionManager::get_user_set_delay_extrema() const
return user_set_delay_extrema;
}
-nest::ConnBuilder*
+nest::BipartiteConnBuilder*
nest::ConnectionManager::get_conn_builder( const std::string& name,
NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs )
{
+ if ( not connruledict_->known( name ) )
+ {
+ throw IllegalConnection( String::compose( "Unknown connection rule '%1'.", name ) );
+ }
+
const size_t rule_id = connruledict_->lookup( name );
- ConnBuilder* cb = connbuilder_factories_.at( rule_id )->create( sources, targets, conn_spec, syn_specs );
+ BipartiteConnBuilder* cb =
+ connbuilder_factories_.at( rule_id )->create( sources, targets, third_out, conn_spec, syn_specs );
assert( cb );
return cb;
}
-nest::ConnBuilder*
-nest::ConnectionManager::get_conn_builder( const std::string& name,
+nest::ThirdOutBuilder*
+nest::ConnectionManager::get_third_conn_builder( const std::string& name,
NodeCollectionPTR sources,
NodeCollectionPTR targets,
- NodeCollectionPTR third,
+ ThirdInBuilder* third_in,
const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs )
+ const std::vector< DictionaryDatum >& syn_specs )
{
- const size_t rule_id = connruledict_->lookup( name );
- ConnBuilder* cb = connbuilder_factories_.at( rule_id )->create( sources, targets, third, conn_spec, syn_specs );
+ if ( not thirdconnruledict_->known( name ) )
+ {
+ throw IllegalConnection( String::compose( "Unknown third-factor connection rule '%1'.", name ) );
+ }
+
+ const size_t rule_id = thirdconnruledict_->lookup( name );
+ ThirdOutBuilder* cb =
+ thirdconnbuilder_factories_.at( rule_id )->create( sources, targets, third_in, conn_spec, syn_specs );
assert( cb );
return cb;
}
@@ -438,14 +460,14 @@ nest::ConnectionManager::connect( NodeCollectionPTR sources,
{
throw BadProperty( "The connection specification must contain a connection rule." );
}
- const std::string rule_name = static_cast< const std::string >( ( *conn_spec )[ names::rule ] );
+ const std::string rule = static_cast< const std::string >( ( *conn_spec )[ names::rule ] );
- if ( not connruledict_->known( rule_name ) )
+ if ( not connruledict_->known( rule ) )
{
- throw BadProperty( String::compose( "Unknown connection rule: %1", rule_name ) );
+ throw BadProperty( String::compose( "Unknown connection rule: %1", rule ) );
}
- ConnBuilder* cb = get_conn_builder( rule_name, sources, targets, conn_spec, syn_specs );
+ ConnBuilder cb( rule, sources, targets, conn_spec, syn_specs );
// at this point, all entries in conn_spec and syn_spec have been checked
ALL_ENTRIES_ACCESSED( *conn_spec, "Connect", "Unread dictionary entries in conn_spec: " );
@@ -457,8 +479,7 @@ nest::ConnectionManager::connect( NodeCollectionPTR sources,
// Set flag before calling cb->connect() in case exception is thrown after some connections have been created.
set_connections_have_changed();
- cb->connect();
- delete cb;
+ cb.connect();
}
@@ -803,6 +824,7 @@ nest::ConnectionManager::connect_tripartite( NodeCollectionPTR sources,
NodeCollectionPTR targets,
NodeCollectionPTR third,
const DictionaryDatum& conn_spec,
+ const DictionaryDatum& third_conn_spec,
const std::map< Name, std::vector< DictionaryDatum > >& syn_specs )
{
if ( sources->empty() )
@@ -831,14 +853,15 @@ nest::ConnectionManager::connect_tripartite( NodeCollectionPTR sources,
{
throw BadProperty( "The connection specification must contain a connection rule." );
}
- const std::string rule_name = static_cast< const std::string >( ( *conn_spec )[ names::rule ] );
-
- if ( not connruledict_->known( rule_name ) )
+ if ( not third_conn_spec->known( names::rule ) )
{
- throw BadProperty( String::compose( "Unknown connection rule: %1", rule_name ) );
+ throw BadProperty( "The third-factor connection specification must contain a connection rule." );
}
- ConnBuilder* cb = get_conn_builder( rule_name, sources, targets, third, conn_spec, syn_specs );
+ const std::string primary_rule = static_cast< const std::string >( ( *conn_spec )[ names::rule ] );
+ const std::string third_rule = static_cast< const std::string >( ( *third_conn_spec )[ names::rule ] );
+
+ ConnBuilder cb( primary_rule, third_rule, sources, targets, third, conn_spec, third_conn_spec, syn_specs );
// at this point, all entries in conn_spec and syn_spec have been checked
ALL_ENTRIES_ACCESSED( *conn_spec, "Connect", "Unread dictionary entries in conn_spec: " );
@@ -853,8 +876,7 @@ nest::ConnectionManager::connect_tripartite( NodeCollectionPTR sources,
// Set flag before calling cb->connect() in case exception is thrown after some connections have been created.
set_connections_have_changed();
- cb->connect();
- delete cb;
+ cb.connect();
}
diff --git a/nestkernel/connection_manager.h b/nestkernel/connection_manager.h
index 315e2a1305..e6c3888dff 100644
--- a/nestkernel/connection_manager.h
+++ b/nestkernel/connection_manager.h
@@ -52,7 +52,8 @@
namespace nest
{
-class GenericConnBuilderFactory;
+class GenericBipartiteConnBuilderFactory;
+class GenericThirdConnBuilderFactory;
class spikecounter;
class Node;
class Event;
@@ -94,20 +95,27 @@ class ConnectionManager : public ManagerInterface
template < typename ConnBuilder >
void register_conn_builder( const std::string& name );
+ /**
+ * Add a connectivity rule, i.e. the respective ConnBuilderFactory.
+ */
+ template < typename ThirdConnBuilder >
+ void register_third_conn_builder( const std::string& name );
+
//! Obtain builder for bipartite connections
- ConnBuilder* get_conn_builder( const std::string& name,
+ BipartiteConnBuilder* get_conn_builder( const std::string& name,
NodeCollectionPTR sources,
NodeCollectionPTR targets,
+ ThirdOutBuilder* third_out,
const DictionaryDatum& conn_spec,
const std::vector< DictionaryDatum >& syn_specs );
- //! Obtain builder for tripartite connections
- ConnBuilder* get_conn_builder( const std::string& name,
+ //! Obtain builder for bipartite connections
+ ThirdOutBuilder* get_third_conn_builder( const std::string& name,
NodeCollectionPTR sources,
NodeCollectionPTR targets,
- NodeCollectionPTR third,
+ ThirdInBuilder* third_in,
const DictionaryDatum& conn_spec,
- const std::map< Name, std::vector< DictionaryDatum > >& syn_specs );
+ const std::vector< DictionaryDatum >& syn_specs );
/**
* Create connections.
@@ -192,6 +200,7 @@ class ConnectionManager : public ManagerInterface
NodeCollectionPTR targets,
NodeCollectionPTR third,
const DictionaryDatum& connectivity,
+ const DictionaryDatum& third_connectivity,
const std::map< Name, std::vector< DictionaryDatum > >& synapse_specs );
size_t find_connection( const size_t tid, const synindex syn_id, const size_t snode_id, const size_t tnode_id );
@@ -638,7 +647,12 @@ class ConnectionManager : public ManagerInterface
DictionaryDatum connruledict_; //!< Dictionary for connection rules.
//! ConnBuilder factories, indexed by connruledict_ elements.
- std::vector< GenericConnBuilderFactory* > connbuilder_factories_;
+ std::vector< GenericBipartiteConnBuilderFactory* > connbuilder_factories_;
+
+ DictionaryDatum thirdconnruledict_; //!< Dictionary for third-factor connection rules.
+
+ //! Third-factor ConnBuilder factories, indexed by thirdconnruledict_ elements.
+ std::vector< GenericThirdConnBuilderFactory* > thirdconnbuilder_factories_;
long min_delay_; //!< Value of the smallest delay in the network.
diff --git a/nestkernel/connection_manager_impl.h b/nestkernel/connection_manager_impl.h
index 3563059a1b..3c8d74034c 100644
--- a/nestkernel/connection_manager_impl.h
+++ b/nestkernel/connection_manager_impl.h
@@ -43,13 +43,25 @@ void
ConnectionManager::register_conn_builder( const std::string& name )
{
assert( not connruledict_->known( name ) );
- GenericConnBuilderFactory* cb = new ConnBuilderFactory< ConnBuilder >();
+ GenericBipartiteConnBuilderFactory* cb = new BipartiteConnBuilderFactory< ConnBuilder >();
assert( cb );
const int id = connbuilder_factories_.size();
connbuilder_factories_.push_back( cb );
connruledict_->insert( name, id );
}
+template < typename ThirdConnBuilder >
+void
+ConnectionManager::register_third_conn_builder( const std::string& name )
+{
+ assert( not thirdconnruledict_->known( name ) );
+ GenericThirdConnBuilderFactory* cb = new ThirdConnBuilderFactory< ThirdConnBuilder >();
+ assert( cb );
+ const int id = thirdconnbuilder_factories_.size();
+ thirdconnbuilder_factories_.push_back( cb );
+ thirdconnruledict_->insert( name, id );
+}
+
inline void
ConnectionManager::send_to_devices( const size_t tid, const size_t source_node_id, Event& e )
{
diff --git a/nestkernel/mpi_manager.h b/nestkernel/mpi_manager.h
index 58d7d30423..6b6b2a6dea 100644
--- a/nestkernel/mpi_manager.h
+++ b/nestkernel/mpi_manager.h
@@ -42,6 +42,7 @@
// Includes from libnestutil:
#include "manager_interface.h"
+#include "stopwatch.h"
// Includes from nestkernel:
#include "nest_types.h"
diff --git a/nestkernel/nest.cpp b/nestkernel/nest.cpp
index 5e99aebda4..1289365adf 100644
--- a/nestkernel/nest.cpp
+++ b/nestkernel/nest.cpp
@@ -192,9 +192,11 @@ connect_tripartite( NodeCollectionPTR sources,
NodeCollectionPTR targets,
NodeCollectionPTR third,
const DictionaryDatum& connectivity,
+ const DictionaryDatum& third_connectivity,
const std::map< Name, std::vector< DictionaryDatum > >& synapse_specs )
{
- kernel().connection_manager.connect_tripartite( sources, targets, third, connectivity, synapse_specs );
+ kernel().connection_manager.connect_tripartite(
+ sources, targets, third, connectivity, third_connectivity, synapse_specs );
}
void
diff --git a/nestkernel/nest.h b/nestkernel/nest.h
index 5cdd7c2b46..8255758ec7 100644
--- a/nestkernel/nest.h
+++ b/nestkernel/nest.h
@@ -102,6 +102,7 @@ void connect_tripartite( NodeCollectionPTR sources,
NodeCollectionPTR targets,
NodeCollectionPTR third,
const DictionaryDatum& connectivity,
+ const DictionaryDatum& third_connectivity,
const std::map< Name, std::vector< DictionaryDatum > >& synapse_specs );
/**
diff --git a/nestkernel/nest_names.cpp b/nestkernel/nest_names.cpp
index 9bc1176eef..c897a9e6cf 100644
--- a/nestkernel/nest_names.cpp
+++ b/nestkernel/nest_names.cpp
@@ -370,8 +370,6 @@ const Name overwrite_files( "overwrite_files" );
const Name P( "P" );
const Name p( "p" );
const Name p_copy( "p_copy" );
-const Name p_primary( "p_primary" );
-const Name p_third_if_primary( "p_third_if_primary" );
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" );
diff --git a/nestkernel/nest_names.h b/nestkernel/nest_names.h
index de08731449..b6d964e04c 100644
--- a/nestkernel/nest_names.h
+++ b/nestkernel/nest_names.h
@@ -398,8 +398,6 @@ extern const Name overwrite_files;
extern const Name P;
extern const Name p;
extern const Name p_copy;
-extern const Name p_primary;
-extern const Name p_third_if_primary;
extern const Name p_transmit;
extern const Name pairwise_bernoulli_on_source;
extern const Name pairwise_bernoulli_on_target;
diff --git a/nestkernel/nestmodule.cpp b/nestkernel/nestmodule.cpp
index d5da67945f..81c95514af 100644
--- a/nestkernel/nestmodule.cpp
+++ b/nestkernel/nestmodule.cpp
@@ -770,16 +770,17 @@ NestModule::Connect_g_g_D_aFunction::execute( SLIInterpreter* i ) const
void
-NestModule::ConnectTripartite_g_g_g_D_DFunction::execute( SLIInterpreter* i ) const
+NestModule::ConnectTripartite_g_g_g_D_D_DFunction::execute( SLIInterpreter* i ) const
{
kernel().connection_manager.sw_construction_connect.start();
- i->assert_stack_load( 5 );
+ i->assert_stack_load( 6 );
- NodeCollectionDatum sources = getValue< NodeCollectionDatum >( i->OStack.pick( 4 ) );
- NodeCollectionDatum targets = getValue< NodeCollectionDatum >( i->OStack.pick( 3 ) );
- NodeCollectionDatum third = getValue< NodeCollectionDatum >( i->OStack.pick( 2 ) );
- DictionaryDatum connectivity = getValue< DictionaryDatum >( i->OStack.pick( 1 ) );
+ NodeCollectionDatum sources = getValue< NodeCollectionDatum >( i->OStack.pick( 5 ) );
+ NodeCollectionDatum targets = getValue< NodeCollectionDatum >( i->OStack.pick( 4 ) );
+ NodeCollectionDatum third = getValue< NodeCollectionDatum >( i->OStack.pick( 3 ) );
+ DictionaryDatum connectivity = getValue< DictionaryDatum >( i->OStack.pick( 2 ) );
+ DictionaryDatum third_connectivity = getValue< DictionaryDatum >( i->OStack.pick( 1 ) );
DictionaryDatum synapse_specs_dict = getValue< DictionaryDatum >( i->OStack.pick( 0 ) );
std::map< Name, std::vector< DictionaryDatum > > synapse_specs {
@@ -797,9 +798,9 @@ NestModule::ConnectTripartite_g_g_g_D_DFunction::execute( SLIInterpreter* i ) co
}
// dictionary access checking is handled by connect
- connect_tripartite( sources, targets, third, connectivity, synapse_specs );
+ connect_tripartite( sources, targets, third, connectivity, third_connectivity, synapse_specs );
- i->OStack.pop( 5 );
+ i->OStack.pop( 6 );
i->EStack.pop();
kernel().connection_manager.sw_construction_connect.stop();
@@ -2127,7 +2128,7 @@ NestModule::init( SLIInterpreter* i )
i->createcommand( "Connect_g_g_D_D", &connect_g_g_D_Dfunction );
i->createcommand( "Connect_g_g_D_a", &connect_g_g_D_afunction );
i->createcommand( "ConnectSonata_D", &ConnectSonata_D_Function );
- i->createcommand( "ConnectTripartite_g_g_g_D_D", &connect_tripartite_g_g_g_D_Dfunction );
+ i->createcommand( "ConnectTripartite_g_g_g_D_D_D", &connect_tripartite_g_g_g_D_D_Dfunction );
i->createcommand( "ResetKernel", &resetkernelfunction );
diff --git a/nestkernel/nestmodule.h b/nestkernel/nestmodule.h
index 1b47b4711c..ef874f16ef 100644
--- a/nestkernel/nestmodule.h
+++ b/nestkernel/nestmodule.h
@@ -554,11 +554,11 @@ class NestModule : public SLIModule
void execute( SLIInterpreter* ) const;
} ConnectSonata_D_Function;
- class ConnectTripartite_g_g_g_D_DFunction : public SLIFunction
+ class ConnectTripartite_g_g_g_D_D_DFunction : public SLIFunction
{
public:
void execute( SLIInterpreter* ) const override;
- } connect_tripartite_g_g_g_D_Dfunction;
+ } connect_tripartite_g_g_g_D_D_Dfunction;
class ResetKernelFunction : public SLIFunction
{
diff --git a/nestkernel/node.cpp b/nestkernel/node.cpp
index 8d990c4a86..eb3c0f0497 100644
--- a/nestkernel/node.cpp
+++ b/nestkernel/node.cpp
@@ -48,6 +48,7 @@ Node::Node()
, frozen_( false )
, initialized_( false )
, node_uses_wfr_( false )
+ , tmp_nc_index_( invalid_index )
{
}
@@ -62,6 +63,7 @@ Node::Node( const Node& n )
// copy must always initialized its own buffers
, initialized_( false )
, node_uses_wfr_( n.node_uses_wfr_ )
+ , tmp_nc_index_( invalid_index )
{
}
diff --git a/nestkernel/node.h b/nestkernel/node.h
index 83d3f33e32..9fde5624fb 100644
--- a/nestkernel/node.h
+++ b/nestkernel/node.h
@@ -953,6 +953,19 @@ class Node
*/
DeprecationWarning deprecation_warning;
+ /**
+ * Set index in node collection; required by ThirdOutBuilder.
+ */
+ void set_tmp_nc_index( size_t index );
+
+ /**
+ * Return and invalidate index in node collection; required by ThirdOutBuilder.
+ *
+ * @note Not const since it invalidates index in node object.
+ */
+ size_t get_tmp_nc_index();
+
+
private:
void set_node_id_( size_t ); //!< Set global node id
@@ -1030,6 +1043,17 @@ class Node
bool frozen_; //!< node shall not be updated if true
bool initialized_; //!< state and buffers have been initialized
bool node_uses_wfr_; //!< node uses waveform relaxation method
+
+ /**
+ * Store index in NodeCollection.
+ *
+ * @note This is only here so that the primary connection builder can inform the ThirdOutBuilder
+ * about the index of the target neuron in the targets node collection. This is required for block-based
+ * builders.
+ *
+ * @note Set by set_tmp_nc_index() and invalidated by get_tmp_nc_index().
+ */
+ size_t tmp_nc_index_;
};
inline bool
@@ -1169,6 +1193,24 @@ Node::get_thread_lid() const
return thread_lid_;
}
+inline void
+Node::set_tmp_nc_index( size_t index )
+{
+ tmp_nc_index_ = index;
+}
+
+inline size_t
+Node::get_tmp_nc_index()
+{
+ assert( tmp_nc_index_ != invalid_index );
+
+ const auto index = tmp_nc_index_;
+ tmp_nc_index_ = invalid_index;
+
+ return index;
+}
+
+
} // namespace
#endif
diff --git a/nestkernel/node_manager.h b/nestkernel/node_manager.h
index def97d9e60..86044911b3 100644
--- a/nestkernel/node_manager.h
+++ b/nestkernel/node_manager.h
@@ -139,7 +139,7 @@ class NodeManager : public ManagerInterface
*
* The function expects that
* the given node ID and thread are valid. If they are not, an assertion
- * will fail. In case the given Node does not exist on the fiven
+ * will fail. In case the given Node does not exist on the given
* thread, a proxy is returned instead.
*
* @param node_id index of the Node
diff --git a/nestkernel/simulation_manager.cpp b/nestkernel/simulation_manager.cpp
index bad0b83e7c..9e0da05602 100644
--- a/nestkernel/simulation_manager.cpp
+++ b/nestkernel/simulation_manager.cpp
@@ -1108,13 +1108,12 @@ nest::SimulationManager::update_()
sw_gather_secondary_data_.start();
#endif
kernel().event_delivery_manager.gather_secondary_events( true );
- }
#ifdef TIMER_DETAILED
- sw_gather_secondary_data_.stop();
+ sw_gather_secondary_data_.stop();
#endif
+ }
}
-
advance_time_();
if ( print_time_ )
diff --git a/nestkernel/sp_manager.cpp b/nestkernel/sp_manager.cpp
index fb912b1f84..4705b7de64 100644
--- a/nestkernel/sp_manager.cpp
+++ b/nestkernel/sp_manager.cpp
@@ -153,7 +153,7 @@ SPManager::set_status( const DictionaryDatum& d )
}
// We use a ConnBuilder with dummy values to check the synapse parameters
- SPBuilder* conn_builder = new SPBuilder( sources, targets, conn_spec, { syn_spec } );
+ SPBuilder* conn_builder = new SPBuilder( sources, targets, /* third_out */ nullptr, conn_spec, { syn_spec } );
conn_builder->set_name( i->first.toString() );
// check that the user defined the min and max delay properly, if the
@@ -251,7 +251,7 @@ SPManager::disconnect( NodeCollectionPTR sources,
}
}
- ConnBuilder* cb = nullptr;
+ BipartiteConnBuilder* cb = nullptr;
conn_spec->clear_access_flags();
syn_spec->clear_access_flags();
@@ -274,7 +274,12 @@ SPManager::disconnect( NodeCollectionPTR sources,
std::string synModel = getValue< std::string >( syn_spec, names::synapse_model );
if ( ( *i )->get_synapse_model() == kernel().model_manager.get_synapse_model_id( synModel ) )
{
- cb = kernel().connection_manager.get_conn_builder( rule_name, sources, targets, conn_spec, { syn_spec } );
+ cb = kernel().connection_manager.get_conn_builder( rule_name,
+ sources,
+ targets,
+ /* third_out */ nullptr,
+ conn_spec,
+ { syn_spec } );
cb->set_synaptic_element_names(
( *i )->get_pre_synaptic_element_name(), ( *i )->get_post_synaptic_element_name() );
}
@@ -282,7 +287,12 @@ SPManager::disconnect( NodeCollectionPTR sources,
}
else
{
- cb = kernel().connection_manager.get_conn_builder( rule_name, sources, targets, conn_spec, { syn_spec } );
+ cb = kernel().connection_manager.get_conn_builder( rule_name,
+ sources,
+ targets,
+ /* third_out */ nullptr,
+ conn_spec,
+ { syn_spec } );
}
assert( cb );
diff --git a/pynest/examples/astrocytes/astrocyte_brunel.py b/pynest/examples/astrocytes/astrocyte_brunel_bernoulli.py
similarity index 91%
rename from pynest/examples/astrocytes/astrocyte_brunel.py
rename to pynest/examples/astrocytes/astrocyte_brunel_bernoulli.py
index 78669886cc..cee744e37a 100644
--- a/pynest/examples/astrocytes/astrocyte_brunel.py
+++ b/pynest/examples/astrocytes/astrocyte_brunel_bernoulli.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# astrocyte_brunel.py
+# astrocyte_brunel_bernoulli.py
#
# This file is part of NEST.
#
@@ -20,8 +20,8 @@
# along with NEST. If not, see .
"""
-Random balanced network with astrocytes
----------------------------------------
+Random balanced network with astrocytes with Bernoulli connectivity
+-------------------------------------------------------------------
This script simulates a random balanced network with excitatory and inhibitory
neurons and astrocytes. The astrocytes are modeled with ``astrocyte_lr_1994``,
@@ -30,9 +30,12 @@
supporting neuron-astrocyte interactions.
The simulation results show how astrocytes affect neuronal excitability. The
-astrocytic dynamics, the slow inward current in the neurons induced by the
-astrocytes, and the raster plot of neuronal firings are shown in the created
-figures.
+figures displayed at the end of the simulation show the astrocytic dynamics,
+the slow inward current induced by the astrocytes in the postsynaptic neurons,
+and a raster plot of neuronal firings, respectively.
+
+In this version of the model, primary connections between populations are
+created with the pairwise bernoulli rule.
References
~~~~~~~~~~
@@ -55,7 +58,7 @@
See Also
~~~~~~~~
-:doc:`astrocyte_small_network`
+:doc:`astrocyte_small_network`, :doc:`astrocyte_brunel_fixed_indegree`
"""
@@ -73,11 +76,10 @@
sim_params = {
"dt": 0.1, # simulation resolution in ms
- "pre_sim_time": 100.0, # pre-simulation time in ms (data not recorded)
"sim_time": 1000.0, # simulation time in ms
"N_rec_spk": 100, # number of neurons to record from with spike recorder
"N_rec_mm": 50, # number of nodes (neurons, astrocytes) to record from with multimeter
- "n_threads": 4, # number of threads for NEST
+ "n_vp": 4, # number of virtual processes for NEST
"seed": 100, # seed for the random module
}
@@ -96,7 +98,7 @@
}
syn_params = {
- "w_a2n": 0.01, # weight of astrocyte-to-neuron connection
+ "w_a2n": 0.05, # weight of astrocyte-to-neuron connection
"w_e": 1.0, # weight of excitatory connection in nS
"w_i": -4.0, # weight of inhibitory connection in nS
"d_e": 2.0, # delay of excitatory connection in ms
@@ -109,8 +111,6 @@
astrocyte_model = "astrocyte_lr_1994"
astrocyte_params = {
"IP3": 0.4, # IP3 initial value in µM
- "delta_IP3": 0.5, # Parameter determining the increase in astrocytic IP3 concentration induced by synaptic input
- "tau_IP3": 2.0, # Time constant of the exponential decay of astrocytic IP3
}
###############################################################################
@@ -168,7 +168,7 @@ def connect_astro_network(nodes_ex, nodes_in, nodes_astro, nodes_noise, scale=1.
"""Connect the nodes in a neuron-astrocyte network.
Nodes in a neuron-astrocyte network are connected. The connection
- probability between neurons is divided by a the given scale to preserve
+ probability between neurons is divided by the given scale to preserve
the expected number of connections for each node. The astrocytes are paired
with excitatory connections only.
@@ -192,10 +192,10 @@ def connect_astro_network(nodes_ex, nodes_in, nodes_astro, nodes_noise, scale=1.
print("Connecting neurons and astrocytes ...")
# excitatory connections are paired with astrocytes
# conn_spec and syn_spec according to the "tripartite_bernoulli_with_pool" rule
- conn_params_e = {
- "rule": "tripartite_bernoulli_with_pool",
- "p_primary": network_params["p_primary"] / scale,
- "p_third_if_primary": network_params[
+ conn_params_e = {"rule": "pairwise_bernoulli", "p": network_params["p_primary"] / scale}
+ conn_params_astro = {
+ "rule": "third_factor_bernoulli_with_pool",
+ "p": network_params[
"p_third_if_primary"
], # "p_third_if_primary" is scaled along with "p_primary", so no further scaling is required
"pool_size": network_params["pool_size"],
@@ -216,7 +216,14 @@ def connect_astro_network(nodes_ex, nodes_in, nodes_astro, nodes_noise, scale=1.
},
"third_out": {"synapse_model": "sic_connection", "weight": syn_params["w_a2n"]},
}
- nest.TripartiteConnect(nodes_ex, nodes_ex + nodes_in, nodes_astro, conn_spec=conn_params_e, syn_specs=syn_params_e)
+ nest.TripartiteConnect(
+ nodes_ex,
+ nodes_ex + nodes_in,
+ nodes_astro,
+ conn_spec=conn_params_e,
+ third_factor_conn_spec=conn_params_astro,
+ syn_specs=syn_params_e,
+ )
# inhibitory connections are not paired with astrocytes
conn_params_i = {"rule": "pairwise_bernoulli", "p": network_params["p_primary"] / scale}
syn_params_i = {
@@ -311,7 +318,7 @@ def run_simulation():
# NEST configuration
nest.ResetKernel()
nest.resolution = sim_params["dt"]
- nest.local_num_threads = sim_params["n_threads"]
+ nest.total_num_virtual_procs = sim_params["n_vp"]
nest.print_time = True
nest.overwrite_files = True
@@ -319,7 +326,6 @@ def run_simulation():
random.seed(sim_params["seed"])
# simulation settings
- pre_sim_time = sim_params["pre_sim_time"]
sim_time = sim_params["sim_time"]
# create and connect nodes
@@ -345,16 +351,11 @@ def run_simulation():
nest.Connect(mm_neuron, neuron_list_for_mm)
nest.Connect(mm_astro, astro_list_for_mm)
- # run pre-simulation
- print("Running pre-simulation ...")
- nest.Simulate(pre_sim_time)
-
# run simulation
print("Running simulation ...")
nest.Simulate(sim_time)
# read out recordings
- neuron_spikes = sr_neuron.events
neuron_data = mm_neuron.events
astro_data = mm_astro.events
diff --git a/pynest/examples/astrocytes/astrocyte_brunel_fixed_indegree.py b/pynest/examples/astrocytes/astrocyte_brunel_fixed_indegree.py
new file mode 100644
index 0000000000..4624986223
--- /dev/null
+++ b/pynest/examples/astrocytes/astrocyte_brunel_fixed_indegree.py
@@ -0,0 +1,374 @@
+# -*- coding: utf-8 -*-
+#
+# astrocyte_brunel_fixed_indegree.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 .
+
+"""
+Random balanced network with astrocytes with fixed-indegree connectivity
+------------------------------------------------------------------------
+
+This script simulates a random balanced network with excitatory and inhibitory
+neurons and astrocytes. The astrocytes are modeled with ``astrocyte_lr_1994``,
+implemented according to [1]_, [2]_, and [3]_. The neurons are modeled with
+``aeif_cond_alpha_astro``, an adaptive exponential integrate-and-fire neuron
+supporting neuron-astrocyte interactions.
+
+The simulation results show how astrocytes affect neuronal excitability. The
+figures displayed at the end of the simulation show the astrocytic dynamics,
+the slow inward current induced by the astrocytes in the postsynaptic neurons,
+and a raster plot of neuronal firings, respectively.
+
+In this version of the model, primary connections between populations are
+created with the fixed-indegree rule.
+
+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
+
+See Also
+~~~~~~~~
+
+:doc:`astrocyte_small_network`, :doc:`astrocyte_brunel_bernoulli`
+
+"""
+
+###############################################################################
+# Import all necessary modules for simulation and plotting.
+
+import random
+
+import matplotlib.pyplot as plt
+import nest
+import numpy as np
+
+###############################################################################
+# Set simulation parameters.
+
+sim_params = {
+ "dt": 0.1, # simulation resolution in ms
+ "sim_time": 1000.0, # simulation time in ms
+ "N_rec_spk": 100, # number of neurons to record from with spike recorder
+ "N_rec_mm": 50, # number of nodes (neurons, astrocytes) to record from with multimeter
+ "n_vp": 4, # number of virtual processes for NEST
+ "seed": 100, # seed for the random module
+}
+
+###############################################################################
+# Set network parameters.
+
+network_params = {
+ "N_ex": 8000, # number of excitatory neurons
+ "N_in": 2000, # number of inhibitory neurons
+ "N_astro": 10000, # number of astrocytes
+ "CE": 800, # number of incoming excitatory connections per neuron
+ "CI": 200, # number of incoming inhbitory connections per neuron
+ "p_third_if_primary": 0.5, # probability of each created neuron-neuron connection to be paired with one astrocyte
+ "pool_size": 10, # astrocyte pool size for each target neuron
+ "pool_type": "random", # astrocyte pool will be chosen randomly for each target neuron
+ "poisson_rate": 2000, # Poisson input rate for neurons
+}
+
+syn_params = {
+ "w_a2n": 0.05, # weight of astrocyte-to-neuron connection
+ "w_e": 1.0, # weight of excitatory connection in nS
+ "w_i": -4.0, # weight of inhibitory connection in nS
+ "d_e": 2.0, # delay of excitatory connection in ms
+ "d_i": 1.0, # delay of inhibitory connection in ms
+}
+
+###############################################################################
+# Set astrocyte parameters.
+
+astrocyte_model = "astrocyte_lr_1994"
+astrocyte_params = {
+ "IP3": 0.4, # IP3 initial value in µM
+}
+
+###############################################################################
+# Set neuron parameters.
+
+neuron_model = "aeif_cond_alpha_astro"
+tau_syn_ex = 2.0
+tau_syn_in = 4.0
+
+neuron_params_ex = {
+ "tau_syn_ex": tau_syn_ex, # excitatory synaptic time constant in ms
+ "tau_syn_in": tau_syn_in, # inhibitory synaptic time constant in ms
+}
+
+neuron_params_in = {
+ "tau_syn_ex": tau_syn_ex, # excitatory synaptic time constant in ms
+ "tau_syn_in": tau_syn_in, # inhibitory synaptic time constant in ms
+}
+
+###############################################################################
+# This function creates the nodes and build the network. The astrocytes only
+# respond to excitatory synaptic inputs; therefore, only the excitatory
+# neuron-neuron connections are paired with the astrocytes. The
+# ``TripartiteConnect()`` function and the ``tripartite_bernoulli_with_pool`` rule
+# are used to create the connectivity of the network.
+
+
+def create_astro_network(scale=1.0):
+ """Create nodes for a neuron-astrocyte network.
+
+ Nodes in a neuron-astrocyte network are created according to the give scale
+ of the model. The nodes created include excitatory and inhibitory neurons,
+ astrocytes, and a Poisson generator.
+
+ Parameters
+ ---------
+ scale
+ Scale of the model.
+
+ Return values
+ -------------
+ Created nodes and Poisson generator.
+
+ """
+ print("Creating nodes ...")
+ assert scale >= 1.0, "scale must be >= 1.0"
+ nodes_ex = nest.Create(neuron_model, int(network_params["N_ex"] * scale), params=neuron_params_ex)
+ nodes_in = nest.Create(neuron_model, int(network_params["N_in"] * scale), params=neuron_params_in)
+ nodes_astro = nest.Create(astrocyte_model, int(network_params["N_astro"] * scale), params=astrocyte_params)
+ nodes_noise = nest.Create("poisson_generator", params={"rate": network_params["poisson_rate"]})
+ return nodes_ex, nodes_in, nodes_astro, nodes_noise
+
+
+def connect_astro_network(nodes_ex, nodes_in, nodes_astro, nodes_noise):
+ """Connect the nodes in a neuron-astrocyte network.
+
+ Nodes in a neuron-astrocyte network are connected. The indegree of neurons
+ is not changed with network scale to preserve the expected number of connections
+ for each node (consistent with the corresponding bernoulli example).
+ The astrocytes are paired with excitatory connections only.
+
+ Parameters
+ ---------
+ nodes_ex
+ Nodes of excitatory neurons.
+ nodes_in
+ Nodes of inhibitory neurons.
+ nodes_astro
+ Nodes of astrocytes.
+ node_noise
+ Poisson generator.
+
+ """
+ print("Connecting Poisson generator ...")
+ nest.Connect(nodes_noise, nodes_ex + nodes_in, syn_spec={"weight": syn_params["w_e"]})
+ print("Connecting neurons and astrocytes ...")
+ # excitatory connections are paired with astrocytes
+ # conn_spec and syn_spec according to the "tripartite_bernoulli_with_pool" rule
+ conn_params_e = {"rule": "fixed_indegree", "indegree": network_params["CE"]}
+ conn_params_astro = {
+ "rule": "third_factor_bernoulli_with_pool",
+ "p": network_params["p_third_if_primary"],
+ "pool_size": network_params["pool_size"],
+ "pool_type": network_params["pool_type"],
+ }
+ syn_params_e = {
+ "primary": {
+ "synapse_model": "tsodyks_synapse",
+ "weight": syn_params["w_e"],
+ "tau_psc": tau_syn_ex,
+ "delay": syn_params["d_e"],
+ },
+ "third_in": {
+ "synapse_model": "tsodyks_synapse",
+ "weight": syn_params["w_e"],
+ "tau_psc": tau_syn_ex,
+ "delay": syn_params["d_e"],
+ },
+ "third_out": {"synapse_model": "sic_connection", "weight": syn_params["w_a2n"]},
+ }
+ nest.TripartiteConnect(
+ nodes_ex,
+ nodes_ex + nodes_in,
+ nodes_astro,
+ conn_spec=conn_params_e,
+ third_factor_conn_spec=conn_params_astro,
+ syn_specs=syn_params_e,
+ )
+
+ # inhibitory connections are not paired with astrocytes
+ conn_params_i = {"rule": "fixed_indegree", "indegree": network_params["CI"]}
+ syn_params_i = {
+ "synapse_model": "tsodyks_synapse",
+ "weight": syn_params["w_i"],
+ "tau_psc": tau_syn_in,
+ "delay": syn_params["d_i"],
+ }
+ nest.Connect(nodes_in, nodes_ex + nodes_in, conn_params_i, syn_params_i)
+
+
+###############################################################################
+# This function plots the dynamics in the astrocytes and their resultant output
+# to the neurons. The IP3 and calcium in the astrocytes and the SIC in neurons
+# are plotted. Means and standard deviations across sampled nodes are indicated
+# by lines and shaded areas, respectively.
+
+
+def plot_dynamics(astro_data, neuron_data, start):
+ """Plot the dynamics in neurons and astrocytes.
+
+ The dynamics in the given neuron and astrocyte nodes are plotted. The
+ dynamics include IP3 and calcium in the astrocytes, and the SIC input to
+ the postsynaptic neurons.
+
+ Parameters
+ ---------
+ astro_data
+ Data of IP3 and calcium dynamics in the astrocytes.
+ neuron_data
+ Data of SIC input to the neurons.
+ start
+ Start time of the plotted dynamics.
+
+ """
+ print("Plotting dynamics ...")
+ # astrocyte data
+ astro_mask = astro_data["times"] > start
+ astro_ip3 = astro_data["IP3"][astro_mask]
+ astro_cal = astro_data["Ca_astro"][astro_mask]
+ astro_times = astro_data["times"][astro_mask]
+ astro_times_set = list(set(astro_times))
+ ip3_means = np.array([np.mean(astro_ip3[astro_times == t]) for t in astro_times_set])
+ ip3_sds = np.array([np.std(astro_ip3[astro_times == t]) for t in astro_times_set])
+ cal_means = np.array([np.mean(astro_cal[astro_times == t]) for t in astro_times_set])
+ cal_sds = np.array([np.std(astro_cal[astro_times == t]) for t in astro_times_set])
+ # neuron data
+ neuron_mask = neuron_data["times"] > start
+ neuron_sic = neuron_data["I_SIC"][neuron_mask]
+ neuron_times = neuron_data["times"][neuron_mask]
+ neuron_times_set = list(set(neuron_times))
+ sic_means = np.array([np.mean(neuron_sic[neuron_times == t]) for t in neuron_times_set])
+ sic_sds = np.array([np.std(neuron_sic[neuron_times == t]) for t in neuron_times_set])
+ # set plots
+ fig, axes = plt.subplots(2, 1, sharex=True)
+ color_ip3 = "tab:blue"
+ color_cal = "tab:green"
+ color_sic = "tab:purple"
+ # astrocyte plot
+ axes[0].set_title(f"{r'IP$_{3}$'} and {r'Ca$^{2+}$'} in astrocytes (n={len(set(astro_data['senders']))})")
+ axes[0].set_ylabel(r"IP$_{3}$ ($\mu$M)")
+ axes[0].tick_params(axis="y", labelcolor=color_ip3)
+ axes[0].fill_between(
+ astro_times_set, ip3_means + ip3_sds, ip3_means - ip3_sds, alpha=0.3, linewidth=0.0, color=color_ip3
+ )
+ axes[0].plot(astro_times_set, ip3_means, linewidth=2, color=color_ip3)
+ ax = axes[0].twinx()
+ ax.set_ylabel(r"Ca$^{2+}$ ($\mu$M)")
+ ax.tick_params(axis="y", labelcolor=color_cal)
+ ax.fill_between(
+ astro_times_set, cal_means + cal_sds, cal_means - cal_sds, alpha=0.3, linewidth=0.0, color=color_cal
+ )
+ ax.plot(astro_times_set, cal_means, linewidth=2, color=color_cal)
+ # neuron plot
+ axes[1].set_title(f"SIC in neurons (n={len(set(neuron_data['senders']))})")
+ axes[1].set_ylabel("SIC (pA)")
+ axes[1].set_xlabel("Time (ms)")
+ axes[1].fill_between(
+ neuron_times_set, sic_means + sic_sds, sic_means - sic_sds, alpha=0.3, linewidth=0.0, color=color_sic
+ )
+ axes[1].plot(neuron_times_set, sic_means, linewidth=2, color=color_sic)
+
+
+###############################################################################
+# This is the main function for simulation. The network is created and the
+# neurons and astrocytes are randomly chosen for recording. After simulation,
+# recorded data of neurons and astrocytes are plotted.
+
+
+def run_simulation():
+ """Run simulation of a neuron-astrocyte network."""
+ # NEST configuration
+ nest.ResetKernel()
+ nest.resolution = sim_params["dt"]
+ nest.local_num_threads = sim_params["n_threads"]
+ nest.print_time = True
+ nest.overwrite_files = True
+
+ # use random seed for reproducible sampling
+ random.seed(sim_params["seed"])
+
+ # simulation settings
+ sim_time = sim_params["sim_time"]
+
+ # create and connect nodes
+ exc, inh, astro, noise = create_astro_network()
+ connect_astro_network(exc, inh, astro, noise)
+
+ # create and connect recorders (multimeter default resolution = 1 ms)
+ sr_neuron = nest.Create("spike_recorder")
+ mm_neuron = nest.Create("multimeter", params={"record_from": ["I_SIC"]})
+ mm_astro = nest.Create("multimeter", params={"record_from": ["IP3", "Ca_astro"]})
+
+ # select nodes randomly and connect them with recorders
+ print("Connecting recorders ...")
+ neuron_list = (exc + inh).tolist()
+ astro_list = astro.tolist()
+ n_neuron_rec_spk = min(len(neuron_list), sim_params["N_rec_spk"])
+ n_neuron_rec_mm = min(len(neuron_list), sim_params["N_rec_mm"])
+ n_astro_rec = min(len(astro), sim_params["N_rec_mm"])
+ neuron_list_for_sr = neuron_list[: min(len(neuron_list), n_neuron_rec_spk)]
+ neuron_list_for_mm = sorted(random.sample(neuron_list, n_neuron_rec_mm))
+ astro_list_for_mm = sorted(random.sample(astro_list, n_astro_rec))
+ nest.Connect(neuron_list_for_sr, sr_neuron)
+ nest.Connect(mm_neuron, neuron_list_for_mm)
+ nest.Connect(mm_astro, astro_list_for_mm)
+
+ # run simulation
+ print("Running simulation ...")
+ nest.Simulate(sim_time)
+
+ # read out recordings
+ neuron_data = mm_neuron.events
+ astro_data = mm_astro.events
+
+ # make raster plot
+ nest.raster_plot.from_device(
+ sr_neuron, hist=True, title=f"Raster plot of neuron {neuron_list_for_sr[0]} to {neuron_list_for_sr[-1]}"
+ )
+
+ # plot dynamics in astrocytes and neurons
+ plot_dynamics(astro_data, neuron_data, 0.0)
+
+ # show plots
+ plt.show()
+
+
+###############################################################################
+# Run simulation.
+
+run_simulation()
diff --git a/pynest/examples/astrocytes/astrocyte_interaction.py b/pynest/examples/astrocytes/astrocyte_interaction.py
index 4be19b1371..f75fa0ea16 100644
--- a/pynest/examples/astrocytes/astrocyte_interaction.py
+++ b/pynest/examples/astrocytes/astrocyte_interaction.py
@@ -85,7 +85,7 @@
# neuron parameters
params_neuro = {"tau_syn_ex": 2.0}
# astrocyte parameters
-params_astro = {"IP3_0": 0.16}
+params_astro = {"delta_IP3": 0.2}
# weights of connections
w_pre2astro = 1.0
w_pre2post = 1.0
diff --git a/pynest/examples/astrocytes/astrocyte_single.py b/pynest/examples/astrocytes/astrocyte_single.py
index e3ef58a130..a28e31602e 100644
--- a/pynest/examples/astrocytes/astrocyte_single.py
+++ b/pynest/examples/astrocytes/astrocyte_single.py
@@ -68,10 +68,10 @@
# simulation time
sim_time = 60000
# astrocyte parameters
-params_astro = {"IP3_0": 0.16}
+params_astro = {"delta_IP3": 0.2}
# Poisson input for the astrocyte
poisson_rate = 1.0
-poisson_weight = 0.1
+poisson_weight = 1.0
###############################################################################
# Create astrocyte and devices and connect them.
diff --git a/pynest/examples/astrocytes/astrocyte_small_network.py b/pynest/examples/astrocytes/astrocyte_small_network.py
index 9411b78d07..77b506b227 100644
--- a/pynest/examples/astrocytes/astrocyte_small_network.py
+++ b/pynest/examples/astrocytes/astrocyte_small_network.py
@@ -29,15 +29,17 @@
neurons are modeled with ``aeif_cond_alpha_astro``, an adaptive exponential
integrate-and-fire neuron supporting neuron-astrocyte interactions.
-The network is created with the ``TripartiteConnect()`` function and the
-``tripartite_bernoulli_with_pool`` rule (see :ref:`tripartite_connectivity` for
-detailed descriptions). This rule creates a tripartite Bernoulli connectivity
-with the following principles:
-
-1. For each pair of neurons, a Bernoulli trial with a probability ``p_primary``
+Neurons are connected with each other and with astrocytes using the ``TripartiteConnect()``
+function. Neuron populations are connected using NEST's standard ``pairwise_bernoulli``
+connection and connections with astrocytes are added according to the
+``third_factor_bernoulli_with_pool`` rule (see :ref:`tripartite_connectivity` for detailed
+descriptions). This creates a tripartite Bernoulli connectivity with the following
+principles:
+
+1. For each pair of neurons, a Bernoulli trial with probability ``p_primary``
determines if a ``tsodyks_synapse`` will be created between them.
-2. For each neuron-neuron connection created, a Bernoulli trial with a
+2. For each neuron-neuron connection created, a Bernoulli trial with
probability ``p_third_if_primary`` determines if it will be paired with one astrocyte.
The selection of this particular astrocyte is confined by ``pool_size`` and
``pool_type`` (see below).
@@ -49,11 +51,13 @@
The available connectivity parameters are as follows:
-* ``conn_spec`` parameters
+* ``conn_spec``: any NEST one-directional connection rule
+
+* ``third_factor_conn_spec``
- * ``p_primary``: Connection probability between neurons.
+ * ``rule``: a third-factor connectivity rule
- * ``p_third_if_primary``: Probability of each created neuron-neuron connection to be
+ * ``p``: Probability of each created neuron-neuron connection to be
paired with one astrocyte.
* ``pool_size``: The size of astrocyte pool for each target neuron. The
@@ -77,17 +81,19 @@
* ``third_out``: ``syn_spec`` specifications for the connections from astrocytes to neurons.
-In this script, the network is created with the ``pool_type`` being ``"block"``.
-``p_primary`` and ``p_third_if_primary`` are both set to one to include as many
-connections as possible. One of the created figures shows the connections between
-neurons and astrocytes as a result (note that multiple connections may exist
-between a pair of nodes; this is not obvious in the figure since connections
-drawn later cover previous ones). It can be seen from the figure that ``"block"``
-results in astrocytes being connected to postsynaptic neurons in non-overlapping
-blocks. The ``pool_size`` should be compatible with this arrangement; in the case
-here, a ``pool_size`` of one is required. Users can try different parameters
-(e.g. ``p_primary`` = 0.5 and ``p_third_if_primary`` = 0.5) to see changes in
-connections.
+In this script, the network is created with the ``pool_type`` being
+``"block"``. Probabilities for the primary and the third-factor
+connections are both set to 1 to include as many connections as
+possible. One of the created figures shows the connections between
+neurons and astrocytes as a result (note that multiple connections may
+exist between a pair of nodes; this is not obvious in the figure since
+connections drawn later cover previous ones). It can be seen from the
+figure that ``"block"`` results in astrocytes being connected to
+postsynaptic neurons in non-overlapping blocks. The ``pool_size``
+should be compatible with this arrangement; in the case here, a
+``pool_size`` of 1 is required. Users can try different parameters
+(e.g. ``conn_spec["p"]`` = 0.5 and ``third_factor_conn_spec["p"]`` =
+0.5) to see changes in connections.
With the created network, neuron-astrocyte interactions can be observed. The
presynaptic spikes induce the generation of IP3, which then changes the calcium
@@ -101,7 +107,7 @@
total number of astrocytes.
See :ref:`tripartite_connectivity` for more details about the
-``TripartiteConnect()`` function and the ``tripartite_bernoulli_with_pool``
+``TripartiteConnect()`` function and the ``third_factor_bernoulli_with_pool``
rule.
References
@@ -132,6 +138,8 @@
###############################################################################
# Import all necessary modules.
+from collections.abc import Iterable
+
import matplotlib.pyplot as plt
import nest
import numpy as np
@@ -157,8 +165,7 @@
astrocyte_model = "astrocyte_lr_1994"
astrocyte_params = {
"IP3": 0.4, # IP3 initial value in µM
- "delta_IP3": 2.0, # parameter determining the increase in astrocytic IP3 concentration induced by synaptic input
- "tau_IP3": 10.0, # time constant of the exponential decay of astrocytic IP3
+ "delta_IP3": 0.2, # parameter determining the increase in astrocytic IP3 concentration induced by synaptic input
}
###############################################################################
@@ -195,10 +202,17 @@ def plot_connections(conn_n2n, conn_n2a, conn_a2n, pre_id_list, post_id_list, as
"""
print("Plotting connections ...")
+ # helper to ensure data can be converted to np.array
+ def _ensure_iterable(data):
+ if isinstance(data, Iterable):
+ return data
+ else:
+ return [data]
+
# helper function to create lists of connection positions
def get_conn_positions(dict_in, source_center, target_center):
- source_list = np.array(dict_in["source"]) - source_center
- target_list = np.array(dict_in["target"]) - target_center
+ source_list = np.array(_ensure_iterable(dict_in["source"])) - source_center
+ target_list = np.array(_ensure_iterable(dict_in["target"])) - target_center
return source_list.tolist(), target_list.tolist()
# prepare data (lists of node positions, list of connection positions)
@@ -399,9 +413,12 @@ def plot_dynamics(astro_data, neuron_data, start):
post_neurons,
astrocytes,
conn_spec={
- "rule": "tripartite_bernoulli_with_pool",
- "p_primary": p_primary,
- "p_third_if_primary": p_third_if_primary,
+ "rule": "pairwise_bernoulli",
+ "p": p_primary,
+ },
+ third_factor_conn_spec={
+ "rule": "third_factor_bernoulli_with_pool",
+ "p": p_third_if_primary,
"pool_size": pool_size,
"pool_type": pool_type,
},
diff --git a/pynest/nest/lib/hl_api_connections.py b/pynest/nest/lib/hl_api_connections.py
index d84441f2d1..2e0b81b59a 100644
--- a/pynest/nest/lib/hl_api_connections.py
+++ b/pynest/nest/lib/hl_api_connections.py
@@ -293,7 +293,7 @@ def Connect(pre, post, conn_spec=None, syn_spec=None, return_synapsecollection=F
@check_stack
-def TripartiteConnect(pre, post, third, conn_spec, syn_specs=None):
+def TripartiteConnect(pre, post, third, conn_spec, third_factor_conn_spec, syn_specs=None):
"""
Connect `pre` nodes to `post` nodes and a `third`-factor nodes.
@@ -314,7 +314,9 @@ def TripartiteConnect(pre, post, third, conn_spec, syn_specs=None):
third : NodeCollection
Third population to include in connection
conn_spec : dict
- Specifies connection rule, which must support tripartite connections, see below
+ Specifies connection rule for primary connection
+ third_factor_conn_spec: dict
+ Specifies third-factor connection rule
syn_spec : dict, optional
Specifies synapse models to be used, see below
@@ -406,8 +408,9 @@ def TripartiteConnect(pre, post, third, conn_spec, syn_specs=None):
sps(post)
sps(third)
sps(conn_spec)
+ sps(third_factor_conn_spec)
sps(syn_specs)
- sr("ConnectTripartite_g_g_g_D_D")
+ sr("ConnectTripartite_g_g_g_D_D_D")
@check_stack
diff --git a/testsuite/pytests/test_astrocyte.dat b/testsuite/pytests/test_astrocyte.dat
index 5646c90265..371917ac07 100644
--- a/testsuite/pytests/test_astrocyte.dat
+++ b/testsuite/pytests/test_astrocyte.dat
@@ -109,903 +109,903 @@
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
+1.000000000000000000e+01 9.990246818764599857e-01 1.018312644180662252e+00 9.979848153411911005e-01
+1.010000000000000142e+01 9.990129342034425042e-01 1.018491770775998173e+00 9.979645132537091623e-01
+1.020000000000000107e+01 9.990011866949118913e-01 1.018670818644186626e+00 9.979442082528212632e-01
+1.030000000000000071e+01 9.989894393508652604e-01 1.018849787810228502e+00 9.979239003403365116e-01
+1.040000000000000036e+01 9.989776921713007241e-01 1.019028678299129576e+00 9.979035895180630167e-01
+1.050000000000000000e+01 9.989659451562157289e-01 1.019207490135899175e+00 9.978832757878087767e-01
+1.060000000000000142e+01 9.989541983056080543e-01 1.019386223345552622e+00 9.978629591513812347e-01
+1.070000000000000107e+01 9.989424516194753689e-01 1.019564877953123005e+00 9.978426396105872787e-01
+1.080000000000000071e+01 9.989307050978152303e-01 1.019743453983624981e+00 9.978223171672321312e-01
+1.090000000000000036e+01 9.989189587406255288e-01 1.019921951462097187e+00 9.978019918231217922e-01
+1.100000000000000000e+01 9.989072125479041553e-01 1.020100370413577151e+00 9.977816635800610401e-01
+1.110000000000000142e+01 9.988954665196486671e-01 1.020278710863102622e+00 9.977613324398534322e-01
+1.120000000000000107e+01 9.988837206558566217e-01 1.020456972835728671e+00 9.977409984043029700e-01
+1.130000000000000071e+01 9.988719749565257988e-01 1.020635156356506146e+00 9.977206614752124336e-01
+1.140000000000000036e+01 9.988602294216540889e-01 1.020813261450496778e+00 9.977003216543841591e-01
+1.150000000000000000e+01 9.988484840512389384e-01 1.020991288142759412e+00 9.976799789436195942e-01
+1.160000000000000142e+01 9.988367388452780160e-01 1.021169236458364438e+00 9.976596333447198539e-01
+1.170000000000000107e+01 9.988249938037691011e-01 1.021347106422388906e+00 9.976392848594853868e-01
+1.180000000000000071e+01 9.988132489267098624e-01 1.021524898059908537e+00 9.976189334897156424e-01
+1.190000000000000036e+01 9.988015042140984123e-01 1.021702611396010374e+00 9.975985792372101812e-01
+1.200000000000000000e+01 9.987897596659319754e-01 1.021880246455777241e+00 9.975782221037670094e-01
+1.210000000000000142e+01 9.987780152822082202e-01 1.022057803264307063e+00 9.975578620911842442e-01
+1.220000000000000107e+01 9.987662710629249263e-01 1.022235281846701316e+00 9.975374992012593367e-01
+1.230000000000000071e+01 9.987545270080800952e-01 1.022412682228061254e+00 9.975171334357888497e-01
+1.240000000000000036e+01 9.987427831176710624e-01 1.022590004433496125e+00 9.974967647965685691e-01
+1.250000000000000000e+01 9.987310393916958295e-01 1.022767248488118286e+00 9.974763932853941695e-01
+1.260000000000000142e+01 9.987192958301518431e-01 1.022944414417046977e+00 9.974560189040603264e-01
+1.270000000000000107e+01 9.987075524330371046e-01 1.023121502245405878e+00 9.974356416543610493e-01
+1.280000000000000071e+01 9.986958092003491716e-01 1.023298511998321780e+00 9.974152615380900144e-01
+1.290000000000000036e+01 9.986840661320856016e-01 1.023475443700928134e+00 9.973948785570398989e-01
+1.300000000000000000e+01 9.986723232282440632e-01 1.023652297378363496e+00 9.973744927130032689e-01
+1.310000000000000142e+01 9.986605804888226690e-01 1.023829073055765537e+00 9.973541040077715802e-01
+1.320000000000000107e+01 9.986488379138187543e-01 1.024005770758284584e+00 9.973337124431358447e-01
+1.330000000000000071e+01 9.986370955032300989e-01 1.024182390511075624e+00 9.973133180208868520e-01
+1.340000000000000036e+01 9.986253532570543712e-01 1.024358932339290540e+00 9.972929207428138376e-01
+1.350000000000000000e+01 9.986136111752893507e-01 1.024535396268090981e+00 9.972725206107061480e-01
+1.360000000000000142e+01 9.986018692579328171e-01 1.024711782322639264e+00 9.972521176263521303e-01
+1.370000000000000107e+01 9.985901275049822168e-01 1.024888090528107476e+00 9.972317117915397988e-01
+1.380000000000000071e+01 9.985783859164353293e-01 1.025064320909667925e+00 9.972113031080562795e-01
+1.390000000000000036e+01 9.985666444922900453e-01 1.025240473492502913e+00 9.971908915776883653e-01
+1.400000000000000000e+01 9.985549032325439223e-01 1.025416548301794517e+00 9.971704772022220720e-01
+1.410000000000000142e+01 9.985431621371948507e-01 1.025592545362730812e+00 9.971500599834427492e-01
+1.420000000000000107e+01 9.985314212062403882e-01 1.025768464700501426e+00 9.971296399231350804e-01
+1.430000000000000071e+01 9.985196804396782033e-01 1.025944306340304424e+00 9.971092170230831941e-01
+1.440000000000000036e+01 9.985079398375059645e-01 1.026120070307340537e+00 9.970887912850708856e-01
+1.450000000000000000e+01 9.984961993997214513e-01 1.026295756626812716e+00 9.970683627108806180e-01
+1.460000000000000142e+01 9.984844591263223323e-01 1.026471365323932572e+00 9.970479313022948542e-01
+1.470000000000000107e+01 9.984727190173064981e-01 1.026646896423913935e+00 9.970274970610952803e-01
+1.480000000000000071e+01 9.984609790726712841e-01 1.026822349951973967e+00 9.970070599890628049e-01
+1.490000000000000036e+01 9.984492392924146920e-01 1.026997725933335159e+00 9.969866200879778928e-01
+1.500000000000000000e+01 9.984374996765342791e-01 1.027173024393220224e+00 9.969661773596198984e-01
+1.510000000000000142e+01 9.984257602250279362e-01 1.027348245356863199e+00 9.969457318057682871e-01
+1.520000000000000107e+01 9.984140209378933317e-01 1.027523388849497676e+00 9.969252834282014142e-01
+1.530000000000000071e+01 9.984022818151278011e-01 1.027698454896366131e+00 9.969048322286975239e-01
+1.540000000000000036e+01 9.983905428567294571e-01 1.027873443522706154e+00 9.968843782090333061e-01
+1.550000000000000000e+01 9.983788040626959681e-01 1.028048354753766880e+00 9.968639213709855618e-01
+1.560000000000000142e+01 9.983670654330246697e-01 1.028223188614799666e+00 9.968434617163303146e-01
+1.570000000000000107e+01 9.983553269677137854e-01 1.028397945131058977e+00 9.968229992468430334e-01
+1.580000000000000071e+01 9.983435886667607617e-01 1.028572624327803053e+00 9.968025339642982985e-01
+1.590000000000000036e+01 9.983318505301632673e-01 1.028747226230295464e+00 9.967820658704702463e-01
+1.600000000000000000e+01 9.983201125579191926e-01 1.028921750863801554e+00 9.967615949671323472e-01
+1.610000000000000142e+01 9.983083747500259841e-01 1.029096198253594663e+00 9.967411212560575162e-01
+1.619999999999999929e+01 9.982966371064815325e-01 1.029270568424946797e+00 9.967206447390175583e-01
+1.630000000000000071e+01 9.982848996272832842e-01 1.029444861403139511e+00 9.967001654177845005e-01
+1.640000000000000213e+01 9.982731623124290188e-01 1.029619077213452361e+00 9.966796832941293705e-01
+1.650000000000000000e+01 9.982614251619165158e-01 1.029793215881172008e+00 9.966591983698220858e-01
+1.660000000000000142e+01 9.982496881757436658e-01 1.029967277431588446e+00 9.966387106466326751e-01
+1.669999999999999929e+01 9.982379513539079152e-01 1.030141261889997439e+00 9.966182201263300566e-01
+1.680000000000000071e+01 9.982262146964071547e-01 1.030315169281692977e+00 9.965977268106825937e-01
+1.690000000000000213e+01 9.982144782032389418e-01 1.030488999631977487e+00 9.965772307014584275e-01
+1.700000000000000000e+01 9.982027418744009450e-01 1.030662752966158502e+00 9.965567318004245889e-01
+1.710000000000000142e+01 9.981910057098911659e-01 1.030836429309540225e+00 9.965362301093474429e-01
+1.719999999999999929e+01 9.981792697097068290e-01 1.031010028687437963e+00 9.965157256299932431e-01
+1.730000000000000071e+01 9.981675338738461578e-01 1.031183551125165465e+00 9.964952183641269112e-01
+1.740000000000000213e+01 9.981557982023064879e-01 1.031356996648043367e+00 9.964747083135135908e-01
+1.750000000000000000e+01 9.981440626950857098e-01 1.031530365281393413e+00 9.964541954799169821e-01
+1.760000000000000142e+01 9.981323273521813810e-01 1.031703657050543788e+00 9.964336798651005633e-01
+1.769999999999999929e+01 9.981205921735913922e-01 1.031876871980822230e+00 9.964131614708272577e-01
+1.780000000000000071e+01 9.981088571593134118e-01 1.032050010097564252e+00 9.963926402988591002e-01
+1.790000000000000213e+01 9.980971223093448863e-01 1.032223071426106698e+00 9.963721163509576817e-01
+1.800000000000000000e+01 9.980853876236837063e-01 1.032396055991787298e+00 9.963515896288839269e-01
+1.810000000000000142e+01 9.980736531023276514e-01 1.032568963819952002e+00 9.963310601343982054e-01
+1.819999999999999929e+01 9.980619187452742791e-01 1.032741794935947865e+00 9.963105278692598876e-01
+1.830000000000000071e+01 9.980501845525214799e-01 1.032914549365124834e+00 9.962899928352282330e-01
+1.840000000000000213e+01 9.980384505240667004e-01 1.033087227132837516e+00 9.962694550340615018e-01
+1.850000000000000000e+01 9.980267166599081641e-01 1.033259828264442515e+00 9.962489144675173991e-01
+1.860000000000000142e+01 9.980149829600430955e-01 1.033432352785300656e+00 9.962283711373531858e-01
+1.869999999999999929e+01 9.980032494244692742e-01 1.033604800720776984e+00 9.962078250453255679e-01
+1.880000000000000071e+01 9.979915160531841467e-01 1.033777172096236541e+00 9.961872761931899189e-01
+1.890000000000000213e+01 9.979797828461859366e-01 1.033949466937049255e+00 9.961667245827018347e-01
+1.900000000000000000e+01 9.979680498034720904e-01 1.034121685268589497e+00 9.961461702156158005e-01
+1.910000000000000142e+01 9.979563169250402765e-01 1.034293827116233855e+00 9.961256130936857467e-01
+1.920000000000000284e+01 9.979445842108884968e-01 1.034465892505362028e+00 9.961050532186653816e-01
+1.930000000000000071e+01 9.979328516610139754e-01 1.034637881461356823e+00 9.960844905923070813e-01
+1.940000000000000213e+01 9.979211192754148252e-01 1.034809794009605044e+00 9.960639252163633328e-01
+1.950000000000000000e+01 9.979093870540884925e-01 1.034981630175494161e+00 9.960433570925849578e-01
+1.960000000000000142e+01 9.978976549970329790e-01 1.035153389984418304e+00 9.960227862227233331e-01
+1.970000000000000284e+01 9.978859231042455091e-01 1.035325073461770939e+00 9.960022126085285032e-01
+1.980000000000000071e+01 9.978741913757241955e-01 1.035496680632949973e+00 9.959816362517497357e-01
+1.990000000000000213e+01 9.978624598114665956e-01 1.035668211523358195e+00 9.959610571541364088e-01
+2.000000000000000000e+01 9.978507284114704889e-01 1.035839666158399286e+00 9.959404753174367908e-01
+2.010000000000000142e+01 9.978389971757334331e-01 1.036011044563480032e+00 9.959198907433984838e-01
+2.020000000000000284e+01 9.978272661042532077e-01 1.036182346764009665e+00 9.958993034337687567e-01
+2.030000000000000071e+01 9.978155351970274811e-01 1.036353572785401411e+00 9.958787133902936572e-01
+2.040000000000000213e+01 9.978038044540540330e-01 1.036524722653072272e+00 9.958581206147192333e-01
+2.050000000000000000e+01 9.977920738753305319e-01 1.036695796392439473e+00 9.958375251087905333e-01
+2.060000000000000142e+01 9.977803434608546462e-01 1.036866794028924454e+00 9.958169268742522728e-01
+2.070000000000000284e+01 9.977686132106241557e-01 1.037037715587951103e+00 9.957963259128480571e-01
+2.080000000000000071e+01 9.977568831246368397e-01 1.037208561094948633e+00 9.957757222263214913e-01
+2.090000000000000213e+01 9.977451532028904779e-01 1.037379330575342928e+00 9.957551158164150706e-01
+2.100000000000000000e+01 9.977334234453824058e-01 1.037550024054568976e+00 9.957345066848706239e-01
+2.110000000000000142e+01 9.977216938521104028e-01 1.037720641558061985e+00 9.957138948334299799e-01
+2.120000000000000284e+01 9.977099644230723596e-01 1.037891183111260052e+00 9.956932802638336355e-01
+2.130000000000000071e+01 9.976982351582662778e-01 1.038061648739602605e+00 9.956726629778216431e-01
+2.140000000000000213e+01 9.976865060576892708e-01 1.038232038468533291e+00 9.956520429771337222e-01
+2.150000000000000000e+01 9.976747771213394511e-01 1.038402352323497757e+00 9.956314202635084820e-01
+2.160000000000000142e+01 9.976630483492141543e-01 1.038572590329944756e+00 9.956107948386843098e-01
+2.170000000000000284e+01 9.976513197413113820e-01 1.038742752513323042e+00 9.955901667043987047e-01
+2.180000000000000071e+01 9.976395912976285807e-01 1.038912838899087587e+00 9.955695358623888325e-01
+2.190000000000000213e+01 9.976278630181637519e-01 1.039082849512696027e+00 9.955489023143908600e-01
+2.200000000000000000e+01 9.976161349029143421e-01 1.039252784379604888e+00 9.955282660621406210e-01
+2.210000000000000142e+01 9.976044069518782420e-01 1.039422643525276024e+00 9.955076271073733940e-01
+2.220000000000000284e+01 9.975926791650533421e-01 1.039592426975171735e+00 9.954869854518232364e-01
+2.230000000000000071e+01 9.975809515424370888e-01 1.039762134754758760e+00 9.954663410972240944e-01
+2.240000000000000213e+01 9.975692240840269287e-01 1.039931766889505171e+00 9.954456940453092484e-01
+2.250000000000000000e+01 9.975574967898208634e-01 1.040101323404881484e+00 9.954250442978110902e-01
+2.260000000000000142e+01 9.975457696598165613e-01 1.040270804326359988e+00 9.954043918564616789e-01
+2.270000000000000284e+01 9.975340426940119132e-01 1.040440209679417638e+00 9.953837367229921851e-01
+2.280000000000000071e+01 9.975223158924043654e-01 1.040609539489530277e+00 9.953630788991334466e-01
+2.290000000000000213e+01 9.975105892549915865e-01 1.040778793782179079e+00 9.953424183866155239e-01
+2.300000000000000000e+01 9.974988627817715781e-01 1.040947972582845438e+00 9.953217551871675894e-01
+2.310000000000000142e+01 9.974871364727417866e-01 1.041117075917014745e+00 9.953010893025187045e-01
+2.320000000000000284e+01 9.974754103279002138e-01 1.041286103810172170e+00 9.952804207343968201e-01
+2.330000000000000071e+01 9.974636843472443060e-01 1.041455056287808212e+00 9.952597494845294435e-01
+2.340000000000000213e+01 9.974519585307716207e-01 1.041623933375413591e+00 9.952390755546438594e-01
+2.350000000000000000e+01 9.974402328784800487e-01 1.041792735098481693e+00 9.952183989464656877e-01
+2.360000000000000142e+01 9.974285073903674803e-01 1.041961461482506346e+00 9.951977196617211030e-01
+2.370000000000000284e+01 9.974167820664313622e-01 1.042130112552987153e+00 9.951770377021347258e-01
+2.380000000000000071e+01 9.974050569066695848e-01 1.042298688335422163e+00 9.951563530694309545e-01
+2.390000000000000213e+01 9.973933319110797058e-01 1.042467188855314086e+00 9.951356657653337434e-01
+2.400000000000000000e+01 9.973816070796596156e-01 1.042635614138165856e+00 9.951149757915659366e-01
+2.410000000000000142e+01 9.973698824124067608e-01 1.042803964209484180e+00 9.950942831498501562e-01
+2.420000000000000284e+01 9.973581579093189209e-01 1.042972239094775988e+00 9.950735878419080249e-01
+2.430000000000000071e+01 9.973464335703939865e-01 1.043140438819551985e+00 9.950528898694610547e-01
+2.440000000000000213e+01 9.973347093956295151e-01 1.043308563409323320e+00 9.950321892342295360e-01
+2.450000000000000000e+01 9.973229853850231752e-01 1.043476612889603583e+00 9.950114859379335375e-01
+2.460000000000000142e+01 9.973112615385727464e-01 1.043644587285908365e+00 9.949907799822923504e-01
+2.470000000000000284e+01 9.972995378562760083e-01 1.043812486623755476e+00 9.949700713690247111e-01
+2.480000000000000071e+01 9.972878143381302962e-01 1.043980310928664057e+00 9.949493600998486897e-01
+2.490000000000000213e+01 9.972760909841337229e-01 1.044148060226154806e+00 9.949286461764815792e-01
+2.500000000000000000e+01 9.972643677942839568e-01 1.044315734541751528e+00 9.949079296006402284e-01
+2.510000000000000142e+01 9.972526447685785556e-01 1.044483333900978694e+00 9.948872103740405981e-01
+2.520000000000000284e+01 9.972409219070152986e-01 1.044650858329363663e+00 9.948664884983985379e-01
+2.530000000000000071e+01 9.972291992095919655e-01 1.044818307852434014e+00 9.948457639754286763e-01
+2.540000000000000213e+01 9.972174766763063358e-01 1.044985682495720214e+00 9.948250368068455307e-01
+2.550000000000000000e+01 9.972057543071557451e-01 1.045152982284754506e+00 9.948043069943623973e-01
+2.560000000000000142e+01 9.971940321021380838e-01 1.045320207245070465e+00 9.947835745396924612e-01
+2.570000000000000284e+01 9.971823100612511315e-01 1.045487357402204109e+00 9.947628394445482414e-01
+2.580000000000000071e+01 9.971705881844926678e-01 1.045654432781691234e+00 9.947421017106411467e-01
+2.590000000000000213e+01 9.971588664718601391e-01 1.045821433409070966e+00 9.947213613396824750e-01
+2.600000000000000000e+01 9.971471449233513251e-01 1.045988359309883542e+00 9.947006183333827467e-01
+2.610000000000000142e+01 9.971354235389643383e-01 1.046155210509670974e+00 9.946798726934515944e-01
+2.620000000000000284e+01 9.971237023186962922e-01 1.046321987033976830e+00 9.946591244215983174e-01
+2.630000000000000071e+01 9.971119812625454104e-01 1.046488688908345122e+00 9.946383735195314379e-01
+2.640000000000000213e+01 9.971002603705090284e-01 1.046655316158322524e+00 9.946176199889588121e-01
+2.650000000000000000e+01 9.970885396425849256e-01 1.046821868809458822e+00 9.945968638315880739e-01
+2.660000000000000142e+01 9.970768190787708818e-01 1.046988346887302024e+00 9.945761050491257471e-01
+2.670000000000000284e+01 9.970650986790644543e-01 1.047154750417403912e+00 9.945553436432776895e-01
+2.680000000000000071e+01 9.970533784434636448e-01 1.047321079425316048e+00 9.945345796157495366e-01
+2.690000000000000213e+01 9.970416583719660109e-01 1.047487333936593767e+00 9.945138129682459249e-01
+2.700000000000000000e+01 9.970299384645693319e-01 1.047653513976791517e+00 9.944930437024711578e-01
+2.710000000000000142e+01 9.970182187212712766e-01 1.047819619571466632e+00 9.944722718201286504e-01
+2.720000000000000284e+01 9.970064991420694023e-01 1.047985650746176889e+00 9.944514973229214849e-01
+2.730000000000000071e+01 9.969947797269614886e-01 1.048151607526481177e+00 9.944307202125516332e-01
+2.740000000000000213e+01 9.969830604759453152e-01 1.048317489937941049e+00 9.944099404907209561e-01
+2.750000000000000000e+01 9.969713413890185505e-01 1.048483298006117836e+00 9.943891581591300932e-01
+2.760000000000000142e+01 9.969596224661787520e-01 1.048649031756575978e+00 9.943683732194796843e-01
+2.770000000000000284e+01 9.969479037074239214e-01 1.048814691214879913e+00 9.943475856734693696e-01
+2.780000000000000071e+01 9.969361851127515051e-01 1.048980276406594303e+00 9.943267955227984567e-01
+2.790000000000000213e+01 9.969244666821592826e-01 1.049145787357287585e+00 9.943060027691651426e-01
+2.800000000000000000e+01 9.969127484156451446e-01 1.049311224092528194e+00 9.942852074142675134e-01
+2.810000000000000142e+01 9.969010303132065376e-01 1.049476586637884568e+00 9.942644094598025450e-01
+2.820000000000000284e+01 9.968893123748411300e-01 1.049641875018929138e+00 9.942436089074667693e-01
+2.830000000000000071e+01 9.968775946005470345e-01 1.049807089261232340e+00 9.942228057589563850e-01
+2.840000000000000213e+01 9.968658769903215866e-01 1.049972229390367939e+00 9.942020000159665916e-01
+2.850000000000000000e+01 9.968541595441625658e-01 1.050137295431909035e+00 9.941811916801918114e-01
+2.860000000000000142e+01 9.968424422620677516e-01 1.050302287411432500e+00 9.941603807533263559e-01
+2.870000000000000284e+01 9.968307251440349237e-01 1.050467205354513878e+00 9.941395672370635372e-01
+2.880000000000000071e+01 9.968190081900614175e-01 1.050632049286729597e+00 9.941187511330962234e-01
+2.890000000000000213e+01 9.968072914001455676e-01 1.050796819233658752e+00 9.940979324431165054e-01
+2.900000000000000000e+01 9.967955747742847095e-01 1.050961515220880216e+00 9.940771111688159190e-01
+2.910000000000000142e+01 9.967838583124765117e-01 1.051126137273975081e+00 9.940562873118853338e-01
+2.920000000000000284e+01 9.967721420147186429e-01 1.051290685418523774e+00 9.940354608740150644e-01
+2.930000000000000071e+01 9.967604258810088824e-01 1.051455159680109608e+00 9.940146318568945372e-01
+2.940000000000000213e+01 9.967487099113451210e-01 1.051619560084315008e+00 9.939938002622128455e-01
+2.950000000000000000e+01 9.967369941057248051e-01 1.051783886656723954e+00 9.939729660916581944e-01
+2.960000000000000142e+01 9.967252784641458252e-01 1.051948139422922202e+00 9.939521293469186780e-01
+2.970000000000000284e+01 9.967135629866059610e-01 1.052112318408494840e+00 9.939312900296810582e-01
+2.980000000000000071e+01 9.967018476731026588e-01 1.052276423639028735e+00 9.939104481416319858e-01
+2.990000000000000213e+01 9.966901325236334763e-01 1.052440455140111863e+00 9.938896036844573345e-01
+3.000000000000000000e+01 9.966784175381965261e-01 1.052604412937332867e+00 9.938687566598422007e-01
+3.010000000000000142e+01 9.966667027167892545e-01 1.052768297056280167e+00 9.938479070694710149e-01
+3.020000000000000284e+01 9.966549880594096633e-01 1.052932107522543959e+00 9.938270549150278743e-01
+3.030000000000000071e+01 9.966432735660551989e-01 1.053095844361714217e+00 9.938062001981958771e-01
+3.040000000000000213e+01 9.966315592367236409e-01 1.053259507599382694e+00 9.937853429206578992e-01
+3.050000000000000000e+01 9.966198450714128798e-01 1.053423097261141361e+00 9.937644830840959287e-01
+3.060000000000000142e+01 9.966081310701203622e-01 1.053586613372583747e+00 9.937436206901913982e-01
+3.070000000000000284e+01 9.965964172328439785e-01 1.053750055959303156e+00 9.937227557406250744e-01
+3.080000000000000071e+01 9.965847035595813974e-01 1.053913425046893781e+00 9.937018882370770578e-01
+3.090000000000000213e+01 9.965729900503302874e-01 1.054076720660950262e+00 9.936810181812268938e-01
+3.100000000000000000e+01 9.965612767050882059e-01 1.054239942827067900e+00 9.936601455747533507e-01
+3.110000000000000142e+01 9.965495635238531547e-01 1.054403091570842443e+00 9.936392704193349745e-01
+3.120000000000000284e+01 9.965378505066223580e-01 1.054566166917870751e+00 9.936183927166490903e-01
+3.130000000000000071e+01 9.965261376533940396e-01 1.054729168893749680e+00 9.935975124683725790e-01
+3.140000000000000213e+01 9.965144249641657570e-01 1.054892097524077421e+00 9.935766296761819882e-01
+3.150000000000000000e+01 9.965027124389352897e-01 1.055054952834451720e+00 9.935557443417531998e-01
+3.160000000000000142e+01 9.964910000777004173e-01 1.055217734850471434e+00 9.935348564667612070e-01
+3.170000000000000284e+01 9.964792878804584753e-01 1.055380443597735196e+00 9.935139660528804484e-01
+3.180000000000000071e+01 9.964675758472072431e-01 1.055543079101842752e+00 9.934930731017844741e-01
+3.190000000000000213e+01 9.964558639779446114e-01 1.055705641388395177e+00 9.934721776151467232e-01
+3.200000000000000000e+01 9.964441522726682487e-01 1.055868130482992884e+00 9.934512795946397468e-01
+3.210000000000000142e+01 9.964324407313758236e-01 1.056030546411236060e+00 9.934303790419354296e-01
+3.220000000000000284e+01 9.964207293540652266e-01 1.056192889198725782e+00 9.934094759587051016e-01
+3.230000000000000426e+01 9.964090181407340152e-01 1.056355158871064237e+00 9.933885703466195372e-01
+3.239999999999999858e+01 9.963973070913798580e-01 1.056517355453853169e+00 9.933676622073485118e-01
+3.250000000000000000e+01 9.963855962060004234e-01 1.056679478972695430e+00 9.933467515425615790e-01
+3.260000000000000142e+01 9.963738854845933801e-01 1.056841529453193651e+00 9.933258383539274039e-01
+3.270000000000000284e+01 9.963621749271567296e-01 1.057003506920950686e+00 9.933049226431142076e-01
+3.280000000000000426e+01 9.963504645336880294e-01 1.057165411401569610e+00 9.932840044117894340e-01
+3.289999999999999858e+01 9.963387543041848371e-01 1.057327242920653276e+00 9.932630836616200831e-01
+3.300000000000000000e+01 9.963270442386450432e-01 1.057489001503806758e+00 9.932421603942723776e-01
+3.310000000000000142e+01 9.963153343370663162e-01 1.057650687176633797e+00 9.932212346114120960e-01
+3.320000000000000284e+01 9.963036245994463247e-01 1.057812299964737912e+00 9.932003063147040178e-01
+3.330000000000000426e+01 9.962919150257829592e-01 1.057973839893724177e+00 9.931793755058122564e-01
+3.339999999999999858e+01 9.962802056160736663e-01 1.058135306989196556e+00 9.931584421864008139e-01
+3.350000000000000000e+01 9.962684963703163366e-01 1.058296701276760121e+00 9.931375063581328044e-01
+3.360000000000000142e+01 9.962567872885087494e-01 1.058458022782019947e+00 9.931165680226706760e-01
+3.370000000000000284e+01 9.962450783706481294e-01 1.058619271530579997e+00 9.930956271816760994e-01
+3.380000000000000426e+01 9.962333696167328112e-01 1.058780447548046011e+00 9.930746838368103013e-01
+3.389999999999999858e+01 9.962216610267602412e-01 1.058941550860022840e+00 9.930537379897339534e-01
+3.400000000000000000e+01 9.962099526007279771e-01 1.059102581492115558e+00 9.930327896421068390e-01
+3.410000000000000142e+01 9.961982443386339092e-01 1.059263539469929682e+00 9.930118387955884085e-01
+3.420000000000000284e+01 9.961865362404757063e-01 1.059424424819069843e+00 9.929908854518373351e-01
+3.430000000000000426e+01 9.961748283062511478e-01 1.059585237565142002e+00 9.929699296125115149e-01
+3.439999999999999858e+01 9.961631205359577912e-01 1.059745977733751010e+00 9.929489712792686218e-01
+3.450000000000000000e+01 9.961514129295935271e-01 1.059906645350501719e+00 9.929280104537651086e-01
+3.460000000000000142e+01 9.961397054871559131e-01 1.060067240440999647e+00 9.929070471376573170e-01
+3.470000000000000284e+01 9.961279982086426177e-01 1.060227763030849646e+00 9.928860813326007007e-01
+3.480000000000000426e+01 9.961162910940513093e-01 1.060388213145657232e+00 9.928651130402500469e-01
+3.489999999999999858e+01 9.961045841433801007e-01 1.060548590811026370e+00 9.928441422622598100e-01
+3.500000000000000000e+01 9.960928773566263272e-01 1.060708896052561911e+00 9.928231690002834453e-01
+3.510000000000000142e+01 9.960811707337876575e-01 1.060869128895868929e+00 9.928021932559739637e-01
+3.520000000000000284e+01 9.960694642748620931e-01 1.061029289366551831e+00 9.927812150309837103e-01
+3.530000000000000426e+01 9.960577579798471914e-01 1.061189377490214802e+00 9.927602343269643637e-01
+3.539999999999999858e+01 9.960460518487407322e-01 1.061349393292462029e+00 9.927392511455670476e-01
+3.550000000000000000e+01 9.960343458815402728e-01 1.061509336798897030e+00 9.927182654884423307e-01
+3.560000000000000142e+01 9.960226400782435929e-01 1.061669208035123768e+00 9.926972773572398934e-01
+3.570000000000000284e+01 9.960109344388484720e-01 1.061829007026745542e+00 9.926762867536089718e-01
+3.580000000000000426e+01 9.959992289633524676e-01 1.061988733799365647e+00 9.926552936791981363e-01
+3.589999999999999858e+01 9.959875236517533592e-01 1.062148388378586272e+00 9.926342981356554018e-01
+3.600000000000000000e+01 9.959758185040490375e-01 1.062307970790010492e+00 9.926133001246280063e-01
+3.610000000000000142e+01 9.959641135202368378e-01 1.062467481059240493e+00 9.925922996477626326e-01
+3.620000000000000284e+01 9.959524087003147619e-01 1.062626919211878018e+00 9.925712967067054082e-01
+3.630000000000000426e+01 9.959407040442805892e-01 1.062786285273525033e+00 9.925502913031017949e-01
+3.639999999999999858e+01 9.959289995521318772e-01 1.062945579269782392e+00 9.925292834385964769e-01
+3.650000000000000000e+01 9.959172952238661836e-01 1.063104801226250729e+00 9.925082731148333615e-01
+3.660000000000000142e+01 9.959055910594816208e-01 1.063263951168530896e+00 9.924872603334563559e-01
+3.670000000000000284e+01 9.958938870589756354e-01 1.063423029122222419e+00 9.924662450961081461e-01
+3.680000000000000426e+01 9.958821832223457848e-01 1.063582035112924373e+00 9.924452274044309741e-01
+3.689999999999999858e+01 9.958704795495900708e-01 1.063740969166236727e+00 9.924242072600667486e-01
+3.700000000000000000e+01 9.958587760407061618e-01 1.063899831307758337e+00 9.924031846646560462e-01
+3.710000000000000142e+01 9.958470726956917263e-01 1.064058621563086726e+00 9.923821596198396655e-01
+3.720000000000000284e+01 9.958353695145443218e-01 1.064217339957819197e+00 9.923611321272569619e-01
+3.730000000000000426e+01 9.958236664972617280e-01 1.064375986517553274e+00 9.923401021885472906e-01
+3.739999999999999858e+01 9.958119636438418354e-01 1.064534561267885371e+00 9.923190698053491188e-01
+3.750000000000000000e+01 9.958002609542822015e-01 1.064693064234411457e+00 9.922980349793001364e-01
+3.760000000000000142e+01 9.957885584285806058e-01 1.064851495442727503e+00 9.922769977120375895e-01
+3.770000000000000284e+01 9.957768560667347169e-01 1.065009854918427701e+00 9.922559580051982797e-01
+3.780000000000000426e+01 9.957651538687423143e-01 1.065168142687106689e+00 9.922349158604180097e-01
+3.789999999999999858e+01 9.957534518346009556e-01 1.065326358774357773e+00 9.922138712793321380e-01
+3.800000000000000000e+01 9.957417499643085312e-01 1.065484503205774480e+00 9.921928242635751349e-01
+3.810000000000000142e+01 9.957300482578625989e-01 1.065642576006948339e+00 9.921717748147813598e-01
+3.820000000000000284e+01 9.957183467152608269e-01 1.065800577203471100e+00 9.921507229345842838e-01
+3.830000000000000426e+01 9.957066453365008840e-01 1.065958506820934071e+00 9.921296686246164898e-01
+3.840000000000000568e+01 9.956949441215808827e-01 1.066116364884927448e+00 9.921086118865101167e-01
+3.850000000000000000e+01 9.956832430704982695e-01 1.066274151421040317e+00 9.920875527218968593e-01
+3.860000000000000142e+01 9.956715421832506019e-01 1.066431866454861987e+00 9.920664911324076352e-01
+3.870000000000000284e+01 9.956598414598357705e-01 1.066589510011980879e+00 9.920454271196728069e-01
+3.880000000000000426e+01 9.956481409002515548e-01 1.066747082117983192e+00 9.920243606853217377e-01
+3.890000000000000568e+01 9.956364405044955124e-01 1.066904582798455570e+00 9.920032918309837910e-01
+3.900000000000000000e+01 9.956247402725654227e-01 1.067062012078983990e+00 9.919822205582868868e-01
+3.910000000000000142e+01 9.956130402044591765e-01 1.067219369985153099e+00 9.919611468688591671e-01
+3.920000000000000284e+01 9.956013403001742201e-01 1.067376656542547320e+00 9.919400707643279969e-01
+3.930000000000000426e+01 9.955896405597083332e-01 1.067533871776749521e+00 9.919189922463194087e-01
+3.940000000000000568e+01 9.955779409830591842e-01 1.067691015713341240e+00 9.918979113164595462e-01
+3.950000000000000000e+01 9.955662415702245527e-01 1.067848088377905347e+00 9.918768279763735540e-01
+3.960000000000000142e+01 9.955545423212022182e-01 1.068005089796021156e+00 9.918557422276860214e-01
+3.970000000000000284e+01 9.955428432359897384e-01 1.068162019993268208e+00 9.918346540720209825e-01
+3.980000000000000426e+01 9.955311443145848926e-01 1.068318878995225374e+00 9.918135635110019166e-01
+3.990000000000000568e+01 9.955194455569854606e-01 1.068475666827470638e+00 9.917924705462514146e-01
+4.000000000000000000e+01 9.955077469631888887e-01 1.068632383515579987e+00 9.917713751793914012e-01
+4.010000000000000142e+01 9.954960485331932896e-01 1.068789029085129627e+00 9.917502774120434683e-01
+4.020000000000000284e+01 9.954843502669959987e-01 1.068945603561693991e+00 9.917291772458286525e-01
+4.030000000000000426e+01 9.954726521645950177e-01 1.069102106970847066e+00 9.917080746823671022e-01
+4.040000000000000568e+01 9.954609542259879040e-01 1.069258539338161063e+00 9.916869697232781888e-01
+4.050000000000000000e+01 9.954492564511724373e-01 1.069414900689208414e+00 9.916658623701809505e-01
+4.060000000000000142e+01 9.954375588401462860e-01 1.069571191049558445e+00 9.916447526246937594e-01
+4.070000000000000284e+01 9.954258613929071187e-01 1.069727410444781590e+00 9.916236404884343214e-01
+4.080000000000000426e+01 9.954141641094529369e-01 1.069883558900445619e+00 9.916025259630197874e-01
+4.090000000000000568e+01 9.954024669897811872e-01 1.070039636442118081e+00 9.915814090500664202e-01
+4.100000000000000000e+01 9.953907700338895381e-01 1.070195643095365190e+00 9.915602897511899272e-01
+4.110000000000000142e+01 9.953790732417757692e-01 1.070351578885751165e+00 9.915391680680057940e-01
+4.120000000000000284e+01 9.953673766134375489e-01 1.070507443838840222e+00 9.915180440021283959e-01
+4.130000000000000426e+01 9.953556801488727679e-01 1.070663237980195470e+00 9.914969175551716640e-01
+4.140000000000000568e+01 9.953439838480788726e-01 1.070818961335377573e+00 9.914757887287489746e-01
+4.150000000000000000e+01 9.953322877110538647e-01 1.070974613929947417e+00 9.914546575244728155e-01
+4.160000000000000142e+01 9.953205917377953016e-01 1.071130195789463668e+00 9.914335239439553416e-01
+4.170000000000000284e+01 9.953088959283007409e-01 1.071285706939483662e+00 9.914123879888079305e-01
+4.180000000000000426e+01 9.952972002825681841e-01 1.071441147405564953e+00 9.913912496606414049e-01
+4.190000000000000568e+01 9.952855048005951888e-01 1.071596517213261768e+00 9.913701089610659212e-01
+4.200000000000000000e+01 9.952738094823794235e-01 1.071751816388128553e+00 9.913489658916909697e-01
+4.210000000000000142e+01 9.952621143279185567e-01 1.071907044955717980e+00 9.913278204541252636e-01
+4.220000000000000284e+01 9.952504193372105901e-01 1.072062202941581166e+00 9.913066726499772940e-01
+4.230000000000000426e+01 9.952387245102531921e-01 1.072217290371268339e+00 9.912855224808544419e-01
+4.240000000000000568e+01 9.952270298470436982e-01 1.072372307270327507e+00 9.912643699483639770e-01
+4.250000000000000000e+01 9.952153353475802211e-01 1.072527253664306901e+00 9.912432150541121700e-01
+4.260000000000000142e+01 9.952036410118599852e-01 1.072682129578751642e+00 9.912220577997047366e-01
+4.270000000000000284e+01 9.951919468398812141e-01 1.072836935039206407e+00 9.912008981867467261e-01
+4.280000000000000426e+01 9.951802528316414653e-01 1.072991670071214765e+00 9.911797362168428549e-01
+4.290000000000000568e+01 9.951685589871382964e-01 1.073146334700318061e+00 9.911585718915969512e-01
+4.300000000000000000e+01 9.951568653063695979e-01 1.073300928952056532e+00 9.911374052126121770e-01
+4.310000000000000142e+01 9.951451717893331494e-01 1.073455452851968861e+00 9.911162361814911392e-01
+4.320000000000000284e+01 9.951334784360263974e-01 1.073609906425592841e+00 9.910950647998357788e-01
+4.330000000000000426e+01 9.951217852464473435e-01 1.073764289698463603e+00 9.910738910692474812e-01
+4.340000000000000568e+01 9.951100922205935451e-01 1.073918602696115832e+00 9.910527149913268552e-01
+4.350000000000000000e+01 9.950983993584626708e-01 1.074072845444081992e+00 9.910315365676742871e-01
+4.360000000000000142e+01 9.950867066600525002e-01 1.074227017967894104e+00 9.910103557998889423e-01
+4.370000000000000284e+01 9.950750141253607017e-01 1.074381120293081082e+00 9.909891726895696529e-01
+4.380000000000000426e+01 9.950633217543850551e-01 1.074535152445171393e+00 9.909679872383149180e-01
+4.390000000000000568e+01 9.950516295471231176e-01 1.074689114449692173e+00 9.909467994477220154e-01
+4.400000000000000000e+01 9.950399375035726690e-01 1.074843006332167672e+00 9.909256093193881121e-01
+4.410000000000000142e+01 9.950282456237315998e-01 1.074996828118121694e+00 9.909044168549093756e-01
+4.420000000000000284e+01 9.950165539075974674e-01 1.075150579833075826e+00 9.908832220558817516e-01
+4.430000000000000426e+01 9.950048623551679405e-01 1.075304261502550762e+00 9.908620249239001865e-01
+4.440000000000000568e+01 9.949931709664409096e-01 1.075457873152064092e+00 9.908408254605591825e-01
+4.450000000000000000e+01 9.949814797414138212e-01 1.075611414807133404e+00 9.908196236674523538e-01
+4.460000000000000142e+01 9.949697886800846769e-01 1.075764886493273398e+00 9.907984195461730925e-01
+4.470000000000000284e+01 9.949580977824509231e-01 1.075918288235997666e+00 9.907772130983137915e-01
+4.480000000000000426e+01 9.949464070485106726e-01 1.076071620060818246e+00 9.907560043254666216e-01
+4.490000000000000568e+01 9.949347164782611497e-01 1.076224881993244953e+00 9.907347932292227544e-01
+4.500000000000000000e+01 9.949230260717003560e-01 1.076378074058785828e+00 9.907135798111729175e-01
+4.510000000000000142e+01 9.949113358288260711e-01 1.076531196282947800e+00 9.906923640729071723e-01
+4.520000000000000284e+01 9.948996457496356305e-01 1.076684248691235357e+00 9.906711460160150251e-01
+4.530000000000000426e+01 9.948879558341270357e-01 1.076837231309151210e+00 9.906499256420852051e-01
+4.540000000000000568e+01 9.948762660822980664e-01 1.076990144162197627e+00 9.906287029527056642e-01
+4.550000000000000000e+01 9.948645764941462799e-01 1.077142987275872876e+00 9.906074779494641325e-01
+4.560000000000000142e+01 9.948528870696694559e-01 1.077295760675675229e+00 9.905862506339475626e-01
+4.570000000000000284e+01 9.948411978088653740e-01 1.077448464387099625e+00 9.905650210077423523e-01
+4.580000000000000426e+01 9.948295087117315916e-01 1.077601098435640337e+00 9.905437890724341221e-01
+4.590000000000000568e+01 9.948178197782658883e-01 1.077753662846789640e+00 9.905225548296078264e-01
+4.600000000000000000e+01 9.948061310084660436e-01 1.077906157646038032e+00 9.905013182808481975e-01
+4.610000000000000142e+01 9.947944424023297261e-01 1.078058582858872905e+00 9.904800794277385245e-01
+4.620000000000000284e+01 9.947827539598544933e-01 1.078210938510780537e+00 9.904588382718623185e-01
+4.630000000000000426e+01 9.947710656810380137e-01 1.078363224627245653e+00 9.904375948148018693e-01
+4.640000000000000568e+01 9.947593775658786219e-01 1.078515441233750538e+00 9.904163490581393559e-01
+4.650000000000000000e+01 9.947476896143735425e-01 1.078667588355775919e+00 9.903951010034560687e-01
+4.660000000000000142e+01 9.947360018265203330e-01 1.078819666018799861e+00 9.903738506523324103e-01
+4.670000000000000284e+01 9.947243142023169948e-01 1.078971674248298651e+00 9.903525980063485612e-01
+4.680000000000000426e+01 9.947126267417610856e-01 1.079123613069747911e+00 9.903313430670840356e-01
+4.690000000000000568e+01 9.947009394448504960e-01 1.079275482508619488e+00 9.903100858361173486e-01
+4.700000000000000000e+01 9.946892523115828944e-01 1.079427282590384118e+00 9.902888263150270154e-01
+4.710000000000000142e+01 9.946775653419559493e-01 1.079579013340510540e+00 9.902675645053903297e-01
+4.720000000000000284e+01 9.946658785359673294e-01 1.079730674784464606e+00 9.902463004087842524e-01
+4.730000000000000426e+01 9.946541918936147031e-01 1.079882266947710612e+00 9.902250340267851891e-01
+4.740000000000000568e+01 9.946425054148960720e-01 1.080033789855711301e+00 9.902037653609685464e-01
+4.750000000000000000e+01 9.946308190998086607e-01 1.080185243533926309e+00 9.901824944129093975e-01
+4.760000000000000142e+01 9.946191329483505816e-01 1.080336628007813937e+00 9.901612211841823719e-01
+4.770000000000000284e+01 9.946074469605193924e-01 1.080487943302830267e+00 9.901399456763610996e-01
+4.780000000000000426e+01 9.945957611363127615e-01 1.080639189444428494e+00 9.901186678910188776e-01
+4.790000000000000568e+01 9.945840754757285795e-01 1.080790366458060925e+00 9.900973878297278929e-01
+4.800000000000000000e+01 9.945723899787645150e-01 1.080941474369176536e+00 9.900761054940605543e-01
+4.810000000000000142e+01 9.945607046454182365e-01 1.081092513203223193e+00 9.900548208855878274e-01
+4.820000000000000284e+01 9.945490194756874125e-01 1.081243482985645876e+00 9.900335340058804556e-01
+4.830000000000000426e+01 9.945373344695698226e-01 1.081394383741887344e+00 9.900122448565084055e-01
+4.840000000000000568e+01 9.945256496270630242e-01 1.081545215497388579e+00 9.899909534390410881e-01
+4.850000000000000000e+01 9.945139649481650190e-01 1.081695978277587677e+00 9.899696597550472488e-01
+4.860000000000000142e+01 9.945022804328732535e-01 1.081846672107920959e+00 9.899483638060950774e-01
+4.870000000000000284e+01 9.944905960811855072e-01 1.081997297013822523e+00 9.899270655937523200e-01
+4.880000000000000426e+01 9.944789118930996707e-01 1.082147853020723804e+00 9.899057651195859453e-01
+4.890000000000000568e+01 9.944672278686134126e-01 1.082298340154054239e+00 9.898844623851619229e-01
+4.900000000000000000e+01 9.944555440077240682e-01 1.082448758439241043e+00 9.898631573920460003e-01
+4.910000000000000142e+01 9.944438603104297503e-01 1.082599107901708990e+00 9.898418501418032589e-01
+4.920000000000000284e+01 9.944321767767279052e-01 1.082749388566880633e+00 9.898205406359978920e-01
+4.930000000000000426e+01 9.944204934066166457e-01 1.082899600460176082e+00 9.897992288761939816e-01
+4.940000000000000568e+01 9.944088102000933072e-01 1.083049743607013227e+00 9.897779148639544999e-01
+4.950000000000000000e+01 9.943971271571558912e-01 1.083199818032807071e+00 9.897565986008421968e-01
+4.960000000000000142e+01 9.943854442778020664e-01 1.083349823762970843e+00 9.897352800884188229e-01
+4.970000000000000284e+01 9.943737615620291681e-01 1.083499760822914881e+00 9.897139593282457959e-01
+4.980000000000000426e+01 9.943620790098354201e-01 1.083649629238047751e+00 9.896926363218836453e-01
+4.990000000000000568e+01 9.943503966212182688e-01 1.083799429033775574e+00 9.896713110708924566e-01
+5.000000000000000000e+01 9.943387143961752717e-01 1.083949160235500919e+00 9.896499835768316489e-01
+5.010000000000000142e+01 9.943270323347043194e-01 1.084098822868625467e+00 9.896286538412600864e-01
+5.020000000000000284e+01 9.943153504368031914e-01 1.084248416958547123e+00 9.896073218657359671e-01
+5.030000000000000426e+01 9.943036687024695564e-01 1.084397942530662018e+00 9.895859876518169340e-01
+5.040000000000000568e+01 9.942919871317010827e-01 1.084547399610363838e+00 9.895646512010597418e-01
+5.050000000000000000e+01 9.942803057244956610e-01 1.084696788223043384e+00 9.895433125150205900e-01
+5.060000000000000142e+01 9.942686244808508489e-01 1.084846108394089459e+00 9.895219715952554562e-01
+5.070000000000000284e+01 9.942569434007643148e-01 1.084995360148887089e+00 9.895006284433192079e-01
+5.080000000000000426e+01 9.942452624842337272e-01 1.085144543512820636e+00 9.894792830607664902e-01
+5.090000000000000568e+01 9.942335817312571988e-01 1.085293658511270909e+00 9.894579354491508383e-01
+5.100000000000000000e+01 9.942219011418321761e-01 1.085442705169615829e+00 9.894365856100254542e-01
+5.110000000000000142e+01 9.942102207159562166e-01 1.085591683513231320e+00 9.894152335449430957e-01
+5.120000000000000284e+01 9.941985404536274329e-01 1.085740593567490642e+00 9.893938792554556327e-01
+5.130000000000000426e+01 9.941868603548430494e-01 1.085889435357764610e+00 9.893725227431143798e-01
+5.140000000000000568e+01 9.941751804196010678e-01 1.086038208909420488e+00 9.893511640094699855e-01
+5.150000000000000000e+01 9.941635006478990455e-01 1.086186914247823987e+00 9.893298030560727652e-01
+5.160000000000000142e+01 9.941518210397348732e-01 1.086335551398337484e+00 9.893084398844719241e-01
+5.170000000000000284e+01 9.941401415951062193e-01 1.086484120386321139e+00 9.892870744962164453e-01
+5.180000000000000426e+01 9.941284623140107524e-01 1.086632621237132224e+00 9.892657068928545350e-01
+5.190000000000000568e+01 9.941167831964463630e-01 1.086781053976125566e+00 9.892443370759336219e-01
+5.200000000000000000e+01 9.941051042424106088e-01 1.086929418628652666e+00 9.892229650470008018e-01
+5.210000000000000142e+01 9.940934254519010471e-01 1.087077715220063467e+00 9.892015908076025044e-01
+5.220000000000000284e+01 9.940817468249156796e-01 1.087225943775704140e+00 9.891802143592843821e-01
+5.230000000000000426e+01 9.940700683614520639e-01 1.087374104320917967e+00 9.891588357035914214e-01
+5.240000000000000568e+01 9.940583900615079793e-01 1.087522196881046677e+00 9.891374548420683865e-01
+5.250000000000000000e+01 9.940467119250812056e-01 1.087670221481428223e+00 9.891160717762587096e-01
+5.260000000000000142e+01 9.940350339521695222e-01 1.087818178147398784e+00 9.890946865077059336e-01
+5.270000000000000284e+01 9.940233561427703757e-01 1.087966066904290319e+00 9.890732990379526024e-01
+5.280000000000000426e+01 9.940116784968815455e-01 1.088113887777433675e+00 9.890519093685407048e-01
+5.290000000000000568e+01 9.940000010145007003e-01 1.088261640792155482e+00 9.890305175010117855e-01
+5.300000000000000000e+01 9.939883236956258417e-01 1.088409325973779929e+00 9.890091234369063899e-01
+5.310000000000000142e+01 9.939766465402543050e-01 1.088556943347628758e+00 9.889877271777647305e-01
+5.320000000000000284e+01 9.939649695483838698e-01 1.088704492939020385e+00 9.889663287251264645e-01
+5.330000000000000426e+01 9.939532927200125378e-01 1.088851974773271225e+00 9.889449280805303610e-01
+5.340000000000000568e+01 9.939416160551379775e-01 1.088999388875694141e+00 9.889235252455145231e-01
+5.350000000000000000e+01 9.939299395537577464e-01 1.089146735271598887e+00 9.889021202216168316e-01
+5.360000000000000142e+01 9.939182632158694020e-01 1.089294013986292553e+00 9.888807130103741683e-01
+5.370000000000000284e+01 9.939065870414710568e-01 1.089441225045079786e+00 9.888593036133230818e-01
+5.380000000000000426e+01 9.938949110305601575e-01 1.089588368473261681e+00 9.888378920319992327e-01
+5.390000000000000568e+01 9.938832351831345946e-01 1.089735444296136668e+00 9.888164782679378373e-01
+5.400000000000000000e+01 9.938715594991919255e-01 1.089882452538999846e+00 9.887950623226734459e-01
+5.410000000000000142e+01 9.938598839787299299e-01 1.090029393227144316e+00 9.887736441977402757e-01
+5.420000000000000284e+01 9.938482086217461653e-01 1.090176266385859405e+00 9.887522238946709896e-01
+5.430000000000000426e+01 9.938365334282385222e-01 1.090323072040431995e+00 9.887308014149986946e-01
+5.440000000000000568e+01 9.938248583982047801e-01 1.090469810216145419e+00 9.887093767602554983e-01
+5.450000000000000000e+01 9.938131835316423857e-01 1.090616480938280342e+00 9.886879499319728426e-01
+5.460000000000000142e+01 9.938015088285494514e-01 1.090763084232114544e+00 9.886665209316815028e-01
+5.470000000000000284e+01 9.937898342889235348e-01 1.090909620122922474e+00 9.886450897609113664e-01
+5.480000000000000426e+01 9.937781599127623045e-01 1.091056088635975918e+00 9.886236564211924316e-01
+5.490000000000000568e+01 9.937664857000634289e-01 1.091202489796543107e+00 9.886022209140535866e-01
+5.500000000000000000e+01 9.937548116508247986e-01 1.091348823629888720e+00 9.885807832410231644e-01
+5.510000000000000142e+01 9.937431377650439712e-01 1.091495090161276105e+00 9.885593434036289429e-01
+5.520000000000000284e+01 9.937314640427185042e-01 1.091641289415964389e+00 9.885379014033979228e-01
+5.530000000000000426e+01 9.937197904838462881e-01 1.091787421419209814e+00 9.885164572418565498e-01
+5.540000000000000568e+01 9.937081170884249914e-01 1.091933486196265068e+00 9.884950109205309365e-01
+5.550000000000000000e+01 9.936964438564522828e-01 1.092079483772380399e+00 9.884735624409460852e-01
+5.560000000000000142e+01 9.936847707879260527e-01 1.092225414172802278e+00 9.884521118046269983e-01
+5.570000000000000284e+01 9.936730978828441918e-01 1.092371277422774511e+00 9.884306590130974568e-01
+5.580000000000000426e+01 9.936614251412041465e-01 1.092517073547537576e+00 9.884092040678807978e-01
+5.590000000000000568e+01 9.936497525630035854e-01 1.092662802572328840e+00 9.883877469704996921e-01
+5.600000000000000000e+01 9.936380801482402880e-01 1.092808464522382561e+00 9.883662877224765886e-01
+5.610000000000000142e+01 9.936264078969120339e-01 1.092954059422929225e+00 9.883448263253327148e-01
+5.620000000000000284e+01 9.936147358090166026e-01 1.093099587299197317e+00 9.883233627805891874e-01
+5.630000000000000426e+01 9.936030638845515517e-01 1.093245048176411105e+00 9.883018970897663458e-01
+5.640000000000000568e+01 9.935913921235144386e-01 1.093390442079791969e+00 9.882804292543840852e-01
+5.650000000000000000e+01 9.935797205259032649e-01 1.093535769034557736e+00 9.882589592759610797e-01
+5.660000000000000142e+01 9.935680490917156993e-01 1.093681029065923349e+00 9.882374871560158924e-01
+5.670000000000000284e+01 9.935563778209495212e-01 1.093826222199100640e+00 9.882160128960664203e-01
+5.680000000000000426e+01 9.935447067136021770e-01 1.093971348459297888e+00 9.881945364976300050e-01
+5.690000000000000568e+01 9.935330357696715575e-01 1.094116407871719820e+00 9.881730579622231003e-01
+5.700000000000000000e+01 9.935213649891553311e-01 1.094261400461568279e+00 9.881515772913616047e-01
+5.710000000000000142e+01 9.935096943720513885e-01 1.094406326254041550e+00 9.881300944865609726e-01
+5.720000000000000284e+01 9.934980239183575090e-01 1.094551185274335037e+00 9.881086095493361032e-01
+5.730000000000000426e+01 9.934863536280709173e-01 1.094695977547640808e+00 9.880871224812010079e-01
+5.740000000000000568e+01 9.934746835011897259e-01 1.094840703099146717e+00 9.880656332836691425e-01
+5.750000000000000000e+01 9.934630135377116034e-01 1.094985361954038172e+00 9.880441419582536300e-01
+5.760000000000000142e+01 9.934513437376341072e-01 1.095129954137496586e+00 9.880226485064663722e-01
+5.770000000000000284e+01 9.934396741009550169e-01 1.095274479674700263e+00 9.880011529298191597e-01
+5.780000000000000426e+01 9.934280046276721121e-01 1.095418938590824620e+00 9.879796552298232282e-01
+5.790000000000000568e+01 9.934163353177830613e-01 1.095563330911041522e+00 9.879581554079889250e-01
+5.800000000000000000e+01 9.934046661712856441e-01 1.095707656660518392e+00 9.879366534658260424e-01
+5.810000000000000142e+01 9.933929971881776400e-01 1.095851915864419990e+00 9.879151494048437065e-01
+5.820000000000000284e+01 9.933813283684567175e-01 1.095996108547908188e+00 9.878936432265504886e-01
+5.830000000000000426e+01 9.933696597121204341e-01 1.096140234736140417e+00 9.878721349324545153e-01
+5.840000000000000568e+01 9.933579912191667916e-01 1.096284294454271002e+00 9.878506245240630257e-01
+5.850000000000000000e+01 9.933463228895932362e-01 1.096428287727451378e+00 9.878291120028827033e-01
+5.860000000000000142e+01 9.933346547233975476e-01 1.096572214580828986e+00 9.878075973704196766e-01
+5.870000000000000284e+01 9.933229867205773944e-01 1.096716075039547489e+00 9.877860806281796302e-01
+5.880000000000000426e+01 9.933113188811306671e-01 1.096859869128747444e+00 9.877645617776672493e-01
+5.890000000000000568e+01 9.932996512050550342e-01 1.097003596873566078e+00 9.877430408203868861e-01
+5.900000000000000000e+01 9.932879836923481642e-01 1.097147258299136618e+00 9.877215177578423377e-01
+5.910000000000000142e+01 9.932763163430078368e-01 1.097290853430589408e+00 9.876999925915364020e-01
+5.920000000000000284e+01 9.932646491570318315e-01 1.097434382293050126e+00 9.876784653229715438e-01
+5.930000000000000426e+01 9.932529821344174836e-01 1.097577844911642675e+00 9.876569359536495618e-01
+5.940000000000000568e+01 9.932413152751627949e-01 1.097721241311485629e+00 9.876354044850716996e-01
+5.950000000000000000e+01 9.932296485792655449e-01 1.097864571517694898e+00 9.876138709187385345e-01
+5.960000000000000142e+01 9.932179820467234022e-01 1.098007835555382616e+00 9.875923352561500890e-01
+5.970000000000000284e+01 9.932063156775341461e-01 1.098151033449656921e+00 9.875707974988056082e-01
+5.980000000000000426e+01 9.931946494716954454e-01 1.098294165225623509e+00 9.875492576482036711e-01
+5.990000000000000568e+01 9.931829834292049686e-01 1.098437230908383189e+00 9.875277157058427457e-01
+6.000000000000000000e+01 9.931713175500602730e-01 1.098580230523034107e+00 9.875061716732200789e-01
+6.010000000000000142e+01 9.931596518342592494e-01 1.098723164094669968e+00 9.874846255518326954e-01
+6.020000000000000284e+01 9.931479862817997883e-01 1.098866031648381369e+00 9.874630773431770647e-01
+6.030000000000000426e+01 9.931363208926793362e-01 1.099008833209255132e+00 9.874415270487484353e-01
+6.040000000000000568e+01 9.931246556668957837e-01 1.099151568802374079e+00 9.874199746700420555e-01
+6.050000000000000000e+01 9.931129906044466882e-01 1.099294238452817485e+00 9.873984202085521744e-01
+6.060000000000000142e+01 9.931013257053299403e-01 1.099436842185661733e+00 9.873768636657727082e-01
+6.070000000000000284e+01 9.930896609695429866e-01 1.099579380025978326e+00 9.873553050431971290e-01
+6.080000000000000426e+01 9.930779963970838287e-01 1.099721851998835653e+00 9.873337443423179094e-01
+6.090000000000000568e+01 9.930663319879501350e-01 1.099864258129298555e+00 9.873121815646267452e-01
+6.100000000000000000e+01 9.930546677421395740e-01 1.100006598442427652e+00 9.872906167116153320e-01
+6.110000000000000142e+01 9.930430036596497034e-01 1.100148872963280233e+00 9.872690497847741442e-01
+6.120000000000000284e+01 9.930313397404785247e-01 1.100291081716909369e+00 9.872474807855934342e-01
+6.130000000000000426e+01 9.930196759846238175e-01 1.100433224728364801e+00 9.872259097155630103e-01
+6.140000000000000568e+01 9.930080123920829172e-01 1.100575302022692270e+00 9.872043365761714595e-01
+6.150000000000000000e+01 9.929963489628538253e-01 1.100717313624934190e+00 9.871827613689070358e-01
+6.160000000000000142e+01 9.929846856969342106e-01 1.100859259560128312e+00 9.871611840952575490e-01
+6.170000000000000284e+01 9.929730225943217414e-01 1.101001139853309718e+00 9.871396047567100318e-01
+6.180000000000000426e+01 9.929613596550139754e-01 1.101142954529508167e+00 9.871180233547508509e-01
+6.190000000000000568e+01 9.929496968790088030e-01 1.101284703613750970e+00 9.870964398908660398e-01
+6.200000000000000000e+01 9.929380342663040038e-01 1.101426387131061002e+00 9.870748543665407437e-01
+6.210000000000000142e+01 9.929263718168972463e-01 1.101568005106457360e+00 9.870532667832596641e-01
+6.220000000000000284e+01 9.929147095307861992e-01 1.101709557564955810e+00 9.870316771425066138e-01
+6.230000000000000426e+01 9.929030474079685309e-01 1.101851044531567014e+00 9.870100854457651840e-01
+6.240000000000000568e+01 9.928913854484422430e-01 1.101992466031298745e+00 9.869884916945181885e-01
+6.250000000000000000e+01 9.928797236522047820e-01 1.102133822089155002e+00 9.869668958902475531e-01
+6.260000000000000142e+01 9.928680620192539275e-01 1.102275112730134898e+00 9.869452980344349813e-01
+6.270000000000000284e+01 9.928564005495874589e-01 1.102416337979234884e+00 9.869236981285613997e-01
+6.280000000000000426e+01 9.928447392432031560e-01 1.102557497861446079e+00 9.869020961741071796e-01
+6.290000000000000568e+01 9.928330781000985761e-01 1.102698592401757161e+00 9.868804921725520263e-01
+6.300000000000000000e+01 9.928214171202713878e-01 1.102839621625151922e+00 9.868588861253750899e-01
+6.310000000000000142e+01 9.928097563037195927e-01 1.102980585556610604e+00 9.868372780340548545e-01
+6.320000000000000284e+01 9.927980956504406373e-01 1.103121484221109228e+00 9.868156679000692488e-01
+6.330000000000000426e+01 9.927864351604323012e-01 1.103262317643619816e+00 9.867940557248955358e-01
+6.340000000000000568e+01 9.927747748336923639e-01 1.103403085849110843e+00 9.867724415100103119e-01
+6.350000000000000000e+01 9.927631146702183829e-01 1.103543788862546338e+00 9.867508252568898408e-01
+6.360000000000000142e+01 9.927514546700084708e-01 1.103684426708886335e+00 9.867292069670093868e-01
+6.370000000000000284e+01 9.927397948330598521e-01 1.103824999413087316e+00 9.867075866418437702e-01
+6.380000000000000426e+01 9.927281351593705283e-01 1.103965507000101764e+00 9.866859642828673671e-01
+6.390000000000000568e+01 9.927164756489383901e-01 1.104105949494877281e+00 9.866643398915537766e-01
+6.400000000000000000e+01 9.927048163017608839e-01 1.104246326922358357e+00 9.866427134693759315e-01
+6.410000000000000853e+01 9.926931571178356783e-01 1.104386639307484819e+00 9.866210850178062097e-01
+6.420000000000000284e+01 9.926814980971606639e-01 1.104526886675192721e+00 9.865994545383163228e-01
+6.429999999999999716e+01 9.926698392397333981e-01 1.104667069050414119e+00 9.865778220323774272e-01
+6.440000000000000568e+01 9.926581805455516605e-01 1.104807186458076851e+00 9.865561875014602355e-01
+6.450000000000000000e+01 9.926465220146131196e-01 1.104947238923104758e+00 9.865345509470347940e-01
+6.460000000000000853e+01 9.926348636469156661e-01 1.105087226470417461e+00 9.865129123705702607e-01
+6.470000000000000284e+01 9.926232054424568574e-01 1.105227149124930808e+00 9.864912717735355718e-01
+6.479999999999999716e+01 9.926115474012346951e-01 1.105367006911555761e+00 9.864696291573986642e-01
+6.490000000000000568e+01 9.925998895232467367e-01 1.105506799855200395e+00 9.864479845236270306e-01
+6.500000000000000000e+01 9.925882318084905398e-01 1.105646527980767013e+00 9.864263378736877197e-01
+6.510000000000000853e+01 9.925765742569638839e-01 1.105786191313155253e+00 9.864046892090471141e-01
+6.520000000000000284e+01 9.925649168686646595e-01 1.105925789877260312e+00 9.863830385311707083e-01
+6.529999999999999716e+01 9.925532596435903132e-01 1.106065323697972280e+00 9.863613858415237745e-01
+6.540000000000000568e+01 9.925416025817387355e-01 1.106204792800178138e+00 9.863397311415705859e-01
+6.550000000000000000e+01 9.925299456831077061e-01 1.106344197208760205e+00 9.863180744327751936e-01
+6.560000000000000853e+01 9.925182889476947823e-01 1.106483536948597024e+00 9.862964157166007606e-01
+6.570000000000000284e+01 9.925066323754978548e-01 1.106622812044562254e+00 9.862747549945100056e-01
+6.579999999999999716e+01 9.924949759665145921e-01 1.106762022521525779e+00 9.862530922679649814e-01
+6.590000000000000568e+01 9.924833197207424407e-01 1.106901168404353264e+00 9.862314275384269635e-01
+6.600000000000000000e+01 9.924716636381795132e-01 1.107040249717905933e+00 9.862097608073567834e-01
+6.610000000000000853e+01 9.924600077188237002e-01 1.107179266487041236e+00 9.861880920762146063e-01
+6.620000000000000284e+01 9.924483519626720041e-01 1.107318218736611515e+00 9.861664213464604867e-01
+6.629999999999999716e+01 9.924366963697226485e-01 1.107457106491465781e+00 9.861447486195530354e-01
+6.640000000000000568e+01 9.924250409399733019e-01 1.107595929776448163e+00 9.861230738969505305e-01
+6.650000000000000000e+01 9.924133856734215220e-01 1.107734688616399010e+00 9.861013971801111389e-01
+6.660000000000000853e+01 9.924017305700653102e-01 1.107873383036153792e+00 9.860797184704918061e-01
+6.670000000000000284e+01 9.923900756299021131e-01 1.108012013060543977e+00 9.860580377695491450e-01
+6.679999999999999716e+01 9.923784208529298212e-01 1.108150578714397483e+00 9.860363550787392128e-01
+6.690000000000000568e+01 9.923667662391458810e-01 1.108289080022536677e+00 9.860146703995169570e-01
+6.700000000000000000e+01 9.923551117885482942e-01 1.108427517009779928e+00 9.859929837333378799e-01
+6.710000000000000853e+01 9.923434575011347292e-01 1.108565889700941831e+00 9.859712950816554855e-01
+6.720000000000000284e+01 9.923318033769028546e-01 1.108704198120831874e+00 9.859496044459234998e-01
+6.729999999999999716e+01 9.923201494158502278e-01 1.108842442294255770e+00 9.859279118275949827e-01
+6.740000000000000568e+01 9.923084956179750726e-01 1.108980622246014791e+00 9.859062172281221059e-01
+6.750000000000000000e+01 9.922968419832745024e-01 1.109118738000905768e+00 9.858845206489565971e-01
+6.760000000000000853e+01 9.922851885117466297e-01 1.109256789583721092e+00 9.858628220915497398e-01
+6.770000000000000284e+01 9.922735352033891232e-01 1.109394777019248934e+00 9.858411215573519293e-01
+6.779999999999999716e+01 9.922618820581993182e-01 1.109532700332272803e+00 9.858194190478130059e-01
+6.790000000000000568e+01 9.922502290761756605e-01 1.109670559547572211e+00 9.857977145643824768e-01
+6.800000000000000000e+01 9.922385762573151524e-01 1.109808354689921339e+00 9.857760081085086279e-01
+6.810000000000000853e+01 9.922269236016160177e-01 1.109946085784091707e+00 9.857542996816400782e-01
+6.820000000000000284e+01 9.922152711090755917e-01 1.110083752854847949e+00 9.857325892852238924e-01
+6.829999999999999716e+01 9.922036187796919871e-01 1.110221355926952702e+00 9.857108769207070242e-01
+6.840000000000000568e+01 9.921919666134627613e-01 1.110358895025162385e+00 9.856891625895357611e-01
+6.850000000000000000e+01 9.921803146103853610e-01 1.110496370174230085e+00 9.856674462931558356e-01
+6.860000000000000853e+01 9.921686627704578987e-01 1.110633781398904008e+00 9.856457280330123139e-01
+6.870000000000000284e+01 9.921570110936780429e-01 1.110771128723927692e+00 9.856240078105494851e-01
+6.879999999999999716e+01 9.921453595800434622e-01 1.110908412174040460e+00 9.856022856272113053e-01
+6.890000000000000568e+01 9.921337082295518250e-01 1.111045631773977194e+00 9.855805614844411755e-01
+6.900000000000000000e+01 9.921220570422008000e-01 1.111182787548467887e+00 9.855588353836814974e-01
+6.910000000000000853e+01 9.921104060179881667e-01 1.111319879522238319e+00 9.855371073263745618e-01
+6.920000000000000284e+01 9.920987551569117047e-01 1.111456907720010046e+00 9.855153773139614382e-01
+6.929999999999999716e+01 9.920871044589690824e-01 1.111593872166499075e+00 9.854936453478831959e-01
+6.940000000000000568e+01 9.920754539241579684e-01 1.111730772886417640e+00 9.854719114295800164e-01
+6.950000000000000000e+01 9.920638035524759202e-01 1.111867609904473531e+00 9.854501755604915259e-01
+6.960000000000000853e+01 9.920521533439208284e-01 1.112004383245369876e+00 9.854284377420567953e-01
+6.970000000000000284e+01 9.920405032984908056e-01 1.112141092933805142e+00 9.854066979757141187e-01
+6.979999999999999716e+01 9.920288534161829652e-01 1.112277738994473131e+00 9.853849562629015679e-01
+6.990000000000000568e+01 9.920172036969953089e-01 1.112414321452063204e+00 9.853632126050559936e-01
+7.000000000000000000e+01 9.920055541409256161e-01 1.112550840331260282e+00 9.853414670036140244e-01
+7.010000000000000853e+01 9.919939047479714445e-01 1.112687295656744180e+00 9.853197194600119557e-01
+7.020000000000000284e+01 9.919822555181305734e-01 1.112823687453190491e+00 9.852979699756849730e-01
+7.029999999999999716e+01 9.919706064514008936e-01 1.112960015745270370e+00 9.852762185520678173e-01
+7.040000000000000568e+01 9.919589575477800736e-01 1.113096280557650086e+00 9.852544651905948969e-01
+7.050000000000000000e+01 9.919473088072654487e-01 1.113232481914991467e+00 9.852327098926996207e-01
+7.060000000000000853e+01 9.919356602298552428e-01 1.113368619841951235e+00 9.852109526598149536e-01
+7.070000000000000284e+01 9.919240118155467911e-01 1.113504694363182113e+00 9.851891934933733053e-01
+7.079999999999999716e+01 9.919123635643379844e-01 1.113640705503331274e+00 9.851674323948066414e-01
+7.090000000000000568e+01 9.919007154762266021e-01 1.113776653287042562e+00 9.851456693655461505e-01
+7.100000000000000000e+01 9.918890675512103128e-01 1.113912537738953601e+00 9.851239044070222439e-01
+7.110000000000000853e+01 9.918774197892867850e-01 1.114048358883698686e+00 9.851021375206648889e-01
+7.120000000000000284e+01 9.918657721904535762e-01 1.114184116745906561e+00 9.850803687079033866e-01
+7.129999999999999716e+01 9.918541247547086881e-01 1.114319811350201084e+00 9.850585979701665940e-01
+7.140000000000000568e+01 9.918424774820497891e-01 1.114455442721202560e+00 9.850368253088829240e-01
+7.150000000000000000e+01 9.918308303724745478e-01 1.114591010883525968e+00 9.850150507254795684e-01
+7.160000000000000853e+01 9.918191834259808548e-01 1.114726515861781175e+00 9.849932742213836079e-01
+7.170000000000000284e+01 9.918075366425663786e-01 1.114861957680573612e+00 9.849714957980215679e-01
+7.179999999999999716e+01 9.917958900222287877e-01 1.114997336364504266e+00 9.849497154568189750e-01
+7.190000000000000568e+01 9.917842435649656396e-01 1.115132651938169017e+00 9.849279331992012443e-01
+7.200000000000000000e+01 9.917725972707748250e-01 1.115267904426158863e+00 9.849061490265929031e-01
+7.210000000000000853e+01 9.917609511396540123e-01 1.115403093853060357e+00 9.848843629404177014e-01
+7.220000000000000284e+01 9.917493051716010921e-01 1.115538220243455170e+00 9.848625749420990561e-01
+7.229999999999999716e+01 9.917376593666135109e-01 1.115673283621920309e+00 9.848407850330600510e-01
+7.240000000000000568e+01 9.917260137246890483e-01 1.115808284013027896e+00 9.848189932147224379e-01
+7.250000000000000000e+01 9.917143682458255949e-01 1.115943221441345390e+00 9.847971994885078573e-01
+7.260000000000000853e+01 9.917027229300207081e-01 1.116078095931435143e+00 9.847754038558376166e-01
+7.270000000000000284e+01 9.916910777772722785e-01 1.116212907507854846e+00 9.847536063181316912e-01
+7.279999999999999716e+01 9.916794327875777526e-01 1.116347656195157079e+00 9.847318068768098343e-01
+7.290000000000000568e+01 9.916677879609351320e-01 1.116482342017889984e+00 9.847100055332914659e-01
+7.300000000000000000e+01 9.916561432973420853e-01 1.116616965000597261e+00 9.846882022889950070e-01
+7.310000000000000853e+01 9.916444987967960589e-01 1.116751525167816839e+00 9.846663971453383235e-01
+7.320000000000000284e+01 9.916328544592951655e-01 1.116886022544082424e+00 9.846445901037389481e-01
+7.329999999999999716e+01 9.916212102848369625e-01 1.117020457153922619e+00 9.846227811656137474e-01
+7.340000000000000568e+01 9.916095662734192295e-01 1.117154829021861140e+00 9.846009703323788109e-01
+7.350000000000000000e+01 9.915979224250395241e-01 1.117289138172416596e+00 9.845791576054495620e-01
+7.360000000000000853e+01 9.915862787396957367e-01 1.117423384630103600e+00 9.845573429862412018e-01
+7.370000000000000284e+01 9.915746352173854250e-01 1.117557568419430991e+00 9.845355264761679326e-01
+7.379999999999999716e+01 9.915629918581064794e-01 1.117691689564903168e+00 9.845137080766434012e-01
+7.390000000000000568e+01 9.915513486618565686e-01 1.117825748091019200e+00 9.844918877890810327e-01
+7.400000000000000000e+01 9.915397056286333610e-01 1.117959744022273716e+00 9.844700656148933637e-01
+7.410000000000000853e+01 9.915280627584346362e-01 1.118093677383155793e+00 9.844482415554922650e-01
+7.420000000000000284e+01 9.915164200512579518e-01 1.118227548198150956e+00 9.844264156122891629e-01
+7.429999999999999716e+01 9.915047775071011982e-01 1.118361356491737846e+00 9.844045877866947070e-01
+7.440000000000000568e+01 9.914931351259620440e-01 1.118495102288391552e+00 9.843827580801193244e-01
+7.450000000000000000e+01 9.914814929078383798e-01 1.118628785612581389e+00 9.843609264939726655e-01
+7.460000000000000853e+01 9.914698508527276521e-01 1.118762406488772676e+00 9.843390930296634922e-01
+7.470000000000000284e+01 9.914582089606276405e-01 1.118895964941424959e+00 9.843172576886002334e-01
+7.479999999999999716e+01 9.914465672315362355e-01 1.119029460994992897e+00 9.842954204721907630e-01
+7.490000000000000568e+01 9.914349256654509945e-01 1.119162894673926933e+00 9.842735813818422885e-01
+7.500000000000000000e+01 9.914232842623699193e-01 1.119296266002671070e+00 9.842517404189613517e-01
+7.510000000000000853e+01 9.914116430222902343e-01 1.119429575005665534e+00 9.842298975849540499e-01
+7.520000000000000284e+01 9.914000019452101631e-01 1.119562821707345002e+00 9.842080528812255924e-01
+7.529999999999999716e+01 9.913883610311271521e-01 1.119696006132139265e+00 9.841862063091811885e-01
+7.540000000000000568e+01 9.913767202800389811e-01 1.119829128304473453e+00 9.841643578702246042e-01
+7.550000000000000000e+01 9.913650796919434294e-01 1.119962188248767143e+00 9.841425075657596055e-01
+7.560000000000000853e+01 9.913534392668381656e-01 1.120095185989434805e+00 9.841206553971892923e-01
+7.570000000000000284e+01 9.913417990047208583e-01 1.120228121550886247e+00 9.840988013659160982e-01
+7.579999999999999716e+01 9.913301589055891760e-01 1.120360994957526168e+00 9.840769454733419019e-01
+7.590000000000000568e+01 9.913185189694411203e-01 1.120493806233754164e+00 9.840550877208678049e-01
+7.600000000000000000e+01 9.913068791962740267e-01 1.120626555403964719e+00 9.840332281098945755e-01
+7.610000000000000853e+01 9.912952395860860078e-01 1.120759242492547214e+00 9.840113666418220939e-01
+7.620000000000000284e+01 9.912836001388746210e-01 1.120891867523885699e+00 9.839895033180497963e-01
+7.629999999999999716e+01 9.912719608546377570e-01 1.121024430522359783e+00 9.839676381399770078e-01
+7.640000000000000568e+01 9.912603217333727512e-01 1.121156931512343302e+00 9.839457711090016101e-01
+7.650000000000000000e+01 9.912486827750776053e-01 1.121289370518205430e+00 9.839239022265210410e-01
+7.660000000000000853e+01 9.912370439797500987e-01 1.121421747564310234e+00 9.839020314939327383e-01
+7.670000000000000284e+01 9.912254053473876780e-01 1.121554062675016450e+00 9.838801589126331404e-01
+7.680000000000001137e+01 9.912137668779883448e-01 1.121686315874677931e+00 9.838582844840180197e-01
+7.690000000000000568e+01 9.912021285715494345e-01 1.121818507187642533e+00 9.838364082094827046e-01
+7.700000000000000000e+01 9.911904904280691708e-01 1.121950636638254561e+00 9.838145300904219681e-01
+7.710000000000000853e+01 9.911788524475448892e-01 1.122082704250851437e+00 9.837926501282298064e-01
+7.720000000000000284e+01 9.911672146299745911e-01 1.122214710049766806e+00 9.837707683242997714e-01
+7.730000000000001137e+01 9.911555769753558343e-01 1.122346654059328097e+00 9.837488846800247488e-01
+7.740000000000000568e+01 9.911439394836863981e-01 1.122478536303858521e+00 9.837269991967971805e-01
+7.750000000000000000e+01 9.911323021549640622e-01 1.122610356807675513e+00 9.837051118760087309e-01
+7.760000000000000853e+01 9.911206649891863840e-01 1.122742115595091850e+00 9.836832227190503986e-01
+7.770000000000000284e+01 9.911090279863511432e-01 1.122873812690413642e+00 9.836613317273128487e-01
+7.780000000000001137e+01 9.910973911464561192e-01 1.123005448117943894e+00 9.836394389021860807e-01
+7.790000000000000568e+01 9.910857544694992027e-01 1.123137021901979393e+00 9.836175442450593165e-01
+7.800000000000000000e+01 9.910741179554778402e-01 1.123268534066811153e+00 9.835956477573215562e-01
+7.810000000000000853e+01 9.910624816043898111e-01 1.123399984636725746e+00 9.835737494403606895e-01
+7.820000000000000284e+01 9.910508454162327840e-01 1.123531373636004416e+00 9.835518492955643843e-01
+7.830000000000001137e+01 9.910392093910046496e-01 1.123662701088923077e+00 9.835299473243197532e-01
+7.840000000000000568e+01 9.910275735287029653e-01 1.123793967019752316e+00 9.835080435280127986e-01
+7.850000000000000000e+01 9.910159378293255106e-01 1.123925171452757610e+00 9.834861379080296340e-01
+7.860000000000000853e+01 9.910043022928699541e-01 1.124056314412199109e+00 9.834642304657554845e-01
+7.870000000000000284e+01 9.909926669193340754e-01 1.124187395922332078e+00 9.834423212025750205e-01
+7.880000000000001137e+01 9.909810317087157649e-01 1.124318416007405119e+00 9.834204101198721348e-01
+7.890000000000000568e+01 9.909693966610126914e-01 1.124449374691663506e+00 9.833984972190302765e-01
+7.900000000000000000e+01 9.909577617762224122e-01 1.124580271999345848e+00 9.833765825014323392e-01
+7.910000000000000853e+01 9.909461270543427069e-01 1.124711107954685874e+00 9.833546659684606617e-01
+7.920000000000000284e+01 9.909344924953713551e-01 1.124841882581912200e+00 9.833327476214968055e-01
+7.930000000000001137e+01 9.909228580993061364e-01 1.124972595905248118e+00 9.833108274619217770e-01
+7.940000000000000568e+01 9.909112238661447192e-01 1.125103247948911367e+00 9.832889054911160276e-01
+7.950000000000000000e+01 9.908995897958848831e-01 1.125233838737114356e+00 9.832669817104595644e-01
+7.960000000000000853e+01 9.908879558885239636e-01 1.125364368294064388e+00 9.832450561213316176e-01
+7.970000000000000284e+01 9.908763221440600732e-01 1.125494836643963659e+00 9.832231287251109730e-01
+7.980000000000001137e+01 9.908646885624907696e-01 1.125625243811008147e+00 9.832011995231756396e-01
+7.990000000000000568e+01 9.908530551438140543e-01 1.125755589819389391e+00 9.831792685169031820e-01
+8.000000000000000000e+01 9.908414218880272628e-01 1.125885874693293154e+00 9.831573357076707209e-01
+8.010000000000000853e+01 9.908297887951285077e-01 1.126016098456900316e+00 9.831354010968542667e-01
+8.020000000000000284e+01 9.908181558651154575e-01 1.126146261134385096e+00 9.831134646858297188e-01
+8.030000000000001137e+01 9.908065230979853366e-01 1.126276362749917936e+00 9.830915264759723105e-01
+8.040000000000000568e+01 9.907948904937363688e-01 1.126406403327663064e+00 9.830695864686567198e-01
+8.050000000000000000e+01 9.907832580523662225e-01 1.126536382891779375e+00 9.830476446652566258e-01
+8.060000000000000853e+01 9.907716257738726773e-01 1.126666301466420439e+00 9.830257010671455964e-01
+8.070000000000000284e+01 9.907599936582531797e-01 1.126796159075734716e+00 9.830037556756964223e-01
+8.080000000000001137e+01 9.907483617055056202e-01 1.126925955743864893e+00 9.829818084922813393e-01
+8.090000000000000568e+01 9.907367299156276674e-01 1.127055691494948331e+00 9.829598595182720278e-01
+8.100000000000000000e+01 9.907250982886171009e-01 1.127185366353116391e+00 9.829379087550395022e-01
+8.110000000000000853e+01 9.907134668244715892e-01 1.127314980342495998e+00 9.829159562039543330e-01
+8.120000000000000284e+01 9.907018355231885787e-01 1.127444533487208522e+00 9.828940018663864242e-01
+8.130000000000001137e+01 9.906902043847661821e-01 1.127574025811369562e+00 9.828720457437045699e-01
+8.140000000000000568e+01 9.906785734092022899e-01 1.127703457339088944e+00 9.828500878372780081e-01
+8.150000000000000000e+01 9.906669425964942377e-01 1.127832828094471607e+00 9.828281281484745335e-01
+8.160000000000000853e+01 9.906553119466398050e-01 1.127962138101616718e+00 9.828061666786618300e-01
+8.170000000000000284e+01 9.906436814596368823e-01 1.128091387384618782e+00 9.827842034292065820e-01
+8.180000000000001137e+01 9.906320511354832492e-01 1.128220575967565642e+00 9.827622384014754742e-01
+8.190000000000000568e+01 9.906204209741762412e-01 1.128349703874540033e+00 9.827402715968339697e-01
+8.200000000000000000e+01 9.906087909757140819e-01 1.128478771129619584e+00 9.827183030166474209e-01
+8.210000000000000853e+01 9.905971611400941068e-01 1.128607777756875929e+00 9.826963326622804029e-01
+8.220000000000000284e+01 9.905855314673142065e-01 1.128736723780375595e+00 9.826743605350968247e-01
+8.230000000000001137e+01 9.905739019573719384e-01 1.128865609224180000e+00 9.826523866364601512e-01
+8.240000000000000568e+01 9.905622726102653042e-01 1.128994434112343903e+00 9.826304109677331811e-01
+8.250000000000000000e+01 9.905506434259920834e-01 1.129123198468917844e+00 9.826084335302781581e-01
+8.260000000000000853e+01 9.905390144045498335e-01 1.129251902317945699e+00 9.825864543254566597e-01
+8.270000000000000284e+01 9.905273855459358900e-01 1.129380545683466019e+00 9.825644733546297083e-01
+8.280000000000001137e+01 9.905157568501484766e-01 1.129509128589512690e+00 9.825424906191581043e-01
+8.290000000000000568e+01 9.905041283171851507e-01 1.129637651060113379e+00 9.825205061204014267e-01
+8.300000000000000000e+01 9.904924999470440250e-01 1.129766113119289983e+00 9.824985198597190328e-01
+8.310000000000000853e+01 9.904808717397222129e-01 1.129894514791059512e+00 9.824765318384696133e-01
+8.320000000000000284e+01 9.904692436952177159e-01 1.130022856099432538e+00 9.824545420580114152e-01
+8.330000000000001137e+01 9.904576158135283137e-01 1.130151137068414968e+00 9.824325505197019082e-01
+8.340000000000000568e+01 9.904459880946515637e-01 1.130279357722006717e+00 9.824105572248981177e-01
+8.350000000000000000e+01 9.904343605385853566e-01 1.130407518084202589e+00 9.823885621749566255e-01
+8.360000000000000853e+01 9.904227331453271388e-01 1.130535618178990731e+00 9.823665653712329027e-01
+8.370000000000000284e+01 9.904111059148750229e-01 1.130663658030354624e+00 9.823445668150820875e-01
+8.380000000000001137e+01 9.903994788472266775e-01 1.130791637662271976e+00 9.823225665078590962e-01
+8.390000000000000568e+01 9.903878519423795490e-01 1.130919557098714501e+00 9.823005644509178458e-01
+8.400000000000000000e+01 9.903762252003314170e-01 1.131047416363648583e+00 9.822785606456116980e-01
+8.410000000000000853e+01 9.903645986210802832e-01 1.131175215481035279e+00 9.822565550932934597e-01
+8.420000000000000284e+01 9.903529722046234829e-01 1.131302954474829425e+00 9.822345477953156045e-01
+8.430000000000001137e+01 9.903413459509591288e-01 1.131430633368980754e+00 9.822125387530300511e-01
+8.440000000000000568e+01 9.903297198600847784e-01 1.131558252187433000e+00 9.821905279677872747e-01
+8.450000000000000000e+01 9.903180939319983223e-01 1.131685810954124793e+00 9.821685154409384166e-01
+8.460000000000000853e+01 9.903064681666970959e-01 1.131813309692988545e+00 9.821465011738330642e-01
+8.470000000000000284e+01 9.902948425641792118e-01 1.131940748427950894e+00 9.821244851678209153e-01
+8.480000000000001137e+01 9.902832171244420056e-01 1.132068127182933148e+00 9.821024674242505581e-01
+8.490000000000000568e+01 9.902715918474835899e-01 1.132195445981851289e+00 9.820804479444701363e-01
+8.500000000000000000e+01 9.902599667333014111e-01 1.132322704848615302e+00 9.820584267298274606e-01
+8.510000000000000853e+01 9.902483417818933598e-01 1.132449903807128955e+00 9.820364037816693425e-01
+8.520000000000000284e+01 9.902367169932571045e-01 1.132577042881291352e+00 9.820143791013424828e-01
+8.530000000000001137e+01 9.902250923673904248e-01 1.132704122094995602e+00 9.819923526901925825e-01
+8.540000000000000568e+01 9.902134679042908783e-01 1.132831141472128378e+00 9.819703245495650101e-01
+8.550000000000000000e+01 9.902018436039564664e-01 1.132958101036571685e+00 9.819482946808044677e-01
+8.560000000000000853e+01 9.901902194663845247e-01 1.133085000812200871e+00 9.819262630852549911e-01
+8.570000000000000284e+01 9.901785954915730548e-01 1.133211840822886174e+00 9.819042297642605055e-01
+8.580000000000001137e+01 9.901669716795197251e-01 1.133338621092491838e+00 9.818821947191636035e-01
+8.590000000000000568e+01 9.901553480302225374e-01 1.133465341644877000e+00 9.818601579513067668e-01
+8.600000000000000000e+01 9.901437245436789381e-01 1.133592002503894358e+00 9.818381194620316998e-01
+8.610000000000000853e+01 9.901321012198865956e-01 1.133718603693391058e+00 9.818160792526796632e-01
+8.620000000000000284e+01 9.901204780588432897e-01 1.133845145237208474e+00 9.817940373245912511e-01
+8.630000000000001137e+01 9.901088550605466887e-01 1.133971627159182205e+00 9.817719936791066138e-01
+8.640000000000000568e+01 9.900972322249947943e-01 1.134098049483142523e+00 9.817499483175653463e-01
+8.650000000000000000e+01 9.900856095521850531e-01 1.134224412232913481e+00 9.817279012413060446e-01
+8.660000000000000853e+01 9.900739870421153555e-01 1.134350715432313805e+00 9.817058524516674156e-01
+8.670000000000000284e+01 9.900623646947833700e-01 1.134476959105156002e+00 9.816838019499870560e-01
+8.680000000000001137e+01 9.900507425101867653e-01 1.134603143275247028e+00 9.816617497376018964e-01
+8.690000000000000568e+01 9.900391204883232099e-01 1.134729267966388067e+00 9.816396958158487562e-01
+8.700000000000000000e+01 9.900274986291907053e-01 1.134855333202374306e+00 9.816176401860634559e-01
+8.710000000000000853e+01 9.900158769327865871e-01 1.134981339006995160e+00 9.815955828495815938e-01
+8.720000000000000284e+01 9.900042553991088567e-01 1.135107285404034272e+00 9.815735238077378799e-01
+8.730000000000001137e+01 9.899926340281551829e-01 1.135233172417269731e+00 9.815514630618665803e-01
+8.740000000000000568e+01 9.899810128199233450e-01 1.135359000070474078e+00 9.815294006133014060e-01
+8.750000000000000000e+01 9.899693917744109006e-01 1.135484768387412968e+00 9.815073364633756237e-01
+8.760000000000000853e+01 9.899577708916157404e-01 1.135610477391847395e+00 9.814852706134215010e-01
+8.770000000000000284e+01 9.899461501715356437e-01 1.135736127107531690e+00 9.814632030647709726e-01
+8.780000000000001137e+01 9.899345296141681683e-01 1.135861717558215078e+00 9.814411338187555289e-01
+8.790000000000000568e+01 9.899229092195109825e-01 1.135987248767640123e+00 9.814190628767062163e-01
+8.800000000000000000e+01 9.899112889875620880e-01 1.136112720759544281e+00 9.813969902399528600e-01
+8.810000000000000853e+01 9.898996689183190423e-01 1.136238133557659014e+00 9.813749159098250630e-01
+8.820000000000000284e+01 9.898880490117794029e-01 1.136363487185709564e+00 9.813528398876519843e-01
+8.830000000000001137e+01 9.898764292679410604e-01 1.136488781667415182e+00 9.813307621747622278e-01
+8.840000000000000568e+01 9.898648096868019053e-01 1.136614017026490231e+00 9.813086827724838423e-01
+8.850000000000000000e+01 9.898531902683596062e-01 1.136739193286642191e+00 9.812866016821436554e-01
+8.860000000000000853e+01 9.898415710126117206e-01 1.136864310471573214e+00 9.812645189050687167e-01
+8.870000000000000284e+01 9.898299519195559171e-01 1.136989368604979678e+00 9.812424344425851874e-01
+8.880000000000001137e+01 9.898183329891901971e-01 1.137114367710551299e+00 9.812203482960185630e-01
+8.890000000000000568e+01 9.898067142215121184e-01 1.137239307811972688e+00 9.811982604666940055e-01
+8.900000000000000000e+01 9.897950956165195713e-01 1.137364188932922238e+00 9.811761709559359002e-01
+8.910000000000000853e+01 9.897834771742098914e-01 1.137489011097072567e+00 9.811540797650679657e-01
+8.920000000000000284e+01 9.897718588945814133e-01 1.137613774328089855e+00 9.811319868954135881e-01
+8.930000000000001137e+01 9.897602407776313616e-01 1.137738478649635621e+00 9.811098923482953760e-01
+8.940000000000000568e+01 9.897486228233576266e-01 1.137863124085364275e+00 9.810877961250354939e-01
+8.950000000000000000e+01 9.897370050317577661e-01 1.137987710658924678e+00 9.810656982269555515e-01
+8.960000000000000853e+01 9.897253874028297815e-01 1.138112238393959919e+00 9.810435986553766030e-01
+8.970000000000000284e+01 9.897137699365713415e-01 1.138236707314107088e+00 9.810214974116189257e-01
+8.980000000000001137e+01 9.897021526329801144e-01 1.138361117442997061e+00 9.809993944970022417e-01
+8.990000000000000568e+01 9.896905354920538800e-01 1.138485468804254941e+00 9.809772899128461621e-01
+9.000000000000000000e+01 9.896789185137901956e-01 1.138609761421500055e+00 9.809551836604691877e-01
+9.010000000000000853e+01 9.896673016981868409e-01 1.138733995318345293e+00 9.809330757411893753e-01
+9.020000000000000284e+01 9.896556850452417065e-01 1.138858170518398660e+00 9.809109661563241156e-01
+9.030000000000001137e+01 9.896440685549524607e-01 1.138982287045260833e+00 9.808888549071903551e-01
+9.040000000000000568e+01 9.896324522273166613e-01 1.139106344922527381e+00 9.808667419951047073e-01
+9.050000000000000000e+01 9.896208360623321987e-01 1.139230344173787657e+00 9.808446274213831195e-01
+9.060000000000000853e+01 9.896092200599966304e-01 1.139354284822625019e+00 9.808225111873404289e-01
+9.070000000000000284e+01 9.895976042203081802e-01 1.139478166892617050e+00 9.808003932942914727e-01
+9.080000000000001137e+01 9.895859885432641834e-01 1.139601990407334897e+00 9.807782737435501996e-01
+9.090000000000000568e+01 9.895743730288623086e-01 1.139725755390344153e+00 9.807561525364303368e-01
+9.100000000000000000e+01 9.895627576771003353e-01 1.139849461865204416e+00 9.807340296742447228e-01
+9.110000000000000853e+01 9.895511424879761542e-01 1.139973109855468625e+00 9.807119051583057523e-01
+9.120000000000000284e+01 9.895395274614873227e-01 1.140096699384684387e+00 9.806897789899250428e-01
+9.130000000000001137e+01 9.895279125976315093e-01 1.140220230476393315e+00 9.806676511704138788e-01
+9.140000000000000568e+01 9.895162978964066047e-01 1.140343703154130361e+00 9.806455217010829895e-01
+9.150000000000000000e+01 9.895046833578101664e-01 1.140467117441424927e+00 9.806233905832423270e-01
+9.160000000000000853e+01 9.894930689818403069e-01 1.140590473361800639e+00 9.806012578182015105e-01
+9.170000000000000284e+01 9.894814547684944728e-01 1.140713770938774463e+00 9.805791234072692708e-01
+9.180000000000001137e+01 9.894698407177702215e-01 1.140837010195858037e+00 9.805569873517541168e-01
+9.190000000000000568e+01 9.894582268296655547e-01 1.140960191156556114e+00 9.805348496529638913e-01
+9.200000000000000000e+01 9.894466131041781409e-01 1.141083313844368119e+00 9.805127103122056598e-01
+9.210000000000000853e+01 9.894349995413054266e-01 1.141206378282786815e+00 9.804905693307861547e-01
+9.220000000000000284e+01 9.894233861410454134e-01 1.141329384495299637e+00 9.804684267100114425e-01
+9.230000000000001137e+01 9.894117729033961028e-01 1.141452332505387579e+00 9.804462824511868124e-01
+9.240000000000000568e+01 9.894001598283546084e-01 1.141575222336525197e+00 9.804241365556174426e-01
+9.250000000000000000e+01 9.893885469159192647e-01 1.141698054012181496e+00 9.804019890246075120e-01
+9.260000000000000853e+01 9.893769341660874073e-01 1.141820827555819262e+00 9.803798398594607555e-01
+9.270000000000000284e+01 9.893653215788569266e-01 1.141943542990894844e+00 9.803576890614803530e-01
+9.280000000000001137e+01 9.893537091542254913e-01 1.142066200340859039e+00 9.803355366319691511e-01
+9.290000000000000568e+01 9.893420968921907699e-01 1.142188799629155982e+00 9.803133825722291084e-01
+9.300000000000000000e+01 9.893304847927505419e-01 1.142311340879224479e+00 9.802912268835618503e-01
+9.310000000000000853e+01 9.893188728559024758e-01 1.142433824114496455e+00 9.802690695672682253e-01
+9.320000000000000284e+01 9.893072610816443513e-01 1.142556249358398057e+00 9.802469106246485264e-01
+9.330000000000001137e+01 9.892956494699740588e-01 1.142678616634349664e+00 9.802247500570023808e-01
+9.340000000000000568e+01 9.892840380208891560e-01 1.142800925965764991e+00 9.802025878656290825e-01
+9.350000000000000000e+01 9.892724267343873112e-01 1.142923177376051758e+00 9.801804240518275924e-01
+9.360000000000000853e+01 9.892608156104664152e-01 1.143045370888611689e+00 9.801582586168955391e-01
+9.370000000000000284e+01 9.892492046491240254e-01 1.143167506526840516e+00 9.801360915621306624e-01
+9.380000000000001137e+01 9.892375938503580324e-01 1.143289584314127305e+00 9.801139228888300359e-01
+9.390000000000000568e+01 9.892259832141661047e-01 1.143411604273855797e+00 9.800917525982898448e-01
+9.400000000000000000e+01 9.892143727405460218e-01 1.143533566429402404e+00 9.800695806918057196e-01
+9.410000000000000853e+01 9.892027624294953414e-01 1.143655470804138652e+00 9.800474071706730683e-01
+9.420000000000000284e+01 9.891911522810119539e-01 1.143777317421428963e+00 9.800252320361866332e-01
+9.430000000000001137e+01 9.891795422950935279e-01 1.143899106304632207e+00 9.800030552896404901e-01
+9.440000000000000568e+01 9.891679324717376209e-01 1.144020837477100816e+00 9.799808769323281599e-01
+9.450000000000000000e+01 9.891563228109422345e-01 1.144142510962181003e+00 9.799586969655424973e-01
+9.460000000000000853e+01 9.891447133127051483e-01 1.144264126783212765e+00 9.799365153905759129e-01
+9.470000000000000284e+01 9.891331039770238087e-01 1.144385684963530325e+00 9.799143322087201513e-01
+9.480000000000001137e+01 9.891214948038962174e-01 1.144507185526461690e+00 9.798921474212666238e-01
+9.490000000000000568e+01 9.891098857933198207e-01 1.144628628495327982e+00 9.798699610295058537e-01
+9.500000000000000000e+01 9.890982769452923984e-01 1.144750013893445217e+00 9.798477730347281422e-01
+9.510000000000000853e+01 9.890866682598117299e-01 1.144871341744121640e+00 9.798255834382230134e-01
+9.520000000000000284e+01 9.890750597368757058e-01 1.144992612070660609e+00 9.798033922412792140e-01
+9.530000000000001137e+01 9.890634513764821056e-01 1.145113824896359267e+00 9.797811994451850470e-01
+9.540000000000000568e+01 9.890518431786284870e-01 1.145234980244507872e+00 9.797590050512288151e-01
+9.550000000000000000e+01 9.890402351433125183e-01 1.145356078138390910e+00 9.797368090606975999e-01
+9.560000000000000853e+01 9.890286272705319792e-01 1.145477118601286648e+00 9.797146114748782608e-01
+9.570000000000000284e+01 9.890170195602845382e-01 1.145598101656466694e+00 9.796924122950566582e-01
+9.580000000000001137e+01 9.890054120125679749e-01 1.145719027327196882e+00 9.796702115225184304e-01
+9.590000000000000568e+01 9.889938046273799577e-01 1.145839895636736605e+00 9.796480091585488825e-01
+9.600000000000000000e+01 9.889821974047184883e-01 1.145960706608339041e+00 9.796258052044322095e-01
+9.610000000000000853e+01 9.889705903445811241e-01 1.146081460265251151e+00 9.796035996614523844e-01
+9.620000000000000284e+01 9.889589834469655338e-01 1.146202156630713898e+00 9.795813925308926029e-01
+9.630000000000001137e+01 9.889473767118694969e-01 1.146322795727962029e+00 9.795591838140357277e-01
+9.640000000000000568e+01 9.889357701392907929e-01 1.146443377580223189e+00 9.795369735121639554e-01
+9.650000000000000000e+01 9.889241637292268683e-01 1.146563902210719466e+00 9.795147616265588164e-01
+9.660000000000000853e+01 9.889125574816758357e-01 1.146684369642666512e+00 9.794925481585015081e-01
+9.670000000000000284e+01 9.889009513966352527e-01 1.146804779899273763e+00 9.794703331092723397e-01
+9.680000000000001137e+01 9.888893454741026767e-01 1.146925133003744657e+00 9.794481164801515094e-01
+9.690000000000000568e+01 9.888777397140759984e-01 1.147045428979275972e+00 9.794258982724183271e-01
+9.700000000000000000e+01 9.888661341165531082e-01 1.147165667849058268e+00 9.794036784873515478e-01
+9.710000000000000853e+01 9.888545286815316748e-01 1.147285849636275890e+00 9.793814571262291491e-01
+9.720000000000000284e+01 9.888429234090093667e-01 1.147405974364106740e+00 9.793592341903289977e-01
+9.730000000000001137e+01 9.888313182989839634e-01 1.147526042055722728e+00 9.793370096809282943e-01
+9.740000000000000568e+01 9.888197133514531334e-01 1.147646052734289102e+00 9.793147835993036843e-01
+9.750000000000000000e+01 9.888081085664144343e-01 1.147766006422965113e+00 9.792925559467307028e-01
+9.760000000000000853e+01 9.887965039438658676e-01 1.147885903144903574e+00 9.792703267244852183e-01
+9.770000000000000284e+01 9.887848994838049910e-01 1.148005742923251304e+00 9.792480959338418778e-01
+9.780000000000001137e+01 9.887732951862294728e-01 1.148125525781148237e+00 9.792258635760749952e-01
+9.790000000000000568e+01 9.887616910511372037e-01 1.148245251741728090e+00 9.792036296524583294e-01
+9.800000000000000000e+01 9.887500870785258522e-01 1.148364920828118363e+00 9.791813941642650843e-01
+9.810000000000000853e+01 9.887384832683933089e-01 1.148484533063441004e+00 9.791591571127676863e-01
+9.820000000000000284e+01 9.887268796207371313e-01 1.148604088470810414e+00 9.791369184992384511e-01
+9.830000000000001137e+01 9.887152761355549879e-01 1.148723587073334995e+00 9.791146783249486951e-01
+9.840000000000000568e+01 9.887036728128447693e-01 1.148843028894117380e+00 9.790924365911692906e-01
+9.850000000000000000e+01 9.886920696526040331e-01 1.148962413956253092e+00 9.790701932991708878e-01
+9.860000000000000853e+01 9.886804666548310028e-01 1.149081742282832108e+00 9.790479484502229157e-01
+9.870000000000000284e+01 9.886688638195227918e-01 1.149201013896937074e+00 9.790257020455946924e-01
+9.880000000000001137e+01 9.886572611466772909e-01 1.149320228821645085e+00 9.790034540865550916e-01
+9.890000000000000568e+01 9.886456586362922794e-01 1.149439387080026798e+00 9.789812045743719882e-01
+9.900000000000000000e+01 9.886340562883656480e-01 1.149558488695145764e+00 9.789589535103131457e-01
+9.910000000000000853e+01 9.886224541028949542e-01 1.149677533690060427e+00 9.789367008956454397e-01
+9.920000000000000284e+01 9.886108520798780885e-01 1.149796522087821460e+00 9.789144467316353015e-01
+9.930000000000001137e+01 9.885992502193123865e-01 1.149915453911474650e+00 9.788921910195484966e-01
+9.940000000000000568e+01 9.885876485211958498e-01 1.150034329184058235e+00 9.788699337606503459e-01
+9.950000000000000000e+01 9.885760469855264798e-01 1.150153147928604236e+00 9.788476749562060597e-01
+9.960000000000000853e+01 9.885644456123015011e-01 1.150271910168139122e+00 9.788254146074794049e-01
+9.970000000000000284e+01 9.885528444015190264e-01 1.150390615925681592e+00 9.788031527157340372e-01
+9.980000000000001137e+01 9.885412433531765020e-01 1.150509265224245237e+00 9.787808892822331686e-01
+9.990000000000000568e+01 9.885296424672718185e-01 1.150627858086835875e+00 9.787586243082391224e-01
diff --git a/testsuite/pytests/test_connect_tripartite_bernoulli.py b/testsuite/pytests/test_connect_tripartite_bernoulli.py
index 60d983bae2..b781a33dd1 100644
--- a/testsuite/pytests/test_connect_tripartite_bernoulli.py
+++ b/testsuite/pytests/test_connect_tripartite_bernoulli.py
@@ -33,16 +33,20 @@
haveMPI4Py = False
-def setup_network(conn_dict, syn_dict, N1, N2, primary_model="aeif_cond_alpha_astro", third_model="astrocyte_lr_1994"):
+def setup_network(
+ conn_dict, third_conn_dict, syn_dict, N1, N2, primary_model="aeif_cond_alpha_astro", third_model="astrocyte_lr_1994"
+):
"""Setup the network for the statistical test.
A three-population network is created for a statictical test of the
- "tripartite_bernoulli_with_pool" rule.
+ "third_factor_bernoulli_with_pool" rule.
Parameters
---------
conn_dict
- Dictionary for the connectivity specifications (conn_spec).
+ Dictionary for the primary connectivity specifications (conn_spec).
+ third_conn_dict
+ Dictionary for the third-factor connectivity specifications (third_factor_conn_spec).
syn_dict
Dictionary for the synapse specifications (syn_spec).
N1
@@ -62,7 +66,9 @@ def setup_network(conn_dict, syn_dict, N1, N2, primary_model="aeif_cond_alpha_as
pop1 = nest.Create(primary_model, N1)
pop2 = nest.Create(primary_model, N2)
pop3 = nest.Create(third_model, N2)
- nest.TripartiteConnect(pop1, pop2, pop3, conn_spec=conn_dict, syn_specs=syn_dict)
+ nest.TripartiteConnect(
+ pop1, pop2, pop3, conn_spec=conn_dict, third_factor_conn_spec=third_conn_dict, syn_specs=syn_dict
+ )
return pop1, pop2, pop3
@@ -316,7 +322,7 @@ def mpi_assert(data_original, data_test):
def test_statistics(p_primary):
"""
A test for the parameters "p_primary" and "pool_size" in the
- "tripartite_bernoulli_with_pool" rule.
+ "third_factor_bernoulli_with_pool" rule.
Parameters
---------
@@ -328,7 +334,8 @@ def test_statistics(p_primary):
N1 = 50
N2 = 50
pool_size = 5
- conn_dict = {"rule": "tripartite_bernoulli_with_pool", "p_primary": p_primary, "pool_size": pool_size}
+ conn_dict = {"rule": "pairwise_bernoulli", "p": p_primary}
+ third_conn_dict = {"rule": "third_factor_bernoulli_with_pool", "pool_size": pool_size}
# set test parameters
stat_dict = {"alpha2": 0.05, "n_runs": 20}
@@ -341,7 +348,7 @@ def test_statistics(p_primary):
# 1. p_primary yields the correct indegree and outdegree
# 2. pool_size limits the number of third-population nodes connected to each target nodes
for fan in ["in", "out"]:
- expected = get_expected_degrees_bernoulli(conn_dict["p_primary"], fan, N1, N2)
+ expected = get_expected_degrees_bernoulli(conn_dict["p"], fan, N1, N2)
pvalues = []
n_third_nodes = []
for i in range(stat_dict["n_runs"]):
@@ -349,7 +356,9 @@ def test_statistics(p_primary):
nest.ResetKernel()
nest.local_num_threads = nr_threads
nest.rng_seed = i + 1
- pop1, pop2, pop3 = setup_network(conn_dict, {"third_out": {"synapse_model": "sic_connection"}}, N1, N2)
+ pop1, pop2, pop3 = setup_network(
+ conn_dict, third_conn_dict, {"third_out": {"synapse_model": "sic_connection"}}, N1, N2
+ )
# get indegree or outdegree
degrees = get_degrees(fan, pop1, pop2)
# gather data from MPI processes
@@ -388,10 +397,13 @@ def test_autapses_true(autapses):
# set network and connectivity parameters
N = 50
conn_dict = {
- "rule": "tripartite_bernoulli_with_pool",
- "p_primary": 1.0,
+ "rule": "pairwise_bernoulli",
+ "p": 1.0,
"allow_autapses": autapses,
}
+ third_conn_dict = {
+ "rule": "third_factor_bernoulli_with_pool",
+ }
# set NEST verbosity
nest.set_verbosity("M_FATAL")
@@ -404,6 +416,7 @@ def test_autapses_true(autapses):
pop_primay,
pop_third,
conn_spec=conn_dict,
+ third_factor_conn_spec=third_conn_dict,
syn_specs={"third_out": {"synapse_model": "sic_connection"}},
)
diff --git a/testsuite/pytests/test_tripartite_connect.py b/testsuite/pytests/test_tripartite_connect.py
index 488513d979..ea12156614 100644
--- a/testsuite/pytests/test_tripartite_connect.py
+++ b/testsuite/pytests/test_tripartite_connect.py
@@ -45,7 +45,11 @@ def test_connect_all():
third = nest.Create("parrot_neuron", n_third)
nest.TripartiteConnect(
- pre, post, third, {"rule": "tripartite_bernoulli_with_pool", "p_primary": 1.0, "p_third_if_primary": 1}
+ pre,
+ post,
+ third,
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0},
)
n_primary = n_pre * n_post
@@ -64,7 +68,8 @@ def test_connect_astro():
pre,
post,
third,
- {"rule": "tripartite_bernoulli_with_pool", "p_primary": 1.0, "p_third_if_primary": 1},
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0},
{"third_out": {"synapse_model": "sic_connection"}},
)
@@ -81,7 +86,11 @@ def test_explicit_random_pool():
third = nest.Create("parrot_neuron", n_third)
nest.TripartiteConnect(
- pre, post, third, {"rule": "tripartite_bernoulli_with_pool", "pool_type": "random", "pool_size": 2}
+ pre,
+ post,
+ third,
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0, "pool_type": "random", "pool_size": 2},
)
n_primary = n_pre * n_post
@@ -97,7 +106,11 @@ def test_block_pool_single():
third = nest.Create("parrot_neuron", n_third)
nest.TripartiteConnect(
- pre, post, third, {"rule": "tripartite_bernoulli_with_pool", "pool_type": "block", "pool_size": 1}
+ pre,
+ post,
+ third,
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0, "pool_type": "block", "pool_size": 1},
)
n_primary = n_pre * n_post
@@ -113,7 +126,11 @@ def test_block_pool_wide():
third = nest.Create("parrot_neuron", n_third)
nest.TripartiteConnect(
- pre, post, third, {"rule": "tripartite_bernoulli_with_pool", "pool_type": "block", "pool_size": 4}
+ pre,
+ post,
+ third,
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0, "pool_type": "block", "pool_size": 4},
)
n_primary = n_pre * n_post
@@ -122,14 +139,56 @@ def test_block_pool_wide():
assert len(nest.GetConnections(third, post)) == n_primary
-def test_bipartite_raises():
+def test_tripartite_raises():
n_pre, n_post, n_third = 4, 2, 8
pre = nest.Create("parrot_neuron", n_pre)
post = nest.Create("parrot_neuron", n_post)
third = nest.Create("parrot_neuron", n_third)
with pytest.raises(nest.kernel.NESTErrors.IllegalConnection):
- nest.TripartiteConnect(pre, post, third, {"rule": "one_to_one"})
+ nest.TripartiteConnect(pre, post, third, {"rule": "one_to_one"}, {"rule": "one_to_one"})
+
+
+def test_tripartite_rejects_make_symmetric():
+ n_pre, n_post, n_third = 4, 4, 8
+ pre = nest.Create("parrot_neuron", n_pre)
+ post = nest.Create("parrot_neuron", n_post)
+ third = nest.Create("parrot_neuron", n_third)
+
+ with pytest.raises(nest.kernel.NESTErrors.BadProperty):
+ nest.TripartiteConnect(
+ pre,
+ post,
+ third,
+ {"rule": "one_to_one", "make_symmetric": True},
+ {"rule": "third_factor_bernoulli_with_pool"},
+ )
+
+
+@pytest.mark.skipif_missing_threads
+@pytest.mark.parametrize(
+ "connspec, num_conns_expected",
+ [
+ ({"rule": "one_to_one"}, 6),
+ ({"rule": "all_to_all"}, 36),
+ ({"rule": "fixed_indegree", "indegree": 3}, 18),
+ ({"rule": "fixed_outdegree", "outdegree": 3}, 18),
+ ({"rule": "fixed_total_number", "N": 23}, 23),
+ ({"rule": "pairwise_bernoulli", "p": 1}, 36),
+ ],
+)
+def test_third_works_for_all_primary_rules(connspec, num_conns_expected):
+ nest.local_num_threads = 4
+ n = 6 # if this is changed, number of expected connection must be adjusted above
+ pre = nest.Create("parrot_neuron", n)
+ post = nest.Create("parrot_neuron", n)
+ third = nest.Create("parrot_neuron", 5)
+
+ nest.TripartiteConnect(pre, post, third, connspec, {"rule": "third_factor_bernoulli_with_pool", "p": 1.0})
+
+ assert len(nest.GetConnections(pre, post)) == num_conns_expected
+ assert len(nest.GetConnections(pre, third)) == num_conns_expected
+ assert len(nest.GetConnections(third, post)) == num_conns_expected
@pytest.mark.skipif_missing_threads
@@ -141,7 +200,11 @@ def test_sliced_third():
third = (nrn[:3] + nrn[5:])[::3]
nest.TripartiteConnect(
- nrn, nrn, third, {"rule": "tripartite_bernoulli_with_pool", "pool_type": "random", "pool_size": 2}
+ nrn,
+ nrn,
+ third,
+ {"rule": "all_to_all"},
+ {"rule": "third_factor_bernoulli_with_pool", "pool_type": "random", "pool_size": 2},
)
t_in = nest.GetConnections(target=third)
@@ -162,7 +225,8 @@ def test_connect_complex_synspecs():
pre,
post,
third,
- {"rule": "tripartite_bernoulli_with_pool", "p_primary": 1.0, "p_third_if_primary": 1},
+ {"rule": "pairwise_bernoulli", "p": 1.0},
+ {"rule": "third_factor_bernoulli_with_pool", "p": 1.0},
{
"primary": nest.CollocatedSynapses(
{"synapse_model": "stdp_synapse", "weight": 2.0}, {"synapse_model": "tsodyks_synapse", "delay": 3.0}