sinabs 3.1.2__tar.gz → 3.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. {sinabs-3.1.2 → sinabs-3.1.3}/PKG-INFO +1 -1
  2. {sinabs-3.1.2 → sinabs-3.1.3}/docs/about/release_notes.md +6 -0
  3. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/iaf_neuron_model.ipynb +0 -1
  4. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/available_network_arch.md +80 -67
  5. sinabs-3.1.3/docs/speck/faqs/imgs/complex-network.png +0 -0
  6. sinabs-3.1.3/docs/speck/faqs/imgs/network-with-residual-connection.png +0 -0
  7. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/nmnist_quick_start.ipynb +0 -2
  8. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/play_with_speck_dvs.ipynb +0 -1
  9. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/nmnist.ipynb +0 -1
  10. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/chips/dynapcnn.py +2 -2
  11. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +3 -3
  12. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/nir_graph_extractor.py +4 -3
  13. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/pool2d.py +1 -1
  14. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/PKG-INFO +1 -1
  15. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/SOURCES.txt +5 -2
  16. sinabs-3.1.3/sinabs.egg-info/pbr.json +1 -0
  17. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_device_movement.py +1 -1
  18. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_discover_device.py +1 -1
  19. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_large_net.py +1 -1
  20. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_neuron_leak.py +1 -6
  21. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_single_neuron_hardware.py +1 -2
  22. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_visualizer.py +3 -4
  23. sinabs-3.1.3/tests/test_dynapcnnnetwork/__init__.py +0 -0
  24. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/conftest_dynapcnnnetwork.py +15 -0
  25. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/model_dummy_1.py +13 -14
  26. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/model_dummy_2.py +20 -21
  27. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/model_dummy_4.py +6 -4
  28. sinabs-3.1.3/tests/test_dynapcnnnetwork/model_dummy_5.py +199 -0
  29. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py +24 -1
  30. sinabs-3.1.2/docs/speck/faqs/imgs/two-independent-networks.png +0 -0
  31. sinabs-3.1.2/sinabs.egg-info/pbr.json +0 -1
  32. {sinabs-3.1.2 → sinabs-3.1.3}/.coveragerc +0 -0
  33. {sinabs-3.1.2 → sinabs-3.1.3}/.github/workflows/ci-pipeline.yml +0 -0
  34. {sinabs-3.1.2 → sinabs-3.1.3}/.pre-commit-config.yaml +0 -0
  35. {sinabs-3.1.2 → sinabs-3.1.3}/.readthedocs.yaml +0 -0
  36. {sinabs-3.1.2 → sinabs-3.1.3}/AUTHORS +0 -0
  37. {sinabs-3.1.2 → sinabs-3.1.3}/CITATION.cff +0 -0
  38. {sinabs-3.1.2 → sinabs-3.1.3}/LICENSE +0 -0
  39. {sinabs-3.1.2 → sinabs-3.1.3}/README.md +0 -0
  40. {sinabs-3.1.2 → sinabs-3.1.3}/codecov.yml +0 -0
  41. {sinabs-3.1.2 → sinabs-3.1.3}/docs/Makefile +0 -0
  42. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/dataflow_layers.png +0 -0
  43. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
  44. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/memory_constraints.png +0 -0
  45. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
  46. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/speck_dynapcnn.png +0 -0
  47. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/Overview/speck_top_level.png +0 -0
  48. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
  49. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/devkits_images/speck_devkit.png +0 -0
  50. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/devkits_images/speck_module.png +0 -0
  51. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
  52. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
  53. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
  54. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
  55. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
  56. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
  57. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/power_monitoring/power_plot.png +0 -0
  58. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
  59. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/sinabs-logo-lowercase.png +0 -0
  60. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
  61. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
  62. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
  63. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/using_readout_layer/readout_layer.png +0 -0
  64. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/using_readout_layer/samna_graph.png +0 -0
  65. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
  66. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
  67. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_static/visualize_spike_count/spike_count.png +0 -0
  68. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_templates/class_activation.rst +0 -0
  69. {sinabs-3.1.2 → sinabs-3.1.3}/docs/_templates/class_layer.rst +0 -0
  70. {sinabs-3.1.2 → sinabs-3.1.3}/docs/about/about.rst +0 -0
  71. {sinabs-3.1.2 → sinabs-3.1.3}/docs/about/contributing.md +0 -0
  72. {sinabs-3.1.2 → sinabs-3.1.3}/docs/about/differences.md +0 -0
  73. {sinabs-3.1.2 → sinabs-3.1.3}/docs/about/info.md +0 -0
  74. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/activation.rst +0 -0
  75. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/api.rst +0 -0
  76. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/from_torch.rst +0 -0
  77. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/hooks.rst +0 -0
  78. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/layers.rst +0 -0
  79. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/network.rst +0 -0
  80. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/nir.rst +0 -0
  81. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/synopcounter.rst +0 -0
  82. {sinabs-3.1.2 → sinabs-3.1.3}/docs/api/utils.rst +0 -0
  83. {sinabs-3.1.2 → sinabs-3.1.3}/docs/conf.py +0 -0
  84. {sinabs-3.1.2 → sinabs-3.1.3}/docs/contact.md +0 -0
  85. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/README.rst +0 -0
  86. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/README.rst +0 -0
  87. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/plot_alif.py +0 -0
  88. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/plot_exp_leaky.py +0 -0
  89. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/plot_iaf.py +0 -0
  90. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/plot_lif.py +0 -0
  91. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/layers/utils.py +0 -0
  92. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/spike_fns/README.rst +0 -0
  93. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
  94. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/spike_fns/plot_multispike.py +0 -0
  95. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
  96. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
  97. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
  98. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
  99. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
  100. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
  101. {sinabs-3.1.2 → sinabs-3.1.3}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
  102. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/fundamentals.rst +0 -0
  103. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/getting_started.rst +0 -0
  104. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/install.rst +0 -0
  105. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
  106. {sinabs-3.1.2 → sinabs-3.1.3}/docs/getting_started/quickstart.ipynb +0 -0
  107. {sinabs-3.1.2 → sinabs-3.1.3}/docs/how_tos/activations.ipynb +0 -0
  108. {sinabs-3.1.2 → sinabs-3.1.3}/docs/how_tos/custom_hooks.ipynb +0 -0
  109. {sinabs-3.1.2 → sinabs-3.1.3}/docs/how_tos/how_tos.rst +0 -0
  110. {sinabs-3.1.2 → sinabs-3.1.3}/docs/how_tos/synops_loss_ann.ipynb +0 -0
  111. {sinabs-3.1.2 → sinabs-3.1.3}/docs/how_tos/synops_loss_snn.ipynb +0 -0
  112. {sinabs-3.1.2 → sinabs-3.1.3}/docs/index.md +0 -0
  113. {sinabs-3.1.2 → sinabs-3.1.3}/docs/make.bat +0 -0
  114. {sinabs-3.1.2 → sinabs-3.1.3}/docs/plugins/plugins.rst +0 -0
  115. {sinabs-3.1.2 → sinabs-3.1.3}/docs/requirements.txt +0 -0
  116. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/advanced_concepts.rst +0 -0
  117. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
  118. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
  119. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
  120. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/discretize.rst +0 -0
  121. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
  122. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
  123. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
  124. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
  125. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
  126. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
  127. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
  128. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/io.rst +0 -0
  129. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/mapping.rst +0 -0
  130. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/specksim.rst +0 -0
  131. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/api/dynapcnn/utils.rst +0 -0
  132. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/dangers.md +0 -0
  133. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/add_new_device.md +0 -0
  134. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
  135. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/chip_errata.md +0 -0
  136. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/device_management.md +0 -0
  137. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/imgs/network-with-merge-and-split.png +0 -0
  138. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/imgs/two-networks-merging-output.png +0 -0
  139. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/index.rst +0 -0
  140. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/output_monitoring.md +0 -0
  141. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
  142. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/faqs/tips_for_training.md +0 -0
  143. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/index.rst +0 -0
  144. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
  145. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
  146. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
  147. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
  148. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
  149. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/overview.md +0 -0
  150. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/specksim.md +0 -0
  151. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/the_basics.md +0 -0
  152. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/tutorials.rst +0 -0
  153. {sinabs-3.1.2 → sinabs-3.1.3}/docs/speck/visualizer.md +0 -0
  154. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
  155. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/bptt.ipynb +0 -0
  156. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/nir_to_speck.ipynb +0 -0
  157. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/scnn_mnist.nir +0 -0
  158. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/tutorials.rst +0 -0
  159. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/weight_scaling.md +0 -0
  160. {sinabs-3.1.2 → sinabs-3.1.3}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
  161. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_DVSLayer_given.ipynb +0 -0
  162. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_DVSLayer_given_followed_by_pool.ipynb +0 -0
  163. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_deployment.ipynb +0 -0
  164. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_need_create_DVSLayer.ipynb +0 -0
  165. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_no_DVSLayer.ipynb +0 -0
  166. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_with_batchnorm.ipynb +0 -0
  167. {sinabs-3.1.2 → sinabs-3.1.3}/examples/dynapcnn_network/snn_with_multiple_batchnorm.ipynb +0 -0
  168. {sinabs-3.1.2 → sinabs-3.1.3}/examples/mnist/dynapcnn_network.py +0 -0
  169. {sinabs-3.1.2 → sinabs-3.1.3}/examples/mnist/mnist_params.pt +0 -0
  170. {sinabs-3.1.2 → sinabs-3.1.3}/examples/mnist/specksim_network.py +0 -0
  171. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/dvs_gesture_params.pt +0 -0
  172. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/gesture_viz.py +0 -0
  173. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/01_armroll.png +0 -0
  174. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/02_handclap.png +0 -0
  175. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
  176. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
  177. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/05_lefthandwave.png +0 -0
  178. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/06_righthandwave.png +0 -0
  179. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
  180. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
  181. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/09_airdrums.png +0 -0
  182. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/10_airguitar.png +0 -0
  183. {sinabs-3.1.2 → sinabs-3.1.3}/examples/visualizer/icons/11_other.png +0 -0
  184. {sinabs-3.1.2 → sinabs-3.1.3}/jupyterlab-requirements.txt +0 -0
  185. {sinabs-3.1.2 → sinabs-3.1.3}/pull_request_template.md +0 -0
  186. {sinabs-3.1.2 → sinabs-3.1.3}/requirements.txt +0 -0
  187. {sinabs-3.1.2 → sinabs-3.1.3}/setup.cfg +0 -0
  188. {sinabs-3.1.2 → sinabs-3.1.3}/setup.py +0 -0
  189. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/__init__.py +0 -0
  190. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/activation/__init__.py +0 -0
  191. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/activation/quantize.py +0 -0
  192. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/activation/reset_mechanism.py +0 -0
  193. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/activation/spike_generation.py +0 -0
  194. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/activation/surrogate_gradient_fn.py +0 -0
  195. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/__init__.py +0 -0
  196. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/__init__.py +0 -0
  197. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
  198. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
  199. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
  200. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
  201. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/config_builder.py +0 -0
  202. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/connectivity_specs.py +0 -0
  203. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/crop2d.py +0 -0
  204. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/discretize.py +0 -0
  205. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
  206. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
  207. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dynapcnn_layer_utils.py +0 -0
  208. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dynapcnn_network.py +0 -0
  209. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/dynapcnnnetwork_module.py +0 -0
  210. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/exceptions.py +0 -0
  211. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/flipdims.py +0 -0
  212. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/io.py +0 -0
  213. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/mapping.py +0 -0
  214. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/sinabs_edges_handler.py +0 -0
  215. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/specksim.py +0 -0
  216. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/utils.py +0 -0
  217. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/backend/dynapcnn/weight_rescaling_methods.py +0 -0
  218. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/cnnutils.py +0 -0
  219. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/conversion.py +0 -0
  220. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/from_torch.py +0 -0
  221. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/hooks.py +0 -0
  222. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/__init__.py +0 -0
  223. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/alif.py +0 -0
  224. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/channel_shift.py +0 -0
  225. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/crop2d.py +0 -0
  226. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/exp_leak.py +0 -0
  227. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/functional/__init__.py +0 -0
  228. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/functional/alif.py +0 -0
  229. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/functional/lif.py +0 -0
  230. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/iaf.py +0 -0
  231. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/lif.py +0 -0
  232. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/merge.py +0 -0
  233. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/neuromorphic_relu.py +0 -0
  234. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/quantize.py +0 -0
  235. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/reshape.py +0 -0
  236. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/stateful_layer.py +0 -0
  237. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/layers/to_spike.py +0 -0
  238. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/network.py +0 -0
  239. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/nir.py +0 -0
  240. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/synopcounter.py +0 -0
  241. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/utils.py +0 -0
  242. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs/validate_memory_speck.py +0 -0
  243. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/dependency_links.txt +0 -0
  244. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/not-zip-safe +0 -0
  245. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/requires.txt +0 -0
  246. {sinabs-3.1.2 → sinabs-3.1.3}/sinabs.egg-info/top_level.txt +0 -0
  247. {sinabs-3.1.2 → sinabs-3.1.3}/tests/__init__.py +0 -0
  248. {sinabs-3.1.2/tests/test_dynapcnn → sinabs-3.1.3/tests}/hw_utils.py +0 -0
  249. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
  250. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
  251. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
  252. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
  253. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
  254. {sinabs-3.1.2 → sinabs-3.1.3}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
  255. {sinabs-3.1.2 → sinabs-3.1.3}/tests/mnist_params.pt +0 -0
  256. {sinabs-3.1.2 → sinabs-3.1.3}/tests/models/README.txt +0 -0
  257. {sinabs-3.1.2 → sinabs-3.1.3}/tests/models/synop_hook_model.pth +0 -0
  258. {sinabs-3.1.2 → sinabs-3.1.3}/tests/requirements.txt +0 -0
  259. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_activations.py +0 -0
  260. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_batch_mismatch.py +0 -0
  261. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_batch_size_update.py +0 -0
  262. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_conversion.py +0 -0
  263. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_copy.py +0 -0
  264. {sinabs-3.1.2/tests/test_dynapcnnlayer → sinabs-3.1.3/tests/test_dynapcnn}/__init__.py +0 -0
  265. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/custom_jit_filters.py +0 -0
  266. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
  267. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
  268. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_config_making.py +0 -0
  269. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
  270. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_discretized.py +0 -0
  271. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_doorbell.py +0 -0
  272. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_dvs_input.py +0 -0
  273. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
  274. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_event_conversion.py +0 -0
  275. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_individual_cases.py +0 -0
  276. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_learning.py +0 -0
  277. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_monitoring.py +0 -0
  278. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnn/test_speck2e.py +0 -0
  279. {sinabs-3.1.2/tests/test_dynapcnnnetwork → sinabs-3.1.3/tests/test_dynapcnnlayer}/__init__.py +0 -0
  280. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/conftest_dynapcnnlayer.py +0 -0
  281. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/model_dummy_1.py +0 -0
  282. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/model_dummy_2.py +0 -0
  283. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/model_dummy_3.py +0 -0
  284. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/model_dummy_4.py +0 -0
  285. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnlayer/test_dynapcnnlayer.py +0 -0
  286. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/model_dummy_3.py +0 -0
  287. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/model_dummy_seq.py +0 -0
  288. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_dynapcnnnetwork/test_failcases.py +0 -0
  289. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_from_model.py +0 -0
  290. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/conftest_graph_extractor.py +0 -0
  291. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/model_dummy_1.py +0 -0
  292. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/model_dummy_2.py +0 -0
  293. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/model_dummy_3.py +0 -0
  294. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/model_dummy_4.py +0 -0
  295. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_graph_extractor/test_graph_extractor.py +0 -0
  296. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_hooks.py +0 -0
  297. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_alif.py +0 -0
  298. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_channelshift.py +0 -0
  299. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_crop2d.py +0 -0
  300. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_exp_leak.py +0 -0
  301. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_iaf.py +0 -0
  302. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_img2spk.py +0 -0
  303. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_lif.py +0 -0
  304. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_maxpooling.py +0 -0
  305. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_merge.py +0 -0
  306. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_neuromorphic_relu.py +0 -0
  307. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_reshaping.py +0 -0
  308. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_sig2spk.py +0 -0
  309. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_layers/test_stateful_layer.py +0 -0
  310. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_network_class.py +0 -0
  311. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_nir.py +0 -0
  312. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_normalize_weights.py +0 -0
  313. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_onnx.py +0 -0
  314. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_quantize.py +0 -0
  315. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_specksim/test_specksim_bindings.py +0 -0
  316. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_specksim/test_specksim_conversion.py +0 -0
  317. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_specksim/test_specksim_network.py +0 -0
  318. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_surrogate_gradients.py +0 -0
  319. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_synops_counter.py +0 -0
  320. {sinabs-3.1.2 → sinabs-3.1.3}/tests/test_utils.py +0 -0
  321. {sinabs-3.1.2 → sinabs-3.1.3}/tests/weights/README.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinabs
