sinabs 3.1.3__tar.gz → 3.1.3.dev1__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.3 → sinabs-3.1.3.dev1}/PKG-INFO +1 -1
  2. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/release_notes.md +0 -6
  3. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/iaf_neuron_model.ipynb +1 -0
  4. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/available_network_arch.md +67 -80
  5. sinabs-3.1.3.dev1/docs/speck/faqs/imgs/two-independent-networks.png +0 -0
  6. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/nmnist_quick_start.ipynb +2 -0
  7. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/play_with_speck_dvs.ipynb +1 -0
  8. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/nmnist.ipynb +1 -0
  9. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/dynapcnn.py +2 -2
  10. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +3 -3
  11. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/nir_graph_extractor.py +3 -4
  12. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/pool2d.py +1 -1
  13. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/PKG-INFO +1 -1
  14. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/SOURCES.txt +2 -5
  15. sinabs-3.1.3.dev1/sinabs.egg-info/pbr.json +1 -0
  16. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_device_movement.py +1 -1
  17. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_discover_device.py +1 -1
  18. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_large_net.py +1 -1
  19. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_neuron_leak.py +6 -1
  20. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_single_neuron_hardware.py +2 -1
  21. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_visualizer.py +4 -3
  22. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/conftest_dynapcnnnetwork.py +0 -15
  23. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_1.py +14 -13
  24. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_2.py +21 -20
  25. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_4.py +4 -6
  26. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py +1 -24
  27. sinabs-3.1.3/docs/speck/faqs/imgs/complex-network.png +0 -0
  28. sinabs-3.1.3/docs/speck/faqs/imgs/network-with-residual-connection.png +0 -0
  29. sinabs-3.1.3/sinabs.egg-info/pbr.json +0 -1
  30. sinabs-3.1.3/tests/test_dynapcnnnetwork/__init__.py +0 -0
  31. sinabs-3.1.3/tests/test_dynapcnnnetwork/model_dummy_5.py +0 -199
  32. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.coveragerc +0 -0
  33. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.github/workflows/ci-pipeline.yml +0 -0
  34. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.pre-commit-config.yaml +0 -0
  35. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/.readthedocs.yaml +0 -0
  36. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/AUTHORS +0 -0
  37. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/CITATION.cff +0 -0
  38. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/LICENSE +0 -0
  39. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/README.md +0 -0
  40. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/codecov.yml +0 -0
  41. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/Makefile +0 -0
  42. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/dataflow_layers.png +0 -0
  43. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
  44. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/memory_constraints.png +0 -0
  45. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
  46. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/speck_dynapcnn.png +0 -0
  47. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/Overview/speck_top_level.png +0 -0
  48. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
  49. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_devkit.png +0 -0
  50. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_module.png +0 -0
  51. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
  52. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
  53. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
  54. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
  55. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
  56. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
  57. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/power_monitoring/power_plot.png +0 -0
  58. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
  59. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/sinabs-logo-lowercase.png +0 -0
  60. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
  61. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
  62. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
  63. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/readout_layer.png +0 -0
  64. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/using_readout_layer/samna_graph.png +0 -0
  65. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
  66. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
  67. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_static/visualize_spike_count/spike_count.png +0 -0
  68. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_templates/class_activation.rst +0 -0
  69. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/_templates/class_layer.rst +0 -0
  70. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/about.rst +0 -0
  71. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/contributing.md +0 -0
  72. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/differences.md +0 -0
  73. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/about/info.md +0 -0
  74. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/activation.rst +0 -0
  75. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/api.rst +0 -0
  76. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/from_torch.rst +0 -0
  77. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/hooks.rst +0 -0
  78. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/layers.rst +0 -0
  79. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/network.rst +0 -0
  80. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/nir.rst +0 -0
  81. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/synopcounter.rst +0 -0
  82. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/api/utils.rst +0 -0
  83. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/conf.py +0 -0
  84. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/contact.md +0 -0
  85. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/README.rst +0 -0
  86. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/README.rst +0 -0
  87. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_alif.py +0 -0
  88. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_exp_leaky.py +0 -0
  89. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_iaf.py +0 -0
  90. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/plot_lif.py +0 -0
  91. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/layers/utils.py +0 -0
  92. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/README.rst +0 -0
  93. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
  94. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_multispike.py +0 -0
  95. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
  96. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
  97. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
  98. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
  99. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
  100. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
  101. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
  102. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/fundamentals.rst +0 -0
  103. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/getting_started.rst +0 -0
  104. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/install.rst +0 -0
  105. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
  106. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/getting_started/quickstart.ipynb +0 -0
  107. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/activations.ipynb +0 -0
  108. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/custom_hooks.ipynb +0 -0
  109. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/how_tos.rst +0 -0
  110. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/synops_loss_ann.ipynb +0 -0
  111. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/how_tos/synops_loss_snn.ipynb +0 -0
  112. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/index.md +0 -0
  113. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/make.bat +0 -0
  114. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/plugins/plugins.rst +0 -0
  115. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/requirements.txt +0 -0
  116. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/advanced_concepts.rst +0 -0
  117. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
  118. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
  119. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
  120. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/discretize.rst +0 -0
  121. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
  122. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
  123. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
  124. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
  125. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
  126. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
  127. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
  128. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/io.rst +0 -0
  129. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/mapping.rst +0 -0
  130. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/specksim.rst +0 -0
  131. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/api/dynapcnn/utils.rst +0 -0
  132. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/dangers.md +0 -0
  133. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/add_new_device.md +0 -0
  134. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
  135. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/chip_errata.md +0 -0
  136. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/device_management.md +0 -0
  137. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/imgs/network-with-merge-and-split.png +0 -0
  138. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/imgs/two-networks-merging-output.png +0 -0
  139. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/index.rst +0 -0
  140. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/output_monitoring.md +0 -0
  141. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
  142. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/faqs/tips_for_training.md +0 -0
  143. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/index.rst +0 -0
  144. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
  145. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
  146. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
  147. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
  148. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
  149. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/overview.md +0 -0
  150. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/specksim.md +0 -0
  151. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/the_basics.md +0 -0
  152. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/tutorials.rst +0 -0
  153. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/speck/visualizer.md +0 -0
  154. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
  155. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/bptt.ipynb +0 -0
  156. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/nir_to_speck.ipynb +0 -0
  157. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/scnn_mnist.nir +0 -0
  158. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/tutorials.rst +0 -0
  159. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/weight_scaling.md +0 -0
  160. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
  161. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_DVSLayer_given.ipynb +0 -0
  162. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_DVSLayer_given_followed_by_pool.ipynb +0 -0
  163. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_deployment.ipynb +0 -0
  164. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_need_create_DVSLayer.ipynb +0 -0
  165. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_no_DVSLayer.ipynb +0 -0
  166. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_with_batchnorm.ipynb +0 -0
  167. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/dynapcnn_network/snn_with_multiple_batchnorm.ipynb +0 -0
  168. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/dynapcnn_network.py +0 -0
  169. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/mnist_params.pt +0 -0
  170. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/mnist/specksim_network.py +0 -0
  171. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/dvs_gesture_params.pt +0 -0
  172. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/gesture_viz.py +0 -0
  173. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/01_armroll.png +0 -0
  174. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/02_handclap.png +0 -0
  175. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
  176. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
  177. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/05_lefthandwave.png +0 -0
  178. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/06_righthandwave.png +0 -0
  179. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
  180. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
  181. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/09_airdrums.png +0 -0
  182. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/10_airguitar.png +0 -0
  183. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/examples/visualizer/icons/11_other.png +0 -0
  184. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/jupyterlab-requirements.txt +0 -0
  185. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/pull_request_template.md +0 -0
  186. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/requirements.txt +0 -0
  187. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/setup.cfg +0 -0
  188. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/setup.py +0 -0
  189. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/__init__.py +0 -0
  190. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/__init__.py +0 -0
  191. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/quantize.py +0 -0
  192. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/reset_mechanism.py +0 -0
  193. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/spike_generation.py +0 -0
  194. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/activation/surrogate_gradient_fn.py +0 -0
  195. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/__init__.py +0 -0
  196. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/__init__.py +0 -0
  197. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
  198. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
  199. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
  200. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
  201. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/config_builder.py +0 -0
  202. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/connectivity_specs.py +0 -0
  203. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/crop2d.py +0 -0
  204. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/discretize.py +0 -0
  205. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
  206. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
  207. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_layer_utils.py +0 -0
  208. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnn_network.py +0 -0
  209. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/dynapcnnnetwork_module.py +0 -0
  210. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/exceptions.py +0 -0
  211. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/flipdims.py +0 -0
  212. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/io.py +0 -0
  213. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/mapping.py +0 -0
  214. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/sinabs_edges_handler.py +0 -0
  215. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/specksim.py +0 -0
  216. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/utils.py +0 -0
  217. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/backend/dynapcnn/weight_rescaling_methods.py +0 -0
  218. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/cnnutils.py +0 -0
  219. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/conversion.py +0 -0
  220. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/from_torch.py +0 -0
  221. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/hooks.py +0 -0
  222. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/__init__.py +0 -0
  223. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/alif.py +0 -0
  224. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/channel_shift.py +0 -0
  225. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/crop2d.py +0 -0
  226. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/exp_leak.py +0 -0
  227. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/__init__.py +0 -0
  228. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/alif.py +0 -0
  229. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/functional/lif.py +0 -0
  230. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/iaf.py +0 -0
  231. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/lif.py +0 -0
  232. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/merge.py +0 -0
  233. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/neuromorphic_relu.py +0 -0
  234. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/quantize.py +0 -0
  235. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/reshape.py +0 -0
  236. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/stateful_layer.py +0 -0
  237. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/layers/to_spike.py +0 -0
  238. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/network.py +0 -0
  239. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/nir.py +0 -0
  240. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/synopcounter.py +0 -0
  241. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/utils.py +0 -0
  242. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs/validate_memory_speck.py +0 -0
  243. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/dependency_links.txt +0 -0
  244. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/not-zip-safe +0 -0
  245. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/requires.txt +0 -0
  246. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/sinabs.egg-info/top_level.txt +0 -0
  247. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/__init__.py +0 -0
  248. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
  249. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
  250. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
  251. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
  252. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
  253. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
  254. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/mnist_params.pt +0 -0
  255. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/models/README.txt +0 -0
  256. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/models/synop_hook_model.pth +0 -0
  257. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/requirements.txt +0 -0
  258. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_activations.py +0 -0
  259. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_batch_mismatch.py +0 -0
  260. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_batch_size_update.py +0 -0
  261. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_conversion.py +0 -0
  262. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_copy.py +0 -0
  263. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/custom_jit_filters.py +0 -0
  264. {sinabs-3.1.3/tests → sinabs-3.1.3.dev1/tests/test_dynapcnn}/hw_utils.py +0 -0
  265. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
  266. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
  267. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_config_making.py +0 -0
  268. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
  269. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_discretized.py +0 -0
  270. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_doorbell.py +0 -0
  271. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_dvs_input.py +0 -0
  272. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
  273. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_event_conversion.py +0 -0
  274. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_individual_cases.py +0 -0
  275. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_learning.py +0 -0
  276. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_monitoring.py +0 -0
  277. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnn/test_speck2e.py +0 -0
  278. {sinabs-3.1.3/tests/test_dynapcnn → sinabs-3.1.3.dev1/tests/test_dynapcnnlayer}/__init__.py +0 -0
  279. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/conftest_dynapcnnlayer.py +0 -0
  280. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_1.py +0 -0
  281. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_2.py +0 -0
  282. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_3.py +0 -0
  283. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/model_dummy_4.py +0 -0
  284. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnlayer/test_dynapcnnlayer.py +0 -0
  285. {sinabs-3.1.3/tests/test_dynapcnnlayer → sinabs-3.1.3.dev1/tests/test_dynapcnnnetwork}/__init__.py +0 -0
  286. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_3.py +0 -0
  287. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/model_dummy_seq.py +0 -0
  288. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_dynapcnnnetwork/test_failcases.py +0 -0
  289. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_from_model.py +0 -0
  290. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/conftest_graph_extractor.py +0 -0
  291. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_1.py +0 -0
  292. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_2.py +0 -0
  293. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_3.py +0 -0
  294. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/model_dummy_4.py +0 -0
  295. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_graph_extractor/test_graph_extractor.py +0 -0
  296. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_hooks.py +0 -0
  297. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_alif.py +0 -0
  298. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_channelshift.py +0 -0
  299. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_crop2d.py +0 -0
  300. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_exp_leak.py +0 -0
  301. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_iaf.py +0 -0
  302. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_img2spk.py +0 -0
  303. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_lif.py +0 -0
  304. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_maxpooling.py +0 -0
  305. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_merge.py +0 -0
  306. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_neuromorphic_relu.py +0 -0
  307. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_reshaping.py +0 -0
  308. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_sig2spk.py +0 -0
  309. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_layers/test_stateful_layer.py +0 -0
  310. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_network_class.py +0 -0
  311. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_nir.py +0 -0
  312. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_normalize_weights.py +0 -0
  313. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_onnx.py +0 -0
  314. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_quantize.py +0 -0
  315. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_bindings.py +0 -0
  316. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_conversion.py +0 -0
  317. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_specksim/test_specksim_network.py +0 -0
  318. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_surrogate_gradients.py +0 -0
  319. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_synops_counter.py +0 -0
  320. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/test_utils.py +0 -0
  321. {sinabs-3.1.3 → sinabs-3.1.3.dev1}/tests/weights/README.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinabs
