sc_neurocore_engine/bindings/
pernarowski.rs1use numpy::{IntoPyArray, PyArray1};
12use pyo3::prelude::*;
13use pyo3::types::PyDict;
14
15use crate::neurons::PernarowskiNeuron;
16
17py_neuron_default!("PernarowskiNeuron", PyPernarowskiNeuron, PernarowskiNeuron, state v, state w, state z);
18
19pub(super) fn register(module: &Bound<'_, PyModule>) -> PyResult<()> {
21 module.add_class::<PyPernarowskiNeuron>()?;
22 module.add_function(wrap_pyfunction!(py_pernarowski_simulate, module)?)?;
23 Ok(())
24}
25
26#[pyfunction]
35#[pyo3(signature = (v0, w0, z0, alpha, beta, eps1, eps2, gamma, dt, v_threshold, n_steps, current))]
36#[allow(clippy::too_many_arguments)]
37fn py_pernarowski_simulate<'py>(
38 py: Python<'py>,
39 v0: f64,
40 w0: f64,
41 z0: f64,
42 alpha: f64,
43 beta: f64,
44 eps1: f64,
45 eps2: f64,
46 gamma: f64,
47 dt: f64,
48 v_threshold: f64,
49 n_steps: usize,
50 current: f64,
51) -> (Bound<'py, PyArray1<f64>>, i64, f64, f64, f64) {
52 let mut neuron = PernarowskiNeuron {
53 v: v0,
54 w: w0,
55 z: z0,
56 alpha,
57 beta,
58 eps1,
59 eps2,
60 gamma,
61 dt,
62 v_threshold,
63 };
64 let (trace, spikes) = neuron.simulate(n_steps, current);
65 (trace.into_pyarray(py), spikes, neuron.v, neuron.w, neuron.z)
66}