3
- Version: 3.1.2
3
+ Version: 3.1.3
4
4
  Summary: SynSense Spiking Neural Network simulator for deep neural networks (DNNs).
5
5
  Author: SynSense (formerly AiCTX)
6
6
  Author-email: support@synsense.ai
@@ -1,5 +1,11 @@
1
1
  # Release notes
2
2
 
3
+ ## v3.1.3 (04/02/2026)
4
+
5
+ * Add tests for mapping non-sequential networks
6
+ * Fix networks used for tests, they didnt meet the hardware constraints
7
+ * Update documentation with the non-sequential networks types that have a test
8
+
3
9
  ## v3.1.2 (12/12/2025)
4
10
 
5
11
  * Update use of visualizer in Sinabs tutorials, previous tutorials were using a deprecated visualizer version.
@@ -163,7 +163,6 @@
163
163
  "import torch\n",
164
164
  "import sinabs.layers as sl\n",
165
165
  "\n",
166
- "\n",
167
166
  "# Define a neuron in 'SINABS'\n",
168
167
  "neuron = sl.IAF()\n",
169
168
  "\n",
@@ -39,28 +39,31 @@ dynapcnn.to(devcie="your device", chip_layers_ordering=[2, 5, 7, 1])
39
39
 
40
40
  ## What network structure can I define?
