Skip to main content

Tools for building and simulating large-scale neural models

Project description

Latest PyPI version Python versions

Nengo: Large-scale brain modelling in Python

An illustration of the three principles of the NEF

Nengo is a Python library for building and simulating large-scale neural models. Nengo can create sophisticated spiking and non-spiking neural simulations with sensible defaults in a few lines of code. Yet, Nengo is highly extensible and flexible. You can define your own neuron types and learning rules, get input directly from hardware, build and run deep neural networks, drive robots, and even simulate your model on a completely different neural simulator or neuromorphic hardware.


Nengo depends on NumPy, and we recommend that you install NumPy before installing Nengo. If you’re not sure how to do this, we recommend using Anaconda.

To install Nengo:

pip install nengo

If you have difficulty installing Nengo or NumPy, please read the more detailed Nengo installation instructions first.

If you’d like to install Nengo from source, please read the developer installation instructions.

Nengo is tested to work on Python 3.6 and above. Python 2.7 and Python 3.4 were supported up to and including Nengo 2.8.0. Python 3.5 was supported up to and including Nengo 3.1.


Here are six of many examples showing how Nengo enables the creation and simulation of large-scale neural models in few lines of code.

  1. 100 LIF neurons representing a sine wave

  2. Computing the square across a neural connection

  3. Controlled oscillatory dynamics with a recurrent connection

  4. Learning a communication channel with the PES rule

  5. Simple question answering with the Semantic Pointer Architecture

  6. A summary of the principles underlying all of these examples


Usage and API documentation can be found at

To build the documentation yourself, run the following command:

python build_sphinx

This requires Pandoc to be installed, as well as some additional Python packages. For more details, see the Developer Guide.


Information for current or prospective developers can be found at

Getting Help

Questions relating to Nengo, whether it’s use or it’s development, should be asked on the Nengo forum at

Release history

