472 throw IllegalConnection(
"Spatial Connect with fixed_indegree to devices is not possible." );
491 const auto masked_source_end = masked_source.
end();
493 std::vector< std::pair< Position< D >,
size_t > > positions;
497 size_t target_id = ( *tgt_it ).node_id;
502 Position< D > target_pos = target.get_position( ( *tgt_it ).nc_index );
507 std::vector< double > source_pos_vector( D );
508 const std::vector< double > target_pos_vector = target_pos.
get_vector();
510 unsigned long target_number_connections =
514 positions.resize( std::distance( masked_source.
begin( target_pos ), masked_source_end ) );
515 std::copy( masked_source.
begin( target_pos ), masked_source_end, positions.begin() );
524 std::vector< double > probabilities;
525 probabilities.reserve( positions.size() );
528 for (
typename std::vector< std::pair<
Position< D >,
size_t > >::iterator iter = positions.begin();
529 iter != positions.end();
532 iter->first.get_vector( source_pos_vector );
533 probabilities.push_back(
kernel_->value( rng, source_pos_vector, target_pos_vector, source, tgt ) );
536 if ( positions.empty()
537 or ( not
allow_autapses_ and ( positions.size() == 1 ) and positions[ 0 ].second == target_id )
538 or ( not
allow_multapses_ and ( positions.size() < target_number_connections ) ) )
540 std::string msg = String::compose(
"Global target ID %1: Not enough sources found inside mask", target_id );
548 lottery.
param( param );
552 std::vector< bool > is_selected( positions.size() );
555 while ( target_number_connections > 0 )
557 size_t random_id = lottery( rng );
563 size_t source_id = positions[ random_id ].second;
568 positions[ random_id ].first.get_vector( source_pos_vector );
571 const double w =
weight_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
572 const double d =
delay_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
577 is_selected[ random_id ] =
true;
578 --target_number_connections;
586 if ( positions.empty()
587 or ( not
allow_autapses_ and ( positions.size() == 1 ) and positions[ 0 ].second == target_id )
588 or ( not
allow_multapses_ and ( positions.size() < target_number_connections ) ) )
590 std::string msg = String::compose(
"Global target ID %1: Not enough sources found inside mask", target_id );
596 std::vector< bool > is_selected( positions.size() );
599 while ( target_number_connections > 0 )
601 const size_t random_id = rng->
ulrand( positions.size() );
606 positions[ random_id ].first.get_vector( source_pos_vector );
607 const size_t source_id = positions[ random_id ].second;
610 const double w =
weight_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
611 const double d =
delay_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
616 is_selected[ random_id ] =
true;
617 --target_number_connections;
627 std::vector< std::pair< Position< D >,
size_t > >* positions = source.get_global_positions_vector( source_nc );
631 size_t target_id = ( *tgt_it ).node_id;
635 Position< D > target_pos = target.get_position( ( *tgt_it ).nc_index );
639 std::vector< double > source_pos_vector( D );
640 const std::vector< double > target_pos_vector = target_pos.
get_vector();
642 if ( ( positions->size() == 0 )
643 or ( not
allow_autapses_ and ( positions->size() == 1 ) and ( ( *positions )[ 0 ].second == target_id ) )
644 or ( not
allow_multapses_ and ( positions->size() < target_number_connections ) ) )
646 std::string msg = String::compose(
"Global target ID %1: Not enough sources found", target_id );
657 std::vector< double > probabilities;
658 probabilities.reserve( positions->size() );
661 for (
typename std::vector< std::pair<
Position< D >,
size_t > >::iterator iter = positions->begin();
662 iter != positions->end();
665 iter->first.get_vector( source_pos_vector );
666 probabilities.push_back(
kernel_->value( rng, source_pos_vector, target_pos_vector, source, tgt ) );
673 lottery.
param( param );
677 std::vector< bool > is_selected( positions->size() );
680 while ( target_number_connections > 0 )
682 const size_t random_id = lottery( rng );
688 const size_t source_id = ( *positions )[ random_id ].second;
694 ( *positions )[ random_id ].first.get_vector( source_pos_vector );
697 const double w =
weight_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
698 const double d =
delay_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
703 is_selected[ random_id ] =
true;
704 --target_number_connections;
714 std::vector< bool > is_selected( positions->size() );
717 while ( target_number_connections > 0 )
719 const size_t random_id = rng->
ulrand( positions->size() );
725 const size_t source_id = ( *positions )[ random_id ].second;
731 ( *positions )[ random_id ].first.get_vector( source_pos_vector );
734 const double w =
weight_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
735 const double d =
delay_[ indx ]->value( rng, source_pos_vector, target_pos_vector, source, tgt );
740 is_selected[ random_id ] =
true;
741 --target_number_connections;
764 throw IllegalConnection(
"Spatial Connect with fixed_outdegree to devices is not possible." );
785 const auto masked_target_end = masked_target.
end();
790 std::vector< std::pair< Position< D >,
size_t > > target_pos_node_id_pairs;
791 std::vector< std::pair< Position< D >,
size_t > > source_pos_node_id_pairs =
792 *source.get_global_positions_vector( source_nc );
794 for (
const auto& source_pos_node_id_pair : source_pos_node_id_pairs )
796 const Position< D > source_pos = source_pos_node_id_pair.first;
797 const size_t source_id = source_pos_node_id_pair.second;
799 const std::vector< double > source_pos_vector = source_pos.
get_vector();
804 std::vector< double > target_pos_vector( D );
805 std::vector< double > probabilities;
809 target_pos_node_id_pairs.resize( std::distance( masked_target.
begin( source_pos ), masked_target_end ) );
810 std::copy( masked_target.
begin( source_pos ), masked_target_end, target_pos_node_id_pairs.begin() );
812 probabilities.reserve( target_pos_node_id_pairs.size() );
815 for (
const auto& target_pos_node_id_pair : target_pos_node_id_pairs )
818 target_pos_node_id_pair.first.get_vector( target_pos_vector );
820 probabilities.push_back(
kernel_->value( grng, source_pos_vector, target_pos_vector, source, tgt ) );
825 probabilities.resize( target_pos_node_id_pairs.size(), 1.0 );
830 if ( target_pos_node_id_pairs.empty()
831 or ( not
allow_multapses_ and target_pos_node_id_pairs.size() < number_of_connections ) )
833 std::string msg = String::compose(
"Global source ID %1: Not enough targets found", source_id );
841 lottery.
param( param );
845 std::vector< bool > is_selected( target_pos_node_id_pairs.size() );
848 while ( number_of_connections > 0 )
855 const size_t target_id = target_pos_node_id_pairs[ random_id ].second;
861 is_selected[ random_id ] =
true;
863 target_pos_node_id_pairs[ random_id ].first.get_vector( target_pos_vector );
865 std::vector< double > rng_weight_vec;
866 std::vector< double > rng_delay_vec;
867 for (
size_t indx = 0; indx <
weight_.size(); ++indx )
870 rng_weight_vec.push_back(
weight_[ indx ]->value( grng, source_pos_vector, target_pos_vector, target, tgt ) );
871 rng_delay_vec.push_back(
delay_[ indx ]->value( grng, source_pos_vector, target_pos_vector, target, tgt ) );
877 --number_of_connections;
878 if ( not
kernel().node_manager.is_local_node_id( target_id ) )
884 const size_t target_thread = target_ptr->
get_thread();
893 rng_delay_vec[ indx ],
894 rng_weight_vec[ indx ] );