41
41
 
42
- `Sinabs` can parse a `torch.nn.Sequential` like architecture, so it is recommended to
43
- use a `Sequential` like network.
42
+ `Sinabs` can parse a `torch.nn.Sequential` like architecture, so it is recommended to use a `Sequential` like network.
44
43
 
45
44
  As of `v3.1.0`, we released a network graph extraction feature that helps users deploy their networks with more complex architectures into the devkit.
46
45
  Our `Speck` chip, in fact, supports branched architectures. With the graph extraction feature, we support a range of network structures, as shown below:
47
46
 
47
+ A network with a merge and a split:
48
48
 
49
- Two independent networks:
50
-
51
- ![Two independent networks](imgs/two-independent-networks.png)
49
+ ![A network with a merge and a split](imgs/network-with-merge-and-split.png)
52
50
 
53
51
  Two networks with merging outputs:
54
52
 
55
53
  ![Two networks with merging outputs](imgs/two-networks-merging-output.png)
56
54
 
57
- A network with a merge and a split:
55
+ A network with residual connections:
58
56
 
59
- ![A network with a merge and a split](imgs/network-with-merge-and-split.png)
57
+ ![A network with residual connections](imgs/network-with-residual-connection.png)
58
+
59
+ A more complex network:
60
60
 
61
+ ![A more complex network](imgs/complex-network.png)
61
62
 
