Skip to content

Commit d971e90

Browse files
committed
Create and fill in a PyNN Report
1 parent 2e3d48d commit d971e90

31 files changed

Lines changed: 232 additions & 11 deletions

spynnaker/pyNN/data/spynnaker_data_view.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
# limitations under the License.
1414
from __future__ import annotations
1515
import logging
16-
from typing import Iterator, Optional, Set, Tuple, TYPE_CHECKING
16+
from typing import (
17+
Iterator, Optional, Set, Tuple, TYPE_CHECKING, List, Any, Dict)
1718

1819
from spinn_utilities.log import FormatAdapter
1920

2021
from spinn_front_end_common.data import FecDataView
2122

2223
from spynnaker import _version
24+
from spinn_utilities.config_holder import get_config_bool, get_report_path
2325

2426
if TYPE_CHECKING:
2527
from spynnaker.pyNN.models.projection import Projection
@@ -51,7 +53,8 @@ class _SpynnakerDataModel(object):
5153
"_id_counter",
5254
"_min_delay",
5355
"_populations",
54-
"_projections")
56+
"_projections",
57+
"_pynn_report")
5558

5659
def __new__(cls) -> '_SpynnakerDataModel':
5760
if cls.__singleton is not None:
@@ -70,6 +73,7 @@ def _clear(self) -> None:
7073
# Using a dict to verify if later could be stored here only
7174
self._populations: Set[Population] = set()
7275
self._projections: Set[Projection] = set()
76+
self._pynn_report = None
7377

7478
def _hard_reset(self) -> None:
7579
"""
@@ -233,3 +237,24 @@ def get_sim_name(cls) -> str:
233237
:returns: The name to be returned by `pyNN.spiNNaker.name`.
234238
"""
235239
return _version.NAME
240+
241+
@classmethod
242+
def write_pynn_report(cls, text: str, *args: List[Any],
243+
**kwargs: Dict[str, Any]) -> None:
244+
"""
245+
Writes text to the PyNN report file, or does nothing if the report is
246+
disabled.
247+
248+
:param text: The text to write to the report file.
249+
:param args: Any additional arguments to format into the text using
250+
`str.format`.
251+
:param kwargs: Any additional keyword arguments to format into the text
252+
using `str.format`.
253+
"""
254+
if not get_config_bool("Reports", "write_pynn_report"):
255+
return
256+
if cls.__spy_data._pynn_report is None:
257+
cls.__spy_data._pynn_report = get_report_path("path_pynn_report")
258+
with open(cls.__spy_data._pynn_report, "a", encoding="utf-8") as f:
259+
f.write(text.format(*args, **kwargs))
260+
f.write("\n")

