ArrayDatum get_children( const index node_id, const DictionaryDatum& params, const bool include_remotes ) { Subnet* subnet = dynamic_cast< Subnet* >( kernel().node_manager.get_node( node_id ) ); if ( subnet == NULL ) { throw SubnetExpected(); } LocalChildList localnodes( *subnet ); ArrayDatum result; std::vector< MPIManager::NodeAddressingData > globalnodes; if ( params->empty() ) { kernel().mpi_manager.communicate( localnodes, globalnodes, include_remotes ); } else { kernel().mpi_manager.communicate( localnodes, globalnodes, params, include_remotes ); } result.reserve( globalnodes.size() ); for ( std::vector< MPIManager::NodeAddressingData >::iterator n = globalnodes.begin(); n != globalnodes.end(); ++n ) { result.push_back( new IntegerDatum( n->get_gid() ) ); } return result; }
void NodeManager::go_to( index n ) { if ( Subnet* target = dynamic_cast< Subnet* >( get_node( n ) ) ) { current_ = target; } else { throw SubnetExpected(); } }
void change_subnet( const index node_gid ) { if ( kernel().node_manager.get_node( node_gid )->is_subnet() ) { kernel().node_manager.go_to( node_gid ); } else { throw SubnetExpected(); } }
void NodeManager::print( index p, int depth ) { Subnet* target = dynamic_cast< Subnet* >( get_node( p ) ); if ( target != NULL ) { std::cout << target->print_network( depth + 1, 0 ); } else { throw SubnetExpected(); } }
ArrayDatum get_nodes( const index node_id, const DictionaryDatum& params, const bool include_remotes, const bool return_gids_only ) { Subnet* subnet = dynamic_cast< Subnet* >( kernel().node_manager.get_node( node_id ) ); if ( subnet == NULL ) throw SubnetExpected(); LocalNodeList localnodes( *subnet ); std::vector< MPIManager::NodeAddressingData > globalnodes; if ( params->empty() ) { kernel().mpi_manager.communicate( localnodes, globalnodes, include_remotes ); } else { kernel().mpi_manager.communicate( localnodes, globalnodes, params, include_remotes ); } ArrayDatum result; result.reserve( globalnodes.size() ); for ( std::vector< MPIManager::NodeAddressingData >::iterator n = globalnodes.begin(); n != globalnodes.end(); ++n ) { if ( return_gids_only ) { result.push_back( new IntegerDatum( n->get_gid() ) ); } else { DictionaryDatum* node_info = new DictionaryDatum( new Dictionary ); ( **node_info )[ names::global_id ] = n->get_gid(); ( **node_info )[ names::vp ] = n->get_vp(); ( **node_info )[ names::parent ] = n->get_parent_gid(); result.push_back( node_info ); } } return result; }
void nest::cg_connect( nest::ConnectionGeneratorDatum& cg, const index source_id, const index target_id, const DictionaryDatum& params_map, const Name& synmodel_name ) { Subnet* sources = dynamic_cast< Subnet* >( kernel().node_manager.get_node( source_id ) ); if ( sources == NULL ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "sources must be a subnet." ); throw SubnetExpected(); } if ( !sources->is_homogeneous() ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "sources must be a homogeneous subnet." ); throw BadProperty(); } if ( dynamic_cast< Subnet* >( *sources->local_begin() ) ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "Only 1-dim subnets are supported as sources." ); throw BadProperty(); } Subnet* targets = dynamic_cast< Subnet* >( kernel().node_manager.get_node( target_id ) ); if ( targets == NULL ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "targets must be a subnet." ); throw SubnetExpected(); } if ( !targets->is_homogeneous() ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "targets must be a homogeneous subnet." ); throw BadProperty(); } if ( dynamic_cast< Subnet* >( *targets->local_begin() ) ) { LOG( M_ERROR, "CGConnect_cg_i_i_D_l", "Only 1-dim subnets are supported as targets." ); throw BadProperty(); } const Token synmodel = kernel().model_manager.get_synapsedict()->lookup( synmodel_name ); if ( synmodel.empty() ) throw UnknownSynapseType( synmodel_name.toString() ); const index synmodel_id = static_cast< index >( synmodel ); const modelrange source_range = kernel().modelrange_manager.get_contiguous_gid_range( ( *sources->local_begin() )->get_gid() ); index source_offset = source_range.get_first_gid(); RangeSet source_ranges; source_ranges.push_back( Range( source_range.get_first_gid(), source_range.get_last_gid() ) ); const modelrange target_range = kernel().modelrange_manager.get_contiguous_gid_range( ( *targets->local_begin() )->get_gid() ); index target_offset = target_range.get_first_gid(); RangeSet target_ranges; target_ranges.push_back( Range( target_range.get_first_gid(), target_range.get_last_gid() ) ); cg_connect( cg, source_ranges, source_offset, target_ranges, target_offset, params_map, synmodel_id ); }