62
63
  Note: with the graph extracture feature it is possible to implement recurrent neural networks. However, this is not recommended or supported as it can result in deadlock on the chip.
63
64
 
65
+ Note2: the use of two parallel network although supported by our chip was not fully considered in our sinabs implementation.
66
+
64
67
  ## How to make use of the graph extraction feature?
65
68
 
66
69
  For general architectures, users need to define their classes, by defining at least the `__init__` method with all the layers, as well as an appropriate `forward` method.
@@ -68,64 +71,70 @@ For general architectures, users need to define their classes, by defining at le
68
71
  Here is an example to define a network with a merge and a split:
69
72
 
70
73
  ```python
74
+ import torch
71
75
  import torch.nn as nn
72
76
 
73
77
  from sinabs.activation.surrogate_gradient_fn import PeriodicExponential
74
78
  from sinabs.layers import IAFSqueeze, Merge, SumPool2d
75
79
 
80
+
76
81
  class SNN(nn.Module):
77
82
  def __init__(self, batch_size) -> None:
78
83
  super().__init__()
79
-
80
- self.conv1 = nn.Conv2d(2, 1, 2, 1, bias=False)
81
- self.iaf1 = IAFSqueeze(
84
+ # -- graph node A --
85
+ self.conv_A = nn.Conv2d(2, 4, 2, 1, bias=False)
86
+ self.iaf_A = IAFSqueeze(
82
87
  batch_size=batch_size,
83
88
  min_v_mem=-1.0,
84
89
  spike_threshold=1.0,
85
90
  surrogate_grad_fn=PeriodicExponential(),
86
91
  )
87
-
88
- self.conv2 = nn.Conv2d(1, 1, 2, 1, bias=False)
89
- self.iaf2 = IAFSqueeze(
92
+ # -- graph node B --
93
+ self.conv_B = nn.Conv2d(4, 4, 2, 1, bias=False)
94
+ self.iaf2_B = IAFSqueeze(
90
95
  batch_size=batch_size,
91
96
  min_v_mem=-1.0,
92
97
  spike_threshold=1.0,
93
98
  surrogate_grad_fn=PeriodicExponential(),
94
99
  )
95
- self.pool2 = SumPool2d(2, 2)
96
-
97
- self.conv3 = nn.Conv2d(1, 1, 2, 1, bias=False)
98
- self.iaf3 = IAFSqueeze(
100
+ self.pool_B = SumPool2d(2, 2)
101
+ # -- graph node C --
102
+ self.conv_C = nn.Conv2d(4, 4, 2, 1, bias=False)
103
+ self.iaf_C = IAFSqueeze(
99
104
  batch_size=batch_size,
100
105
  min_v_mem=-1.0,
101
106
  spike_threshold=1.0,
102
107
  surrogate_grad_fn=PeriodicExponential(),
103
108
  )
104
- self.pool3 = SumPool2d(2, 2)
105
- self.pool3a = SumPool2d(5, 5)
106
-
107
- self.conv4 = nn.Conv2d(1, 1, 2, 1, bias=False)
108
- self.iaf4 = IAFSqueeze(
109
+ self.pool_C = SumPool2d(2, 2)
110
+ # -- graph node D --
111
+ self.conv_D = nn.Conv2d(4, 4, 2, 1, bias=False)
112
+ self.iaf_D = IAFSqueeze(
109
113
  batch_size=batch_size,
110
114
  min_v_mem=-1.0,
111
115
  spike_threshold=1.0,
112
116
  surrogate_grad_fn=PeriodicExponential(),
113
117
  )
114
- self.pool4 = SumPool2d(3, 3)
115
-
116
- self.flat1 = nn.Flatten()
117
- self.flat2 = nn.Flatten()
118
-
119
- self.conv5 = nn.Conv2d(1, 1, 2, 1, bias=False)
120
- self.iaf5 = IAFSqueeze(
118
+ # -- graph node E --
119
+ self.conv_E = nn.Conv2d(4, 4, 2, 1, bias=False)
120
+ self.iaf3_E = IAFSqueeze(
121
121
  batch_size=batch_size,
122
122
  min_v_mem=-1.0,
123
123
  spike_threshold=1.0,
124
124
  surrogate_grad_fn=PeriodicExponential(),
125
125
  )
126
-
127
- self.fc2 = nn.Linear(25, 10, bias=False)
128
- self.iaf2_fc = IAFSqueeze(
126
+ self.pool_E = SumPool2d(2, 2)
127
+ # -- graph node F --
128
+ self.conv_F = nn.Conv2d(4, 4, 2, 1, bias=False)
129
+ self.iaf_F = IAFSqueeze(
130
+ batch_size=batch_size,
131
+ min_v_mem=-1.0,
132
+ spike_threshold=1.0,
133
+ surrogate_grad_fn=PeriodicExponential(),
134
+ )
135
+ # -- graph node G --
136
+ self.fc3 = nn.Linear(144, 10, bias=False)
137
+ self.iaf3_fc = IAFSqueeze(
129
138
  batch_size=batch_size,
130
139
  min_v_mem=-1.0,
131
140
  spike_threshold=1.0,
@@ -134,43 +143,47 @@ class SNN(nn.Module):
134
143
 
135
144
  # -- merges --
136
145
  self.merge1 = Merge()
137
- self.merge2 = Merge()
146
+
147
+ # -- falts --
148
+ self.flat_D = nn.Flatten()
149
+ self.flat_F = nn.Flatten()
138
150
 
139
151
  def forward(self, x):
140
152
  # conv 1 - A/0
141
- con1_out = self.conv1(x)
142
- iaf1_out = self.iaf1(con1_out)
153
+ convA_out = self.conv_A(x)
154
+ iaf_A_out = self.iaf_A(convA_out)
143
155
 
144
156
  # conv 2 - B/1
145
- conv2_out = self.conv2(iaf1_out)
146
- iaf2_out = self.iaf2(conv2_out)
147
- pool2_out = self.pool2(iaf2_out)
157
+ conv_B_out = self.conv_B(iaf_A_out)
158
+ iaf_B_out = self.iaf2_B(conv_B_out)
159
+ pool_B_out = self.pool_B(iaf_B_out)
148
160
 
149
161
  # conv 3 - C/2
150
- conv3_out = self.conv3(iaf1_out)
151
- iaf3_out = self.iaf3(conv3_out)
152
- pool3_out = self.pool3(iaf3_out)
153
- pool3a_out = self.pool3a(iaf3_out)
154
-
155
- # conv 4 - D/3
156
- merge1_out = self.merge1(pool2_out, pool3_out)
157
- conv4_out = self.conv4(merge1_out)
158
- iaf4_out = self.iaf4(conv4_out)
159
- pool4_out = self.pool4(iaf4_out)
160
- flat1_out = self.flat1(pool4_out)
161
-
162
- # conv 5 - E/4
163
- conv5_out = self.conv5(pool3a_out)
164
- iaf5_out = self.iaf5(conv5_out)
165
- flat2_out = self.flat2(iaf5_out)
166
-
167
- # fc 2 - F/5
168
- merge2_out = self.merge2(flat2_out, flat1_out)
169
-
170
- fc2_out = self.fc2(merge2_out)
171
- iaf2_fc_out = self.iaf2_fc(fc2_out)
172
-
173
- return iaf2_fc_out
162
+ conv_C_out = self.conv_C(pool_B_out)
163
+ iaf_C_out = self.iaf_C(conv_C_out)
164
+ pool_C_out = self.pool_C(iaf_C_out)
165
+
166
+ # conv 4 - D/4
167
+ conv_D_out = self.conv_D(pool_C_out)
168
+ iaf_D_out = self.iaf_D(conv_D_out)
169
+ # fc 1 - E/3
170
+ conv_E_out = self.conv_E(pool_B_out)
171
+ iaf3_E_out = self.iaf3_E(conv_E_out)
172
+ pool_E_out = self.pool_E(iaf3_E_out)
173
+
174
+ # fc 2 - F/6
175
+ conv_F_out = self.conv_F(pool_E_out)
176
+ iaf_F_out = self.iaf_F(conv_F_out)
177
+
178
+ # fc 2 - G/5
179
+ flat_D_out = self.flat_D(iaf_D_out)
180
+ flat_F_out = self.flat_F(iaf_F_out)
181
+
182
+ merge1_out = self.merge1(flat_D_out, flat_F_out)
183
+ fc3_out = self.fc3(merge1_out)
184
+ iaf3_fc_out = self.iaf3_fc(fc3_out)
185
+
186
+ return iaf3_fc_out
174
187
  ```
