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}