Skip to content

Conversation

FinnBurkhardt
Copy link

Add Ornstein–Uhlenbeck Noise Generator

This pull request adds a new ou_noise_generator device and corresponding pytest-based tests. The device generates temporally correlated current following an Ornstein–Uhlenbeck (OU). The tests verify both parameter handling and statistical properties.

Model Implementation

  • Files added

    • models/ou_noise_generator.h
    • models/ou_noise_generator.cpp
    • pytests/sli2py_stimulating/test_ou_noise_generator.py
  • Process equation
    The state variable (x) evolves as

$$ dx = \frac{1}{\tau}(\mu - x)\ dt + \sigma\ dW $$

where

  • ($\mu$) (mean parameter) is the long-term mean of the process,

  • ($\sigma$) (std parameter) its stationary standard deviation,

  • ($\tau$) (tau parameter) is the time constant,

  • dt is the internal integration step.

  • Integration and output

    • Internally integrates the OU equation at user-specified dt.
    • On each simulation step it emits the current (x) to connected targets.

Tests (test_ou_noise_generator.py)

  • Parameter setting and defaults

    • Verifies that set() and SetDefaults() both correctly configure all parameters (mean, std, tau, dt).
  • Error conditions

    • Asserts that attempting to create the generator with a dt not divisible by nest.resolution raises StepMultipleRequired.
  • Mean and variance

    • Runs 100 trials of 1000 ms each, records the last current value, and checks that the sample mean and variance match the target $\mu$ and $\sigma^2$ within reasonable statistical bounds.
  • Autocorrelation

    • Collects a long trace, discards the initial $10\tau$ burn-in, and computes the empirical lag-1 autocorrelation.
    • Confirms it matches $\exp(-\text{dt}/\tau)$ within a small tolerance.
  • Cross-correlation

    • Connects a single OU generator to two independent neurons and records their membrane potentials.
    • Computes the cross-correlation of the two voltage traces and verifies it remains near zero.

@heplesser heplesser added T: Enhancement New functionality, model or documentation S: Normal Handle this with default priority I: No breaking change Previously written code will work as before, no one should note anything changing (aside the fix) labels Aug 7, 2025
@heplesser heplesser added this to Models Aug 7, 2025
@github-project-automation github-project-automation bot moved this to To do in Models Aug 7, 2025
@jessica-mitchell jessica-mitchell changed the title Add ou generator Add Ornstein–Uhlenbeck noise generator Aug 11, 2025
Copy link
Contributor

@jessica-mitchell jessica-mitchell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution!
I have a minor change for the docs, and a question if there is a good use case we can use an example for this generator?

@github-project-automation github-project-automation bot moved this from To do to Review in Models Aug 11, 2025
@terhorstd terhorstd requested a review from jakobkramp August 13, 2025 07:26
The correlation time constant :math:`\tau` of the process (ms).

dt
The interval :math:`\delta` between updates of the noise current (ms).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The interval :math:`\delta` between updates of the noise current (ms).
The time interval between updates of the noise current (ms).

@heplesser
Copy link
Contributor

@FinnBurkhardt Would you be able to address the open issues within a few days? I also added two minor suggestions. Please merge master into your branch for this PR to ensure that the testsuite works properly.

@heplesser heplesser requested a review from clinssen September 11, 2025 17:44
@FinnBurkhardt
Copy link
Author

Thanks for the contribution! I have a minor change for the docs, and a question if there is a good use case we can use an example for this generator?

Thanks, I’ve applied the suggested changes.

For examples, I’d have two candidates at hand:

  1. Single neuron driven by the OU noise generator.

  2. White vs. OU noise (matched mean/variance), comparing firing rate and coefficient of variation.

Would one (or both) be useful for the docs?

@jessica-mitchell
Copy link
Contributor

@FinnBurkhardt if they are ready then we could take both.
You can add them to pynest/examples/ (please adhere to the style of docstring as in the other examples)

And you can add it to the doc/htmldoc/examples/index.rst page:
I think in the 'stimulating network' section would make sense?

    .. grid-item-card:: Stimulating networks
           :img-top: ../static/img/pynest/sensitivitypertubation.png

           * :doc:`../auto_examples/sinusoidal_poisson_generator`
           * :doc:`../auto_examples/sinusoidal_gamma_generator`
           * :doc:`../auto_examples/repeated_stimulation`
           * :doc:`../auto_examples/sensitivity_to_perturbation`
           * :doc:`../auto_examples/intrinsic_currents_spiking`
           * :doc:`../auto_examples/intrinsic_currents_subthreshold`

It also needs to be added to the .. toctree::

I can also help with this if it's confusing!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
I: No breaking change Previously written code will work as before, no one should note anything changing (aside the fix) S: Normal Handle this with default priority T: Enhancement New functionality, model or documentation
Projects
Status: Review
Development

Successfully merging this pull request may close these issues.

6 participants