175
188
 
176
189
  ## Can I achieve a "Residual Connection" like ResNet does?
@@ -180,9 +193,9 @@ change the `samna.speck2f.configuration.CNNLayerDestination.layer` to achieve th
180
193
  familiar with the `samna-configuration`.
181
194
  You can also make use of our network graph extraction feature, to implement residual networks.
182
195
 
183
- ## How to use "Residual Connection" manually?
196
+ ## How can I define "Residual Connection" manually?
184
197
 
185
- Alright! Here I will give an example of achieving the "Residual Connection" by manually modify the `samna-configuration`.
198
+ You can also achieve "Residual Connection" by manually modify the `samna-configuration`.
186
199
 
187
200
  Let's say you want an architecture like below:
188
201
 
@@ -221,7 +234,7 @@ class ResidualBlock(nn.Module):
221
234
 
222
235
  ```
223
236
 
224
- Since currently Sinabs can only parse Sequential like network, we need to do some tedious work like below:
237
+ You can write it like:
225
238
 
226
239
  ```python
227
240
  # define a Sequential first
@@ -264,8 +277,8 @@ devkit.get_model().apply_configuration(samna_cfg)
264
277
 
265
278
  ```
266
279
 
267
- I have to say it is not an elegant solution though, it should help you to achieve an initial Residual Block. We will
268
- improve this part after Sinabs has the ability for extracting model's graph.
280
+ It is a lot of manual work but it will let you have your Residual Block.
281
+ We recommend to use our network graph extraction feature for residual connections.
269
282
 
270
283
  ## What execution order should I be aware of when I am implementing a sequential structure?
271
284
  You should be aware with the internal layer order.
@@ -97,7 +97,6 @@
97
97
  "source": [
98
98
  "from torch import nn\n",
99
99
  "\n",
100
- "\n",
101
100
  "# define a CNN model\n",
102
101
  "cnn = nn.Sequential(\n",
103
102
  " # [2, 34, 34] -> [8, 17, 17]\n",
@@ -1181,7 +1180,6 @@
1181
1180
  "source": [
1182
1181
  "from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
1183
1182
  "\n",
1184
- "\n",
1185
1183
  "visualizer = DynapcnnVisualizer(\n",
1186
1184
  " window_scale=(4, 8),\n",
1187
1185
  " dvs_shape=(34, 34),\n",
@@ -103,7 +103,6 @@
103
103
  "from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
104
104
  "from sinabs.backend.dynapcnn import DynapcnnNetwork\n",
105
105
  "\n",
106
- "\n",
107
106
  "# create a dummy snn for DynapcnnNetwork initialization\n",
108
107
  "snn = nn.Sequential(\n",
109
108
  " nn.Conv2d(1, 1, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False),\n",
@@ -292,7 +292,6 @@
292
292
  "source": [
293
293
  "from tqdm.notebook import tqdm\n",
294
294
  "\n",
295
- "\n",
296
295
  "n_epochs = 1\n",
297
296
  "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n",
298
297
  "crit = nn.functional.cross_entropy\n",
@@ -101,7 +101,7 @@ class DynapcnnConfigBuilder(ConfigBuilder):
101
101
  dimensions["input_shape"]["feature_count"] = channel_count
102
102
 
103
103
  # dimensions["output_feature_count"] already done in conv2d_to_dict
104
- (f, h, w) = layer.get_neuron_shape()
104
+ f, h, w = layer.get_neuron_shape()
105
105
  dimensions["output_shape"]["size"] = {}
106
106
  dimensions["output_shape"]["feature_count"] = f
107
107
  dimensions["output_shape"]["size"]["x"] = w
@@ -121,7 +121,7 @@ class DynapcnnConfigBuilder(ConfigBuilder):
121
121
  config_dict["dimensions"] = dimensions
122
122
  # Update parameters from convolution
123
123
  if layer.conv_layer.bias is not None:
124
- (weights, biases) = layer.conv_layer.parameters()
124
+ weights, biases = layer.conv_layer.parameters()
125
125
  else:
126
126
  (weights,) = layer.conv_layer.parameters()
127
127
  biases = torch.zeros(layer.conv_layer.out_channels)
@@ -455,7 +455,7 @@ class DynapcnnVisualizer:
455
455
 
456
456
  # Streamer graph
457
457
  # Dvs node
458
- (_, dvs_member_filter, _, streamer_node) = self.streamer_graph.sequential(
458
+ _, dvs_member_filter, _, streamer_node = self.streamer_graph.sequential(
459
459
  [
460
460
  dynapcnn_network.samna_device.get_model_source_node(),
461
461
  samna.graph.JitMemberSelect(),
@@ -526,7 +526,7 @@ class DynapcnnVisualizer:
526
526
  ## Readout node
527
527
  if "r" in self.gui_type:
528
528
  if self.readout_node == "JitMajorityReadout":
529
- (_, majority_readout_node, _) = self.streamer_graph.sequential(
529
+ _, majority_readout_node, _ = self.streamer_graph.sequential(
530
530
  [
531
531
  spike_collection_node,
532
532
  samna.graph.JitMajorityReadout(samna.ui.Event),
@@ -544,7 +544,7 @@ class DynapcnnVisualizer:
544
544
  self.readout_default_threshold_high
545
545
  )
546
546
  else:
547
- (_, majority_readout_node, _) = self.streamer_graph.sequential(
547
+ _, majority_readout_node, _ = self.streamer_graph.sequential(
548
548
  [
549
549
  spike_collection_node,
550
550
  self.readout_node,
@@ -504,7 +504,7 @@ class GraphExtractor:
504
504
  A handler to the newly added `DVSLayer` instance.
505
505
  """
506
506
 
507
- (features, height, width) = dvs_input_shape
507
+ features, height, width = dvs_input_shape
508
508
  if features > 2:
509
509
  raise ValueError(
510
510
  f"A DVSLayer istance can have a max feature dimension of 2 but {features} was given."
@@ -578,7 +578,7 @@ class GraphExtractor:
578
578
  f"A DVSLayer node exists and there are {nb_entries} entry nodes in the graph: the DVSLayer should be the only entry node."
579
579
  )
580
580
 
581
- (features, _, _) = dvs_input_shape
581
+ features, _, _ = dvs_input_shape
582
582
 
583
583
  if features > 2:
584
584
  raise ValueError(
@@ -752,7 +752,7 @@ class GraphExtractor:
752
752
  # different input sources to a core to have the same output shapes.
753
753
  if any(inp.shape != inputs[0].shape for inp in inputs):
754
754
  raise ValueError(
755
- f"Layer `sinabs.layers.merge.Merge` (node {node}) requires input tensors with the same shape"
755
+ f"Layer `sinabs.layers.merge.Merge` (node {node}) requires input tensors with the same shape."
756
756
  )
757
757
 
758
758
  # forward input through the node.
@@ -828,6 +828,7 @@ class GraphExtractor:
828
828
  if len(sources) == 0:
829
829
  return -1
830
830
  if len(sources) > 1:
831
+ # return -1 #TODO: why throw a runtime error when the documentation explicitly say -1 in case of more than one input node?
831
832
  raise RuntimeError(f"Node {node} has more than 1 input")
832
833
  return sources.pop()
833
834
 
@@ -80,7 +80,7 @@ class SpikingMaxPooling2dLayer(nn.Module):
80
80
  Returns:
81
81
  (channelsOut, height_out, width_out)
82
82
  """
83
- (channels, height, width) = input_shape
83
+ channels, height, width = input_shape
84
84
 
85
85
  height_out = conv_output_size(
86
86
  height + sum(self.padding[2:]), self.pool_size[0], self.strides[0]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinabs
3
- Version: 3.1.2
3
+ Version: 3.1.3
4
4
  Summary: SynSense Spiking Neural Network simulator for deep neural networks (DNNs).
5
5
  Author: SynSense (formerly AiCTX)
6
6
  Author-email: support@synsense.ai
@@ -121,8 +121,9 @@ docs/speck/faqs/index.rst
121
121
  docs/speck/faqs/output_monitoring.md
122
122
  docs/speck/faqs/save_hardware_config_as_binary.md
123
123
  docs/speck/faqs/tips_for_training.md
124
+ docs/speck/faqs/imgs/complex-network.png
124
125
  docs/speck/faqs/imgs/network-with-merge-and-split.png
125
- docs/speck/faqs/imgs/two-independent-networks.png
126
+ docs/speck/faqs/imgs/network-with-residual-connection.png
126
127
  docs/speck/faqs/imgs/two-networks-merging-output.png
127
128
  docs/speck/notebooks/leak_neuron.ipynb
128
129
  docs/speck/notebooks/nmnist_quick_start.ipynb
@@ -228,6 +229,7 @@ sinabs/layers/functional/__init__.py
228
229
  sinabs/layers/functional/alif.py
229
230
  sinabs/layers/functional/lif.py
230
231
  tests/__init__.py
232
+ tests/hw_utils.py
231
233
  tests/mnist_params.pt
232
234
  tests/requirements.txt
233
235
  tests/test_activations.py
@@ -253,8 +255,8 @@ tests/inputs_and_results/hooks/input_diffs.pth
253
255
  tests/inputs_and_results/hooks/model_synops.pth
254
256
  tests/models/README.txt
255
257
  tests/models/synop_hook_model.pth
258
+ tests/test_dynapcnn/__init__.py
256
259
  tests/test_dynapcnn/custom_jit_filters.py
257
- tests/test_dynapcnn/hw_utils.py
258
260
  tests/test_dynapcnn/test_auto_mapping.py
259
261
  tests/test_dynapcnn/test_compatible_layer_build.py
260
262
  tests/test_dynapcnn/test_config_making.py
@@ -287,6 +289,7 @@ tests/test_dynapcnnnetwork/model_dummy_1.py
287
289
  tests/test_dynapcnnnetwork/model_dummy_2.py
288
290
  tests/test_dynapcnnnetwork/model_dummy_3.py
289
291
  tests/test_dynapcnnnetwork/model_dummy_4.py
292
+ tests/test_dynapcnnnetwork/model_dummy_5.py
290
293
  tests/test_dynapcnnnetwork/model_dummy_seq.py
291
294
  tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py
292
295
  tests/test_dynapcnnnetwork/test_failcases.py
@@ -0,0 +1 @@
1
+ {"git_version": "d84078e", "is_release": false}
@@ -3,7 +3,7 @@ import torch.nn as nn
3
3
 
4
4
  from sinabs.backend.dynapcnn import DynapcnnNetwork
5
5
  from sinabs.from_torch import from_model
6
- from hw_utils import find_open_devices
6
+ from tests.hw_utils import find_open_devices
7
7
 
8
8
  ann = nn.Sequential(
9
9
  nn.Conv2d(1, 20, 5, 1, bias=False),
@@ -2,7 +2,7 @@ import pytest
2
2
  import samna
3
3
 
4
4
  from sinabs.backend.dynapcnn import io
5
- from hw_utils import find_open_devices
5
+ from tests.hw_utils import find_open_devices
6
6
 
7
7
 
8
8
  def test_is_device_type():
@@ -14,7 +14,7 @@ from torch import nn
14
14
  from sinabs.backend.dynapcnn.dynapcnn_network import DynapcnnNetwork
15
15
  from sinabs.from_torch import from_model
16
16
  from sinabs.layers import NeuromorphicReLU
17
- from hw_utils import find_open_devices
17
+ from tests.hw_utils import find_open_devices
18
18
 
19
19
 
20
20
  class DynapCnnNetA(nn.Module):
@@ -3,12 +3,7 @@ import time
3
3
  import pytest
4
4
  import samna
5
5
  import torch
6
- from hw_utils import (
7
- find_open_devices,
8
- get_ones_network,
9
- is_any_samna_device_connected,
10
- is_device_connected,
11
- )
6
+ from tests.hw_utils import find_open_devices, is_any_samna_device_connected
12
7
  from torch import nn
13
8
 
14
9
  from sinabs.backend.dynapcnn import DynapcnnNetwork
@@ -1,9 +1,8 @@
1
1
  import pytest
2
- from hw_utils import (
2
+ from tests.hw_utils import (
3
3
  find_open_devices,
4
4
  get_ones_network,
5
5
  is_any_samna_device_connected,
6
- is_device_connected,
7
6
  reset_all_connected_boards,
8
7
  )
9
8
 
@@ -3,9 +3,8 @@ from typing import Callable, Union
3
3
 
4
4
  import pytest
5
5
  import samna
6
- from custom_jit_filters import majority_readout_filter as custom_filter
7
- from hw_utils import find_open_devices, is_any_samna_device_connected
8
-
6
+ from .custom_jit_filters import majority_readout_filter as custom_filter
7
+ from tests.hw_utils import find_open_devices
9
8
  from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer
10
9
 
11
10
 
@@ -89,7 +88,7 @@ def test_jit_compilation():
89
88
  streamer_graph = samna.graph.EventFilterGraph()
90
89
  # Streamer graph
91
90
  # Dvs node
92
- (_, dvs_member_filter, _, streamer_node) = streamer_graph.sequential(
91
+ _, dvs_member_filter, _, streamer_node = streamer_graph.sequential(
93
92
  [
94
93
  # samna.graph.JitSource(samna.speck2e.event.OutputEvent),
95
94
  dynapcnn_network.samna_device.get_model_source_node(),
File without changes
@@ -14,6 +14,11 @@ from .model_dummy_4 import batch_size as batch_size_4
14
14
  from .model_dummy_4 import expected_output as expected_output_4
15
15
  from .model_dummy_4 import input_shape as input_shape_4
16
16
  from .model_dummy_4 import snn as snn_4
17
+ from .model_dummy_5 import batch_size as batch_size_5
18
+ from .model_dummy_5 import expected_output as expected_output_5
19
+ from .model_dummy_5 import input_shape as input_shape_5
20
+ from .model_dummy_5 import snn as snn_5
21
+
17
22
  from .model_dummy_seq import (
18
23
  expected_seq_1,
19
24
  expected_seq_2,
@@ -30,3 +35,13 @@ args_DynapcnnNetworkTest = [
30
35
  (seq_1, input_shape_seq, 1, expected_seq_1),
31
36
  (seq_2, input_shape_seq, 1, expected_seq_2),
32
37
  ]
38
+
39
+ args_DynapcnnNetworkMappingTest = [
40
+ (snn_1, input_shape_1, batch_size_1),
41
+ (snn_2, input_shape_2, batch_size_2),
42
+ (snn_3, input_shape_3, batch_size_3),
43
+ (snn_4, input_shape_4, batch_size_4),
44
+ (seq_1, input_shape_seq, 1),
45
+ (seq_2, input_shape_seq, 1),
46
+ # (snn_5, input_shape_5, batch_size_5), #TODO: forward method needs implementation
47
+ ]
@@ -13,49 +13,49 @@ class SNN(nn.Module):
13
13
  def __init__(self, batch_size) -> None:
14
14
  super().__init__()
15
15
 
16
- self.conv1 = nn.Conv2d(2, 10, 2, 1, bias=False) # node 0
16
+ self.conv1 = nn.Conv2d(2, 10, 2, 1, bias=False)
17
17
  self.iaf1 = IAFSqueeze(
18
18
  batch_size=batch_size,
19
19
  min_v_mem=-1.0,
20
20
  spike_threshold=1.0,
21
21
  surrogate_grad_fn=PeriodicExponential(),
22
- ) # node 1
23
- self.pool1 = nn.AvgPool2d(3, 3) # node 2
24
- self.pool1a = nn.AvgPool2d(4, 4) # node 3
22
+ )
23
+ self.pool1 = nn.AvgPool2d(2, 2)
24
+ self.pool1a = nn.AvgPool2d(2, 2)
25
25
 
26
- self.conv2 = nn.Conv2d(10, 10, 4, 1, bias=False) # node 4
26
+ self.conv2 = nn.Conv2d(10, 10, 1, 1, bias=False)
27
27
  self.iaf2 = IAFSqueeze(
28
28
  batch_size=batch_size,
29
29
  min_v_mem=-1.0,
30
30
  spike_threshold=1.0,
31
31
  surrogate_grad_fn=PeriodicExponential(),
32
- ) # node 6
32
+ )
33
33
 
34
- self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False) # node 8
34
+ self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False)
35
35
  self.iaf3 = IAFSqueeze(
36
36
  batch_size=batch_size,
37
37
  min_v_mem=-1.0,
38
38
  spike_threshold=1.0,
39
39
  surrogate_grad_fn=PeriodicExponential(),
40
- ) # node 9
40
+ )
41
41
 
42
42
  self.flat = nn.Flatten()
43
43
 
44
- self.fc1 = nn.Linear(49, 500, bias=False) # node 10
44
+ self.fc1 = nn.Linear(225, 200, bias=False)
45
45
  self.iaf4 = IAFSqueeze(
46
46
  batch_size=batch_size,
47
47
  min_v_mem=-1.0,
48
48
  spike_threshold=1.0,
49
49
  surrogate_grad_fn=PeriodicExponential(),
50
- ) # node 11
50
+ )
51
51
 
52
- self.fc2 = nn.Linear(500, 10, bias=False) # node 12
52
+ self.fc2 = nn.Linear(200, 10, bias=False)
53
53
  self.iaf5 = IAFSqueeze(
54
54
  batch_size=batch_size,
55
55
  min_v_mem=-1.0,
56
56
  spike_threshold=1.0,
57
57
  surrogate_grad_fn=PeriodicExponential(),
58
- ) # node 13
58
+ )
59
59
 
60
60
  self.adder = Merge()
61
61
 
@@ -67,14 +67,13 @@ class SNN(nn.Module):
67
67
 
68
68
  conv2_out = self.conv2(pool1_out)
69
69
  iaf2_out = self.iaf2(conv2_out)
70
-
71
70
  conv3_out = self.conv3(self.adder(pool1a_out, iaf2_out))
72
71
  iaf3_out = self.iaf3(conv3_out)
73
-
74
72
  flat_out = self.flat(iaf3_out)
75
73
 
76
74
  fc1_out = self.fc1(flat_out)
77
75
  iaf4_out = self.iaf4(fc1_out)
76
+
78
77
  fc2_out = self.fc2(iaf4_out)
79
78
  iaf5_out = self.iaf5(fc2_out)
80
79