4.0.0 (November 16, 2023)


  • Added groups parameter to nengo.Convolution. (#1675, #1684)


  • Made NengoCore available under the GPLv2 license. (#1693)


  • Fixed an issue where nengo.LinearFilter and subclasses (e.g. Lowpass, Alpha) would fail when running on tensors with dimension >= 3. (#1687)

3.2.0 (January 27, 2022)


  • Added official support for Python 3.9. (#1660)

  • Added ChannelShape.from_space_and_channels to easily construct a ChannelShape from a spatial shape and number of channels. (#1648)

  • Added the ConvolutionTranspose transform to perform transposed convolution. It is commonly used for various forms of upsampling in deep networks. (#1648)

  • Added Conv and ConvTranspose aliases for Convolution and ConvolutionTranspose. (#1648)


  • The minimum supported NumPy version is now 1.19, as earlier versions are no longer officially supported. (NEP-29, #1683)


  • Removed support for Python 3.5 (which reached its end of life in September 2020). (#1649)

  • Removed nengo.utils.graphs.graph (this was a small utility function for building graphs that was only used in tests). (#1654)

  • Removed simulator.ProbeDict alias; this was previously renamed to simulator.SimulationData. (#1649)


  • Fixed a bug with a problematic cache index breaking decoder solvers. The solver now avoids using the cache, rather than crashing. (#1649)

  • Operator graph step order will now be deterministic. (#1654)

  • Fixed an issue in which some simulators could not be reset due to signals not being marked as readonly. (#1676)

  • Fixed an inconsistency in which normal Node output functions would receive a copy of the input signal, while Process step functions would not. Process step functions now also receive copies. (#1679)

  • Duplicate keys in Neurons.probeable have been removed. (#1681)

3.1.0 (November 17, 2020)


  • Added a new example notebook for Legendre Memory Units. (#1589)

  • Added the step_order attribute to nengo.Simulator, which contains an ordered list of the operations run on each timestep. (#1615)

  • Added the make_state method to NeuronType, which initializes the neuron type’s state variables. (#1609)

  • Added the spiking attribute to NeuronType, which exposes whether a neuron type is spiking or non-spiking. (#1609)

  • Added the negative attribute to NeuronType, which indicates whether the neuron type can have negative outputs. (#1609)

  • Added the Tanh neuron type to simulate hyperbolic tangent neurons. (#1609)

  • Added the RatesToSpikesNeuronType, which is a base class for neuron types that convert a rate-based type to a spiking one. (#1609)

  • Added the RegularSpiking neuron type, which emits regularly-spaced spikes at the rate specified by its base type. (#1609)

  • Added the StochasticSpiking neuron type, which emits spikes based on stochastic rounding to roughly match the rate specified by its base type. (#1609)

  • Added the PoissonSpiking neuron type, which emits Poisson-distributed spikes, as are commonly used to match biological spiking statistics. (#1609)

  • Added the PositiveNeuronType test argument to run tests on all neuron types for which negative is not True. (#1609)

  • Added the QuasirandomSequence distribution, which is similar to Uniform but spreads points across the space evenly. (#1611)

  • Added the ScatteredHypersphere distribution, which is similar to UniformHypersphere but spreads points across the space more evenly. (#1611)

  • Added the RLS (recursive least-squares) learning rule, which is an online version of the least-squares method typically used for offline decoder-solving. (#1611, example)

  • Added the SimProbe operator, which marks a signal as being probed. (#1653)


  • Nengo is now compatible with Python 3.8. (#1628)

  • The default Connection transform is now None, meaning that there will be no transform applied. This only changes behavior when learning on a neuron-neuron connection with the default scalar transform. In that situation there are now no weights to apply learning to, so this will result in an error. The old behaviour can be obtained by setting transform=1. (#1591)

  • Network list attributes (e.g. .ensembles, .connections, .probes) are now read-only, to prevent users from accidentally overwriting them with their own data. (#1545, #1608)

  • The NeuronType.step_math method has been renamed to NeuronType.step. (#1609)

  • Neuron types can now create arbitrary state variables without needing to register a new build function. The state class attribute declares the neuron type’s state variables and their default initial values. All __init__ methods accept an initial_state dictionary for users to override the default initial state values. (#1609)

  • The nl and nl_nodirect test arguments have been renamed to AnyNeuronType and NonDirectNeuronType. (#1609)

  • Weight solvers (i.e. those with weights=True) are now allowed on all connections. For connections that are not between Ensembles, though, weight solvers have the same effects as solvers with weights=False, and a warning will be raised. (#1626)

  • Various improvements to simulation speed. (#1629)

  • EnsembleArray now raises an error if add_output would overwrite an existing attribute. (#1611)

  • The encoders and eval_points of Ensemble are now sampled from ScatteredHypersphere by default. (#1611)

  • Trying to re-open a closed Simulator will now raise an error. (#1599)


  • NeuronType.step replaces the NeuronType.step_math method, which will be removed in Nengo 4.0.0. (#1609)

  • Connection.is_decoded is deprecated, as the definition of whether a Connection is decoded or not was ambiguous. Instead we recommend directly checking the pre/post objects for the properties of interest. (#1640)


  • Fixed a bug when comparing equality with Ensemble.neurons or Connection.learning_rule objects. (#1588)

  • Fixed a bug preventing unpickling an Ensemble. (#1598)

  • Fixed a bug in which unpickling a Simulator would rerun the optimizer. (#1598)

  • Fixed a bug where the LstsqDrop solver errored when solving for zero weights. (#1541, #1607)

  • Fixed a bug in the validation of Choice distributions. (#1630)

  • Fixed a bug where a Signal did not register as sharing memory with itself. (#1627)

  • Fixed a shape error when applying PES learning to a neuron-to-neuron connection with a slice on the post-synaptic neurons. (#1640)

  • Fixed a shape error when applying PES learning to a neuron->ensemble connection with a weight solver. (#1640)

  • Fixed a shape error when applying PES learning to an ensemble->neuron connection. (#1640)

  • Fixed a shape error when applying PES learning with a slice on the pre-synaptic object. (#1640)

3.0.0 (November 18, 2019)


  • Added progress bar support for Jupyter Lab >=0.32. (#1428, #1087)

  • We now warn that the progress bar is not supported in Jupyter Notebook <5. (#1428, #1426)

  • Added support for convolutional connections. (#1481)

  • Added version tracking to documentation, so that documentation from old versions remains available. (#1488)

  • Added support for sparse connections. (#1532)

  • Added a fail_fast setting to test operators when they are first added to the model. See configuration options for details. (#1532)

  • Added a --memory option for pytest that prints the total memory consumed by the tests when they complete (Linux and Mac OS X only). (#640)

  • Added a bit precision setting to change the number of bits allocated to each value tracked by Nengo. (#640)

  • Added a Simulator.clear_probes method to clear probe data. This method can be used before pickling to reduce the pickle file size. (#1387)

  • Nengo tests now use the allclose fixture from pytest-allclose, which makes it possible for backends to change test tolerances. (#1563)

  • Nengo tests now use the rng and seed fixtures from pytest-rng. (#1566)

  • Nengo tests now use the plt fixture from pytest-plt. (#1566)

  • Added a nengo_simloader pytest option for specifying a callable that takes a pytest request and returns a callable to be used as Simulator in the Nengo test suite. (#1566)

  • Added more content to the API reference documentation. (#1578)


  • Python 2 is no longer supported. The oldest supported Python version is 3.5. (#1520,

  • Nengo no longer supports Python 3.4. Official 3.4 support ended in March 2019. (PEP-429, #1514)

  • Replaced the dt argument to Simulator.trange with sample_every because dt would return values that the simulator had not simulated. dt is now an alias for sample_every and will be removed in the future. (#1368, #1384)

  • Dense connection transforms (this includes all previously supported values for Connection.transform) will now be represented internally as nengo.Dense objects. Arrays/scalars can still be passed as transform values, and they will be automatically converted to the equivalent nengo.Dense object. Retrieving the value of my_conn.transform will return that Dense object. The original input array can be retrieved through my_conn.transform.init. (#1481)

  • nengo.solvers.NoSolver(w, weights=True) now expects w to have shape (pre.n_neurons, function_d), rather than pre.n_neurons, post.n_neurons). That is, with NoSolver you are always specifying the values for the decoders, and encoders/transform will be applied automatically to those decoders (as occurs with all other solvers). Note that this does not affect NoSolver(..., weights=False) (the default). (#1481)

  • Increased minimum NumPy version to 1.11.0. See our instructions for installing NumPy if you need to upgrade. (#1481)

  • Solvers are now explicitly marked as compositional or non-compositional depending on whether they must act on full connection weight matrices when solving for weights. (#1507)

  • Solvers no longer take encoders as an argument. Instead, encoders will be applied to the targets before the solve function for non-compositional solvers and applied by the Transform builder for compositional solvers. (#1507)

  • Example Jupyter notebooks have been upgraded to notebook format 4. (#1440)

  • Switched documentation to new nengo-sphinx-theme. (#1489)

  • The settled_firingrate function has been moved from nengo.utils.neurons to nengo.neurons. (#1187)

  • Added new pytest config option, nengo_test_unsupported (replacing the previous Simulator.unsupported functionality). (#1521)

  • Switched to nengo-bones templating system for TravisCI config/scripts. (#1514)

  • The NeuronType.current and NeuronType.rates methods now document the supported shapes of parameters and return values. (#1437)

  • PES learning updates are now applied on the next timestep rather than the current one. (#1398)

  • The NdarrayParam now accepts a dtype argument to check that data assigned to that parameter matches the given Numpy dtype. DistOrArrayParam accepts an analogous sample_dtype argument. (#1532)

  • We no longer test operators when they are initially added to the model, which speed up build times slightly. To re-enable this testing, enable the fail_fast RC setting. (#1532)

  • LinearFilter now uses state space representations internally, which is faster and potentially more accurate. (#1535)

  • The default value of y0 in Synapse.filt is now 0 instead of the initial value of the input signal. This allows unstable filters (e.g., integrators) to be used with filt. (#1535)

  • LinearFilter now accepts the discretization method as an argument, rather than having it specified in make_step. (#1535)

  • The synapse_kwargs argument to FilteredNoise has been removed. (#1535)

  • Processes with internal state now declare that state by defining a make_state method and accepting a state parameter in make_step. (#1387)

  • Simulator is now pickleable, allowing its state to be saved and loaded. (#1387)

  • Renamed utils.testing.allclose to utils.testing.signals_allclose, to differentiate it from the allclose fixture. (#1563)

  • The default intercepts value has been changed to Uniform(-1, 0.9) to avoid high gains when intercepts are close to 1. (#1534, #1561)

  • The --simulator and --neurons pytest command line arguments are now specified by nengo_simulator and nengo_neurons entries in the pytest config file instead. (#1566)

  • The nengo_test_unsupported option now uses pytest nodeids for the test names (the main change is that this means a double :: between file and function names). (#1566)

  • Signals will now raise an error if their initial value contains NaNs. (#1571)

  • The builder will now raise an error if any encoders are NaN, which can occur if an encoder has length zero. (#1571)

  • Renamed simulator.ProbeDict to simulator.SimulationData. (#1574)

  • Increased minimum numpy version to 1.13. (#1577)

  • Documentation pages that had underscores in their filenames have been renamed to have hyphens instead. (#1585)


  • Deprecated the module. Use the Nengo SPA project instead. (#1465)

  • The A and B inputs to the Product and CircularConvolution networks are officially deprecated. Use input_a and input_b instead. (#887, #1179)

  • nengo.utils.compat will be removed in the next minor release. (#1520)

  • Deprecated utils.numpy.rmse. Call utils.numpy.rms on the difference between two arrays instead. (#1563)


  • Networks no longer accept the net argument. To set network arguments like label, pass them as keyword arguments instead. (#1179)

  • Removed generate_graphviz utility function. It can now be found in nengo_extras. (#1187)

  • Removed functions for estimating firing rates from spikes. They can now be found in nengo_extras. (#1187)

  • Removed the probe_all function. It can now be found in nengo_extras. (#1187)

  • PES.correction is no longer probeable. (#1398)

  • The internal rng and seed fixtures have been removed. Use the external pytest-rng package instead. (#1566)

  • The internal plt fixture has been removed. Use the external pytest-plt package instead. (#1566)

  • The internal logger fixture has been removed. Use pytest’s log capturing instead. (#1566)

  • Removed nengo.log and nengo.utils.logging. Use the standard Python and pytest logging modules instead. (#1566)

  • The internal analytics and analytics_data fixtures have been removed. Use pytest’s cache fixture instead. (#1566)

  • The RefSimulator fixture has been removed. Use the Simulator fixture and the nengo_test_unsupported configuration option instead. (#1566)

  • Removed find_modules and load_functions from nengo.utils.testing. Backends wanting to run Nengo test should use pytest --pyargs nengo instead. (#1566)

  • Removed nengo.tests.options. It is no longer necessary to use -p nengo.tests.options when running Nengo tests. (#1566)

  • Removed nengo.conftest. Use pytest configuration options instead. (#1566)

  • Removed support for legacy cache files. (#1577)

  • Removed the nengo ipynb progress bar extension. This is no longer needed in more recent ipynb versions. (#1577)

  • Removed the deprecated *_tau (e.g. pre_tau) parameters from learning rules. Use *_synapse instead. (#1577)

  • Removed the deprecated neuron_nodes argument from networks.EnsembleArray. Use EnsembleArray.add_neuron_input/add_neuron_output instead. (#1577)

  • Removed the deprecated progress.updater config option. Use progress.progress_bar instead. (#1577)

  • Removed the deprecated nengo.synapses.filt/filtfilt functions. Use the Synapse.filt/filtfilt methods instead. (#1577)

  • Removed the Python 2 compatibility code from utils.compat. (#1577)

  • Removed utils.connection.target_function. Target points can be passed directly to the Connection.function argument instead. (#1577)

  • Removed utils.functions.piecewise. Use nengo.processes.Piecewise instead. (#1577)

  • Removed utils.testing.Mock. (#1578)


  • FrozenObjects can control parameter initialization order when copying, which fixed a bug encountered when copying convolutional connections. (#1493)

  • Fixed an issue in which reshaped signals were not having their offset values preserved, causing issues with some node functions. (#1474)

  • Better error message when Node output function does not match the given size_in/size_out. (#1452, #1434)

  • Several objects had elements missing from their string representations. These strings are now automatically generated and tested to be complete. (#1472)

  • Fixed the progress bar in recent Jupyter Lab versions. (#1499, #1500)

  • Some higher-order LinearFilter synapses had unnecessary delays that have now been removed. (#1535)

  • Models using the SpikingRectifiedLinear neuron type now have their decoders cached. (#1550)

  • Optional ShapeParam/TupleParam can now be set to None. (#1569)

  • Fixed error when using advanced indexing to connect to an Ensemble.neurons object. (#1582, #1583)

2.8.0 (June 9, 2018)


  • Added a warning when setting gain and bias along with either of max_rates or intercepts, as the latter two parameters are ignored. (#1431, #1433)


  • Learning rules can now be sliced when providing error input. (#1365, #1385)

  • The order of parameters in learning rules has changed such that learning_rate always comes first. (#1095)

  • Learning rules take pre_synapse, post_synapse, and theta_synapse instead of pre_tau, post_tau, and theta_tau respectively. This allows arbitrary Synapse objects to be used as filters on learning signals. (#1095)


  • The nengo.ipynb IPython extension and the IPython2ProgressBar have been deprecated and replaced by the IPython5ProgressBar. This progress bar will be automatically activated in IPython and Jupyter notebooks from IPython version 5.0 onwards. (#1087, #1375)

  • The pre_tau, post_tau, and theta_tau parameters for learning rules are deprecated. Instead, use pre_synapse, post_synapse, and theta_synapse respectively. (#1095)


  • Removed nengo.utils.docutils in favor of using nbsphinx. (#1349)

2.7.0 (March 7, 2018)


  • Added amplitude parameter to LIF, LIFRate, and RectifiedLinear which scale the output amplitude. (#1325, #1391)

  • Added the SpikingRectifiedLinear neuron model. (#1391)


  • Default values can no longer be set for Ensemble.n_neurons or Ensemble.dimensions. (#1372)

  • If the simulator seed is not specified, it will now be set from the network seed if a network seed is specified. (#980, #1386)


  • Fixed an issue in which signals could not be pickled, making it impossible to pickle Model instances. (#1135)

  • Better error message for invalid return values in nengo.Node functions. (#1317)

  • Fixed an issue in which accepting and passing (*args, **kwargs) could not be used in custom solvers. (#1358, #1359)

  • Fixed an issue in which the cache would not release its index lock on abnormal termination of the Nengo process. (#1364)

  • Fixed validation checks that prevented the default from being set on certain parameters. (#1372)

  • Fixed an issue with repeated elements in slices in which a positive and negative index referred to the same dimension. (#1395)

  • The Simulator.n_steps and Simulator.time properties now return scalars, as was stated in the documentation. (#1406)

  • Fixed the --seed-offset option of the test suite. (#1409)

2.6.0 (October 6, 2017)


  • Added a NoSolver solver that can be used to manually pass in a predefined set of decoders or weights to a connection. (#1352)

  • Added a Piecewise process, which replaces the now deprecated piecewise function. (#1036, #1100, #1355, #1362)


  • The minimum required version of NumPy has been raised to 1.8. (#947)

  • Learning rules can now have a learning rate of 0. (#1356)

  • Running the simulator for zero timesteps will now issue a warning, and running for negative time will error. (#1354, #1357)


  • Fixed an issue in which the PES learning rule could not be used on connections to an ObjView when using a weight solver. (#1317)

  • The progress bar that can appear when building a large model will now appear earlier in the build process. (#1340)

  • Fixed an issue in which ShapeParam would always store None. (#1342)

  • Fixed an issue in which multiple identical indices in a slice were ignored. (#947, #1361)


  • The piecewise function in nengo.utils.functions has been deprecated. Please use the Piecewise process instead. (#1100)

2.5.0 (July 24, 2017)


  • Added a n_neurons property to Network, which gives the number of neurons in the network, including all subnetworks. (#435, #1186)

  • Added a new example showing how adjusting ensemble tuning curves can improve function approximation. (#1129)

  • Added a minimum magnitude option to UniformHypersphere. (#799)

  • Added documentation on RC settings. (#1130)

  • Added documentation on improving performance. (#1119, #1130)

  • Added LinearFilter.combine method to combine two LinearFilter instances. (#1312)

  • Added a method to all neuron types to compute ensemble max_rates and intercepts given gain and bias. (#1334)


  • Learning rules now have a size_in parameter and attribute, allowing both integers and strings to define the dimensionality of the learning rule. This replaces the error_type attribute. (#1307, #1310)

  • EnsembleArray.n_neurons now gives the total number of neurons in all ensembles, including those in subnetworks. To get the number of neurons in each ensemble, use EnsembleArray.n_neurons_per_ensemble. (#1186)

  • The Nengo modelling API document now has summaries to help navigate the page. (#1304)

  • The error raised when a Connection function returns None is now more clear. (#1319)

  • We now raise an error when a Connection transform is set to None. (#1326)


  • Probe cache is now cleared on simulator reset. (#1324)

  • Neural gains are now always applied after the synapse model. Previously, this was the case for decoded connections but not neuron-to-neuron connections. (#1330)

  • Fixed a crash when a lock cannot be acquired while shrinking the cache. (#1335, #1336)

2.4.0 (April 18, 2017)


  • Added an optimizer that reduces simulation time for common types of models. The optimizer can be turned off by passing optimize=False to Simulator. (#1035)

  • Added the option to not normalize encoders by setting Ensemble.normalize_encoders to False. (#1191, #1267)

  • Added the Samples distribution to allow raw NumPy arrays to be passed in situations where a distribution is required. (#1233)


  • We now raise an error when an ensemble is assigned a negative gain. This can occur when solving for gains with intercepts greater than 1. (#1212, #1231, #1248)

  • We now raise an error when a Node or Direct ensemble produces a non-finite value. (#1178, #1280, #1286)

  • We now enforce that the label of a network must be a string or None, and that the seed of a network must be an int or None. This helps avoid situations where the seed would mistakenly be passed as the label. (#1277, #1275)

  • It is now possible to pass NumPy arrays in the ens_kwargs argument of EnsembleArray. Arrays are wrapped in a Samples distribution internally. (#691, #766, #1233)

  • The default refractory period (tau_ref) for the Sigmoid neuron type has changed to 2.5 ms (from 2 ms) for better compatibility with the default maximum firing rates of 200-400 Hz. (#1248)

  • Inputs to the Product and CircularConvolution networks have been renamed from A and B to input_a and input_b for consistency. The old names are still available, but should be considered deprecated. (#887, #1296)


  • Properly handle non C-contiguous node outputs. (#1184, #1185)


  • The net argument to networks has been deprecated. This argument existed so that network components could be added to an existing network instead of constructing a new network. However, this feature is rarely used, and makes the code more complicated for complex networks. (#1296)

2.3.1 (February 18, 2017)


  • Added documentation on config system quirks. (#1224)

  • Added function to make it easier to activate direct mode in networks where some parts require neurons. (#1111, #1168)


  • The matrix multiplication example will now work with matrices of any size and uses the product network for clarity. (#1159)

  • Fixed instances in which passing a callable class as a function could fail. (#1245)

  • Fixed an issue in which probing some attributes would be one timestep faster than other attributes. (#1234, #1245)

  • Fixed an issue in which SPA models could not be copied. (#1266, #1271)

  • Fixed an issue in which Nengo would crash if other programs had locks on Nengo cache files in Windows. (#1200, #1235)


  • Integer indexing of Nengo objects out of range raises an IndexError now to be consistent with standard Python behaviour. (#1176, #1183)

  • Documentation that applies to all Nengo projects has been moved to (#1251)

2.3.0 (November 30, 2016)


  • It is now possible to probe scaled_encoders on ensembles. (#1167, #1117)

  • Added copy method to Nengo objects. Nengo objects can now be pickled. (#977, #984)

  • A progress bar now tracks the build process in the terminal and Jupyter notebook. (#937, #1151)

  • Added nengo.dists.get_samples function for convenience when working with distributions or samples. (#1181, docs)


  • Access to probe data via is now cached, making repeated access much faster. (#1076, #1175)


  • Access to nengo.Simulator.model is deprecated. To access static data generated during the build use It provides access to everything that nengo.Simulator.model.params used to provide access to and is the canonical way to access this data across different backends. (#1145, #1173)

2.2.0 (September 12, 2016)

API changes

  • It is now possible to pass a NumPy array to the function argument of nengo.Connection. The values in the array are taken to be the targets in the decoder solving process, which means that the eval_points must also be set on the connection. (#1010)

  • nengo.utils.connection.target_function is now deprecated, and will be removed in Nengo 3.0. Instead, pass the targets directly to the connection through the function argument. (#1010)

Behavioural changes

  • Dropped support for NumPy 1.6. Oldest supported NumPy version is now 1.7. (#1147)


  • Added a nengo.backends entry point to make the reference simulator discoverable for other Python packages. In the future all backends should declare an entry point accordingly. (#1127)

  • Added ShapeParam to store array shapes. (#1045)

  • Added ThresholdingPreset to configure ensembles for thresholding. (#1058, #1077, #1148)

  • Tweaked rasterplot so that spikes from different neurons don’t overlap. (#1121)


  • Added a page explaining the config system and preset configs. (#1150)

Bug fixes

  • Fixed some situations where the cache index becomes corrupt by writing the updated cache index atomically (in most cases). (#1097, #1107)

  • The synapse methods filt and filtfilt now support lists as input. (#1123)

  • Added a registry system so that only stable objects are cached. (#1054, #1068)

  • Nodes now support array views as input. (#1156, #1157)

2.1.2 (June 27, 2016)

Bug fixes

  • The DecoderCache is now more robust when used improperly, and no longer requires changes to backends in order to use properly. (#1112)

2.1.1 (June 24, 2016)


  • Improved the default LIF neuron model to spike at the same rate as the LIFRate neuron model for constant inputs. The older model has been moved to nengo_extras under the name FastLIF. (#975)

  • Added y0 attribute to WhiteSignal, which adjusts the phase of each dimension to begin with absolute value closest to y0. (#1064)

  • Allow the AssociativeMemory to accept Semantic Pointer expressions as input_keys and output_keys. (#982)

Bug fixes

  • The DecoderCache is used as context manager instead of relying on the __del__ method for cleanup. This should solve problems with the cache’s file lock not being removed. It might be necessary to manually remove the index.lock file in the cache directory after upgrading from an older Nengo version. (#1053, #1041, #1048)

  • If the cache index is corrupted, we now fail gracefully by invalidating the cache and continuing rather than raising an exception. (#1110, #1097)

  • The Nnls solver now works for weights. The NnlsL2 solver is improved since we clip values to be non-negative before forming the Gram system. (#1027, #1019)

  • Eliminate memory leak in the parameter system. (#1089, #1090)

  • Allow recurrence of the form a=b, b=a in basal ganglia SPA actions. (#1098, #1099)

  • Support a greater range of Jupyter notebook and ipywidgets versions with the the ipynb extensions. (#1088, #1085)

2.1.0 (April 27, 2016)

API changes

  • A new class for representing stateful functions called Process has been added. Node objects are now process-aware, meaning that a process can be used as a node’s output. Unlike non-process callables, processes are properly reset when a simulator is reset. See the processes.ipynb example notebook, or the API documentation for more details. (#590, #652, #945, #955)

  • Spiking LIF neuron models now accept an additional argument, min_voltage. Voltages are clipped such that they do not drop below this value (previously, this was fixed at 0). (#666)

  • The PES learning rule no longer accepts a connection as an argument. Instead, error information is transmitted by making a connection to the learning rule object (e.g., nengo.Connection(error_ensemble, connection.learning_rule). (#344, #642)

  • The modulatory attribute has been removed from nengo.Connection. This was only used for learning rules to this point, and has been removed in favor of connecting directly to the learning rule. (#642)

  • Connection weights can now be probed with nengo.Probe(conn, 'weights'), and these are always the weights that will change with learning regardless of the type of connection. Previously, either decoders or transform may have changed depending on the type of connection; it is now no longer possible to probe decoders or transform. (#729)

  • A version of the AssociativeMemory SPA module is now available as a stand-alone network in nengo.networks. The AssociativeMemory SPA module also has an updated argument list. (#702)

  • The Product and InputGatedMemory networks no longer accept a config argument. (#814)

  • The EnsembleArray network’s neuron_nodes argument is deprecated. Instead, call the new add_neuron_input or add_neuron_output methods. (#868)

  • The nengo.log utility function now takes a string level parameter to specify any logging level, instead of the old binary debug parameter. Cache messages are logged at DEBUG instead of INFO level. (#883)

  • Reorganised the Associative Memory code, including removing many extra parameters from nengo.networks.assoc_mem.AssociativeMemory and modifying the defaults of others. (#797)

  • Add close method to Simulator. Simulator can now be used used as a context manager. (#857, #739, #859)

  • Most exceptions that Nengo can raise are now custom exception classes that can be found in the nengo.exceptions module. (#781)

  • All Nengo objects (Connection, Ensemble, Node, and Probe) now accept a label and seed argument if they didn’t previously. (#958)

  • In nengo.synapses, filt and filtfilt are deprecated. Every synapse type now has filt and filtfilt methods that filter using the synapse. (#945)

  • Connection objects can now accept a Distribution for the transform argument; the transform matrix will be sampled from that distribution when the model is built. (#979).

Behavioural changes

  • The sign on the PES learning rule’s error has been flipped to conform with most learning rules, in which error is minimized. The error should be actual - target. (#642)

  • The PES rule’s learning rate is invariant to the number of neurons in the presynaptic population. The effective speed of learning should now be unaffected by changes in the size of the presynaptic population. Existing learning networks may need to be updated; to achieve identical behavior, scale the learning rate by pre.n_neurons / 100. (#643)

  • The probeable attribute of all Nengo objects is now implemented as a property, rather than a configurable parameter. (#671)

  • Node functions receive x as a copied NumPy array (instead of a readonly view). (#716, #722)

  • The SPA Compare module produces a scalar output (instead of a specific vector). (#775, #782)

  • Bias nodes in spa.Cortical, and gate ensembles and connections in spa.Thalamus are now stored in the target modules. (#894, #906)

  • The filt and filtfilt functions on Synapse now use the initial value of the input signal to initialize the filter output by default. This provides more accurate filtering at the beginning of the signal, for signals that do not start at zero. (#945)


  • Added Ensemble.noise attribute, which injects noise directly into neurons according to a stochastic Process. (#590)

  • Added a randomized_svd subsolver for the L2 solvers. This can be much quicker for large numbers of neurons or evaluation points. (#803)

  • Added PES.pre_tau attribute, which sets the time constant on a lowpass filter of the presynaptic activity. (#643)

  • EnsembleArray.add_output now accepts a list of functions to be computed by each ensemble. (#562, #580)

  • LinearFilter now has an analog argument which can be set through its constructor. Linear filters with digital coefficients can be specified by setting analog to False. (#819)

  • Added SqrtBeta distribution, which describes the distribution of semantic pointer elements. (#414, #430)

  • Added Triangle synapse, which filters with a triangular FIR filter. (#660)

  • Added utils.connection.eval_point_decoding function, which provides a connection’s static decoding of a list of evaluation points. (#700)

  • Resetting the Simulator now resets all Processes, meaning the injected random signals and noise are identical between runs, unless the seed is changed (which can be done through Simulator.reset). (#582, #616, #652)

  • An exception is raised if SPA modules are not properly assigned to an SPA attribute. (#730, #791)

  • The Product network is now more accurate. (#651)

  • Numpy arrays can now be used as indices for slicing objects. (#754)

  • Config.configures now accepts multiple classes rather than just one. (#842)

  • Added add method to spa.Actions, which allows actions to be added after module has been initialized. (#861, #862)

  • Added SPA wrapper for circular convolution networks, spa.Bind (#849)

  • Added the Voja (Vector Oja) learning rule type, which updates an ensemble’s encoders to fire selectively for its inputs. (see examples/learning/learn_associations.ipynb). (#727)

  • Added a clipped exponential distribution useful for thresholding, in particular in the AssociativeMemory. (#779)

  • Added a cosine similarity distribution, which is the distribution of the cosine of the angle between two random vectors. It is useful for setting intercepts, in particular when using the Voja learning rule. (#768)

  • nengo.synapses.LinearFilter now has an evaluate method to evaluate the filter response to sine waves of given frequencies. This can be used to create Bode plots, for example. (#945)

  • objects now have a readonly attribute that can be used to disallow adding new semantic pointers. Vocabulary subsets are read-only by default. (#699)

  • Improved performance of the decoder cache by writing all decoders of a network into a single file. (#946)

Bug fixes

  • Fixed issue where setting Connection.seed through the constructor had no effect. (#724)

  • Fixed issue in which learning connections could not be sliced. (#632)

  • Fixed issue when probing scalar transforms. (#667, #671)

  • Fix for SPA actions that route to a module with multiple inputs. (#714)

  • Corrected the rmses values in BuiltConnection.solver_info when using NNls and Nnl2sL2 solvers, and the reg argument for Nnl2sL2. (#839)

  • spa.Vocabulary.create_pointer now respects the specified number of creation attempts, and returns the most dissimilar pointer if none can be found below the similarity threshold. (#817)

  • Probing a Connection’s output now returns the output of that individual Connection, rather than the input to the Connection’s post Ensemble. (#973, #974)

  • Fixed thread-safety of using networks and config in with statements. (#989)

  • The decoder cache will only be used when a seed is specified. (#946)

2.0.4 (April 27, 2016)

Bug fixes

  • Cache now fails gracefully if the legacy.txt file cannot be read. This can occur if a later version of Nengo is used.

2.0.3 (December 7, 2015)

API changes

  • The spa.State object replaces the old spa.Memory and spa.Buffer. These old modules are deprecated and will be removed in 2.2. (#796)

2.0.2 (October 13, 2015)

2.0.2 is a bug fix release to ensure that Nengo continues to work with more recent versions of Jupyter (formerly known as the IPython notebook).

Behavioural changes

  • The IPython notebook progress bar has to be activated with %load_ext nengo.ipynb. (#693)


  • Added [progress] section to nengorc which allows setting progress_bar and updater. (#693)

Bug fixes

  • Fix compatibility issues with newer versions of IPython, and Jupyter. (#693)

2.0.1 (January 27, 2015)

Behavioural changes

  • Node functions receive t as a float (instead of a NumPy scalar) and x as a readonly NumPy array (instead of a writeable array). (#626, #628)


  • rasterplot works with 0 neurons, and generates much smaller PDFs. (#601)

Bug fixes

  • Fix compatibility with NumPy 1.6. (#627)

2.0.0 (January 15, 2015)

Initial release of Nengo 2.0! Supports Python 2.6+ and 3.3+. Thanks to all of the contributors for making this possible!

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nengo-4.0.0.tar.gz (580.9 kB view hashes)

Uploaded Source

Built Distribution

nengo-4.0.0-py3-none-any.whl (538.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page