Skip to content

Commit 0bf4f9f

Browse files
authored
Merge pull request #839 from apdavison/issue837
Fix Issue 837
2 parents 2f4aee8 + 4c6aaa0 commit 0bf4f9f

2 files changed

Lines changed: 47 additions & 3 deletions

File tree

pyNN/standardmodels/base.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,12 @@ class StandardPostSynapticResponse(StandardModelType, models.BasePostSynapticRes
188188
"""Base class for standardized post-synaptic receptor models."""
189189

190190
def get_schema(self):
191+
# Derive the validation schema from default_parameters so that it always
192+
# matches the actual parameters of each subclass. All post-synaptic
193+
# response parameters are floats except "locations".
191194
return {
192-
"locations": SynapseDistribution,
193-
"e_syn": float,
194-
"tau_syn": float # should be a tuple, if multiple time constants
195+
name: (SynapseDistribution if name == "locations" else float)
196+
for name in self.default_parameters
195197
}
196198

197199
def set_parent(self, parent):

test/unittests/test_standardmodels.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from pyNN.standardmodels import build_translations, StandardModelType, \
22
STDPWeightDependence, STDPTimingDependence
33
from pyNN.standardmodels.synapses import StaticSynapse, STDPMechanism
4+
from pyNN.standardmodels.receptors import (
5+
CurrExpPostSynapticResponse,
6+
CondExpPostSynapticResponse,
7+
CondAlphaPostSynapticResponse,
8+
CondBetaPostSynapticResponse,
9+
)
410
from pyNN import errors
511
from pyNN.parameters import ParameterSpace
612
from unittest.mock import Mock
@@ -216,3 +222,39 @@ def test_STDPMechanism_create_invalid_types():
216222
# test STDPWeightDependence
217223

218224
# test STDPTimingDependence
225+
226+
227+
# post-synaptic response models: the validation schema must track each model's
228+
# default_parameters (see issue #837)
229+
230+
@pytest.mark.parametrize("cls", [
231+
CurrExpPostSynapticResponse,
232+
CondExpPostSynapticResponse,
233+
CondAlphaPostSynapticResponse,
234+
CondBetaPostSynapticResponse,
235+
])
236+
def test_psr_schema_matches_default_parameters(cls):
237+
"""The schema used for validation must expose exactly the model's parameters."""
238+
assert set(cls().get_schema()) == set(cls.default_parameters)
239+
240+
241+
def test_CondBetaPostSynapticResponse_accepts_tau_rise_tau_decay():
242+
"""Regression test for issue #837: beta receptor must accept its own parameters."""
243+
psr = CondBetaPostSynapticResponse(e_syn=0.0, tau_rise=0.2, tau_decay=1.5)
244+
assert set(psr.get_schema()) == {"locations", "e_syn", "tau_rise", "tau_decay"}
245+
246+
247+
def test_CondBetaPostSynapticResponse_rejects_tau_syn():
248+
"""The beta receptor has no tau_syn parameter, so it must be rejected."""
249+
with pytest.raises(errors.NonExistentParameterError):
250+
CondBetaPostSynapticResponse(tau_syn=5.0)
251+
252+
253+
def test_CurrExpPostSynapticResponse_rejects_e_syn():
254+
"""Current-based response has no reversal potential, so e_syn must be rejected."""
255+
with pytest.raises(errors.NonExistentParameterError):
256+
CurrExpPostSynapticResponse(e_syn=0.0)
257+
258+
259+
def test_CurrExpPostSynapticResponse_accepts_tau_syn():
260+
CurrExpPostSynapticResponse(tau_syn=5.0)

0 commit comments

Comments
 (0)