3
- Version: 3.1.3
3
+ Version: 3.1.3.dev1
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,11 +1,5 @@
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
-
9
3
  ## v3.1.2 (12/12/2025)
10
4
 
11
5
  * Update use of visualizer in Sinabs tutorials, previous tutorials were using a deprecated visualizer version.
@@ -163,6 +163,7 @@
163
163
  "import torch\n",
164
164
  "import sinabs.layers as sl\n",
165
165
  "\n",
166
+ "\n",
166
167
  "# Define a neuron in 'SINABS'\n",
167
168
  "neuron = sl.IAF()\n",
168
169
  "\n",
@@ -39,31 +39,28 @@ 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 use a `Sequential` like network.
42
+ `Sinabs` can parse a `torch.nn.Sequential` like architecture, so it is recommended to
43
+ use a `Sequential` like network.
43
44
 
44
45
  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.
45
46
  Our `Speck` chip, in fact, supports branched architectures. With the graph extraction feature, we support a range of network structures, as shown below:
46
47
 
47
- A network with a merge and a split:
48
48
 
49
- ![A network with a merge and a split](imgs/network-with-merge-and-split.png)
49
+ Two independent networks:
50
+
51
+ ![Two independent networks](imgs/two-independent-networks.png)
50
52
 
51
53
  Two networks with merging outputs:
