49 for (
int i = 0; i < D; ++i )
51 displ[ i ] -= from_pos[ i ];
54 displ[ i ] = -0.5 * extent_[ i ] + std::fmod( displ[ i ] + 0.5 * extent_[ i ], extent_[ i ] );
55 if ( displ[ i ] < -0.5 * extent_[ i ] )
57 displ[ i ] += extent_[ i ];
67 const std::vector< double >& to_pos,
68 const unsigned int dimension )
const
70 double displacement = to_pos[ dimension ] - from_pos[ dimension ];
71 if ( periodic_[ dimension ] )
86 periodic_ = ( 1 << D ) - 1;
95 d[
names::extent ] = std::vector< double >( extent_.get_vector() );
96 d[
names::center ] = std::vector< double >( ( lower_left_ + extent_ / 2 ).get_vector() );
98 if ( periodic_.none() )
102 else if ( periodic_.count() == D )
125 assert( target_abs );
130 connector.
connect( *
this, source_nc, tgt, target_nc );
132 catch ( std::bad_cast& e )
134 throw BadProperty(
"Target layer must have same number of dimensions as source layer." );
139std::shared_ptr< Ntree< D, size_t > >
142 if ( cached_ntree_md_ == node_collection->get_metadata() )
144 assert( cached_ntree_.get() );
145 return cached_ntree_;
148 clear_ntree_cache_();
150 cached_ntree_ = std::shared_ptr< Ntree< D, size_t > >(
153 return do_get_global_positions_ntree_( node_collection );
157std::shared_ptr< Ntree< D, size_t > >
163 clear_ntree_cache_();
164 clear_vector_cache_();
167 for (
int i = 0; i < D; ++i )
169 if ( not periodic[ i ] )
171 extent[ i ] = extent_[ i ];
172 lower_left[ i ] = lower_left_[ i ];
177 std::shared_ptr< Ntree< D, size_t > >(
new Ntree< D, size_t >( this->lower_left_, extent, periodic ) );
179 do_get_global_positions_ntree_( node_collection );
184 return cached_ntree_;
188std::shared_ptr< Ntree< D, size_t > >
191 if ( cached_vector_md_ == node_collection->get_metadata() )
194 std::copy( cached_vector_->begin(), cached_vector_->end(), std::back_inserter( *cached_ntree_ ) );
198 insert_global_positions_ntree_( *cached_ntree_, node_collection );
201 clear_vector_cache_();
203 cached_ntree_md_ = node_collection->get_metadata();
205 return cached_ntree_;
209std::vector< std::pair< Position< D >,
size_t > >*
212 if ( cached_vector_md_ == node_collection->get_metadata() )
214 assert( cached_vector_ );
215 return cached_vector_;
218 clear_vector_cache_();
220 cached_vector_ =
new std::vector< std::pair< Position< D >,
size_t > >;
222 if ( cached_ntree_md_ == node_collection->get_metadata() )
226 typename std::back_insert_iterator< std::vector< std::pair< Position< D >,
size_t > > > to =
227 std::back_inserter( *cached_vector_ );
236 insert_global_positions_vector_( *cached_vector_, node_collection );
239 clear_ntree_cache_();
241 cached_vector_md_ = node_collection->get_metadata();
243 return cached_vector_;
247std::vector< std::pair< Position< D >,
size_t > >
250 bool allow_oversized,
253 MaskedLayer< D > masked_layer( *
this, mask, allow_oversized, node_collection );
254 std::vector< std::pair< Position< D >,
size_t > > positions;
259 positions.push_back( *iter );
268 const std::vector< double >& anchor,
269 bool allow_oversized,
272 MaskedLayer< D > masked_layer( *
this, mask, allow_oversized, node_collection );
273 std::vector< size_t > nodes;
276 nodes.push_back( i->second );
286 it < this->node_collection_->end();
289 out << ( *it ).node_id <<
' ';
300 const std::string& syn_model )
311 std::vector< std::pair< Position< D >,
size_t > >* src_vec = get_global_positions_vector( node_collection );
314 size_t previous_source_node_id = 0;
316 for (
const auto& conn : connectome )
318 const size_t source_node_id = conn.get_source_node_id();
321 if ( source_node_id != previous_source_node_id )
323 const auto it = std::find_if( src_vec->begin(),
325 [ source_node_id ](
const std::pair<
Position< D >,
size_t >& p ) { return p.second == source_node_id; } );
326 assert( it != src_vec->end() );
328 source_pos = it->first;
329 previous_source_node_id = source_node_id;
333 conn.get_target_node_id(),
334 conn.get_target_thread(),
335 conn.get_synapse_model_id(),
343 const long tnode_lid = tgt_layer->
node_collection_->get_nc_index( target_node_id );
344 assert( tnode_lid >= 0 );
347 out << source_node_id <<
' ' << target_node_id <<
' ' << weight <<
' ' << delay <<
' ';
348 tgt_layer->compute_displacement( source_pos, tnode_lid ).print( out );
357 if ( not mask_.get() )
370 if ( grid_layer == 0 )
372 throw BadProperty(
"Grid masks can only be used with grid layers." );
378 if ( not allow_oversized )
380 bool oversize =
false;
381 for (
int i = 0; i < D; ++i )
389 "Mask size must not exceed layer size; set allow_oversized_mask to "
397 const double y = lower_left[ 1 ];
398 lower_left[ 1 ] = -upper_right[ 1 ];
399 upper_right[ 1 ] = -y;
403 catch ( std::bad_cast& )
412 if ( not allow_oversized )
414 const Box< D > bb = mask.get_bbox();
415 bool oversize =
false;
416 for (
int i = 0; i < D; ++i )
424 "Mask size must not exceed layer size; set allow_oversized_mask to "
429 catch ( std::bad_cast& )
431 throw BadProperty(
"Mask is incompatible with layer." );
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
T get(const std::string &key) const
Get the value at key in the specified type.
Definition dictionary.h:710
Abstract base class for Layers of unspecified dimension.
Definition layer.h:52
NodeCollectionPTR node_collection_
The NodeCollection to which the layer belongs.
Definition layer.h:182
Mask which covers all of space.
Definition mask.h:155
Exception to be thrown if a status parameter is incomplete or inconsistent.
Definition exceptions.h:680
Mask defining a box region.
Definition mask.h:209
This class is a representation of the dictionary of connection properties given as an argument to the...
Definition connection_creator.h:63
void connect(Layer< D > &source, NodeCollectionPTR source_nc, Layer< D > &target, NodeCollectionPTR target_nc)
Connect two layers.
Definition connection_creator_impl.h:38
Dictionary get_synapse_status(const size_t source_node_id, const size_t target_node_id, const size_t tid, const synindex syn_id, const size_t lcid) const
Definition connection_manager.cpp:235
std::deque< ConnectionID > get_connections(const Dictionary ¶ms)
Return connections between pairs of neurons.
Definition connection_manager.cpp:1081
Layer with neurons placed in a grid.
Definition grid_layer.h:40
Position< D, size_t > get_dims() const
Definition grid_layer.h:169
Mask defined in terms of grid points rather than spacial coordinates.
Definition grid_mask.h:40
Position< D, int > get_lower_right() const
Definition grid_mask.h:95
Position< D, int > get_upper_left() const
Definition grid_mask.h:89
Abstract base class for Layer of given dimension (D=2 or 3).
Definition layer.h:218
std::shared_ptr< Ntree< D, size_t > > get_global_positions_ntree(NodeCollectionPTR node_collection)
Get positions for all nodes in layer, including nodes on other MPI processes.
Definition layer_impl.h:140
Position< D > compute_displacement(const Position< D > &from_pos, const Position< D > &to_pos) const
Returns displacement of a position from another position.
Definition layer_impl.h:46
static std::vector< std::pair< Position< D >, size_t > > * cached_vector_
Definition layer.h:447
std::shared_ptr< Ntree< D, size_t > > do_get_global_positions_ntree_(NodeCollectionPTR node_collection)
Definition layer_impl.h:189
void set_status(const Dictionary &) override
Change properties of the layer according to the entries in the dictionary.
Definition layer_impl.h:80
void connect(NodeCollectionPTR source_nc, AbstractLayerPTR target, NodeCollectionPTR target_nc, ConnectionCreator &connector) override
Connect this layer to the given target layer.
Definition layer_impl.h:117
void dump_nodes(std::ostream &os) const override
Write layer data to stream.
Definition layer_impl.h:283
std::bitset< D > get_periodic_mask() const
Definition layer.h:277
std::vector< size_t > get_global_nodes(const MaskPTR mask, const std::vector< double > &anchor, bool allow_oversized, NodeCollectionPTR node_collection) override
Return a vector with the node IDs of the nodes inside the mask.
Definition layer_impl.h:267
const Position< D > & get_extent() const
Definition layer.h:259
void get_status(Dictionary &, NodeCollection const *const) const override
Retrieve status, slice according to node collection if given.
Definition layer_impl.h:93
static std::shared_ptr< Ntree< D, size_t > > cached_ntree_
Global position information for a single layer.
Definition layer.h:446
void dump_connections(std::ostream &out, NodeCollectionPTR node_collection, AbstractLayerPTR target_layer, const std::string &syn_model) override
Dumps information about all connections of the given type having their source in the given layer to t...
Definition layer_impl.h:297
std::vector< std::pair< Position< D >, size_t > > * get_global_positions_vector(NodeCollectionPTR node_collection)
Definition layer_impl.h:210
Abstract base class for masks with given dimension.
Definition mask.h:101
Class for applying masks to layers.
Definition layer.h:458
void check_mask_(Layer< D > &layer, bool allow_oversized)
Will check that the mask can be applied to the layer.
Definition layer_impl.h:355
Ntree< D, size_t >::masked_iterator begin(const Position< D > &anchor)
Iterate over nodes inside mask.
Definition layer.h:570
Ntree< D, size_t >::masked_iterator end()
Definition layer.h:584
Superclass for NodeCollections.
Definition node_collection.h:565
virtual size_t size() const =0
Get the size of the NodeCollection.
Iterator iterating the nodes in a Quadtree.
Definition ntree.h:69
Iterator iterating the nodes in a Quadtree inside a Mask.
Definition ntree.h:153
A Ntree object represents a subtree or leaf in a Ntree structure.
Definition ntree.h:55
Iterator for NodeCollections.
Definition node_collection.h:415
ConnectionManager connection_manager
Definition kernel_manager.h:239
const std::string delay("delay")
const std::string network_size("network_size")
const std::string center("center")
const std::string edge_wrap("edge_wrap")
const std::string target("target")
const std::string weight("weight")
const std::string extent("extent")
const std::string source("source")
const std::string synapse_model("synapse_model")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
std::shared_ptr< AbstractMask > MaskPTR
Definition mask.h:44
KernelManager & kernel()
Definition kernel_manager.h:311
std::shared_ptr< AbstractLayer > AbstractLayerPTR
Definition layer.h:46
std::shared_ptr< NodeCollectionMetadata > NodeCollectionMetadataPTR
Definition node_collection.h:51
std::vector< std::vector< double > > displacement(NodeCollectionPTR layer_to_nc, NodeCollectionPTR layer_from_nc)
Definition spatial.cpp:137
std::shared_ptr< NodeCollection > NodeCollectionPTR
Definition node_collection.h:50
std::vector< std::vector< double > > get_position(NodeCollectionPTR layer_nc)
Definition spatial.cpp:83
A box is defined by the lower left corner (minimum coordinates) and the upper right corner (maximum c...
Definition position.h:321
Position< D > lower_left
Definition position.h:331
Position< D > upper_right
Definition position.h:332