root/trunk/changelog

Revision 958, 38.9 KB (checked in by apdavison, 13 months ago)

renamed COPYING to LICENSE

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1====================
2Release 0.7.1 (r958)
3====================
4
5The main reason for this release is to add copyright statements, without which
6the validity of the CeCILL licence could be questioned. There are also some
7minor bug fixes.
8
9====================
10Release 0.7.0 (r929)
11====================
12
13This release sees a major extension of the API with the addition of the
14`PopulationView` and `Assembly` classes, which aim to make building large,
15structured networks much simpler and cleaner. A `PopulationView` allows a
16sub-set of the neurons from a `Population` to be encapsulated in an object. We
17call it a "view", rather than a "sub-population", to emphasize the fact that the
18neurons are not copied: they are the same neurons as in the parent `Population`,
19and any operations on either view or parent (setting parameter values, recording,
20etc.) will be reflected in the other.  An `Assembly` is a list of `Population`
21and/or `PopulationView` objects, enabling multiple cell types to be encapsulated
22in a single object. `PopulationView` and `Assembly` objects behave in most ways
23like `Population`: you can record them, connect them using a `Projection`, you
24can have views of views...
25
26The "low-level API" (rechristened "procedural API") has been reimplemented in
27in terms of `Population` and `Projection`. For example, `create()` now returns a
28`Population` object rather than a list of IDs, and `connect()` returns a
29`Projection`object. This change should be almost invisible to the user, since
30`Population` now behaves very much like a list of IDs (can be sliced, joined,
31etc.).
32There has been a major change to cell addressing: Populations now always store
33cells in a one-dimensional array, which means cells no longer have an address
34but just an index. To specify the spatial structure of a Population, pass a
35Structure object to the constructor, e.g.
36
37  `p = Population((12,10), IF_cond_exp)`
38
39  is now
40
41  `p = Population(120, IF_cond_exp, structure=Grid2D(1.2))`
42
43although the former syntax still works, for backwards compatibility. The reasons
44for doing this are:
45  (i)   we can now have more interesting structures than just grids
46  (ii)  efficiency (less juggling addresses, flattening)
47  (iii) simplicity (less juggling addresses, less code).
48
49The API for setting initial values has changed: this is now done via the
50`initialize()` function or the `Population.initialize()` method, rather than by
51having `v_init` and similar parameters for cell models.
52 
53Other API changes:
54
55- simplification of the `record_X()` methods.
56- enhanced `describe()` methods: can now use Jinja2 or Cheetah templating
57  engines to produce much nicer, better formatted network descriptions.
58- connections and neuron positions can now be saved to various binary formats as
59  well as to text files.
60- added some new connectors: `SmallWorldConnector` and `CSAConnector`
61  (CSA = Connection Set Algebra)
62- native neuron and synapse models are now supported using a NativeModelType
63  subclass, rather than specified as strings. This simplifies the code internally
64  and increases the range of PyNN functionality that can be used with native
65  models (e.g. you can now record any variable from a native NEST or NEURON
66  model). For NEST, there is a class factory ``native_cell_type()``, for NEURON
67  the NativeModelType subclasses have to be written by hand.
68
69Backend changes:
70
71- the NEST backend has been updated to work with NEST version 2.0.0.
72- the Brian backend has seen extensive work on performance and on bringing it
73  to feature parity with the other backends.
74
75
76Details:
77
78* Where `Population.initial_values` contains arrays, these arrays now consistently contain only enough values for local cells. Before, there was some inconsistency about how this was handled. Still need more tests to be sure it's really working as expected.
79
80* Allow override of default_maxstep for NEURON backend as setup paramter.  This is for the case that the user wants to add network connections across nodes after simulation start time.
81
82* Discovered that when using NEST with mpi4py, you must `import nest` first and let it do the MPI initialization. The only time this seems to be a problem with PyNN is if a user imports `pyNN.random` before `pyNN.nest`. It would be nice to handle this more gracefully, but for now I've just added a test that NEST and mpi4py agree on the rank, and a hopefully useful error message.
83
84* Added a new `setup()` option for `pyNN.nest`: `recording_precision`. By default, `recording_precision` is 3 for on-grid and 15 for off-grid.
85
86* Partially fixed the `pyNN.nest` implementation of `TsodyksMarkramMechanism` (cf ticket:172). The 'tsodyks_synapse' model has a 'tau_psc' parameter, which should be set to the same value as the decay time constant of the post-synaptic current (which is a parameter of the neuron model). I consider this only a partial fix, because if 'tau_syn_E' or 'tau_syn_I' is changed after the creation of the Projection, 'tau_psc' will not be updated to match (unlike in the `pyNN.neuron` implementation. I'm also not sure how well it will work with native neuron models.
87
88* reverted `pyNN.nest` to reading/resetting the current time from the kernel rather than keeping track of it within PyNN. NEST warns that this is dangerous, but all the tests pass, so let's wait and see.
89
90* In `HH_cond_exp`, conductances are now in µS, as for all other conductances in PyNN, instead of nS.
91
92* NEURON now supports Tsodyks-Markram synapses for current-based exponential synapses (before it was only for conductance-based).
93
94* NEURON backend now supports the IF_cond_exp_gsfa_grr model.
95
96* Simplification of the record_X() methods. With the addition of the
97  `PopulationView` class, the selection logic implemented by the `record_from`
98  and `rng` arguments duplicated that in `Population.__getitem__()` and
99  `Population.sample()`, and so these arguments have been removed, and the
100  `record_X()` methods now record all neurons within a `Population`,
101  `PopulationView` or `Assembly`.
102  Examples of syntax changes:
103     `pop.record_v([pop[0], pop[17]])` --> `pop[(0, 17)].record_v()`
104     `pop.record(10, rng=rng)` --> `pop.sample(10, rng).record()
105
106* Added a `sample()` method to `Population`, which returns a `PopulationView`
107  of a random sample of the neurons in the parent population.
108
109* Added the EIF_cond_exp/alpha_isfa/ista and HH_cond_exp standard models in
110  Brian.
111
112* Added a `gather` option to the `Population.get()` method.
113
114* `brian.setup()` now accepts a number of addtional argumenbts in `extra_params`,
115  For example, extra_params={'useweave': True} will lead to inline C++ code generation
116
117* Wrote a first draft of a developers' guide.
118
119* Considerably extended the `core.LazyArray` class, as a basis for a possible
120  rewrite of the `connectors` module.
121
122* The `random` module now uses `mpi4py` to determine the MPI rank and
123  num_processes, rather than receiving these as arguments to the RNG constructor
124  (see ticket:164).
125
126* Many fixes and performance enhancements for the `brian` module, which now
127  supports synaptic plasticity.
128
129* Made the `describe()` method of `Population`, `Projection`, etc. much more
130  powerful by adding a simple plugin-like structure for templating engines.
131  Jinja2 and Cheetah currently available, with fallback to string.Template.
132
133* No more GSL warning every time! Just raise an Exception if we attempt to use
134  GSLRNG and pygsl is not available.
135
136* Added some more flexibility to init_logging: logfile=None -> stderr, format
137  includes size & rank, user can override log-level
138
139* NEST __init__.py changed to query NEST for filling NEST_SYNAPSE_TYPES.
140  Allows _S connectors if available for use with inh_gamma_generator
141
142* Started to move synapse dynamics related stuff out of Projection and into the
143  synapse dynamics-related classes, where it belongs.
144
145* Added an `Assembly` class to the API. An `Assembly` is a list of `Population`
146  and/or `PopulationView` objects, enabling multiple cell types to be
147  encapsulated in a single object. An `Assembly` object is intended to
148  behave in most ways like `Population`: you can record them, connect them using
149  a `Projection`...
150
151* Added a new "spike_precision" option to `nest.setup()`
152  (see http://neuralensemble.org/trac/PyNN/wiki/SimulatorSpecificOptions)
153
154* Updated the NEST backend to work with version 2.0.0
155
156* Rewrote the test suite, making a much cleaner distinction between unit tests,
157  which now make heavy use of mock objects to better-isolate components, and
158  system tests. Test suite now runs with nose (http://somethingaboutorange.com/mrl/projects/nose),
159  in order to facilitate continuous integration testing.
160
161* the "low-level API" (rechristened "procedural API") has been reimplemented in
162  in terms of `Population` and `Projection`, with the aim of improved
163  maintainability. For example, `create()` now returns a `Population` object
164  rather than a list of IDs, and `connect()` returns a `Projection`object. With
165  the addition of `PopulationView` and `Assembly`, `Population` now behaves much
166  more like a list of IDs (can be sliced, joined, etc.), so this should have
167  minimal impact on existing simulation scripts.
168
169* Changed the format of connection files, as written by `saveConnections()` and
170  read by `FromFileConnector`: files no longer contain the population label.
171  Connections can now also be written to NumpyBinaryFile or PickleFile objects,
172  instead of just text files. Same for `Population.save_positions()`.
173
174* Added CSAConnector, which wraps the Connection Set Algebra for use by PyNN.
175  Requires the csa package: http://pypi.python.org/pypi/csa/
176
177* Added a `PopulationView` class to the API. This allows a sub-set of the neurons
178  from a `Population` to be encapsulated in an object. We call it a "view",
179  rather than a "sub-population", to emphasize the fact that the neurons are
180  not copied: they are the same neurons as in the parent `Population`, and any
181  operations on either view or parent (setting parameter values, recording, etc.)
182  will be reflected in the other. `PopulationView` objects are intended to
183  behave in most ways like `Population`: you can record them, connect them using
184  a `Projection`, you can have views of views...
185
186* A major change to cell addressing: Populations now always store cells in a
187  one-dimensional array, which means cells no longer have an address but just
188  an index. To specify the spatial structure of a Population, pass a Structure
189  object to the constructor, e.g.
190
191  `p = Population((12,10), IF_cond_exp)`
192
193  is now
194
195  `p = Population(120, IF_cond_exp, structure=Grid2D(1.2))`
196
197  although the former syntax still works, for backwards compatibility. The reasons for doing this are:
198  (i)   we can now have more interesting structures than just grids
199  (ii)  efficiency (less juggling addresses, flattening)
200  (iii) simplicity (less juggling addresses, less code - this opens the way to a
201        much easier implementation of sub-populations).
202
203* Removed the `v_init` parameter from all cell models. Setting initial values of
204  state variables is now done via the `initialize()` function or the
205  `Population.initialize()` method.
206
207* Enhance the distance expressions by allowing expressions such as
208  (d[0] < 0.1) & (d[1] < 0.2). Complex forms can therefore now be drawn,
209  such as squares, ellipses, and so on.
210
211* Added an `n_connections` flag to the DistanceDependentProbabiblityConnector in
212order to be able to constrain the total number of connections. Can be useful for normalizations
213
214* Added a simple SmallWorldConnector. Cells are connected within a certain
215  degree d. Then, all the connections are rewired with a probability given by a
216  rewiring parameter and new targets are uniformly selected among all the
217  possible targets.
218
219* Added a method to save cell positions to file.
220
221* Added a progress bar to connectors. Now, a verbose flag allows to display or
222  not a progress bar indicating the percentage of connections established.
223
224* New implementation of the connector classes, with much improved performance
225  and scaling with MPI, and extension of distance-dependent weights and delays
226  to all connectors. In addition, a `safe` flag has been added to all connectors:
227  on by default, a user can turn it off to avoid tests on weights and delays.
228 
229* Added the ability to set the `atol` and `rtol` parameters of NEURON's cvode
230  solver in the `extra_params` argument of `setup()` (patch from Johannes Partzsch).
231
232* Made `nest`s handling of the refractory period consistent with the other backends.
233  Made the default refractory period 0.1 ms rather than 0.0 ms, since NEST appears
234  not to handle zero refractory period.
235
236* Moved standard model (cells and synapses) machinery, the `Space` class, and
237  `Error` classes out of `common` into their own modules.
238
239====================
240Release 0.6.0 (r710)
241====================
242
243There have been three major changes to the API in this version.
244
2451. Spikes, membrane potential and synaptic conductances can now be saved to file
246   in various binary formats. To do this, pass a PyNN `File` object to
247   `Population.print_X()`, instead of a filename. There are various types of
248   PyNN `File` objects, defined in the `recording.files` module, e.g.,
249   `StandardTextFile`, `PickleFile`, `NumpyBinaryFile`, `HDF5ArrayFile`.
250
2512. Added a `reset()` function and made the behaviour of `setup()` consistent
252   across simulators. `reset()` sets the simulation time to zero and sets
253   membrane potentials to their initial values, but does not change the network
254   structure. `setup()` destroys any previously defined network.
255   
2563. The possibility of expressing distance-dependent weights and delays was
257   extended to the `AllToAllConnector` and `FixedProbabilityConnector` classes.
258   To reduce the number of arguments to the constructors, the arguments affecting
259   the spatial topology (periodic boundary conditions, etc.) were moved to a new
260   `Space` class, so that only a single `Space` instance need be passed to the
261   `Connector` constructor.
262
263Details:
264
265* Switched to using the point process-based AdExp mechanism in NEURON.
266
267* Factored out most of the commonality between the `Recorder` classes of each backend into a parent class `recording.Recorder`, and tidied up the `recording` module.
268
269* Can now pass a PyNN File object to `Population.print_X()`, instead of a filename. There are various types of PyNN File objects, defined in the `recording.files` module, e.g., `StandardTextFile`, `PickleFile`, `NumpyBinaryFile`, `HDF5ArrayFile`.
270
271* Added an attribute `conductance_based` to `StandardCellType`, to make the determination of synapse type for a given cell more robust.
272
273* PyNN now uses a named logger, which makes it easier to control logging levels when using PyNN within a larger application.
274
275* implemented gather for `Projection.saveConnections()`
276
277* Added a test script (test_mpi.py) to check whether serial and distributed simulations give the same results
278
279* Added a `size()` method to `Projection`, to give the total number of connections across all nodes (unlike `__len__()`, which gives only the connections on the local node
280
281* Speeded up record() by a huge factor (from 10 s for 12000 cells to less than 0.1 s) by removing an unecessary conditional path (since all IDs now have an attribute "local")
282
283* `synapse_type` is now passed to the `ConnectionManager` constructor, not to the `connect()` method, since (a) it is fixed for a given connection manager, (b) it is needed in other methods than just `connect()`; fixed weight unit conversion in `brian` module.
284
285* Updated connection handling in `nest` module to work with NEST version 1.9.8498. Will not now work with previous NEST versions
286
287* The `neuron` back-end now supports having both static and Tsodyks-Markram synapses on the same neuron (previously, the T-M synapses replaced the static synapses) - in agreement with `nest`  and common sense. Thanks to Bartosz Telenczuk for reporting this.
288
289* Added a `compatible_output` mode for the `saveConnections()` method. True by default, it allows connections to be reloaded from a file. If False, then the raw connections are stored, which makes for easier postprocessing.
290
291* Added an ACSource` current source to the `nest` module.
292
293* Fixed Hoc build directory problem in setup.py - see ticket:147
294
295* `Population.get_v()` and the other "`get`" methods now return cell indices (starting from 0) rather than cell IDs. This behaviour now matches that of `Population.print_v()`, etc. See ticket:119 if you think this is a bad idea.
296
297* Implemented `reset()` and made the behaviour of `setup()` consistent across simulators. Almost all unit tests now pass.
298
299* Moved the base `Connector` class from `common` to `connectors`. Put the `distances` function inside a `Space` class, to allow more convenient specification of topology parameters. Extended the possibility of expressing distance-dependent weights and delays to the `AllToAllConnector` and `FixedProbabilityConnector`.
300
301* `Projection.setWeights()` and `setDelays()` now accept a 2D array argument (ref ticket:136), to be symmetric with `getWeights()` and `getDelays()`. For distributed simulations, each node only takes the values it needs from the array.
302
303* `FixedProbabilityConnector` is now more strict, and checks that `p_connect` is less than 1 (see ticket:148). This makes no difference to the behaviour, but could act as a check for errors in user code.
304
305* Fixed problem with changing `SpikeSourcePoisson` rate during a simulation (see ticket:152)
306
307
308====================
309Release 0.5.0 (r652)
310====================
311
312There have been rather few changes to the API in this version, which has
313focused rather on improving the simulator interfaces and on an internal
314code-reorganization which aims to make PyNN easier to test, maintain and
315extend.
316
317Principal API changes:
318
319    * Removed the 'string' connection methods from the `Projection` constructor.
320      The `method` argument now *must* be a `Connector` object, not a string.
321    * Can now record synaptic conductances.
322    * Can now access weights and delays of individual connections one-at-a-time
323      within a `Projection` through `Connection` objects.
324    * Added an interface for injecting arbitrary time-varying currents into cells.
325    * Added `get_v()` and `get_gsyn()` methods to the `Population` class, enabling
326      membrane potential and synaptic conductances to be read directly into memory,
327      rather than saved to file.
328   
329Improvements to simulator back-ends:
330    * Implemented an interface for the Brian simulator.
331    * Re-implementated the interface to NEURON, to use the new functionality in v7.0.
332    * Removed support for version 1 of NEST. The module for NEST v2 is now simply called `pyNN.nest`.
333    * The PCSIM implementation is now more complete, and more compatible with the
334      other back-ends.
335    * Behind-the-scenes refactoring to implement the API in terms of a small number
336      of low-level, simulator-specific operations. This reduces redundancy between
337      simulator modules, and makes it easier to extend PyNN, since if new
338      functionality uses the low-level operations, it only needs to be written once,
339      not once for each simulator.
340
341Details:
342
343* Renamed `nest2` to `nest`.
344
345* Random number generators  now "parallel_safe" by default.
346
347* Added documentation on running parallel simulations.
348
349* Trying a new method of getting the last data points out of NEST: we always simulate to `t+dt`. This should be fine until we implement the possibility of accessing Vm directly from the `ID` object (see ticket:35). In the meantime, hopefully the NEST guys will change this behaviour.
350
351* `gather=True` now works for all modules, even without a shared filesystem (requires `mpi4py`).
352
353* Added an `allow_update_on_post` option to the NEURON weight adjuster mechanisms. This is set to 0 (false) for consistency with NEST, which means that weight updates are accumulated and are applied only on a pre-synaptic spike, although I'm not yet sure (a) what the correct behaviour really is, (b) what PCSIM and Brian do.
354
355* The `pcsim` module is now implemented in terms of the common implementation, using just `net.add()` and `net.connect()`. I have just commented out the old code (using `CuboidGridObjectPopulation`s and `ConnectionsProjection`s) rather than deleting it, as it will probably be mostly re-used when optimizing later.
356
357* `Population.__getitem__()` now accepts slices (see ticket:21).
358
359* NEST does not record values at t=0 or t=simtime so, for compatibility with the other simulators, we now add these values manually to the array/datafile.
360
361* Fixed the `SpikeSourcePoisson` model in the `neuron` module so it has a really fixed
362duration, not just an 'on average' fixed duration.
363
364* Created a new Exception type, `RecordingError`, for when we try to record membrane potential from a `SpikeSource`.
365
366* Renamed the `param_dict` argument of `create()` to `cellparams`, for consistency with `Population.__init__()`.
367
368* Created default implementations of nearly all functions and classes in `common`, some of which depend on the simulator package having a `simulator` module that defines certain 'primitive' capabilities.
369
370* Created default implementations of all `Connector` classes in `connectors`, which
371depend on the `Projection` having a `ConnectionManager` which in turn has a `connect()`
372method implementing divergent connect.
373
374* Added a `ConnectionManager` class to the `simulator` module in `nest2`, `neuron` and `brian` packages. This allows (i) a common way of managing connections for both the `connect()` function and the `Projection` class, (ii) a common specification of `Connector` algorithms in terms of method calls on a `ConnectionManager` instance.
375
376* Added `weights_iterator()` and `delays_iterator()` to the base `Connector` class, to make them available to all simulator modules.
377
378* Moved `Connector` base classes from `common` into a new module, `connectors`.
379
380* Moved standard dynamic synapse base classes from `common` into a new module, `synapses`.
381
382* Moved standard cell base classes from `common` into a new module, `cells`.
383
384* Moved `Timer` class from `common` to `utility`.
385
386* `Population` attributes `all_cells` and `local_cells` are now an official part of the API (`cell` is as an alias for `local_cells` for now since it was widely used, if not officially part of the API, in 0.4).
387
388* Removed the 'string' connection methods from the `Projection` constructor. The `method` argument now *must* be a `Connector` object, not a string.
389
390* Standard cell types now know what things can be recorded from them (`recordable` attribute).
391
392* Added new Exception `NothingToWriteError`. Calling `printSpikes()`, etc, when you have not recorded anything raises an Exception, since this is quite likely a mistake, but it needs to be a specific Exception type so it can be handled without inadvertently catching all other errors that are likely to arise during writing to file.
393
394* Moved old tests to examples folder
395
396* Added Padraig Gleeson's modifications to neuroml.py
397
398* little change in setup of the rng_seeds, re-add the possibility to give a seed for a RNG that then draws seeds for the simulation. In that way one does not have to provide the exact number of seeds needed, just one.
399
400* add `save_population()` and `load_population()` functions to `utility`.
401
402* `test/explore_space.py` is now working. The test script saves results to a NeuroTools datastore, which the `explore_space` script can later retrieve. Only plotting does not work in distributed mode due to lack of X-display.
403
404* STDP testing improved. `nest`, `pcsim` and `neuron` now give pretty similar results for `SpikePairRule` with `AdditiveWeightDependence`. I think some of the remaining differences are due to sampling the weights every millisecond, rather than at the beginning of each PSP. We need to develop an API for recording weights in PyNN (PCSIM and NEURON can record the weights directly, rather than by sampling, not sure about NEST).
405However, I suspect there are some fundamental differences in the algorithms (notably *when* weight changes get applied), that may make it impossible to completely reconcile the results.
406
407* Moved the `MultiSim` class from `test/multisim.py` into the `utility` module.
408
409* The `pcsim` module now supports dynamic synapses with both conductance-based and current-based synapses.
410
411* `Projection.saveConnections()`, `printWeights()` and `weightHistogram()` now work in the `pcsim` module.
412
413* `pcsim` `Connector`s now handle arrays of weights/delays.
414
415* Implemented `FromListConnector` and `FromFileConnector` for `pcsim`.
416
417* Changed tau_ref for hardware neuron model from 0.4ms to 1.0ms. Old estimation was distorted by hardware error.
418
419* Fixed a bug whereby spikes from a `Population` of `SpikeSourceArray`s are not recorded if they are set after creation of the population.
420
421* Optimisations to improve the building times of large networks in `nest2`.
422
423* Can now record synaptic conductances.
424
425* Added an interface for the Brian simulator.
426
427* When you try to write data to a file, any existing file of the same name is first renamed by appending '_old' to the filename.
428
429* Modification of the RandomDistribution object to allow the specification of boundaries, and the way we deal with numbers drawn outside those boundaries. Numbers may be clipped to min/max values, or either redrawn till they fall within min/max values
430
431* Added the possibility to select a particular model of plasticity when several are available for the same plastic rule. This is mainly used in NEST, where we set the stdp_synapse_hom as the default type, because it is more efficient when (as is often the case) all plasticity parameters are identitical.
432
433* Added the possibility of giving an expression for distant-dependent weights and delays in the `DistanceDependentProbabilityConnector`.
434
435* Harmonization of `describe()` methods across simulators, by moving its definition into `common`. `describe()` now returns a string, rather than printing directly to stdout. This lets it be used for writing to log files, etc. You will now have to use `print p.describe()` to obtain the old behaviour.`describe()` now also takes a `template` argument, allowing the output to be customized.
436
437* Added an interface for injecting arbitrary currents into cells.
438
439Usage example:
440{{{
441  cell = create(IF_curr_exp)
442  current_source1 = DCSource(amplitude=0.3, start=20, stop=80)
443  current_source2 = StepCurrentSource(times=[20,40,60,80], amplitudes=[0.3,-0.3,0.3,0.0])
444
445  cell.inject(current_source1)            # two alternatives
446  current_source2.inject_into([cell])
447}}}
448`DCSource` and `StepCurrentSource` are available in the `nest2`, `neuron` and `brian` modules. `NoisyCurrentSource` is only available in `nest2` for the time being, but it will be straightforward to add it for the other backends. Adding `ACSource`, etc., should be straightforward.
449
450* Optimised setting of parameter values by checking whether the list of parameters to be set contains any computed parameters, and only getting/translating all parameters in this case. Before, each time we wanted to set a parameter, we always got all the native_parameters and translated them even when there was a one-to-one correspondence between parameters.
451
452* Implemented the Gutig rule and the van Rossum rule of plasticity in `nest2`, and changed the old naming.
453
454* In `nest2`, fixed also the meanSpikeCount() method to directly obtain the spike count from the recorder, and not from the file.
455
456* Great improvement of the distance dependant distance. Speed up considerably the building time.
457
458* Moved unit tests into their own subdirectory
459
460* Fixed a bug in the periodic boundary conditions in `DistanceDependentProbabilityConnector` class if they are specified by the user and not linked to the grid sizes.
461
462* Reduced the number of adjustable parameters in the `IF_facets_hardware1` standard cell model.
463
464* Reimplemented the `neuron` module to use the new features of NEURON (`HocObject`, etc) available in v7.0.
465
466* Added `get_v()` method to the `Population` class, enabling membrane potential to be read directly into memory, rather than saved to file.
467
468====================
469Release 0.4.0 (r342)
470====================
471
472* Added a `quit_on_end` extra argument to `neuron.setup()`
473
474* Added a `synapse_types` attribute to all standard cell classes.
475
476* Removed `Projection.setThreshold()` from API
477
478* In the `neuron` module, `load_mechanisms()` now takes a path to search from as an optional argument, in order to allow loading user-defined mechanisms
479
480* Added `get_script_args()` (process command line arguments) and `colour()` (print coloured output) functions to the `utility` module.
481
482* Added `rank()` to the API (returns the MPI rank)
483
484* Removed `setRNGseeds()` from the API, since each simulator is so different in its requirements. The seeds may be provided using the `extra_params` argument to `setup()`.
485
486* The headers of output files now contain the first and last ids in the Population (not fully implemented yet
487for recording with the low-level API)
488
489* Global variables such as the time step and minimum delay have been replaced
490with functions `get_time_step()`, `get_min_delay()` and `get_current_time()`. This
491ensures that values are always up-to-date.
492
493* Removed `cellclass` arg from `set()` function. All cells should now know their own cellclass.
494
495* Added `get()` method to `Population` class.
496
497* Default value for the `duration` parameter in `SpikeSourcePoisson` changed
498from 1e12 ms to 1e6 ms.
499
500* Reimplemented `Population.set()`, `tset()`, `rset()` in a more consistent way
501which avoids exposing the translation machinery and fixes various bugs with
502computed parameters. The new implementation is likely to be slower, but several
503optimisations are possible.
504
505* Added `simple_parameters()`, `scaled_parameters()` and `computed_parameters()`
506methods to the `StandardModelType` class. Their intended use is in making
507`set()` methods/functions more efficient for non-computed parameters when
508setting on many nodes.
509
510* Multiple calls to `Population.record()` no longer record the same cell twice.
511
512* Changed `common.ID` to `common.IDMixin`, which allows the type used for the id
513to vary (`int` for `neuron` and `nest1/2`, `long` for pcsim).
514
515* In `common.StandardModelType`, changed most of the methods to be classmethods,
516since they do not act on instance data.
517
518* Added a `ModelNotAvailable` class to allow more informative error messages
519when people try to use a model with a simulator that doesn't support it.
520
521* hoc and mod files are now correctly packaged, installed and compiled with
522`distutils`.
523
524* Added a check that argument names to `setup()` are not mis-spelled. This is
525possible because of `extra_params`.
526
527* It is now possible to instantiate Timer objects, i.e. to have multiple,
528independent Timers
529
530* Some re-naming of function/method arguments to conform more closely to
531Python style guidelines, e.g. `methodParameters` to `method_parameters` and
532`paramDict` to `param_dict`.
533
534* Added `getWeights()` and `getDelays()` methods to `Projection` class. NOTE:
535check for which simulators this is available. XXX
536
537* Added a `RoundingWarning` exception, to warn the user when rounding is
538occurring.
539
540* Can now change the `spike_times` attribute of a `SpikeSourceArray` during a
541simulation without reinitialising. This reduces memory for long simulations,
542since it is not necessary to load all the spike times into memory at once.
543NOTE: check for which simulators this works. XXX
544
545* The `neuron` module now requires NEURON v6.1 or later.
546
547* For developers, changes to the layout of the code:
548    (1) Simulator modules have been moved to a `src` subdirectory - this is to
549    make distribution/installation of PyNN easier.
550    (2) Several of the modules have been split into multiple files, in their own
551    subdirectories, e.g.: `nest2.py` --> `nest2/__init__.py`, `nest2/cells.py`
552    and `nest2/connectors.py`. The reason for this is that the individual files
553    were getting very long and difficult to navigate.
554
555* Added `index()` method to `Population` class - what does it do?? XXX
556
557* Added `getSpikes()` method to `Population` class - returns spike times/ids as
558a numpy array.
559
560* Added support for the Stage 1 FACETS hardware.
561
562* Changed the default weight to zero (was 1.0 nA)
563
564* New STDP API, with implementations for `neuron` and `nest2`, based on
565discussions at the CodeSprint.
566
567* Distance calculations can now use periodic boundary conditions.
568
569* Parameter translation system now fully supports reverse translation
570(including units). The syntax for specifying translations is now simpler,
571which makes it easier to define new standard cell models.
572
573* All simulator modules now have a `list_standard_models()` function, which
574returns a list of all the models that are available for that simulator.
575
576* The `connect()` function now returns a `Connection` object, which has
577`weight` and `delay` properties. This allows accessing/changing weights/delays
578of individual connections in the low-level API. NOTE: only available in `nest2`?
579Implement for all sims or delete from this release. XXX
580
581* Added `record_c()` and `print_c()` methods to the `Population` class, to allow
582recording synaptic conductances. NOTE: only in `nest2` - should add to
583`neuron` or delete from this release. XXX
584
585* Procedures for connecting `Population`s can now be defined as classes
586(subclasses of an abstract `Connector` class) rather than given as a string.
587This should make it easier for users to add their own connection methods.
588Weights and delays can also be specified in the `Connector` constructor,
589removing the need to call `setWeights()` and `setDelays()` after the building
590of the connections.
591We keep the string specification for backwards compatibility, but this is
592deprecated and will be removed in a future API version.
593
594* Added new standard models: EIF_cond_alpha_isfa_ista, IF_cond_exp_gsfa_grr,
595HodgkinHuxley. NOTE: check names, and that all models are supported by at
596least two simulators.
597
598* Version 2 of the NEST simulator is now supported, with the `nest2` module.
599The `nest` module is now called `nest1`.
600
601* Changed the order of arguments in `random.RandomDistribution.__init__()` to
602put `rng` last, since this is the argument for which the default is most often
603used (moving it lets positional arguments be used for `distribution` and
604`parameters` when `rng` is not specified).
605
606* Changes to `ID` class:
607  - `_cellclass` attribute renamed to `cellclass` and is now a [http://www.geocities.com/foetsch/python/new_style_classes.htm property].
608  - Ditto for `_position` --> `position`
609  - Methods `setPosition()`, `getPosition()`, `setCellClass()` removed (just use
610  the `position` or `cellclass` properties).
611  - `set(param,val=None)` changed to `setParameters(**parameters)`.
612  - Added `getParameters()`
613  - `__setattr__()` and `__getattr__()` overridden, so that cell parameters can
614  be read/changed using dot notation, e.g. `id.tau_m = 20.0`
615Note that one of the reasons for using properties is that it allows attributes
616to be created only when needed, hopefully saving on memory.
617
618* Added `positions` property to `Population` class, which allows the positions
619of all cells in a population to be set/read at once as a numpy array.
620
621* All positions are now in 3D space, irrespective of the shape of the
622`Population`.
623
624* Threads can now be used in `nest` and `pcsim`, via the `extra_param` option of
625the `setup()` function.
626
627* Removed `oldneuron` module.
628
629* Added `__iter__()` (iterates over ids) and `addresses()` (iterates over
630addresses) to the `Population` class.
631
632=============
633Release 0.3.0
634=============
635
636* `pcsim` is now fully supported, although there are still one or two parts of
637the API that are not implemented.
638
639* The behaviour of the `run()` function in the `neuron` module has been changed to match the `nest` and `pcsim` modules, i.e., calling `run(simtime)` several times in succession will advance the simulation by `simtime` ms each time, whereas before, `neuron` would reset time to zero each time.
640
641* PyTables is now optional with `pcsim`
642
643* Change to `neuron` and `oldneuron` to match more closely the behaviour of
644`nest` and `pcsim` when the `synapse_type` argument is not given in `connect()`.
645Before, `neuron` would by default choose an excitatory synapse. Now, it chooses
646an inhibitory synapse if the weight is negative.
647
648* `runtests.py` now runs tests for `pcsim` as well as `nest`, `neuron` and
649`oldneuron`.
650
651* Minor changes to arg names and doc-strings, to improve API-consistency between modules.
652
653* Added users' guide (in `doc` directory).
654
655* Renamed `neuron` module to `oldneuron` and `neuron2` to `neuron`.
656
657* PyNN can now be installed using `distutils`, although this doesn't install
658or compile hoc/mod files.
659
660* Added a `compatible_output` argument to the `printX()` functions/methods, to
661allow choosing a simulator's native format (faster) or a format that is
662consistent across simulators.
663
664* Temporary files used for saving spikes and membrane potential are now created
665using the `tempfile` module, which means it should be safe to run multiple PyNN
666simulations at the same time (before, they would all overwrite the same file).
667
668* pygsl is no longer an absolute requirement but can be used if available
669
670* Changed the behaviour of `Population` indexing in the `nest` module to be more
671consistent with the `neuron2` module, in two ways. (i) negative addresses now
672raise an Exception. (ii) Previously, an integer index `n` signified the `(n+1)`th
673neuron in the population, e.g., `p[99]` would be the same as `p[10,10]` for a
67410x10 population. Now, `p[99]` is the same as `p[99,]` and is only valid for a
6751D population.
676
677* Addition of `ID` class (inherits from `int`), allowing syntax like
678`p[3,4].set('tau_m',20.0)` where `p` is a Population object.
679
680=============
681Release 0.2.0
682=============
683
684* `Population.tset()` now accepts arrays of arrays (e.g. conceptually a 2D array
685of 1D arrays, actually a 3D array) as well as arrays of lists.
686
687* setup() now returns the node id. This can be used in a parallel framework to
688identify the master node.
689
690* Unified output format for spikes and membrane potential for `nest` and
691`neuron` modules.
692
693* Added first experimental version of `pcsim` module
694
695* `neuron2` module now supports distributed simulations using NEURON compiled
696with both MPI and Python support.
697
698* `Population[xx]` syntax for getting individual cell ids improved. You can now
699write `p[2,3]` instead of `p[(2,3)]`.
700
701* `v_init` added as a parameter to the `IF_curr_alpha`, etc, models.
702
703* Trying to access a hoc variable that doesn't exist raises a Python exception,
704`HocError`.
705
706* If synaptic delay is not specified, delays are now set to `min_delay`, not zero.
707
708* Random number API allows keeping control of the random numbers used in
709simulations, by passing an RNG object as an argument to functions that use RNGs.
710`random` module has wrappers for NumPy RNGs and GSL RNGs, as well as a stub
711class to indicate the simulator's native RNG should be used (i.e., the `Random`
712class in hoc).
713
714* Translation of model and parameter names from standardised names to
715simulator-specific names now uses one class per neuron model, rather than a
716single class with one method per model. For users, the only difference is
717that you have to use, e.g.,
718    `create(IF_curr_alpha)`
719instead of
720    `create('IF_curr_alpha')`
721i.e., pass the class instead of a string.
722For developers, it should now be easier to add new standard models.
723
724* Added `neuron2` module, a reimplemtation of the PyNN API for NEURON, that uses
725more Python and less hoc.
726
727
728=============
729Release 0.1.0
730=============
731
732Version 0.1 of the API was never really released. At this point the project used
733the FACETSCOMMON svn repository.
734
735First svn import of early stage of PyNN was on 9th May 2006.
Note: See TracBrowser for help on using the browser.