/* * nest-init.sli * * 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 <http://www.gnu.org/licenses/>. * */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% NEST Kernel 2 initialisation %% %% (C) 2000-2006 The NEST Initiative %% %% Authors Marc-Oliver Gewaltig <marc-oliver.gewaltig@honda-ri.de> %% Markus Diesmann <diesmann@fz-juelich.de> %% Jochen Martin Eppler <eppler@fz-juelich.de> %% M_DEBUG (nest-init.sli) (Initializing SLI support for NEST Kernel.) message % see nestmodule.cpp /nest-init /SLI ($Revision: 10474 $) provide-component /nest-init /C++ (1.157) require-component statusdict begin /kernellibrevision ($Revision: 10474 $) % SVN/CVS revision number (unique) def end % Add NEST example directory to search-path statusdict /prgdocdir get (/examples) join addpath statusdict /prgdocdir get (/examples/FacetsBenchmarks) join addpath /test { statusdict/prgdatadir :: (/extras/do_tests.sh ) join statusdict/prefix :: (/bin/nest) join join system ; ; } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % add new functions to trie if it exists, else create new /SetStatus dup lookup not { trie } if [/integertype /dictionarytype] /SetStatus_id load addtotrie [/connectiontype /dictionarytype] /SetStatus_CD load addtotrie def % add new functions to trie if it exists, else create new /GetStatus dup lookup not { trie } if [/integertype] /GetStatus_i load addtotrie [/connectiontype] /GetStatus_C load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % These variants of get access network elements represented by % a gid like dictionaries. In particular, if a gid returns a dictionary, % get can be used to acces the contents of the nested objects. % 071108, Diesmann % /get [/integertype /literaltype] {exch GetStatus exch get} def /get [/integertype /arraytype] {exch GetStatus exch get_d_a} def % Same as above for connections % 100922, Diesmann /get [/connectiontype /literaltype] {exch GetStatus exch get} def /get [/connectiontype /arraytype] {exch GetStatus exch get_d_a} def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Simulate trie [/integertype] {cvd Simulate} addtotrie [/doubletype] /Simulate_d load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /cvdict trie [/connectiontype] /cvdict_C load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /GetResolution { 0 GetStatus /resolution get } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create and variants % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Create_l { 1 Create_l_i } def /Create_l_D { 1 exch Create_l_i_D } def /Create_l_i_D { << >> begin /params Set /n Set /model Set % Only store the old parameters that are present in params. model GetDefaults /oldparams Set /tmp << >> def % get implicitly checks if params contains 'illegal' keys params keys { /key Set tmp key oldparams key get put } forall tmp /oldparams Set model params SetDefaults model n Create_l_i model oldparams SetDefaults end % local namespace } def /Create trie [/literaltype ] /Create_l load addtotrie [/literaltype /integertype ] /Create_l_i load addtotrie [/literaltype /dictionarytype] /Create_l_D load addtotrie [/literaltype /integertype /dictionarytype] /Create_l_i_D load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Model handling % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /CopyModel_l_l { << >> CopyModel_l_l_D } bind def /CopyModel trie [/literaltype /literaltype ] /CopyModel_l_l load addtotrie [/literaltype /literaltype /dictionarytype] /CopyModel_l_l_D load addtotrie def /SetDefaults [/literaltype /dictionarytype] /SetDefaults_l_D load def /GetDefaults [/literaltype] /GetDefaults_l load def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: ShowDefaults - Show the default parameters of a model. Synopsis: /modelname ShowDefaults -> - Description: ShowDefaults retrieves the dictionary of default values from the specified model and displays it, using info. ShowDefaults is equivalent to the sequence "GetDefaults info" SeeAlso: GetDefaults, info */ /ShowDefaults { GetDefaults info } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Connect and its variants % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: Connect - Establish a connection between two nodes. Synopsis: sgid tgid Connect -> - sgid tgid /synmodel Connect -> - sgid tgid weight delay Connect -> - sgid tgid weight delay /synmodel Connect -> - sgid tgid params Connect -> - sgid tgid params /synmodel Connect -> - Parameters: sgid - Global id of the source node. tgid - Global id of the target node. weight - The weight of the connection delay - The transmission delay of the connection (in ms) params - A complete parameter dictionary for the connection /synmodel - The synapse model for the connection (see Options below) Options: /synapse_model - the default synapse model to be used for all connections. This is a convenience option for the creation of many connections of the same type. Alternatively, the synapse model can be given in each call to Connect. Description: 1. Connect establishes a connection between two nodes. 2. The parameters and dynamics of the connection are determined by the synapse model. The model can be given in the call to Connect. The default model can be set as an Option. SeeAlso: ConvergentConnect, DivergentConnect, synapsedict */ /Connect << /synapse_model /static_synapse >> Options /Connect_main trie [/integertype /integertype /literaltype] /Connect_i_i_l load addtotrie [/integertype /integertype /doubletype /doubletype /literaltype] /Connect_i_i_d_d_l load addtotrie [/integertype /integertype /dictionarytype /literaltype] /Connect_i_i_D_l load addtotrie def /Connect [/literaltype] { Connect_main } def /Connect [/anytype] { /Connect /synapse_model GetOption Connect_main } def /* BeginDocumentation Name: GetConnections - Retrieve connections between nodes Synopsis: << /source [sgid1 sgid2 ...] /target [tgid1 tgid2 ...] /synapse_model /smodel >> GetConnections -> [ conn1 conn2 ... ] Parameters: A dictionary that may contain the following fields (all are optional): /source - array with GIDs of presynaptic nodes whose connections are sought. If not given, all neurons are searched as sources. /target - array with GIDs of post-synaptic nodes whose connections are sought. If not given, all neurons are searched as targets. /synapse_model - literal specifying synapse model If not given, connections of all synapse models are returned. Description: 1. If called with an empty dictionary, GetConnections returns all connections of the network, as a list of arrays (IntVectorDatum), one array per connection. 2. Each array (connection object) has the following elements: [source-gid target-gid target-thread synapse-model-id port] 3. The optional dictionary elements /source and /target can be used to filter for specific pre- and post-synaptic neurons, respectively. 4. The optional parameter /synapse_model can be used to filter for a specific synapse model. 5. In a parallel simulation, GetConnections only returns connections with *targets* on the MPI process executing the function. Remarks: 1. See synapsedict for the synapse-model-id's for all synapse models. 2. The "port" enumerates connections per source, thread and synapse model. It is mainly important for NEST internally. 3. In OpenMP mode, GetConnections works thread-parallel for better performance. 4. Connection objects can be converted to SLI lists with cva. 5. Connection objects can be passed to SetSynapseStatus, GetSynapseStatus, and DataConnect SeeAlso: DataConnect, SetSynapseStatus, GetSynapseStatus, synapsedict */ /GetConnections [/dictionarytype] { dup /pdict Set [ /source /target ] { /key Set pdict key known { pdict key get ArrayQ exch ; not { key cvs ( argument must be list of GIDs) join M_ERROR message /GetConnections /ArgumentError raiseerror } if } if } forall pstack GetConnections_D Flatten } def /* BeginDocumentation Name: GetSynapseStatus - Return synapse status information Synopsis: [ conn1 conn2 ... ] GetSynapseStatus -> [ sdict1 sdict2 ... ] Parameters: An list of connection objects as returned by GetConnections. Description: Returns a list of synapse status dictionaries, one for each connection in the parameter list. Remarks: Status information is only available for connections with targets on the MPI process executing the command. See also: GetConnections, SetSynapseStatus, DataConnect */ /GetSynapseStatus [/arraytype] /GetStatus_a load def /* BeginDocumentation Name: SetSynapseStatus - Return synapse status information Synopsis: [ conn1 conn2 ... ] [ sdict1 sdict2 ... ] SetSynapseStatus -> - Parameters: An list of connection objects as returned by GetConnections and a list of synapse properties dictionaries. Description: Sets the given properties on the given connections. If the list of dictionaries contains more than one dictionary, there must be one dictionary per connection. Otherwise, the single dictionary is used for all connections. Remarks: Only some connection properties can be changed. Properties can only be changed for connections with targets on the MPI process executing SetSynapseStatus. See also: GetConnections, GetSynapseStatus, DataConnect */ /SetSynapseStatus [/arraytype /arraytype] /SetStatus_aa load def /* BeginDocumentation Name: DataConnect - Connect many neurons from data. Synopsis: 1. source dict model DataConnect_i_D_a -> - source - GID of the source neuron dict - dictionary with connection parameters model - the synapse model as string or literal 2. [dict1 dict2 .... dict_n] DataConnect_a -> - The argument is a list with synapse status dictionaries as obtained from GetStatus. Description: Variant 1: This variant is used if connectivity data is explicitly given and read from files. Connects the source neuron to targets according to the data in dict, using the synapse 'model'. Dict is a parameter dictionary that must contain at least the following fields: /target /weight /delay Other parameters depend on the synapse model. The values in the dictionaries are arrays of equal size, specifying the parameters for the respective connection. The arrays should all be of type DoubleVectorDatum (numpy.array(dtype=float)). Note that for performance reasons, target GIDs must be given as doubles rather than integers! The second variant of DataConnect can be used to re-instantiate a given connectivity matrix. The argument is a list of dictionaries, each containing at least the keys /source /target /weight /delay /synapsemodel Example: % assume a connected network << >> GetConnections /conns Set % Get all connections conns { GetStatus } Map /syns Set % retrieve their synapse status ResetKernel % clear everything % rebuild neurons syns DataConnect % restore the connecions Author: Marc-Oliver Gewaltig FirstVersion: August 2011 SeeAlso: DataConnect_i_D_s, DataConnect_a, Connect, DivergentConnect */ /DataConnect trie [/integertype /dictionarytype /literaltype] /DataConnect_i_D_s load addtotrie [/integertype /dictionarytype /stringtype] /DataConnect_i_D_s load addtotrie [/arraytype] /DataConnect_a load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /DivergentConnect_i_ia_l [/integertype /arraytype /literaltype] { [] [] % put empty arrays for weights and delays on the stack 3 2 roll DivergentConnect_i_ia_a_a_l } def /DivergentConnect_main trie [/integertype /arraytype /literaltype] /DivergentConnect_i_ia_l load addtotrie [/integertype /arraytype /arraytype /arraytype /literaltype] /DivergentConnect_i_ia_a_a_l load addtotrie def /DivergentConnect [/literaltype] { DivergentConnect_main } def /DivergentConnect [/anytype] { /Connect /synapse_model GetOption DivergentConnect_main } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* CheckMultapseAutapseConstraints Ensure that connection request can be fulfilled under given multapse and autapse constraints (cf #451). Can be called from either RandomConvergentConnect (RCC) or RandomDivergentConnect (RDC). Returns only if no problem. Arguments: pool - list of source (RCC) or target (RDC) nodes pole - target (RCC) or source (RDC) node N - number of connections requested mult - allow_multapses aut - allow_autapses caller - literal identifying calling function (/RCC or /RDC) Endless loop would results if multapses prohibited a) and N > len(pool) b) and N == len(pool), autapses prohibited and pole in pool c) Endless loop also if autapses prohibited and pole is only node in pool */ /CheckMultapseAutapseConstraints %[/arraytype /integertype /integertype /booltype /booltype /literaltype] { % open phrase dictionary for current caller << /RCC << /caller /RandomConvergentConnect /emptyPoolMsg (Source array must not be empty.) /smallPoolMsg (Multapses prohibited and fewer sources than connections.) /smallPoolNoAutapseMsg (Multapses and autapses prohibited and fewer sources than connections.) /poolEqualsPoleMsg (Autapses prohibited and all sources equal target.) >> /RDC << /caller /RandomDivergentConnect /emptyPoolMsg (Target array must not be empty.) /smallPoolMsg (Multapses prohibited and fewer targets than connections.) /smallPoolNoAutapseMsg (Multapses and autapses prohibited and fewer targets than connections.) /poolEqualsPoleMsg (Autapses prohibited and all targets equal source.) >> >> exch get begin % local dictionary << >> begin /allow_autapses Set /allow_multapses Set /N Set /pole Set /pool Set /pool_size pool length def pool_size 0 eq { emptyPoolMsg M_ERROR message caller /ArgumentError raiseerror } if allow_multapses not { N pool_size gt { % case a) smallPoolMsg M_ERROR message caller /ArgumentError raiseerror } { N pool_size eq allow_autapses not and { % put MemberQ test in here to avoid unneccesary eval pool pole MemberQ { % case b) smallPoolNoAutapseMsg M_ERROR message caller /ArgumentError raiseerror } if } if } ifelse % warn if long runtime expected N 0.9 pool_size mul gt { (Multapses are prohibited and you request more than 90% connectivity.) ( Expect long connecting times!) join M_WARNING message } if } if % allow_multapses not allow_autapses not { pool pole HasDifferentMemberQ not { poolEqualsPoleMsg M_ERROR message caller /ArgumentError raiseerror } if } if end % close local dict end % close caller phrase dict } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: RandomDivergentConnect - Randomly connect a population of nodes to a target node. Synopsis: source n [targets] RandomDivergentConnect -> - source n [targets] /synmodel RandomDivergentConnect -> - source n [targets] [weights] [delays] RandomDivergentConnect -> - source n [targets] [weights] [delays] /synmodel RandomDivergentConnect -> - Parameters: source - GID of source node n - number of connections to be established [targets] - array of (global IDs of) potential target nodes weights - A list of n or 1 weight(s) delays - A list of n or 1 delay(s) /synmodel - The synapse model for the connection (see Options below) Options: allow_autapses - controls, whether self connections can be produced. allow_multapses - controls, whether multiple selections are possible. If not given, the synapse model is taken from the Options dictionary of the Connect command. Description: This function connects a given source node with a random collection of n randomly chosen target nodes from the specified array. The targets are chosen with uniform probability. Whether multiple synapses between a pair of nodes are allowed can be controlled by the option allow_multapses. Self connections are controlled by the option allow_autapses. Author: Tobias Potjans, Moritz Helias, Jochen Martin Eppler SeeAlso: Connect, DivergentConnect, ConvergentConnect, RandomConvergentConnect */ % default options /RandomDivergentConnect << /allow_multapses true /allow_autapses true >> Options % this function checks for impossible multapse/autapse requirements % before passing the call to the C++ level /RandomDivergentConnect_i_i_ia_da_da_b_b_l_wrapper { % << >> begin % copy arguments required for checks 1 pick /aut_ok Set 2 pick /mult_ok Set 5 pick /tgts Set 6 pick /:RDC_N Set 7 pick /src Set tgts src :RDC_N mult_ok aut_ok /RDC CheckMultapseAutapseConstraints % we only get here if check went through RandomDivergentConnect_i_i_ia_da_da_b_b_l % end } bind def /RandomDivergentConnect_i_i_ia_l { [] [] % empty arrays of weight and delay /RandomDivergentConnect /allow_multapses GetOption /RandomDivergentConnect /allow_autapses GetOption 5 4 roll RandomDivergentConnect_i_i_ia_da_da_b_b_l_wrapper } bind def /RandomDivergentConnect_i_i_ia_b_b_l { [] 4 -3 roll % empty weight array [] 4 -3 roll % empty delay array RandomDivergentConnect_i_i_ia_da_da_b_b_l_wrapper } def /RandomDivergentConnect_i_i_ia_da_da_l { /RandomDivergentConnect /allow_multapses GetOption /RandomDivergentConnect /allow_autapses GetOption 3 2 roll RandomDivergentConnect_i_i_ia_da_da_b_b_l_wrapper } def /RandomDivergentConnect_main trie [/integertype /integertype /arraytype /literaltype] /RandomDivergentConnect_i_i_ia_l load addtotrie [/integertype /integertype /arraytype /booltype /booltype /literaltype] /RandomDivergentConnect_i_i_ia_b_b_l load addtotrie [/integertype /integertype /arraytype /arraytype /arraytype /literaltype] /RandomDivergentConnect_i_i_ia_da_da_l load addtotrie [/integertype /integertype /arraytype /arraytype /arraytype /booltype /booltype /literaltype] /RandomDivergentConnect_i_i_ia_da_da_b_b_l_wrapper load addtotrie def /RandomDivergentConnect [/literaltype] { RandomDivergentConnect_main } def /RandomDivergentConnect [/anytype] { /Connect /synapse_model GetOption RandomDivergentConnect_main } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /ConvergentConnect_ia_i_l [/arraytype /integertype /literaltype] { [] [] % put empty arrays for weights and delays on the stack 3 2 roll ConvergentConnect_ia_i_a_a_l } def /ConvergentConnect_main trie [/arraytype /integertype /literaltype] /ConvergentConnect_ia_i_l load addtotrie [/arraytype /integertype /arraytype /arraytype /literaltype] /ConvergentConnect_ia_i_a_a_l load addtotrie def /ConvergentConnect [/literaltype] { ConvergentConnect_main } def /ConvergentConnect [/anytype] { /Connect /synapse_model GetOption ConvergentConnect_main } def /* BeginDocumentation Name: RandomConvergentConnect - Randomly connect a population of nodes to a target node. Synopsis: [sources] target n RandomConvergentConnect -> - [sources] target n /synmodel RandomConvergentConnect -> - [sources] target n init_dict RandomConvergentConnect -> - [sources] target n init_dict /synmodel RandomConvergentConnect -> - [sources] target n [weights] [delays] RandomConvergentConnect -> - [sources] target n [weights] [delays] /synmodel RandomConvergentConnect -> - [sources] [targets] [ns] [weightss] [delayss] /synmodel RandomConvergentConnect -> - [sources] [targets] n /synmodel RandomConvergentConnect -> - Parameters: [sources] - array of (global IDs of) potential source nodes target - GID of target node [targets] - array of (global IDs of) target nodes n - number of connections to be established init_dict - dictionary used to initialize each of the established connections weights - A list of weights of size n delays - A list of delays of size n weightss - A list of lists of weights of size length(targets) x size n delayss - A list of lists delays of size length(targets) x size n /synmodel - The synapse model for the connection (see Options below) Options: allow_autapses - controls, whether self connections can be produced. allow_multapses - controls, whether multiple selections are possible. If not given, the synapse model is taken from the Options dictionary of the Connect command. Description: This function connects a given target node with a random collection of n randomly chosen source nodes from the specified array. The sources are chosen with uniform probability. Whether multiple synapses are allowed can be set via the option allow_multapses. Self connections are controlled by the option allow_autapses. In the second synopsis, init_dict is a dictionary supplied by the user to initialize each synapses' parameters. init_dict must contain a function called /InitSynapse, which is called by RandomConvergentConnect before each call to Connect. /InitSynapse expects as argument on the stack the number i (between 0 and n-1) of the connection currently to be established. A typical implementation of init_dict, which for each connection sets the value for weight and delay (stored in arrays in init_dict) of the synapse is given below: init_dict << /weights [0.3 2.2 0.1 -0.2 ...] % array of length n /delays [1.2 1.3 1.0 1.5 ...] % array of length n /InitSynapse { /i Set << /weight weights i get /delay delays i get >> SetDefaults % sets these parameters for the following call to Connect } >> def In the third synopsis, an array of weights and delays of length n each are supplied. The first connection will get weights[0], delays[0], the second weights[1], delays[1] and so on. Author: Tobias Potjans, Moritz Helias SeeAlso: Connect, ConvergentConnect, DivergentConnect, RandomDivergentConnect */ % This variant handles calls with and init_dict /RandomConvergentConnect_ia_i_i_d_l { /RandomConvergentConnect GetOptions begin << >> begin %% open local namespace for variables % stack should be unchanged in case of error % we thus pick and pop only at end /RCC_NUM_ARGS 5 def 0 pick /synmodel Set 1 pick /init_dict Set 2 pick /:RDC_N Set 3 pick /target Set 4 pick /source_neurons Set source_neurons target :RDC_N allow_multapses allow_autapses /RCC CheckMultapseAutapseConstraints target GetStatus /local get { target GetVpRNG /rngindx Set source_neurons length /Nindx Set %% list of neurons already connected to this target %% top prevent multiple connections [] /srcs Set % make N connections i=0...N-1 0 1 :RDC_N 1 sub { int /i Set % loop index % call initilizer for synapse i init_dict /InitSynapse call { source_neurons rngindx Nindx irand get % GID of source neuron on stack dup dup target neq % check if no self connection allow_autapses or % stack: gid gid True/False allow_multapses { exch pop true } { exch srcs exch MemberQ not % check if no multiple synapse } ifelse % stack: gid True/False True/False and { exit } if pop } loop %% GID of source neuron on stack dup srcs exch append /srcs Set %% append to list of incoming neurons % source neuron's GID on stack target % target neuron's GID synmodel Connect } for } if % of if target is local % all went well, we can now pop the copied args from the stack RCC_NUM_ARGS npop end % of private dictionary << >> end % of options } bind def % default options /RandomConvergentConnect << /allow_multapses true /allow_autapses true >> Options % this function checks for impossible multapse/autapse requirements % before passing the call to the C++ level /RandomConvergentConnect_ia_i_i_da_da_b_b_l_wrapper { % copy arguments required for checks 1 pick /aut_ok Set 2 pick /mult_ok Set 5 pick /:RDC_N Set 6 pick /tgt Set 7 pick /srcs Set srcs tgt :RDC_N mult_ok aut_ok /RCC CheckMultapseAutapseConstraints % we only get here if check went through RandomConvergentConnect_ia_i_i_da_da_b_b_l } bind def /RandomConvergentConnect_ia_i_i_l { [] [] % empty arrays of weight and delay /RandomConvergentConnect /allow_multapses GetOption /RandomConvergentConnect /allow_autapses GetOption 5 4 roll RandomConvergentConnect_ia_i_i_da_da_b_b_l_wrapper } bind def /RandomConvergentConnect_ia_i_i_b_b_l { [] 4 -3 roll % empty weight array [] 4 -3 roll % empty delay array RandomConvergentConnect_ia_i_i_da_da_b_b_l_wrapper } bind def /RandomConvergentConnect_ia_i_i_da_da_l { /RandomConvergentConnect /allow_multapses GetOption /RandomConvergentConnect /allow_autapses GetOption 3 2 roll RandomConvergentConnect_ia_i_i_da_da_b_b_l_wrapper } bind def /RandomConvergentConnect_ia_ia_ia_daa_daa_l { /RandomConvergentConnect /allow_multapses GetOption /RandomConvergentConnect /allow_autapses GetOption 3 2 roll RandomConvergentConnect_ia_ia_ia_daa_daa_b_b_l } bind def /RandomConvergentConnect_ia_ia_i_l { % construct an array of size(targets) entries all of which have value given by third argument 3 2 roll size [1] exch LayoutArray 4 -1 roll LayoutArray 3 2 roll [ ] % weights empty [ ] % delays empty 3 2 roll /RandomConvergentConnect /allow_multapses GetOption /RandomConvergentConnect /allow_autapses GetOption 3 2 roll RandomConvergentConnect_ia_ia_ia_daa_daa_b_b_l } bind def % all calls without init_dict are forwarded to C++ /RandomConvergentConnect_main trie [/arraytype /integertype /integertype /literaltype] /RandomConvergentConnect_ia_i_i_l load addtotrie [/arraytype /integertype /integertype /dictionarytype /literaltype] /RandomConvergentConnect_ia_i_i_d_l load addtotrie [/arraytype /integertype /integertype /booltype /booltype /literaltype] /RandomConvergentConnect_ia_i_i_b_b_l load addtotrie [/arraytype /integertype /integertype /arraytype /arraytype /literaltype] /RandomConvergentConnect_ia_i_i_da_da_l load addtotrie [/arraytype /integertype /integertype /arraytype /arraytype /booltype /booltype /literaltype] /RandomConvergentConnect_ia_i_i_da_da_b_b_l_wrapper load addtotrie [/arraytype /arraytype /arraytype /arraytype /arraytype /literaltype] /RandomConvergentConnect_ia_ia_ia_daa_daa_l load addtotrie [/arraytype /arraytype /integertype /literaltype] /RandomConvergentConnect_ia_ia_i_l load addtotrie def /RandomConvergentConnect trie [/literaltype] /RandomConvergentConnect_main load addtotrie [/anytype] { /Connect /synapse_model GetOption RandomConvergentConnect_main } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: BinomialConvergentConnect - Connect a target to a binomial number of sources. Synopsis: [sources] target c BinomialConvergentConnect -> - Parameters: [sources] - array of (global IDs of) potential source nodes target - GID of target node c - probability of a potential connection to be established Options: allow_autapses - controls, whether self connections can be produced. allow_multapses - controls, whether multiple selections are possible. Description: The function connects a given target node with each of the nodes specified in the source array with probability c. The resulting number of inputs to the target neuron is a binomially distributed random number. Hence, the name. The parameters of the distribution are the length of the source array and the connection probability c. One way to implement BinomialConnect is to draw a binomially distributed random number followed by a call of RandomConvergentConnect. Author: Diesmann SeeAlso: RandomConvergentConnect */ % default options /BinomialConvergentConnect << /allow_multapses true /allow_autapses true >> Options /BinomialConvergentConnect_ia_i_d_l { % note: protection against impossible multapse/autapse % requirements handled by RandomConvergentConnect_ia_i_b_b_l /BinomialConvergentConnect GetOptions begin << >> begin %% open local namespace for variables /synmodel Set /c Set /target Set dup /source_neurons Set length /n Set target GetStatus /local get { target GetVpRNG /rng Set rng rdevdict /binomial get CreateRDV /bino Set bino << /p c /n n >> SetStatus source_neurons target bino Random allow_multapses allow_autapses synmodel RandomConvergentConnect_ia_i_i_b_b_l } if % of if target is local end } def /BinomialConvergentConnect_main trie [/arraytype /integertype /doubletype /literaltype] /BinomialConvergentConnect_ia_i_d_l load addtotrie def /BinomialConvergentConnect [/literaltype] { RandomConvergentConnect_main } def /BinomialConvergentConnect [/anytype] { /Connect /synapse_model GetOption RandomConvergentConnect_main } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*BeginDocumentation Name: FindConnections - Find connections that fulfill the given criteria Synopsis: dict FindConnections -> [c1 c2 ... cn] Parameters: The given dictionary may contain the following entries /source gid - The GID of the source neuron (mandatory) /target gid - The GID of the target neuron /synapsetype /syn - The synapsetype of the connection(s) Description: FindConnections returns an array with the ids of all connections that fulfil the given criteria. The connection ids can then be used as argumentsfor GetStatus and SetStatus to inspect and modify the parameters of the connections. If no connections were found, the returned array is empty. This function is deprecated and will disappear in future version. Please use GetConnections instead. Remarks: This function iterates over all threads, but not over MPI processes. Author: Jochen Martin Eppler FirstVersion: January 2008 SeeAlso: GetConnections, GetStatus, SetStatus */ %/FindConnections trie % [/dictionarytype ] /FindConnections_D load addtotrie %def /FindConnections [/dictionarytype] { << >> begin /args Set << /source [ args /source get ] args /target known { /target [ args /target get ] } if args /synapse_model known { /synapse_model args /synapse_model get cvlit} if >> end GetConnections Flatten } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: LayoutNetwork - Create a multidimensional network. Synopsis: model [d1 d2 ...] << >> LayoutNetwork model [d1 d2 ...] LayoutNetwork /constructor [d1 d2 ...] LayoutNetwork Parameters: model - model id of the nodes to be created [d1 d2 ..] - array with dimensions << >> - optional status dictionary with initialization for the nodes Description: LayoutNetwork generates an n-dimensial network with nodes of type model. If a status dictionary is supplied, each created node is initialized with the supplied status dictionary. Examples: iaf_neuron [10 10] LayoutNetwork Creates a two dimensional layer of 10 by 10 neurons of type iaf_neuron. Author: Marc-Oliver Gewaltig FirstVersion: 20.6.02 SeeAlso: Create, LayoutArray */ /LayoutNetwork_l_a_dict { << >> begin /val Set size /n_dim Set dup 0 get /n Set /dim Set /m Set /cwn CurrentSubnet def /subnet Create dup /result Set % safe return value ChangeSubnet n_dim 1 eq { % we have reached the end of the recursion % and may create the leaf elements m n Create ; 1 1 n { 1 arraystore val SetStatus } for cwn ChangeSubnet } { % go down in recursion m dim Rest val % parameters for LayoutNetwork n { 3 copy LayoutNetwork_l_a_dict % call function recursively pop % forget about return value } repeat 3 npop } ifelse % return root as result result cwn ChangeSubnet end } bind def /LayoutNetwork_l_a { << >> begin size /n_dim Set dup 0 get /n Set /dim Set /m Set /cwn CurrentSubnet def /subnet Create dup /result Set ChangeSubnet n_dim 1 eq { % we have reached the end of the recursion % and may create the leaf elements m n Create ; % go back to where we came from cwn ChangeSubnet } { % go down in recursion m dim Rest % parameters for LayoutNetwork n { 2 copy LayoutNetwork_l_a % call function recursively pop % forget about return value } repeat 2 npop } ifelse % leave the root node as result result cwn ChangeSubnet end } bind def /LayoutNetwork trie [/literaltype /arraytype /dictionarytype] /LayoutNetwork_l_a_dict load addtotrie [/literaltype /arraytype ] /LayoutNetwork_l_a load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: elementstates - dictionary with symbolic element state tag Description: Each element has a state which can be accessed via it's status dictionary. The state is defined as a superposition of the following values: /valid 1 /busy 2 /updated 4 /suspended 8 /frozen 16 /buffers_initialized 32 /err 64 valid - the default state of an element. busy - indicates that this element needs more than one cycle to update and is not yet fully updated. updated - indicates, that the element was updated in the current cycle. once the update cycle is completed, all updated flags are changed to valid. This flag shoulds only be set if the update cycle was interrupted or suspended. suspended - indicates, that the update of this element was suspended. The next call to simulate will continue with this element. frozen - if this state is set, the update cycle skips this element. In effect, the element keeps its state intact as if it was "frozen". This is the only state which can directly be set by the user. buffers_initialized - the buffers of the node have been initialized err - some unspecified error condition has occured. Examples: elementstates info Availability: NEST */ /elementstates << /valid 1 /busy 2 /updated 4 /suspended 8 /frozen 16 /buffers_initialized 32 /err 64 >> def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: unit_conversion - Conversion factors for SI units. Description: Some SLI functions and tools expect numerical arguments which carry SI units. function/tool expected unit ---------------------------------- Simulate ms current generators pA voltmeters mV ac_generator Hz As SLI does not know any unit conversion scheme, numerical values need to be specified in the appropriate units. However, it improves readability, if a hint to the unit is specified in the program code, such as "333 pA", instead of just "333". Furthermore, it may be convenient to have other units converted to the ones expected by the routines. (For example, "ms" converts from milliseconds to timesteps, taking into account the current network resolution, see example below.) The following conversion factors are know (developers: please add others in nest-init.sli as convenient): ms, pA, mV, Hz, spikes Examples: The following call always simulates 1000 ms of network time, 1000 ms Simulate Author: (unknown), documented by Ruediger Kupper, 18-jul-2003 Availability: This is just a description. unit_conversion is no SLI command. SeeAlso: Hz, ms, pA, mV, spikes, cvd, cvi */ %% Some auxiliary definitions, just for readibility /* BeginDocumentation Name: ms - Specification in ms (for readability) SeeAlso: unit_conversion, ms2hms */ /ms /cvd load def /* BeginDocumentation Name: s - Specification in s (for readability) SeeAlso: unit_conversion, ms2hms */ /s {1000.0 mul} bind def /* BeginDocumentation Name: pA - Specification in pA (for readability) SeeAlso: unit_conversion */ /pA /cvd load def /* BeginDocumentation Name: nS - Specification in nS (for readability) SeeAlso: unit_conversion */ /nS /cvd load def /* BeginDocumentation Name: pF - Specification in pF (for readability) SeeAlso: unit_conversion */ /pF /cvd load def /* BeginDocumentation Name: mV - Specification in mV (for readability) SeeAlso: unit_conversion */ /mV /cvd load def /* BeginDocumentation Name: Hz - Specification in Hz (for readability) SeeAlso: unit_conversion */ /Hz /cvd load def /* BeginDocumentation Name: spikes - Specification in spikes (for readability) SeeAlso: unit_conversion */ /spikes /cvi load def /double /cvd load def /int /cvi load def /* BeginDocumentation Name: SubsetQ - Test if one dictionary is a subset of another Synopsis: dict1 dict2 SubsetQ -> bool Parameters: dict1 - dictionary dict2 - dictionary Description: The functions returns true, if all entries of dict2 are present in dict1 with the same values. Examples: << /a 1 /b 2 /c 2 >> << /c 2 >> SubsetQ -> true */ /SubsetQ [/dictionarytype /dictionarytype] { << >> begin cva 2 Partition /properties Set /object Set true properties { arrayload ; /val Set cvlit /key Set object dup key known { key get val eq and } { pop pop false exit } ifelse } forall end } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: GetGlobalNodesInfo - Return GIDs, VPs and Parent GIDs of all nodes of a subnet that fulfill the conditions given in the dictionary, or of all nodes if no dictionary given. Synopsis: gid [<<dict>>] GetGlobalNodesInfo -> [<<...>> <<...>> ...] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [<<...>>...] - Array with dicts containing /global_id, /vp, /parent Description: This function recursively traverses a subnet and returns the gid, vp and parent gid of all child nodes in increasing order of gid. If a dictionary is provided, only those nodes which fulfill the given criteria are returned. The returned Nodes include the intermediate subnets. Author: Marc-Oliver Gewaltig, Abigail Morrison SeeAlso: GetGlobalNodes, GetLocalNodes */ /GetGlobalNodesInfo trie [/integertype /dictionarytype] { false false GetNodes_i_D_b_b } bind addtotrie [/integertype] { << >> false false GetNodes_i_D_b_b } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: GetGlobalNodes - Return IDs of all nodes of a subnet that fulfill the conditions given in the dictionary, or all nodes if no dictionary given. Synopsis: gid [<<dict>>] GetGlobalNodes -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all child nodes. Description: This function recursively traverses a subnet and returns the global ids of all child nodes in increasing order of gid. If a dictionary is provided, only those nodes which fulfill the given criteria are returned. The returned Nodes include the intermediate subnets. For a variant of this command that excludes the subnets, see "GetGlobalLeaves". Author: Marc-Oliver Gewaltig, Abigail Morrison SeeAlso: GetGlobalNodesInfo, GetLocalNodes, GetGlobalLeaves, GetGlobalChildren */ /GetGlobalNodes trie [/integertype /dictionarytype] { false true GetNodes_i_D_b_b } bind addtotrie [/integertype] { << >> false true GetNodes_i_D_b_b } bind addtotrie def /* BeginDocumentation Name: GetLocalNodes - Return IDs of all local nodes of a subnet that fulfill the conditions given in the dictionary, or all nodes if no dictionary given. Synopsis: gid [<<dict>>] GetLocalNodes -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all local child nodes. Description: This function is equivalent to GetGlobalNodes, but returns only those nodes that are local to the MPI process executing the command. Author: Hans Ekkehard Plesser, Abigail Morrison SeeAlso: GetGlobalNodes, GetLocalLeaves, GetLocalChildren */ /GetLocalNodes trie [/integertype /dictionarytype] { true true GetNodes_i_D_b_b } bind addtotrie [/integertype] { << >> true true GetNodes_i_D_b_b } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: GetGlobalChildren - Return IDs of all immediate child nodes of a subnet that fulfill the conditions given in the dictionary, or all nodes if no dictionary given. Synopsis: gid [<<dict>>] GetGlobalChildren -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all child nodes. Description: This function returns the ids of all children of a subnet in increasing order of gid. If a dictionary is provided, only those nodes which fulfill the given criteria are returned. Author: Marc-Oliver Gewaltig, Abigail Morrison SeeAlso: GetLocalChildren, GetGlobalNodes, GetGlobalLeaves */ /GetGlobalChildren trie [/integertype /dictionarytype] { false GetChildren_i_D_b } bind addtotrie [/integertype] { << >> false GetChildren_i_D_b} bind addtotrie def /* BeginDocumentation Name: GetLocalChildren - Return IDs of all immediate local child nodes of a subnet that fulfill the conditions given in the dictionary, or all children if no dictionary given. Synopsis: gid [<<dict>>] GetLocalChildren -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all local child nodes. Description: This function is equivalent to GetGlobalChildren, but returns only the ids of all children of a subnet belonging to the MPI process executing the command. Author: Hans Ekkehard Plesser, Abigail Morrison SeeAlso: GetGlobalChildren, GetLocalNodes, GetLocalLeaves */ /GetLocalChildren trie [/integertype /dictionarytype] { true GetChildren_i_D_b } bind addtotrie [/integertype] { << >> true GetChildren_i_D_b } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: GetGlobalLeaves - Return IDs of all leaves of a subnet that fulfill the conditions given in the dictionary, or all leaves if no dictionary given. Synopsis: gid [<<dict>>] GetGlobalLeaves -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all leaf nodes. Description: This function recursively traverses a subnet and returns the global ids of all leaf nodes in increasing order of gid. If a dictionary is provided, only those nodes which fulfill the given criteria are returned. The returned nodes DO NOT include the intermediate subnets. For a variant of this command that also returns the subnets, see "GetGlobalNodes". Author: Ruediger Kupper, Abigail Morrison FirstVersion: 12.3.2003 SeeAlso: GetLocalLeaves, GetGlobalNodes, GetGlobalChildren */ /GetGlobalLeaves trie [/integertype /dictionarytype] { false GetLeaves_i_D_b } bind addtotrie [/integertype] { << >> false GetLeaves_i_D_b } bind addtotrie def /* BeginDocumentation Name: GetLocalLeaves - Return IDs of all local leaves of a subnet that fulfill the conditions given in the dictionary, or all leaves if no dictionary given. Synopsis: gid [<<dict>>] GetLocalLeaves -> [gid1 ... gidn] Parameters: gid - id of a subnet <<dict>> - Dictionary of selection properties Returns: [gid..] - Array with the global ids of all local leaf nodes. Description: This function does the same as GetGlobalLeaves, but returns only the nodes local to the MPI process executing the program. Author: Hans Ekkehard Plesser, Abigail Morrison SeeAlso: GetGlobalLeaves, GetLocalNodes, GetLocalChildren */ /GetLocalLeaves trie [/integertype /dictionarytype] { true GetLeaves_i_D_b } bind addtotrie [/integertype] { << >> true GetLeaves_i_D_b } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: ShowStatus - Show the status dictionary of a network node. Synopsis: gid ShowStatus -> - Description: ShowStatus retrieves the status dictionary of the specified node and displays it, using info. ShowStatus is equivalent to the sequence "GetStatus info" SeeAlso: GetStatus, info */ /ShowStatus { GetStatus info } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /GetNetwork_i_i { << >> begin /depth Set dup GetStatus /model get % id model /subnet eq depth 1 geq and { % id dup % id id [ exch % id [ id GetGlobalChildren { depth 1 sub GetNetwork_i_i } forall ] exch prepend } if end } def /* BeginDocumentation Name: GetNetwork - Return a nested list with the IDs of nodes in a multi-dimensional subnet. Synpsis: ID n GetNetwork -> [ ] Description: GetNetwork takes the id of a subnet and an integer parameter n. GetNetwork then recursively calls GetChildren down to level n. The result is a nested list whicht contains the ids of all nodes. The first element of each list is the id of the subnet itself. Example: SLI ] /iaf_neuron Create ; SLI ] /iaf_neuron [2 2] LayoutNetwork ; SLI ] /iaf_neuron Create ; SLI ] 0 3 GetNetwork == [0 1 [2 [3 4 5] [6 7 8]] 9] Note: In parallel simulations, this function collects data across all processes and can thus take a lot of time and consume huge amounts of memory. SeeAlso: GetGlobalNodes, GetLocalNodes, GetGlobalLeaves, GetLocalLeaves, GetGlobalChildren, GetLocalChildren */ /GetNetwork trie [/integertype /integertype] /GetNetwork_i_i load addtotrie def /* BeginDocumentation Name: TimeCommunication - returns average time taken for MPI_Allgather over n calls with m bytes Synopsis: n m [bool] TimeCommunication -> time Availability: NEST 2.0 Author: Abigail Morrison FirstVersion: August 2009 Description: The function allows a user to test how much time a call the Allgather costs If boolean third argument is passed and true, time offgrid spike communication. SeeAlso: TimeCommunicationOffgrid */ /TimeCommunication trie [/integertype /integertype /booltype] /TimeCommunication_i_i_b load addtotrie [/integertype /integertype] { false TimeCommunication_i_i_b } bind addtotrie def /* BeginDocumentation Name: TimeCommunicationOffgrid - returns average time taken for MPI_Allgather over n calls with m bytes when communication offgrid spikes Synopsis: n m [bool] TimeCommunication -> time Availability: NEST 2.0 Author: Abigail Morrison FirstVersion: August 2009 Description: The function allows a user to test how much time a call the Allgather costs SeeAlso: TimeCommunication */ /TimeCommunicationOffgrid trie [/integertype /integertype] { true TimeCommunication_i_i_b } bind addtotrie def % can only be defined here because on bg processes.sli is not included statusdict /platform get dup (bg/p) eq exch (bg/q) eq or { /memory_thisjob {memory_thisjob_bg} def } if /* BeginDocumentation Name - RestoreNodes - Restore nodes from an array of status dictionaries. Description: RestoreNodes takes an array of status dictionaries and creates nodes with these properties. RestoreNodes assumes that the status dictionaries belong to a consecutive range of nodes. The new nodes are created inside the current subnet and maintain their local subnet structure. Thus, RestoreNodes can be used to copy a range of neurons to different locations. */ /RestoreNodes [/arraytype] /RestoreNodes_a load def /* BeginDocumentation Name: SaveModels - Retrieve the state of all models. Description: */ /SaveModels { << >> begin modeldict cva 2 Partition size /n_models Set n_models 1 add % proxy model is not in modeldict array /models Set { models exch arrayload ; exch put /models Set } forall [ models { dup type /literaltype eq { GetDefaults } { pop } ifelse } forall ] end } def /* BeginDocumentation Name: RestoreModels - Restore saved models from an array of status dictionaries. Description: */ /RestoreModels [/arraytype] { << >> begin /models Set 0 GetStatus /dict_miss_is_error get /dict_err Set 0 << /dict_miss_is_error false >> SetStatus /old_verbosity verbosity def M_ERROR setverbosity /restoremodel { begin model type_id neq { type_id model currentdict CopyModel } { type_id /a2eif_cond_exp_HW neq % these models type_id /topology_layer_3d neq and % these models type_id /topology_layer_free neq and % break when type_id /topology_layer_grid neq and % their status is changed { model currentdict SetDefaults } if } ifelse end } def models { restoremodel } forall old_verbosity setverbosity 0 << /dict_miss_is_error dict_err >> SetStatus end } def /cva [/connectiontype] /cva_C load def /abort { statusdict /exitcodes get /userabort get statusdict /is_mpi get { MPI_Abort }{ quit_i } ifelse } bind def