NEST main@caf0ae8
 
Loading...
Searching...
No Matches
parameter.h
Go to the documentation of this file.
1/*
2 * parameter.h
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#ifndef PARAMETER_H_
24#define PARAMETER_H_
25
26// C++ includes:
27#include <cmath>
28
29// Includes from nestkernel:
30#include "generic_factory.h"
31#include "nest_names.h"
32#include "node.h"
33#include "node_collection.h"
34#include "random_generators.h"
35
36
37namespace nest
38{
39class Parameter;
40using ParameterPTR = std::shared_ptr< Parameter >;
41
42class AbstractLayer;
43
48{
49public:
56 Parameter( bool is_spatial = false, bool returns_int_only = false )
59 {
60 }
61
62 explicit Parameter( const Parameter& p ) = default;
63
64 virtual ~Parameter() = default;
65
75 // TODO-PYNEST-NG: We need to either make this non-abstract or add every single non-abstract parameter subclass to the
76 // std::variant acceptec-types collection.
77 virtual double
79 {
80 return 0.;
81 }
82
95 virtual double value( RngPtr rng,
96 const std::vector< double >& source_pos,
97 const std::vector< double >& target_pos,
98 const AbstractLayer& layer,
99 Node* node );
100
105 std::vector< double > apply( const NodeCollectionPTR&, const std::vector< std::vector< double > >& );
106
112 bool is_spatial() const;
113
119 bool returns_int_only() const;
120
121protected:
122 bool is_spatial_ { false };
123 bool returns_int_only_ { false };
124
125 bool value_is_integer_( const double value ) const;
126};
127
132{
133public:
134 using Parameter::value;
135
141 explicit ConstantParameter( double value )
142 : value_( value )
143 {
145 }
146
156 {
157 value_ = d.get< double >( "value" );
159 }
160
161 ~ConstantParameter() override = default;
162
166 double
167 value( RngPtr, Node* ) override
168 {
169 return value_;
170 }
171
172private:
173 double value_;
174};
175
176
181{
182public:
183 using Parameter::value;
184
195 : lower_( 0.0 )
196 , range_( 1.0 )
197 {
198 d.update_value( names::min, lower_ );
199 d.update_value( names::max, range_ );
200 if ( lower_ >= range_ )
201 {
202 throw BadProperty(
203 "UniformParameter: "
204 "min < max required." );
205 }
206
207 range_ -= lower_;
208 }
209
210 double
211 value( RngPtr rng, Node* ) override
212 {
213 return lower_ + rng->drand() * range_;
214 }
215
216private:
217 double lower_, range_;
218};
219
224{
225public:
226 using Parameter::value;
227
237 : Parameter( false, true )
238 , max_( 1 )
239 {
240 d.update_integer_value( names::max, max_ );
241 if ( max_ <= 0 )
242 {
243 throw BadProperty( "UniformIntParameter: max > 0 required." );
244 }
245 }
246
247 double
248 value( RngPtr rng, Node* ) override
249 {
250 return rng->ulrand( max_ );
251 }
252
253private:
254 long max_;
255};
256
257
262{
263public:
264 using Parameter::value;
265
275 NormalParameter( const Dictionary& d );
276
277 double value( RngPtr rng, Node* node ) override;
278
279private:
280 double mean_, std_;
281 std::vector< normal_distribution > normal_dists_;
282};
283
284
289{
290public:
291 using Parameter::value;
292
302 LognormalParameter( const Dictionary& d );
303
304 double value( RngPtr rng, Node* node ) override;
305
306private:
307 double mean_, std_;
308 std::vector< lognormal_distribution > lognormal_dists_;
309};
310
311
316{
317public:
318 using Parameter::value;
319
329 : beta_( 1.0 )
330 {
331 d.update_value( names::beta, beta_ );
332 if ( beta_ < 0 )
333 {
334 throw BadProperty( "ExponentialParameter: beta ≥ 0 required." );
335 }
336 }
337
338 double
339 value( RngPtr rng, Node* ) override
340 {
341 return beta_ * ( -std::log( 1 - rng->drand() ) );
342 }
343
344private:
345 double beta_;
346};
347
348
353{
354public:
368 : Parameter( true )
369 , dimension_( 0 )
370 , synaptic_endpoint_( 0 )
371 {
372 bool dimension_specified = d.update_integer_value( names::dimension, dimension_ );
373 if ( not dimension_specified )
374 {
375 throw BadParameterValue( "Dimension must be specified when creating a node position parameter." );
376 }
377 if ( dimension_ < 0 )
378 {
379 throw BadParameterValue( "Node position parameter dimension cannot be negative." );
380 }
381 d.update_integer_value( names::synaptic_endpoint, synaptic_endpoint_ );
382 if ( synaptic_endpoint_ < 0 or 2 < synaptic_endpoint_ )
383 {
384 throw BadParameterValue( "Synaptic endpoint must either be unspecified (0), source (1) or target (2)." );
385 }
386 }
387
388 double
389 value( RngPtr, Node* node ) override
390 {
391 if ( synaptic_endpoint_ != 0 )
392 {
393 throw BadParameterValue( "Source or target position parameter can only be used when connecting." );
394 }
395 if ( not node )
396 {
397 throw KernelException( "Node position parameter can only be used when connecting spatially distributed nodes." );
398 }
399 return get_node_pos_( node );
400 }
401
402 double
404 const std::vector< double >& source_pos,
405 const std::vector< double >& target_pos,
406 const AbstractLayer&,
407 Node* ) override
408 {
409 switch ( synaptic_endpoint_ )
410 {
411 case 0:
412 throw BadParameterValue( "Node position parameter cannot be used when connecting." );
413 case 1:
414 {
415 return source_pos[ dimension_ ];
416 }
417 case 2:
418 return target_pos[ dimension_ ];
419 }
420 throw KernelException( "Wrong synaptic_endpoint_." );
421 }
422
423private:
426
427 double get_node_pos_( Node* node ) const;
428};
429
430
435{
436public:
438 : Parameter( true )
439 , dimension_( 0 )
440 {
441 d.update_integer_value( names::dimension, dimension_ );
442 if ( dimension_ < 0 )
443 {
444 throw BadParameterValue( "Spatial distance parameter dimension cannot be negative." );
445 }
446 }
447
448 double
449 value( RngPtr, Node* ) override
450 {
451 throw BadParameterValue( "Spatial distance parameter can only be used when connecting." );
452 }
453
454 double value( RngPtr rng,
455 const std::vector< double >& source_pos,
456 const std::vector< double >& target_pos,
457 const AbstractLayer& layer,
458 Node* ) override;
459
460private:
462};
463
464
469{
470public:
477 : Parameter( m1->is_spatial() or m2->is_spatial(), m1->returns_int_only() and m2->returns_int_only() )
478 , parameter1_( m1 )
479 , parameter2_( m2 )
480 {
481 }
482
484 : Parameter( p )
487 {
488 }
489
493 double
494 value( RngPtr rng, Node* node ) override
495 {
496 return parameter1_->value( rng, node ) * parameter2_->value( rng, node );
497 }
498
499 double
501 const std::vector< double >& source_pos,
502 const std::vector< double >& target_pos,
503 const AbstractLayer& layer,
504 Node* node ) override
505 {
506 return parameter1_->value( rng, source_pos, target_pos, layer, node )
507 * parameter2_->value( rng, source_pos, target_pos, layer, node );
508 }
509
510protected:
513};
514
519{
520public:
527 : Parameter( m1->is_spatial() or m2->is_spatial(), m1->returns_int_only() and m2->returns_int_only() )
528 , parameter1_( m1 )
529 , parameter2_( m2 )
530 {
531 }
532
534 : Parameter( p )
537 {
538 }
539
543 double
544 value( RngPtr rng, Node* node ) override
545 {
546 return parameter1_->value( rng, node ) / parameter2_->value( rng, node );
547 }
548
549 double
551 const std::vector< double >& source_pos,
552 const std::vector< double >& target_pos,
553 const AbstractLayer& layer,
554 Node* node ) override
555 {
556 return parameter1_->value( rng, source_pos, target_pos, layer, node )
557 / parameter2_->value( rng, source_pos, target_pos, layer, node );
558 }
559
560protected:
563};
564
569{
570public:
577 : Parameter( m1->is_spatial() or m2->is_spatial(), m1->returns_int_only() and m2->returns_int_only() )
578 , parameter1_( m1 )
579 , parameter2_( m2 )
580 {
581 }
582
584 : Parameter( p )
587 {
588 }
589
593 double
594 value( RngPtr rng, Node* node ) override
595 {
596 return parameter1_->value( rng, node ) + parameter2_->value( rng, node );
597 }
598
599 double
601 const std::vector< double >& source_pos,
602 const std::vector< double >& target_pos,
603 const AbstractLayer& layer,
604 Node* node ) override
605 {
606 return parameter1_->value( rng, source_pos, target_pos, layer, node )
607 + parameter2_->value( rng, source_pos, target_pos, layer, node );
608 }
609
610protected:
613};
614
619{
620public:
627 : Parameter( m1->is_spatial() or m2->is_spatial(), m1->returns_int_only() and m2->returns_int_only() )
628 , parameter1_( m1 )
629 , parameter2_( m2 )
630 {
631 }
632
634 : Parameter( p )
637 {
638 }
639
643 double
644 value( RngPtr rng, Node* node ) override
645 {
646 return parameter1_->value( rng, node ) - parameter2_->value( rng, node );
647 }
648
649 double
651 const std::vector< double >& source_pos,
652 const std::vector< double >& target_pos,
653 const AbstractLayer& layer,
654 Node* node ) override
655 {
656 return parameter1_->value( rng, source_pos, target_pos, layer, node )
657 - parameter2_->value( rng, source_pos, target_pos, layer, node );
658 }
659
660protected:
663};
664
669{
670public:
685 : Parameter( m1->is_spatial() or m2->is_spatial(), true )
686 , parameter1_( m1 )
687 , parameter2_( m2 )
688 , comparator_( -1 )
689 {
690 if ( not d.update_integer_value( names::comparator, comparator_ ) )
691 {
692 throw BadParameter( "A comparator has to be specified." );
693 }
694 if ( comparator_ < 0 or 5 < comparator_ )
695 {
696 throw BadParameter( "Comparator specification has to be in the range 0-5." );
697 }
698 }
699
701 : Parameter( p )
705 {
706 }
707
711 double
712 value( RngPtr rng, Node* node ) override
713 {
714 return compare_( parameter1_->value( rng, node ), parameter2_->value( rng, node ) );
715 }
716
717 double
719 const std::vector< double >& source_pos,
720 const std::vector< double >& target_pos,
721 const AbstractLayer& layer,
722 Node* node ) override
723 {
724 return compare_( parameter1_->value( rng, source_pos, target_pos, layer, node ),
725 parameter2_->value( rng, source_pos, target_pos, layer, node ) );
726 }
727
728protected:
731
732private:
733 bool
734 compare_( double value_a, double value_b ) const
735 {
736 switch ( comparator_ )
737 {
738 case 0:
739 return value_a < value_b;
740 case 1:
741 return value_a <= value_b;
742 case 2:
743 return value_a == value_b;
744 case 3:
745 return value_a != value_b;
746 case 4:
747 return value_a >= value_b;
748 case 5:
749 return value_a > value_b;
750 }
751 throw KernelException( "Wrong comparison operator." );
752 }
753
755};
756
757
762{
763public:
769 : Parameter( condition->is_spatial() or if_true->is_spatial() or if_false->is_spatial(),
770 if_true->returns_int_only() and if_false->returns_int_only() )
771 , condition_( condition )
772 , if_true_( if_true )
773 , if_false_( if_false )
774 {
775 }
776
778 : Parameter( p )
780 , if_true_( p.if_true_ )
781 , if_false_( p.if_false_ )
782 {
783 }
784
788 double
789 value( RngPtr rng, Node* node ) override
790 {
791 if ( condition_->value( rng, node ) )
792 {
793 return if_true_->value( rng, node );
794 }
795 else
796 {
797 return if_false_->value( rng, node );
798 }
799 }
800
801 double
803 const std::vector< double >& source_pos,
804 const std::vector< double >& target_pos,
805 const AbstractLayer& layer,
806 Node* node ) override
807 {
808 if ( condition_->value( rng, source_pos, target_pos, layer, node ) )
809 {
810 return if_true_->value( rng, source_pos, target_pos, layer, node );
811 }
812 else
813 {
814 return if_false_->value( rng, source_pos, target_pos, layer, node );
815 }
816 }
817
818protected:
822};
823
824
829{
830public:
835 MinParameter( ParameterPTR p, const double other_value )
836 : Parameter( p->is_spatial(), p->returns_int_only() and value_is_integer_( other_value ) )
837 , p_( p )
838 , other_value_( other_value )
839 {
840 assert( is_spatial_ == p->is_spatial() );
841 }
842
844 : Parameter( p )
845 , p_( p.p_ )
847 {
848 }
849
853 double
854 value( RngPtr rng, Node* node ) override
855 {
856 return std::min( p_->value( rng, node ), other_value_ );
857 }
858
859 double
861 const std::vector< double >& source_pos,
862 const std::vector< double >& target_pos,
863 const AbstractLayer& layer,
864 Node* node ) override
865 {
866 return std::min( p_->value( rng, source_pos, target_pos, layer, node ), other_value_ );
867 }
868
869protected:
872};
873
874
879{
880public:
885 MaxParameter( ParameterPTR p, const double other_value )
886 : Parameter( p->is_spatial(), p->returns_int_only() and value_is_integer_( other_value ) )
887 , p_( p )
888 , other_value_( other_value )
889 {
890 }
891
893 : Parameter( p )
894 , p_( p.p_ )
896 {
897 }
898
902 double
903 value( RngPtr rng, Node* node ) override
904 {
905 return std::max( p_->value( rng, node ), other_value_ );
906 }
907
908 double
910 const std::vector< double >& source_pos,
911 const std::vector< double >& target_pos,
912 const AbstractLayer& layer,
913 Node* node ) override
914 {
915 return std::max( p_->value( rng, source_pos, target_pos, layer, node ), other_value_ );
916 }
917
918protected:
921};
922
923
928{
929public:
934 RedrawParameter( ParameterPTR p, const double min, const double max );
935
937 : Parameter( p )
938 , p_( p.p_ )
939 , min_( p.min_ )
940 , max_( p.max_ )
942 {
943 }
944
948 double value( RngPtr rng, Node* node ) override;
949 double value( RngPtr rng,
950 const std::vector< double >& source_pos,
951 const std::vector< double >& target_pos,
952 const AbstractLayer& layer,
953 Node* node ) override;
954
955protected:
957 double min_;
958 double max_;
959 const size_t max_redraws_;
960};
961
962
967{
968public:
974 : Parameter( p->is_spatial() )
975 , p_( p )
976 {
977 }
978
980 : Parameter( p )
981 , p_( p.p_ )
982 {
983 }
984
988 double
989 value( RngPtr rng, Node* node ) override
990 {
991 return std::exp( p_->value( rng, node ) );
992 }
993
994 double
996 const std::vector< double >& source_pos,
997 const std::vector< double >& target_pos,
998 const AbstractLayer& layer,
999 Node* node ) override
1000 {
1001 return std::exp( p_->value( rng, source_pos, target_pos, layer, node ) );
1002 }
1003
1004protected:
1006};
1007
1008
1013{
1014public:
1020 : Parameter( p->is_spatial() )
1021 , p_( p )
1022 {
1023 }
1024
1026 : Parameter( p )
1027 , p_( p.p_ )
1028 {
1029 }
1030
1034 double
1035 value( RngPtr rng, Node* node ) override
1036 {
1037 return std::sin( p_->value( rng, node ) );
1038 }
1039
1040 double
1042 const std::vector< double >& source_pos,
1043 const std::vector< double >& target_pos,
1044 const AbstractLayer& layer,
1045 Node* node ) override
1046 {
1047 return std::sin( p_->value( rng, source_pos, target_pos, layer, node ) );
1048 }
1049
1050protected:
1052};
1053
1058{
1059public:
1065 : Parameter( p->is_spatial() )
1066 , p_( p )
1067 {
1068 }
1069
1071 : Parameter( p )
1072 , p_( p.p_ )
1073 {
1074 }
1075
1079 double
1080 value( RngPtr rng, Node* node ) override
1081 {
1082 return std::cos( p_->value( rng, node ) );
1083 }
1084
1085 double
1087 const std::vector< double >& source_pos,
1088 const std::vector< double >& target_pos,
1089 const AbstractLayer& layer,
1090 Node* node ) override
1091 {
1092 return std::cos( p_->value( rng, source_pos, target_pos, layer, node ) );
1093 }
1094
1095protected:
1097};
1098
1099
1105{
1106public:
1110 PowParameter( ParameterPTR p, const double exponent )
1111 : Parameter( p->is_spatial(), p->returns_int_only() )
1112 , p_( p )
1113 , exponent_( exponent )
1114 {
1115 }
1116
1118 : Parameter( p )
1119 , p_( p.p_ )
1120 , exponent_( p.exponent_ )
1121 {
1122 }
1123
1127 double
1128 value( RngPtr rng, Node* node ) override
1129 {
1130 return std::pow( p_->value( rng, node ), exponent_ );
1131 }
1132
1133 double
1135 const std::vector< double >& source_pos,
1136 const std::vector< double >& target_pos,
1137 const AbstractLayer& layer,
1138 Node* node ) override
1139 {
1140 return std::pow( p_->value( rng, source_pos, target_pos, layer, node ), exponent_ );
1141 }
1142
1143protected:
1145 const double exponent_;
1146};
1147
1148
1155{
1156public:
1157 using Parameter::value;
1158
1165 : Parameter( true )
1166 , num_dimensions_( 2 )
1167 , px_( px )
1168 , py_( py )
1169 , pz_( nullptr )
1170 {
1171 }
1172
1174 : Parameter( true )
1175 , num_dimensions_( 3 )
1176 , px_( px )
1177 , py_( py )
1178 , pz_( pz )
1179 {
1180 }
1181
1183 : Parameter( p )
1185 , px_( p.px_ )
1186 , py_( p.py_ )
1187 , pz_( p.pz_ )
1188 {
1189 }
1190
1194 double
1195 value( RngPtr, Node* ) override
1196 {
1197 throw KernelException( "Cannot get value of DimensionParameter." );
1198 }
1199
1205 std::vector< double >
1207 {
1208 switch ( num_dimensions_ )
1209 {
1210 case 2:
1211 return { px_->value( rng, nullptr ), py_->value( rng, nullptr ) };
1212 case 3:
1213 return { px_->value( rng, nullptr ), py_->value( rng, nullptr ), pz_->value( rng, nullptr ) };
1214 }
1215 throw KernelException( "Wrong number of dimensions in get_values!" );
1216 }
1217
1218 int
1220 {
1221 return num_dimensions_;
1222 }
1223
1224protected:
1229};
1230
1231
1238{
1239public:
1240 using Parameter::value;
1241
1245 ExpDistParameter( const Dictionary& d );
1246
1248 : Parameter( p )
1249 , p_( p.p_ )
1250 , inv_beta_( p.inv_beta_ )
1251 {
1252 assert( is_spatial_ == p.is_spatial() );
1253 }
1254
1258 double
1259 value( RngPtr, Node* ) override
1260 {
1261 throw BadParameterValue( "Exponential distribution parameter can only be used when connecting." );
1262 }
1263
1264 double value( RngPtr rng,
1265 const std::vector< double >& source_pos,
1266 const std::vector< double >& target_pos,
1267 const AbstractLayer& layer,
1268 Node* node ) override;
1269
1270protected:
1272 const double inv_beta_;
1273};
1274
1275
1282{
1283public:
1284 using Parameter::value;
1285
1289 GaussianParameter( const Dictionary& d );
1290
1292 : Parameter( p )
1293 , p_( p.p_ )
1294 , mean_( p.mean_ )
1296 {
1297 }
1298
1302 double
1303 value( RngPtr, Node* ) override
1304 {
1305 throw BadParameterValue( "Gaussian distribution parameter can only be used when connecting." );
1306 }
1307
1308 double value( RngPtr rng,
1309 const std::vector< double >& source_pos,
1310 const std::vector< double >& target_pos,
1311 const AbstractLayer& layer,
1312 Node* node ) override;
1313
1314protected:
1316 const double mean_;
1317 const double inv_two_std2_;
1318};
1319
1320
1327{
1328public:
1329 using Parameter::value;
1330
1334 Gaussian2DParameter( const Dictionary& d );
1335
1337 : Parameter( p )
1338 , px_( p.px_ )
1339 , py_( p.py_ )
1340 , mean_x_( p.mean_x_ )
1341 , mean_y_( p.mean_y_ )
1345 {
1346 }
1347
1351 double
1352 value( RngPtr, Node* ) override
1353 {
1354 throw BadParameterValue( "Gaussian 2D parameter can only be used when connecting." );
1355 }
1356
1357 double value( RngPtr rng,
1358 const std::vector< double >& source_pos,
1359 const std::vector< double >& target_pos,
1360 const AbstractLayer& layer,
1361 Node* node ) override;
1362
1363protected:
1366 const double mean_x_;
1367 const double mean_y_;
1368 const double x_term_const_;
1369 const double y_term_const_;
1370 const double xy_term_const_;
1371};
1372
1374{
1375public:
1376 using Parameter::value;
1377
1381 GaborParameter( const Dictionary& d );
1382
1387 : Parameter( p )
1388 , px_( p.px_ )
1389 , py_( p.py_ )
1390 , cos_( p.cos_ )
1391 , sin_( p.sin_ )
1392 , gamma_( p.gamma_ )
1394 , lambda_( p.lambda_ )
1395 , psi_( p.psi_ )
1396 {
1397 }
1398
1402 double
1403 value( RngPtr, Node* ) override
1404 {
1405 throw BadParameterValue( "Gabor parameter can only be used when connecting." );
1406 }
1407
1408 double value( RngPtr rng,
1409 const std::vector< double >& source_pos,
1410 const std::vector< double >& target_pos,
1411 const AbstractLayer& layer,
1412 Node* node ) override;
1413
1414protected:
1415 std::shared_ptr< Parameter > const px_;
1416 std::shared_ptr< Parameter > const py_;
1417 const double cos_;
1418 const double sin_;
1419 const double gamma_;
1420 const double inv_two_std2_;
1421 const double lambda_;
1422 const double psi_;
1423};
1424
1425
1432{
1433public:
1434 using Parameter::value;
1435
1439 GammaParameter( const Dictionary& d );
1440
1442 : Parameter( p )
1443 , p_( p.p_ )
1444 , kappa_( p.kappa_ )
1445 , inv_theta_( p.inv_theta_ )
1446 , delta_( p.delta_ )
1447 {
1448 }
1449
1453 double
1454 value( RngPtr, Node* ) override
1455 {
1456 throw BadParameterValue( "Gamma distribution parameter can only be used when connecting." );
1457 }
1458
1459 double value( RngPtr rng,
1460 const std::vector< double >& source_pos,
1461 const std::vector< double >& target_pos,
1462 const AbstractLayer& layer,
1463 Node* node ) override;
1464
1465protected:
1467 const double kappa_;
1468 const double inv_theta_;
1469 const double delta_;
1470};
1471
1472inline double
1474 const std::vector< double >&,
1475 const std::vector< double >&,
1476 const AbstractLayer&,
1477 Node* node )
1478{
1479 return value( rng, node );
1480}
1481
1482inline bool
1484{
1485 return is_spatial_;
1486}
1487
1488inline bool
1490{
1491 return returns_int_only_;
1492}
1493
1494inline bool
1495Parameter::value_is_integer_( const double value ) const
1496{
1497 // Here fmod calculates the remainder of the division operation x/y. By using y=1.0, the remainder is the
1498 // fractional part of the value. If the fractional part is zero, the value is an integer.
1499 return std::fmod( value, static_cast< double >( 1.0 ) ) == 0.0;
1500}
1501
1502
1508ParameterPTR multiply_parameter( const ParameterPTR first, const ParameterPTR second );
1509
1515ParameterPTR divide_parameter( const ParameterPTR first, const ParameterPTR second );
1516
1522ParameterPTR add_parameter( const ParameterPTR first, const ParameterPTR second );
1523
1529ParameterPTR subtract_parameter( const ParameterPTR first, const ParameterPTR second );
1530
1536ParameterPTR compare_parameter( const ParameterPTR first, const ParameterPTR second, const Dictionary& d );
1537
1548conditional_parameter( const ParameterPTR condition, const ParameterPTR if_true, const ParameterPTR if_false );
1549
1555ParameterPTR min_parameter( const ParameterPTR parameter, const double other );
1556
1562ParameterPTR max_parameter( const ParameterPTR parameter, const double other );
1563
1569ParameterPTR redraw_parameter( const ParameterPTR parameter, const double min, const double max );
1570
1576ParameterPTR exp_parameter( const ParameterPTR parameter );
1577
1583ParameterPTR sin_parameter( const ParameterPTR parameter );
1584
1590ParameterPTR cos_parameter( const ParameterPTR parameter );
1591
1597ParameterPTR pow_parameter( const ParameterPTR parameter, const double exponent );
1598
1604ParameterPTR dimension_parameter( const ParameterPTR x_parameter, const ParameterPTR y_parameter );
1605
1607dimension_parameter( const ParameterPTR x_parameter, const ParameterPTR y_parameter, const ParameterPTR z_parameter );
1608
1609
1610} // namespace nest
1611
1612#endif
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
Abstract base class for Layers of unspecified dimension.
Definition layer.h:52
Exception to be thrown if a parameter value is not acceptable.
Definition exceptions.h:752
Exception to be thrown if a parameter cannot be set.
Definition exceptions.h:717
Exception to be thrown if a status parameter is incomplete or inconsistent.
Definition exceptions.h:680
Base class for RNG engine wrappers.
Definition random_generators.h:67
virtual unsigned long ulrand(unsigned long N)=0
Uses the wrapped RNG engine to draw an unsigned long from a uniform distribution in the range [0,...
virtual double drand()=0
Uses the wrapped RNG engine to draw a double from a uniform distribution in the range [0,...
Parameter class representing the comparison of two parameters.
Definition parameter.h:669
double value(RngPtr rng, Node *node) override
Definition parameter.h:712
ParameterPTR const parameter2_
Definition parameter.h:730
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:718
ParameterPTR const parameter1_
Definition parameter.h:729
ComparingParameter(const ComparingParameter &p)
Definition parameter.h:700
ComparingParameter(ParameterPTR m1, ParameterPTR m2, const Dictionary &d)
Construct the comparison of the two given parameters.
Definition parameter.h:684
bool compare_(double value_a, double value_b) const
Definition parameter.h:734
int comparator_
Definition parameter.h:754
Parameter class choosing a value based on a comparing parameter.
Definition parameter.h:762
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:802
ConditionalParameter(const ConditionalParameter &p)
Definition parameter.h:777
ParameterPTR const if_false_
Definition parameter.h:821
ParameterPTR const condition_
Definition parameter.h:819
ParameterPTR const if_true_
Definition parameter.h:820
double value(RngPtr rng, Node *node) override
Definition parameter.h:789
ConditionalParameter(ParameterPTR condition, ParameterPTR if_true, ParameterPTR if_false)
Construct the choice of two given parameters, based on a third.
Definition parameter.h:768
Parameter with constant value.
Definition parameter.h:132
double value_
Definition parameter.h:173
ConstantParameter(double value)
Creates a ConstantParameter with a specified value.
Definition parameter.h:141
ConstantParameter(const Dictionary &d)
Creates a ConstantParameter with the value specified in a dictionary.
Definition parameter.h:155
~ConstantParameter() override=default
double value(RngPtr, Node *) override
Definition parameter.h:167
Parameter class representing the cosine of a parameter.
Definition parameter.h:1058
CosParameter(const CosParameter &p)
Definition parameter.h:1070
double value(RngPtr rng, Node *node) override
Definition parameter.h:1080
ParameterPTR const p_
Definition parameter.h:1096
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:1086
CosParameter(ParameterPTR p)
Construct the exponential of the given parameter.
Definition parameter.h:1064
Parameter class representing the difference of two parameters.
Definition parameter.h:619
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:650
DifferenceParameter(ParameterPTR m1, ParameterPTR m2)
Construct the difference of two given parameters.
Definition parameter.h:626
ParameterPTR const parameter2_
Definition parameter.h:662
DifferenceParameter(const DifferenceParameter &p)
Definition parameter.h:633
double value(RngPtr rng, Node *node) override
Definition parameter.h:644
ParameterPTR const parameter1_
Definition parameter.h:661
Position-generating Parameter class.
Definition parameter.h:1155
ParameterPTR const pz_
Definition parameter.h:1228
DimensionParameter(const DimensionParameter &p)
Definition parameter.h:1182
int get_num_dimensions() const
Definition parameter.h:1219
DimensionParameter(ParameterPTR px, ParameterPTR py)
Construct the Parameter with one given Parameter per dimension.
Definition parameter.h:1164
ParameterPTR const px_
Definition parameter.h:1226
double value(RngPtr, Node *) override
The DimensionParameter has no double value, so this method will always throw.
Definition parameter.h:1195
int num_dimensions_
Definition parameter.h:1225
DimensionParameter(ParameterPTR px, ParameterPTR py, ParameterPTR pz)
Definition parameter.h:1173
ParameterPTR const py_
Definition parameter.h:1227
std::vector< double > get_values(RngPtr rng)
Generates a position with values for each dimension generated from their respective parameters.
Definition parameter.h:1206
Parameter class representing an exponential distribution applied on a parameter.
Definition parameter.h:1238
ParameterPTR const p_
Definition parameter.h:1271
double value(RngPtr, Node *) override
Definition parameter.h:1259
const double inv_beta_
Definition parameter.h:1272
ExpDistParameter(const ExpDistParameter &p)
Definition parameter.h:1247
Parameter class representing the exponential of a parameter.
Definition parameter.h:967
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:995
ExpParameter(const ExpParameter &p)
Definition parameter.h:979
double value(RngPtr rng, Node *node) override
Definition parameter.h:989
ExpParameter(ParameterPTR p)
Construct the exponential of the given parameter.
Definition parameter.h:973
ParameterPTR const p_
Definition parameter.h:1005
Random parameter with exponential distribution.
Definition parameter.h:316
double value(RngPtr rng, Node *) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:339
ExponentialParameter(const Dictionary &d)
Creates a ExponentialParameter with specifications specified in a dictionary.
Definition parameter.h:328
double beta_
Definition parameter.h:345
Definition parameter.h:1374
const double lambda_
Definition parameter.h:1421
double value(RngPtr, Node *) override
Definition parameter.h:1403
const double inv_two_std2_
Definition parameter.h:1420
const double gamma_
Definition parameter.h:1419
const double cos_
Definition parameter.h:1417
std::shared_ptr< Parameter > const px_
Definition parameter.h:1415
std::shared_ptr< Parameter > const py_
Definition parameter.h:1416
const double psi_
Definition parameter.h:1422
GaborParameter(const GaborParameter &p)
Copy constructor.
Definition parameter.h:1386
const double sin_
Definition parameter.h:1418
Parameter class representing a gamma distribution applied on a parameter.
Definition parameter.h:1432
const double inv_theta_
Definition parameter.h:1468
double value(RngPtr, Node *) override
Definition parameter.h:1454
ParameterPTR const p_
Definition parameter.h:1466
const double delta_
Definition parameter.h:1469
const double kappa_
Definition parameter.h:1467
GammaParameter(const GammaParameter &p)
Definition parameter.h:1441
Parameter class representing a gaussian distribution in two dimensions applied on a parameter.
Definition parameter.h:1327
ParameterPTR const px_
Definition parameter.h:1364
const double y_term_const_
Definition parameter.h:1369
const double xy_term_const_
Definition parameter.h:1370
double value(RngPtr, Node *) override
Definition parameter.h:1352
Gaussian2DParameter(const Gaussian2DParameter &p)
Definition parameter.h:1336
ParameterPTR const py_
Definition parameter.h:1365
const double x_term_const_
Definition parameter.h:1368
const double mean_x_
Definition parameter.h:1366
const double mean_y_
Definition parameter.h:1367
Parameter class representing a gaussian distribution applied on a parameter.
Definition parameter.h:1282
const double mean_
Definition parameter.h:1316
GaussianParameter(const GaussianParameter &p)
Definition parameter.h:1291
const double inv_two_std2_
Definition parameter.h:1317
double value(RngPtr, Node *) override
Definition parameter.h:1303
ParameterPTR const p_
Definition parameter.h:1315
Base class for all Kernel exceptions.
Definition exceptions.h:65
Random parameter with lognormal distribution.
Definition parameter.h:289
double std_
Definition parameter.h:307
double value(RngPtr rng, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.cpp:147
double mean_
Definition parameter.h:307
std::vector< lognormal_distribution > lognormal_dists_
Definition parameter.h:308
Parameter class representing the maximum of a parameter's value and a given value.
Definition parameter.h:879
MaxParameter(const MaxParameter &p)
Definition parameter.h:892
double other_value_
Definition parameter.h:920
MaxParameter(ParameterPTR p, const double other_value)
Construct a max parameter.
Definition parameter.h:885
double value(RngPtr rng, Node *node) override
Definition parameter.h:903
ParameterPTR const p_
Definition parameter.h:919
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:909
Parameter class representing the minimum of a parameter's value and a given value.
Definition parameter.h:829
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:860
double value(RngPtr rng, Node *node) override
Definition parameter.h:854
double other_value_
Definition parameter.h:871
ParameterPTR const p_
Definition parameter.h:870
MinParameter(ParameterPTR p, const double other_value)
Construct a min parameter.
Definition parameter.h:835
MinParameter(const MinParameter &p)
Definition parameter.h:843
Node position parameter.
Definition parameter.h:353
double value(RngPtr, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:389
double get_node_pos_(Node *node) const
Definition parameter.cpp:161
long dimension_
Definition parameter.h:424
NodePosParameter(const Dictionary &d)
Creates a NodePosParameter with specifications specified in a dictionary.
Definition parameter.h:367
double value(RngPtr, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &, Node *) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:403
int synaptic_endpoint_
Definition parameter.h:425
Base class for all NEST network objects.
Definition node.h:99
Random parameter with normal distribution.
Definition parameter.h:262
double mean_
Definition parameter.h:280
std::vector< normal_distribution > normal_dists_
Definition parameter.h:281
double std_
Definition parameter.h:280
double value(RngPtr rng, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.cpp:107
Abstract base class for parameters.
Definition parameter.h:48
bool value_is_integer_(const double value) const
Definition parameter.h:1495
bool is_spatial() const
Check if the Parameter is based on spatial properties.
Definition parameter.h:1483
Parameter(bool is_spatial=false, bool returns_int_only=false)
Creates a Parameter, with optionally specified attributes.
Definition parameter.h:56
Parameter(const Parameter &p)=default
virtual double value(RngPtr, Node *)
Generates a value based on parameter specifications and arguments.
Definition parameter.h:78
bool is_spatial_
Definition parameter.h:122
std::vector< double > apply(const NodeCollectionPTR &, const std::vector< std::vector< double > > &)
Applies a parameter on a single-node ID NodeCollection and given array of positions.
Definition parameter.cpp:37
bool returns_int_only_
Definition parameter.h:123
bool returns_int_only() const
Check if the Parameter only returns integer values.
Definition parameter.h:1489
virtual ~Parameter()=default
Parameter class representing the parameter raised to the power of an exponent.
Definition parameter.h:1105
const double exponent_
Definition parameter.h:1145
double value(RngPtr rng, Node *node) override
Definition parameter.h:1128
PowParameter(ParameterPTR p, const double exponent)
Construct the parameter.
Definition parameter.h:1110
PowParameter(const PowParameter &p)
Definition parameter.h:1117
ParameterPTR const p_
Definition parameter.h:1144
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:1134
Parameter class representing the product of two parameters.
Definition parameter.h:469
ParameterPTR const parameter1_
Definition parameter.h:511
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:500
ProductParameter(const ParameterPTR m1, const ParameterPTR m2)
Construct the product of the two given parameters.
Definition parameter.h:476
ProductParameter(const ProductParameter &p)
Definition parameter.h:483
double value(RngPtr rng, Node *node) override
Definition parameter.h:494
ParameterPTR const parameter2_
Definition parameter.h:512
Parameter class representing the quotient of two parameters.
Definition parameter.h:519
QuotientParameter(ParameterPTR m1, ParameterPTR m2)
Construct the quotient of two given parameters.
Definition parameter.h:526
double value(RngPtr rng, Node *node) override
Definition parameter.h:544
ParameterPTR const parameter1_
Definition parameter.h:561
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:550
ParameterPTR const parameter2_
Definition parameter.h:562
QuotientParameter(const QuotientParameter &p)
Definition parameter.h:533
Parameter class redrawing a parameter value if it is outside of specified limits.
Definition parameter.h:928
const size_t max_redraws_
Definition parameter.h:959
double max_
Definition parameter.h:958
double min_
Definition parameter.h:957
double value(RngPtr rng, Node *node) override
Definition parameter.cpp:248
RedrawParameter(const RedrawParameter &p)
Definition parameter.h:936
ParameterPTR const p_
Definition parameter.h:956
Parameter class representing the sine of a parameter.
Definition parameter.h:1013
SinParameter(ParameterPTR p)
Construct the sine of the given parameter.
Definition parameter.h:1019
ParameterPTR const p_
Definition parameter.h:1051
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:1041
double value(RngPtr rng, Node *node) override
Definition parameter.h:1035
SinParameter(const SinParameter &p)
Definition parameter.h:1025
Parameter representing the spatial distance between two nodes, optionally in a specific dimension.
Definition parameter.h:435
SpatialDistanceParameter(const Dictionary &d)
Definition parameter.h:437
int dimension_
Definition parameter.h:461
double value(RngPtr, Node *) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:449
Parameter class representing the sum of two parameters.
Definition parameter.h:569
double value(RngPtr rng, Node *node) override
Definition parameter.h:594
SumParameter(ParameterPTR m1, ParameterPTR m2)
Construct the sum of two given parameters.
Definition parameter.h:576
SumParameter(const SumParameter &p)
Definition parameter.h:583
ParameterPTR const parameter1_
Definition parameter.h:611
double value(RngPtr rng, const std::vector< double > &source_pos, const std::vector< double > &target_pos, const AbstractLayer &layer, Node *node) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:600
ParameterPTR const parameter2_
Definition parameter.h:612
Random parameter with uniform distribution in [0,max), yielding integer values.
Definition parameter.h:224
double value(RngPtr rng, Node *) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:248
UniformIntParameter(const Dictionary &d)
Creates a UniformIntParameter with specifications specified in a dictionary.
Definition parameter.h:236
long max_
Definition parameter.h:254
Random parameter with uniform distribution in [min,max).
Definition parameter.h:181
double range_
Definition parameter.h:217
double value(RngPtr rng, Node *) override
Generates a value based on parameter specifications and arguments.
Definition parameter.h:211
double lower_
Definition parameter.h:217
UniformParameter(const Dictionary &d)
Creates a UniformParameter with specifications specified in a dictionary.
Definition parameter.h:194
const std::string max("max")
const std::string beta("beta")
const std::string synaptic_endpoint("synaptic_endpoint")
const std::string comparator("comparator")
const std::string min("min")
const std::string dimension("dimension")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
ParameterPTR divide_parameter(const ParameterPTR first, const ParameterPTR second)
Create the quotient of one parameter with another.
Definition parameter.cpp:462
ParameterPTR compare_parameter(const ParameterPTR first, const ParameterPTR second, const Dictionary &d)
Create comparison of one parameter with another.
Definition parameter.cpp:480
ParameterPTR add_parameter(const ParameterPTR first, const ParameterPTR second)
Create the sum of one parameter with another.
Definition parameter.cpp:468
ParameterPTR max_parameter(const ParameterPTR parameter, const double other)
Create parameter whose value is the maximum of a given parameter's value and the given value.
Definition parameter.cpp:498
ParameterPTR sin_parameter(const ParameterPTR parameter)
Create the sine of a parameter.
Definition parameter.cpp:516
ParameterPTR multiply_parameter(const ParameterPTR first, const ParameterPTR second)
Create the product of one parameter with another.
Definition parameter.cpp:456
ParameterPTR subtract_parameter(const ParameterPTR first, const ParameterPTR second)
Create the difference between one parameter and another.
Definition parameter.cpp:474
ParameterPTR dimension_parameter(const ParameterPTR x_parameter, const ParameterPTR y_parameter)
Create a parameter that can generate position vectors from a given set of parameters.
Definition parameter.cpp:534
ParameterPTR pow_parameter(const ParameterPTR parameter, const double exponent)
Create a parameter raised to the power of an exponent.
Definition parameter.cpp:528
ParameterPTR min_parameter(const ParameterPTR parameter, const double other)
Create parameter whose value is the minimum of a given parameter's value and the given value.
Definition parameter.cpp:492
ParameterPTR conditional_parameter(const ParameterPTR condition, const ParameterPTR if_true, const ParameterPTR if_false)
Create a parameter that chooses between two other parameters, based on a given condition parameter.
Definition parameter.cpp:486
ParameterPTR exp_parameter(const ParameterPTR parameter)
Create the exponential of a parameter.
Definition parameter.cpp:510
std::shared_ptr< Parameter > ParameterPTR
Definition parameter.h:40
std::shared_ptr< NodeCollection > NodeCollectionPTR
Definition node_collection.h:50
ParameterPTR cos_parameter(const ParameterPTR parameter)
Create the cosine of a parameter.
Definition parameter.cpp:522
ParameterPTR redraw_parameter(const ParameterPTR parameter, const double min, const double max)
Create parameter redrawing the value if the value of a parameter is outside the set limits.
Definition parameter.cpp:504
Declarations for base class Node.