sc_neurocore_engine/bindings/channels/
nmda_neuron.rs1use pyo3::exceptions::PyValueError;
10use pyo3::prelude::*;
11use pyo3::types::PyDict;
12
13use crate::neurons;
14
15#[pyclass(
16 name = "NMDANeuron",
17 module = "sc_neurocore_engine.sc_neurocore_engine"
18)]
19#[derive(Clone)]
20pub struct PyNMDANeuron {
21 inner: neurons::NMDANeuron,
22}
23
24#[pymethods]
25impl PyNMDANeuron {
26 #[new]
27 fn new() -> Self {
28 Self {
29 inner: neurons::NMDANeuron::default(),
30 }
31 }
32
33 fn step(&mut self, current: f64) -> PyResult<i32> {
37 self.inner.try_step(current).map_err(PyValueError::new_err)
38 }
39
40 fn reset(&mut self) {
42 self.inner.reset();
43 }
44
45 fn get_state(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {
47 let state = PyDict::new(py);
48 state.set_item("v", self.inner.v)?;
49 state.set_item("x_nmda", self.inner.x_nmda)?;
50 state.set_item("s_nmda", self.inner.s_nmda)?;
51 state.set_item("ca", self.inner.ca)?;
52 state.set_item("refractory_remaining", self.inner.refractory_remaining)?;
53 Ok(state.into_any().unbind())
54 }
55}
56
57pub(super) fn register(module: &Bound<'_, PyModule>) -> PyResult<()> {
59 module.add_class::<PyNMDANeuron>()?;
60 Ok(())
61}