52
54
 
53
55
  ![Two networks with merging outputs](imgs/two-networks-merging-output.png)
54
56
 
55
- A network with residual connections:
56
-
57
- ![A network with residual connections](imgs/network-with-residual-connection.png)
57
+ A network with a merge and a split:
58
58
 
59
- A more complex network:
59
+ ![A network with a merge and a split](imgs/network-with-merge-and-split.png)
60
60
 
61
- ![A more complex network](imgs/complex-network.png)
62
61
 
63
62
  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.
64
63
 
65
- Note2: the use of two parallel network although supported by our chip was not fully considered in our sinabs implementation.
66
-
67
64
  ## How to make use of the graph extraction feature?
68
65
 
69
66
  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.
@@ -71,70 +68,64 @@ For general architectures, users need to define their classes, by defining at le
71
68
  Here is an example to define a network with a merge and a split:
72
69
 
73
70
  ```python
74
- import torch
75
71
  import torch.nn as nn
76
72
 
77
73
  from sinabs.activation.surrogate_gradient_fn import PeriodicExponential
78
74
  from sinabs.layers import IAFSqueeze, Merge, SumPool2d
79
75
 
80
-
81
76
  class SNN(nn.Module):
82
77
  def __init__(self, batch_size) -> None:
83
78
  super().__init__()
84
- # -- graph node A --
85
- self.conv_A = nn.Conv2d(2, 4, 2, 1, bias=False)
86
- self.iaf_A = IAFSqueeze(
87
- batch_size=batch_size,
88
- min_v_mem=-1.0,
89
- spike_threshold=1.0,
90
- surrogate_grad_fn=PeriodicExponential(),
91
- )
92
- # -- graph node B --
93
- self.conv_B = nn.Conv2d(4, 4, 2, 1, bias=False)
94
- self.iaf2_B = IAFSqueeze(
79
+
80
+ self.conv1 = nn.Conv2d(2, 1, 2, 1, bias=False)
81
+ self.iaf1 = IAFSqueeze(
95
82
  batch_size=batch_size,
96
83
  min_v_mem=-1.0,
97
84
  spike_threshold=1.0,
98
85
  surrogate_grad_fn=PeriodicExponential(),
99
86
  )
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(
87
+
88
+ self.conv2 = nn.Conv2d(1, 1, 2, 1, bias=False)
89
+ self.iaf2 = IAFSqueeze(
104
90
  batch_size=batch_size,
105
91
  min_v_mem=-1.0,
106
92
  spike_threshold=1.0,
107
93
  surrogate_grad_fn=PeriodicExponential(),
108
94
  )
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(
95
+ self.pool2 = SumPool2d(2, 2)
96
+
97
+ self.conv3 = nn.Conv2d(1, 1, 2, 1, bias=False)
98
+ self.iaf3 = IAFSqueeze(
113
99
  batch_size=batch_size,
114
100
  min_v_mem=-1.0,
115
101
  spike_threshold=1.0,
116
102
  surrogate_grad_fn=PeriodicExponential(),
117
103
  )
118
- # -- graph node E --
119
- self.conv_E = nn.Conv2d(4, 4, 2, 1, bias=False)
120
- self.iaf3_E = IAFSqueeze(
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(
121
109
  batch_size=batch_size,
122
110
  min_v_mem=-1.0,
123
111
  spike_threshold=1.0,
124
112
  surrogate_grad_fn=PeriodicExponential(),
125
113
  )
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(
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(
130
121
  batch_size=batch_size,
131
122
  min_v_mem=-1.0,
132
123
  spike_threshold=1.0,
133
124
  surrogate_grad_fn=PeriodicExponential(),
134
125
  )
135
- # -- graph node G --
136
- self.fc3 = nn.Linear(144, 10, bias=False)
137
- self.iaf3_fc = IAFSqueeze(
126
+
127
+ self.fc2 = nn.Linear(25, 10, bias=False)
128
+ self.iaf2_fc = IAFSqueeze(
138
129
  batch_size=batch_size,
139
130
  min_v_mem=-1.0,
140
131
  spike_threshold=1.0,
@@ -143,47 +134,43 @@ class SNN(nn.Module):
143
134
 
144
135
  # -- merges --
145
136
  self.merge1 = Merge()
146
-
147
- # -- falts --
148
- self.flat_D = nn.Flatten()
149
- self.flat_F = nn.Flatten()
137
+ self.merge2 = Merge()
150
138
 
151
139
  def forward(self, x):
152
140
  # conv 1 - A/0
153
- convA_out = self.conv_A(x)
154
- iaf_A_out = self.iaf_A(convA_out)
141
+ con1_out = self.conv1(x)
142
+ iaf1_out = self.iaf1(con1_out)
155
143
 
156
144
  # conv 2 - B/1
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)
145
+ conv2_out = self.conv2(iaf1_out)
146
+ iaf2_out = self.iaf2(conv2_out)
147
+ pool2_out = self.pool2(iaf2_out)
160
148
 
161
149
  # conv 3 - C/2
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
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
187
174
  ```