spynnaker/pyNN/models/neural_projections/connectors/multapse_connector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def create_synaptic_block(
276276
return block
277277

278278
def __repr__(self) -> str:
279-
return f"MultapseConnector({self.__num_synapses})"
279+
return f"FixedTotalNumberConnector({self.__num_synapses})"
280280

281281
@property
282282
@overrides(AbstractGenerateConnectorOnMachine.gen_connector_id)

spynnaker/pyNN/models/neuron/abstract_pynn_neuron_model_standard.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,6 @@ def create_vertex(
9393
splitter=splitter, seed=seed, n_colour_bits=n_colour_bits,
9494
neurons_per_core=neurons_per_core, n_synapse_cores=n_synapse_cores,
9595
allow_delay_extensions=allow_delay_extensions)
96+
97+
def __str__(self) -> str:
98+
return f"{self._model}"

spynnaker/pyNN/models/neuron/additional_inputs/additional_input_ca2_adaptive.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from spynnaker.pyNN.data import SpynnakerDataView
2323

2424
from .abstract_additional_input import AbstractAdditionalInput
25+
from typing import Dict
2526

2627
I_ALPHA = "i_alpha"
2728
I_CA2 = "i_ca2"
@@ -56,6 +57,13 @@ def __init__(self, tau_ca2: ModelParameter, i_ca2: ModelParameter,
5657
self.__i_ca2 = i_ca2
5758
self.__i_alpha = i_alpha
5859

60+
@overrides(AbstractAdditionalInput.get_param_values)
61+
def get_param_values(self) -> Dict[str, ModelParameter]:
62+
return {
63+
TAU_CA2: self.__tau_ca2,
64+
I_ALPHA: self.__i_alpha,
65+
TIME_STEP: SpynnakerDataView.get_simulation_time_step_ms()}
66+
5967
@overrides(AbstractAdditionalInput.add_parameters)
6068
def add_parameters(self, parameters: RangeDictionary[float]) -> None:
6169
parameters[TAU_CA2] = self._convert(self.__tau_ca2)

spynnaker/pyNN/models/neuron/implementations/abstract_standard_neuron_component.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,10 @@ def _convert(value: ModelParameter) -> \
109109
return value
110110
# TODO: Is this correct? Without this, things will only handle floats
111111
return SpynnakerRangedList(None, value)
112+
113+
@abstractmethod
114+
def get_param_values(self) -> Dict[str, ModelParameter]:
115+
"""
116+
The parameters of the component and their values
117+
"""
118+
raise NotImplementedError

spynnaker/pyNN/models/neuron/implementations/neuron_impl_standard.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,10 @@ def __getitem__(self, key: str) -> Any:
197197
# ... or fail
198198
raise AttributeError(
199199
f"'{self.__class__.__name__}' object has no attribute {key}")
200+
201+
def __str__(self) -> str:
202+
param_values: str = "";
203+
for component in self.__components:
204+
for param, value in component.get_param_values().items():
205+
param_values += f"{param}={value}, "
206+
return f"{self.__class__.__name__}({param_values[:-2]})"

spynnaker/pyNN/models/neuron/implementations/neuron_impl_stoc_exp.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,8 @@ def get_units(self, variable: str) -> str:
163163
@overrides(AbstractNeuronImpl.is_conductance_based)
164164
def is_conductance_based(self) -> bool:
165165
return False
166+
167+
def __str__(self) -> str:
168+
return (
169+
f"NeuronImplStocExp(tau={self._tau}, bias={self._bias}, "
170+
f"refract_init={self._refract_init}, seed={self._random.seed})")

spynnaker/pyNN/models/neuron/implementations/neuron_impl_stoc_exp_stable.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,10 @@ def get_units(self, variable: str) -> str:
180180
@overrides(AbstractNeuronImpl.is_conductance_based)
181181
def is_conductance_based(self) -> bool:
182182
return False
183+
184+
def __str__(self) -> str:
185+
return (
186+
f"{self.model_name}(v_init={self._v_init}, "
187+
f"v_reset={self._v_reset}, tau={self._tau}, "
188+
f"tau_refrac={self._tau_refrac}, bias={self._bias}, "
189+
f"refract_init={self._refract_init}, seed={self._random.seed})")

spynnaker/pyNN/models/neuron/implementations/neuron_impl_stoc_sigma.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,9 @@ def get_units(self, variable: str) -> str:
166166
@overrides(AbstractNeuronImpl.is_conductance_based)
167167
def is_conductance_based(self) -> bool:
168168
return False
169+
170+
def __str__(self) -> str:
171+
return (f"NeuronImplStocSigma(tau_refrac={self._tau_refrac}, "
172+
f"alpha={self._alpha}, bias={self._bias}, "
173+
f"refract_init={self._refract_init}, "
174+
f"seed={self._random.rng.seed})")

spynnaker/pyNN/models/neuron/input_types/input_type_conductance.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from spynnaker.pyNN.utilities.struct import Struct
2222

2323
from .abstract_input_type import AbstractInputType
24+
from typing import Dict
2425

2526
E_REV_E = "e_rev_E"
2627
E_REV_I = "e_rev_I"
@@ -49,6 +50,10 @@ def __init__(self, e_rev_E: ModelParameter, e_rev_I: ModelParameter):
4950
self.__e_rev_E = e_rev_E
5051
self.__e_rev_I = e_rev_I
5152

53+
@overrides(AbstractInputType.get_param_values)
54+
def get_param_values(self) -> Dict[str, ModelParameter]:
55+
return {E_REV_E: self.__e_rev_E, E_REV_I: self.__e_rev_I}
56+
5257
@overrides(AbstractInputType.add_parameters)
5358
def add_parameters(self, parameters: RangeDictionary[float]) -> None:
5459
parameters[E_REV_E] = self._convert(self.__e_rev_E)

0 commit comments

Comments
 (0)