Skip to main content

PymoNNtorch is a Pytorch version of PymoNNto

Project description

PymoNNtorch

pymonntorch logo

https://img.shields.io/pypi/v/pymonntorch.svg Documentation Status

PymoNNtorch is a Pytorch-adapted version of PymoNNto.

Features

  • Use torch tensors and Pytorch-like syntax to create a spiking neural network (SNN).

  • Simulate an SNN on CPU or GPU.

  • Define dynamics of SNN components as Behavior modules.

  • Control over the order of applying different behaviors in each simulation time step.

Usage

You can use the same syntax as PymoNNto to create you network:

from pymonntorch import *

net = Network()
ng = NeuronGroup(net=net, tag="my_neuron", size=100, behavior=None)
SynapseGroup(src=ng, dst=ng, net=net, tag="recurrent_synapse")
net.initialize()
net.simulate_iterations(1000)

Similarly, you can write your own Behavior Modules with the same logic as PymoNNto; except using torch tensors instead of numpy ndarrays.

from pymonntorch import *

class BasicBehavior(Behavior):
    def initialize(self, neurons):
        super().initialize(neurons)
        neurons.voltage = neurons.vector(mode="zeros")
        self.threshold = 1.0

    def forward(self, neurons):
        firing = neurons.voltage >= self.threshold
        neurons.spike = firing.byte()
        neurons.voltage[firing] = 0.0 # reset

        neurons.voltage *= 0.9 # voltage decay
        neurons.voltage += neurons.vector(mode="uniform", density=0.1)

class InputBehavior(Behavior):
    def initialize(self, neurons):
        super().initialize(neurons)
        for synapse in neurons.afferent_synapses['GLUTAMATE']:
            synapse.W = synapse.matrix('uniform', density=0.1)
            synapse.enabled = synapse.W > 0

    def forward(self, neurons):
        for synapse in neurons.afferent_synapses['GLUTAMATE']:
            neurons.voltage += synapse.W@synapse.src.spike.float() / synapse.src.size * 10

net = Network()
ng = NeuronGroup(net=net,
                size=100,
                behavior={
                    1: BasicBehavior(),
                    2: InputBehavior(),
                    9: Recorder(['voltage']),
                    10: EventRecorder(['spike'])
                })
SynapseGroup(src=ng, dst=ng, net=net, tag='GLUTAMATE')
net.initialize()
net.simulate_iterations(1000)

import matplotlib.pyplot as plt

plt.plot(net['voltage',0][:, :10])
plt.show()

plt.plot(net['spike.t',0], net['spike.i',0], '.k')
plt.show()

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template. It changes the codebase of PymoNNto to use torch rather than numpy and tensorflow numpy.

History

0.1.4 (2024-03-16)

  • Bug fixes.

  • Src and dst can be None for syanpses.

  • Hierarchical structure.

0.1.3 (2023-08-16)

  • BREAKING CHANGE: Network no longer accept settings. Individual setting are now argument for Network.

  • Bug fixes.

0.1.2 (2023-06-14)

  • tensor method for NetworkObject

0.1.1 (2023-05-26)

  • Every NetworkObject can have a recorder behavior.

  • Network settings accept “index” entry.

  • Bug fixes and general improvement.

0.1.0 (2023-03-17)

  • Repository made public.

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

pymonntorch-0.1.4.tar.gz (274.7 kB view hashes)

Uploaded Source

Built Distribution

pymonntorch-0.1.4-py2.py3-none-any.whl (38.3 kB view hashes)

Uploaded Python 2 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