188
175
 
189
176
  ## Can I achieve a "Residual Connection" like ResNet does?
@@ -193,9 +180,9 @@ change the `samna.speck2f.configuration.CNNLayerDestination.layer` to achieve th
193
180
  familiar with the `samna-configuration`.
194
181
  You can also make use of our network graph extraction feature, to implement residual networks.
195
182
 
196
- ## How can I define "Residual Connection" manually?
183
+ ## How to use "Residual Connection" manually?
197
184
 
198
- You can also achieve "Residual Connection" by manually modify the `samna-configuration`.
185
+ Alright! Here I will give an example of achieving the "Residual Connection" by manually modify the `samna-configuration`.
199
186
 
200
187
  Let's say you want an architecture like below:
201
188
 
@@ -234,7 +221,7 @@ class ResidualBlock(nn.Module):
234
221
 
235
222
  ```
236
223
 
237
- You can write it like:
224
+ Since currently Sinabs can only parse Sequential like network, we need to do some tedious work like below:
238
225
 
239
226
  ```python
240
227
  # define a Sequential first
@@ -277,8 +264,8 @@ devkit.get_model().apply_configuration(samna_cfg)
277
264
 
278
265
  ```
279
266
 
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.
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.
282
269
 
283
270
  ## What execution order should I be aware of when I am implementing a sequential structure?
284
271
  You should be aware with the internal layer order.
@@ -97,6 +97,7 @@
97
97
  "source": [
98
98
  "from torch import nn\n",
99
99
  "\n",
100
+ "\n",
100
101
  "# define a CNN model\n",
101
102
  "cnn = nn.Sequential(\n",
102
103
  " # [2, 34, 34] -> [8, 17, 17]\n",
@@ -1180,6 +1181,7 @@
1180
1181
  "source": [
1181
1182
  "from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer\n",
1182
1183
  "\n",
1184
+ "\n",
1183
1185
  "visualizer = DynapcnnVisualizer(\n",
1184
1186
  " window_scale=(4, 8),\n",
1185
1187
  " dvs_shape=(34, 34),\n",
@@ -103,6 +103,7 @@
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",
106
107
  "# create a dummy snn for DynapcnnNetwork initialization\n",
107
108
  "snn = nn.Sequential(\n",
108
109
  " nn.Conv2d(1, 1, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False),\n",
@@ -292,6 +292,7 @@
292
292
  "source": [
293
293
  "from tqdm.notebook import tqdm\n",
294
294
  "\n",
295
+ "\n",
295
296
  "n_epochs = 1\n",
296
297
  "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n",
297
298
  "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,7 +828,6 @@ 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?
832
831
  raise RuntimeError(f"Node {node} has more than 1 input")
833
832
  return sources.pop()
834
833
 
@@ -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.3
3
+ Version: 3.1.3.dev1
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,9 +121,8 @@ 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
125
124
  docs/speck/faqs/imgs/network-with-merge-and-split.png
126
- docs/speck/faqs/imgs/network-with-residual-connection.png
125
+ docs/speck/faqs/imgs/two-independent-networks.png
127
126
  docs/speck/faqs/imgs/two-networks-merging-output.png
128
127
  docs/speck/notebooks/leak_neuron.ipynb
129
128
  docs/speck/notebooks/nmnist_quick_start.ipynb
@@ -229,7 +228,6 @@ sinabs/layers/functional/__init__.py
229
228
  sinabs/layers/functional/alif.py
230
229
  sinabs/layers/functional/lif.py
231
230
  tests/__init__.py
232
- tests/hw_utils.py
233
231
  tests/mnist_params.pt
234
232
  tests/requirements.txt
235
233
  tests/test_activations.py
@@ -255,8 +253,8 @@ tests/inputs_and_results/hooks/input_diffs.pth
255
253
  tests/inputs_and_results/hooks/model_synops.pth
256
254
  tests/models/README.txt
257
255
  tests/models/synop_hook_model.pth
258
- tests/test_dynapcnn/__init__.py
259
256
  tests/test_dynapcnn/custom_jit_filters.py
257
+ tests/test_dynapcnn/hw_utils.py
260
258
  tests/test_dynapcnn/test_auto_mapping.py
261
259
  tests/test_dynapcnn/test_compatible_layer_build.py
262
260
  tests/test_dynapcnn/test_config_making.py
@@ -289,7 +287,6 @@ tests/test_dynapcnnnetwork/model_dummy_1.py
289
287
  tests/test_dynapcnnnetwork/model_dummy_2.py
290
288
  tests/test_dynapcnnnetwork/model_dummy_3.py
291
289
  tests/test_dynapcnnnetwork/model_dummy_4.py
292
- tests/test_dynapcnnnetwork/model_dummy_5.py
293
290
  tests/test_dynapcnnnetwork/model_dummy_seq.py
294
291
  tests/test_dynapcnnnetwork/test_dynapcnnnetwork.py
295
292
  tests/test_dynapcnnnetwork/test_failcases.py
@@ -0,0 +1 @@
1
+ {"git_version": "70cee7a", "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 tests.hw_utils import find_open_devices
6
+ from 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 tests.hw_utils import find_open_devices
5
+ from 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 tests.hw_utils import find_open_devices
17
+ from hw_utils import find_open_devices
18
18
 
19
19
 
20
20
  class DynapCnnNetA(nn.Module):
@@ -3,7 +3,12 @@ import time
3
3
  import pytest
4
4
  import samna
5
5
  import torch
6
- from tests.hw_utils import find_open_devices, is_any_samna_device_connected
6
+ from hw_utils import (
7
+ find_open_devices,
8
+ get_ones_network,
9
+ is_any_samna_device_connected,
10
+ is_device_connected,
11
+ )
7
12
  from torch import nn
8
13
 
9
14
  from sinabs.backend.dynapcnn import DynapcnnNetwork
@@ -1,8 +1,9 @@
1
1
  import pytest
2
- from tests.hw_utils import (
2
+ from hw_utils import (
3
3
  find_open_devices,
4
4
  get_ones_network,
5
5
  is_any_samna_device_connected,
6
+ is_device_connected,
6
7
  reset_all_connected_boards,
7
8
  )
8
9
 
@@ -3,8 +3,9 @@ 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 tests.hw_utils import find_open_devices
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
+
8
9
  from sinabs.backend.dynapcnn.dynapcnn_visualizer import DynapcnnVisualizer
9
10
 
10
11
 
@@ -88,7 +89,7 @@ def test_jit_compilation():
88
89
  streamer_graph = samna.graph.EventFilterGraph()
89
90
  # Streamer graph
90
91
  # Dvs node
91
- _, dvs_member_filter, _, streamer_node = streamer_graph.sequential(
92
+ (_, dvs_member_filter, _, streamer_node) = streamer_graph.sequential(
92
93
  [
93
94
  # samna.graph.JitSource(samna.speck2e.event.OutputEvent),
94
95
  dynapcnn_network.samna_device.get_model_source_node(),
@@ -14,11 +14,6 @@ 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
-
22
17
  from .model_dummy_seq import (
23
18
  expected_seq_1,
24
19
  expected_seq_2,
@@ -35,13 +30,3 @@ args_DynapcnnNetworkTest = [
35
30
  (seq_1, input_shape_seq, 1, expected_seq_1),
36
31
  (seq_2, input_shape_seq, 1, expected_seq_2),
37
32
  ]
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)
16
+ self.conv1 = nn.Conv2d(2, 10, 2, 1, bias=False) # node 0
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
- )
23
- self.pool1 = nn.AvgPool2d(2, 2)
24
- self.pool1a = nn.AvgPool2d(2, 2)
22
+ ) # node 1
23
+ self.pool1 = nn.AvgPool2d(3, 3) # node 2
24
+ self.pool1a = nn.AvgPool2d(4, 4) # node 3
25
25
 
26
- self.conv2 = nn.Conv2d(10, 10, 1, 1, bias=False)
26
+ self.conv2 = nn.Conv2d(10, 10, 4, 1, bias=False) # node 4
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
- )
32
+ ) # node 6
33
33
 
34
- self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False)
34
+ self.conv3 = nn.Conv2d(10, 1, 2, 1, bias=False) # node 8
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
- )
40
+ ) # node 9
41
41
 
42
42
  self.flat = nn.Flatten()
43
43
 
44
- self.fc1 = nn.Linear(225, 200, bias=False)
44
+ self.fc1 = nn.Linear(49, 500, bias=False) # node 10
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
- )
50
+ ) # node 11
51
51
 
52
- self.fc2 = nn.Linear(200, 10, bias=False)
52
+ self.fc2 = nn.Linear(500, 10, bias=False) # node 12
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
- )
58
+ ) # node 13
59
59
 
60
60
  self.adder = Merge()
61
61
 
@@ -67,13 +67,14 @@ class SNN(nn.Module):
67
67
 
68
68
  conv2_out = self.conv2(pool1_out)
69
69
  iaf2_out = self.iaf2(conv2_out)
70
+
70
71
  conv3_out = self.conv3(self.adder(pool1a_out, iaf2_out))
71
72
  iaf3_out = self.iaf3(conv3_out)
73
+
72
74
  flat_out = self.flat(iaf3_out)
73
75
 
74
76
  fc1_out = self.fc1(flat_out)
75
77
  iaf4_out = self.iaf4(fc1_out)
76
-
77
78
  fc2_out = self.fc2(iaf4_out)
78
79
  iaf5_out = self.iaf5(fc2_out)
79
80