Changeset 729 for trunk/src/connectors2.py
- Timestamp:
- 03/12/10 01:26:31 (2 years ago)
- Files:
-
- 1 modified
-
trunk/src/connectors2.py (modified) (36 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/connectors2.py
r728 r729 1 import numpy 2 from pyNN import errors, common, core, random 1 import numpy, logging, sys 2 from pyNN import errors, common, core, random, utility 3 3 from pyNN.space import Space 4 4 from pyNN.random import RandomDistribution … … 7 7 sin, sinh, sqrt, tan, tanh, maximum, minimum 8 8 9 logger = logging.getLogger("PyNN") 10 9 11 class ConnectionAttributeGenerator(object): 10 12 … … 13 15 self.local_mask = local_mask 14 16 self.safe = safe 17 if self.safe: 18 self.get = self.get_safe 15 19 if isinstance(self.source, numpy.ndarray): 16 20 self.source_iterator = iter(self.source) 17 21 18 def get(self, N, distance_matrix=None, sub_mask=None): 22 def check(self, data): 23 return data 24 25 def extract(self, N, distance_matrix=None, sub_mask=None): 19 26 if isinstance(self.source, basestring): 20 27 assert distance_matrix is not None … … 39 46 if sub_mask: 40 47 values = values[sub_mask] 41 return values 48 return values 49 50 def get_safe(self, N, distance_matrix=None, sub_mask=None): 51 return self.check(self.extract(N, distance_matrix, sub_mask)) 52 53 def get(self, N, distance_matrix=None, sub_mask=None): 54 return self.extract(N, distance_matrix, sub_mask) 42 55 43 56 … … 74 87 logger.debug("Can't check weight, conductance status unknown.") 75 88 return weight 76 77 def get(self, N, distance_matrix=None, sub_mask=None): 78 values = ConnectionAttributeGenerator.get(self, N, distance_matrix, sub_mask) 79 if self.safe: 80 values = self.check(values) 81 return values 82 89 90 83 91 84 92 class DelayGenerator(ConnectionAttributeGenerator): … … 88 96 self.min_delay = common.get_min_delay() 89 97 self.max_delay = common.get_max_delay() 90 98 91 99 def check(self, delay): 92 100 all_negative = (delay<=self.max_delay).all() … … 94 102 if not (all_negative and all_positive): 95 103 raise errors.ConnectionError("delay (%s) is out of range [%s,%s]" % (delay, common.get_min_delay(), common.get_max_delay())) 96 return delay 97 98 def get(self, N, distance_matrix=None, sub_mask=None): 99 values = ConnectionAttributeGenerator.get(self, N, distance_matrix, sub_mask) 100 if self.safe: 101 values = self.check(values) 102 return values 103 104 return delay 104 105 105 106 class ProbaGenerator(ConnectionAttributeGenerator): … … 113 114 self.space = space 114 115 if mask is not None: 115 self.B = ((B.T)[mask]).T116 self.B = B[:,mask] 116 117 else: 117 118 self.B = B … … 133 134 class Connector(object): 134 135 135 def __init__(self, weights=0.0, delays=None, space=Space(), safe=True ):136 def __init__(self, weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 136 137 self.weights = weights 137 138 self.space = space 138 139 self.safe = safe 140 self.verbose = verbose 139 141 min_delay = common.get_min_delay() 140 142 if delays is None: … … 143 145 if core.is_listlike(delays): 144 146 assert min(delays) >= min_delay 145 el se:147 elif not (isinstance(delays, basestring) or isinstance(delays, RandomDistribution)): 146 148 assert delays >= min_delay 147 self.delays = delays 148 149 self.delays = delays 150 149 151 def connect(self, projection): 150 152 pass 151 153 154 def progressbar(self, N): 155 self.prog = utility.ProgressBar(0, N, 20, mode='fixed') 156 157 def progression(self, count): 158 if self.verbose: 159 self.prog.update_amount(count) 160 print self.prog, "\r", 161 sys.stdout.flush() 162 152 163 153 164 … … 207 218 """ 208 219 209 def __init__(self, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True ):220 def __init__(self, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 210 221 """ 211 222 Create a new connector. … … 223 234 dependent weights or delays 224 235 """ 225 Connector.__init__(self, weights, delays, space, safe )236 Connector.__init__(self, weights, delays, space, safe, verbose) 226 237 assert isinstance(allow_self_connections, bool) 227 238 self.allow_self_connections = allow_self_connections … … 229 240 def connect(self, projection): 230 241 connector = ProbabilisticConnector(projection, self.weights, self.delays, self.allow_self_connections, self.space, safe=self.safe) 242 self.progressbar(len(projection.pre)) 231 243 for count, src in enumerate(projection.pre.all()): 232 244 connector._probabilistic_connect(src, 1) 233 234 245 self.progression(count) 246 235 247 236 248 … … 240 252 """ 241 253 242 def __init__(self, p_connect, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True): 254 def __init__(self, p_connect, allow_self_connections=True, weights=0.0, delays=None, space=Space(), 255 safe=True, verbose=True): 243 256 """ 244 257 Create a new connector. … … 258 271 dependent weights or delays 259 272 """ 260 Connector.__init__(self, weights, delays, space, safe )273 Connector.__init__(self, weights, delays, space, safe, verbose) 261 274 assert isinstance(allow_self_connections, bool) 262 275 self.allow_self_connections = allow_self_connections … … 267 280 #assert projection.rng.parallel_safe 268 281 connector = ProbabilisticConnector(projection, self.weights, self.delays, self.allow_self_connections, self.space, safe=self.safe) 269 for src in projection.pre.all(): 282 self.progressbar(len(projection.pre)) 283 for count, src in enumerate(projection.pre.all()): 270 284 connector._probabilistic_connect(src, self.p_connect) 271 285 self.progression(count) 286 272 287 273 288 class DistanceDependentProbabilityConnector(ProbabilisticConnector): … … 277 292 278 293 def __init__(self, d_expression, allow_self_connections=True, 279 weights=0.0, delays=None, space=Space(), safe=True ):294 weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 280 295 """ 281 296 Create a new connector. … … 290 305 to the global minimum delay. 291 306 """ 292 Connector.__init__(self, weights, delays, space, safe )307 Connector.__init__(self, weights, delays, space, safe, verbose) 293 308 assert isinstance(d_expression, str) 294 309 try: … … 305 320 connector = ProbabilisticConnector(projection, self.weights, self.delays, self.allow_self_connections, self.space, safe=self.safe) 306 321 proba_generator = ProbaGenerator(self.d_expression, connector.local) 307 308 for src in projection.pre.all():322 self.progressbar(len(projection.pre)) 323 for count, src in enumerate(projection.pre.all()): 309 324 connector.distance_matrix.set_source(src.position) 310 325 proba = proba_generator.get(connector.N, connector.distance_matrix) … … 312 327 proba = proba.astype(float) 313 328 connector._probabilistic_connect(src, proba) 314 329 self.progression(count) 330 315 331 316 332 class FromListConnector(Connector): … … 319 335 """ 320 336 321 def __init__(self, conn_list ):337 def __init__(self, conn_list, safe=True, verbose=True): 322 338 """ 323 339 Create a new connector. … … 331 347 """ 332 348 # needs extending for dynamic synapses. 333 Connector.__init__(self, 0., common.get_min_delay() )349 Connector.__init__(self, 0., common.get_min_delay(), safe=safe, verbose=verbose) 334 350 self.conn_list = conn_list 335 351 … … 337 353 """Connect-up a Projection.""" 338 354 # slow: should maybe sort by pre 339 for i in xrange(len(self.conn_list)): 355 self.progressbar(len(self.conn_list)) 356 for count, i in enumerate(xrange(len(self.conn_list))): 340 357 src, tgt, weight, delay = self.conn_list[i][:] 341 358 src = projection.pre[tuple(src)] 342 359 tgt = projection.post[tuple(tgt)] 343 360 projection.connection_manager.connect(src, [tgt], weight, delay) 344 361 self.progression(count) 362 345 363 346 364 class FromFileConnector(FromListConnector): … … 349 367 """ 350 368 351 def __init__(self, filename, distributed=False ):369 def __init__(self, filename, distributed=False, safe=True, verbose=True): 352 370 """ 353 371 Create a new connector. … … 360 378 distributed simulations. 361 379 """ 362 Connector.__init__(self, 0., common.get_min_delay() )380 Connector.__init__(self, 0., common.get_min_delay(), safe=safe, verbose=verbose) 363 381 self.filename = filename 364 382 self.distributed = distributed … … 397 415 """ 398 416 399 def __init__(self, n, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True ):417 def __init__(self, n, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 400 418 """ 401 419 Create a new connector. … … 415 433 to the global minimum delay. 416 434 """ 417 Connector.__init__(self, weights, delays, space, safe )435 Connector.__init__(self, weights, delays, space, safe, verbose) 418 436 assert isinstance(allow_self_connections, bool) 419 437 self.allow_self_connections = allow_self_connections … … 433 451 weights_generator = WeightGenerator(self.weights, local, projection, self.safe) 434 452 delays_generator = DelayGenerator(self.delays, local, self.safe) 435 distance_matrix = DistanceMatrix(projection.post.positions, self.space , numpy.arange(len(projection.post)))453 distance_matrix = DistanceMatrix(projection.post.positions, self.space) 436 454 candidates = projection.post.all_cells.flatten() 455 self.progressbar(len(projection.pre)) 437 456 438 457 if isinstance(projection.rng, random.NativeRNG): 439 458 raise Exception("Use of NativeRNG not implemented.") 440 459 441 for src in projection.pre.all():460 for count, src in enumerate(projection.pre.all()): 442 461 # pick n neurons at random 443 462 if hasattr(self, 'rand_distr'): … … 463 482 if len(targets) > 0: 464 483 projection.connection_manager.connect(src, targets.tolist(), weights, delays) 465 484 485 self.progression(count) 486 466 487 467 488 class FixedNumberPreConnector(Connector): … … 477 498 """ 478 499 479 def __init__(self, n, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True ):500 def __init__(self, n, allow_self_connections=True, weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 480 501 """ 481 502 Create a new connector. … … 510 531 def connect(self, projection): 511 532 """Connect-up a Projection.""" 512 local = numpy.arange(len(projection.post))533 local = projection.pre._mask_local.flatten() 513 534 weights_generator = WeightGenerator(self.weights, local, projection, self.safe) 514 535 delays_generator = DelayGenerator(self.delays, local, self.safe) 515 536 distance_matrix = DistanceMatrix(projection.pre.positions, self.space) 516 537 candidates = projection.pre.all_cells.flatten() 538 self.progressbar(len(projection.pre)) 517 539 518 540 if isinstance(projection.rng, random.NativeRNG): 519 541 raise Exception("Warning: use of NativeRNG not implemented.") 520 542 521 for tgt in projection.post.local_cells.flat:543 for count, tgt in enumerate(projection.post.local_cells.flat): 522 544 # pick n neurons at random 523 545 if hasattr(self, 'rand_distr'): … … 543 565 for src, w, d in zip(sources, weights, delays): 544 566 projection.connection_manager.connect(src, [tgt], w, d) 545 567 568 self.progression(count) 569 546 570 547 571 class OneToOneConnector(Connector): … … 557 581 558 582 559 def __init__(self, weights=0.0, delays=None, space=Space() ):583 def __init__(self, weights=0.0, delays=None, space=Space(), safe=True, verbose=True): 560 584 """ 561 585 Create a new connector. … … 567 591 to the global minimum delay. 568 592 """ 569 Connector.__init__(self, weights, delays, space) 593 Connector.__init__(self, weights, delays, space, verbose) 594 self.space = space 595 self.safe = safe 570 596 571 597 def connect(self, projection): … … 574 600 N = projection.post.size 575 601 local = projection.post._mask_local.flatten() 576 weights_generator = WeightGenerator(self.weights, local, projection )577 delays_generator = DelayGenerator(self.delays, local )602 weights_generator = WeightGenerator(self.weights, local, projection, self.safe) 603 delays_generator = DelayGenerator(self.delays, local, self.safe) 578 604 weights = weights_generator.get(N) 579 605 delays = delays_generator.get(N) 606 self.progressbar(len(projection.post.local_cells)) 607 count = 0 580 608 581 609 for tgt, w, d in zip(projection.post.local_cells, weights, delays): … … 584 612 # the float is in case the values are of type numpy.float64, which NEST chokes on 585 613 projection.connection_manager.connect(src, [tgt], float(w), float(d)) 614 self.progression(count) 615 count += 1 586 616 else: 587 617 raise errors.InvalidDimensionsError("OneToOneConnector does not support presynaptic and postsynaptic Populations of different sizes.")
