canns 1.0.0__tar.gz → 1.0.1__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 (177) hide show
  1. {canns-1.0.0 → canns-1.0.1}/.gitignore +1 -0
  2. {canns-1.0.0 → canns-1.0.1}/CHANGELOG.md +31 -5
  3. canns-1.0.1/CITATION.cff +139 -0
  4. {canns-1.0.0 → canns-1.0.1}/PKG-INFO +36 -10
  5. {canns-1.0.0 → canns-1.0.1}/README.md +35 -9
  6. {canns-1.0.0 → canns-1.0.1}/README_zh.md +35 -9
  7. {canns-1.0.0 → canns-1.0.1}/pyproject.toml +23 -4
  8. {canns-1.0.0 → canns-1.0.1}/src/canns/__init__.py +25 -6
  9. canns-1.0.1/src/canns/__main__.py +69 -0
  10. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/cohospace_scatter.py +0 -1
  11. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/visualization/btn_plots.py +0 -2
  12. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/theta_sweep_plots.py +1 -3
  13. canns-1.0.0/CITATION.cff +0 -43
  14. {canns-1.0.0 → canns-1.0.1}/LICENSE +0 -0
  15. {canns-1.0.0 → canns-1.0.1}/src/canns/_version.py +0 -0
  16. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/__init__.py +0 -0
  17. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/__init__.py +0 -0
  18. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/__init__.py +0 -0
  19. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/coho.py +0 -0
  20. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/cohomap.py +0 -0
  21. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/cohomap_vectors.py +0 -0
  22. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/cohospace.py +0 -0
  23. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/cohospace_phase_centers.py +0 -0
  24. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/config.py +0 -0
  25. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/decode.py +0 -0
  26. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/embedding.py +0 -0
  27. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/fly_roi.py +0 -0
  28. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/fr.py +0 -0
  29. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/path.py +0 -0
  30. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/plotting.py +0 -0
  31. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/tda.py +0 -0
  32. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/asa/utils.py +0 -0
  33. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/__init__.py +0 -0
  34. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/__init__.py +0 -0
  35. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/btn.py +0 -0
  36. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/grid_cells.py +0 -0
  37. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/grid_modules_leiden.py +0 -0
  38. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/head_direction.py +0 -0
  39. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/core/spatial_analysis.py +0 -0
  40. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/io/__init__.py +0 -0
  41. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/io/matlab_loader.py +0 -0
  42. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/utils/__init__.py +0 -0
  43. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/utils/circular_stats.py +0 -0
  44. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/utils/correlation.py +0 -0
  45. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/utils/geometry.py +0 -0
  46. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/utils/image_processing.py +0 -0
  47. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/visualization/__init__.py +0 -0
  48. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/visualization/grid_plots.py +0 -0
  49. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/data/cell_classification/visualization/hd_plots.py +0 -0
  50. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/metrics/__init__.py +0 -0
  51. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/metrics/spatial_metrics.py +0 -0
  52. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/metrics/systematic_ratemap.py +0 -0
  53. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/metrics/utils.py +0 -0
  54. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/model_specific/__init__.py +0 -0
  55. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/model_specific/hopfield.py +0 -0
  56. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/slow_points/__init__.py +0 -0
  57. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/slow_points/checkpoint.py +0 -0
  58. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/slow_points/finder.py +0 -0
  59. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/slow_points/fixed_points.py +0 -0
  60. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/slow_points/visualization.py +0 -0
  61. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/__init__.py +0 -0
  62. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/__init__.py +0 -0
  63. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/animation.py +0 -0
  64. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/backend.py +0 -0
  65. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/config.py +0 -0
  66. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/jupyter_utils.py +0 -0
  67. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/rendering.py +0 -0
  68. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/core/writers.py +0 -0
  69. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/energy_plots.py +0 -0
  70. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/spatial_plots.py +0 -0
  71. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/spike_plots.py +0 -0
  72. {canns-1.0.0 → canns-1.0.1}/src/canns/analyzer/visualization/tuning_plots.py +0 -0
  73. {canns-1.0.0 → canns-1.0.1}/src/canns/data/__init__.py +0 -0
  74. {canns-1.0.0 → canns-1.0.1}/src/canns/data/datasets.py +0 -0
  75. {canns-1.0.0 → canns-1.0.1}/src/canns/data/loaders.py +0 -0
  76. {canns-1.0.0 → canns-1.0.1}/src/canns/models/__init__.py +0 -0
  77. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/__init__.py +0 -0
  78. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/_base.py +0 -0
  79. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/cann.py +0 -0
  80. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/grid_cell.py +0 -0
  81. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/hierarchical_model.py +0 -0
  82. {canns-1.0.0 → canns-1.0.1}/src/canns/models/basic/theta_sweep_model.py +0 -0
  83. {canns-1.0.0 → canns-1.0.1}/src/canns/models/brain_inspired/__init__.py +0 -0
  84. {canns-1.0.0 → canns-1.0.1}/src/canns/models/brain_inspired/_base.py +0 -0
  85. {canns-1.0.0 → canns-1.0.1}/src/canns/models/brain_inspired/hopfield.py +0 -0
  86. {canns-1.0.0 → canns-1.0.1}/src/canns/models/brain_inspired/linear.py +0 -0
  87. {canns-1.0.0 → canns-1.0.1}/src/canns/models/brain_inspired/spiking.py +0 -0
  88. {canns-1.0.0 → canns-1.0.1}/src/canns/models/hybrid/__init__.py +0 -0
  89. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/__init__.py +0 -0
  90. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/__main__.py +0 -0
  91. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/__init__.py +0 -0
  92. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/__main__.py +0 -0
  93. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/app.py +0 -0
  94. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/runner.py +0 -0
  95. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/screens.py +0 -0
  96. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/state.py +0 -0
  97. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/styles.tcss +0 -0
  98. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa/widgets.py +0 -0
  99. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/__init__.py +0 -0
  100. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/__main__.py +0 -0
  101. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/__init__.py +0 -0
  102. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/base.py +0 -0
  103. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/batch_mode.py +0 -0
  104. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/cohomap_mode.py +0 -0
  105. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/cohospace_mode.py +0 -0
  106. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/decode_mode.py +0 -0
  107. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/fr_mode.py +0 -0
  108. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/frm_mode.py +0 -0
  109. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/gridscore_mode.py +0 -0
  110. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/pathcompare_mode.py +0 -0
  111. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/analysis_modes/tda_mode.py +0 -0
  112. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/app.py +0 -0
  113. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/controllers/__init__.py +0 -0
  114. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/controllers/analysis_controller.py +0 -0
  115. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/controllers/preprocess_controller.py +0 -0
  116. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/core/__init__.py +0 -0
  117. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/core/cache.py +0 -0
  118. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/core/runner.py +0 -0
  119. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/core/state.py +0 -0
  120. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/core/worker.py +0 -0
  121. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/main_window.py +0 -0
  122. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/models/__init__.py +0 -0
  123. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/models/config.py +0 -0
  124. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/models/job.py +0 -0
  125. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/models/presets.py +0 -0
  126. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/__init__.py +0 -0
  127. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/dark.qss +0 -0
  128. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/light.qss +0 -0
  129. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/logo.ico +0 -0
  130. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/logo.svg +0 -0
  131. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/resources/styles.qss +0 -0
  132. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/utils/__init__.py +0 -0
  133. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/utils/formatters.py +0 -0
  134. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/utils/io_adapters.py +0 -0
  135. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/utils/validators.py +0 -0
  136. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/__init__.py +0 -0
  137. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/help_content.py +0 -0
  138. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/pages/__init__.py +0 -0
  139. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/pages/analysis_page.py +0 -0
  140. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/pages/preprocess_page.py +0 -0
  141. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/panels/__init__.py +0 -0
  142. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/__init__.py +0 -0
  143. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/artifacts_tab.py +0 -0
  144. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/drop_zone.py +0 -0
  145. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/file_list.py +0 -0
  146. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/gridscore_tab.py +0 -0
  147. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/help_dialog.py +0 -0
  148. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/image_tab.py +0 -0
  149. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/image_viewer.py +0 -0
  150. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/log_box.py +0 -0
  151. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/pathcompare_tab.py +0 -0
  152. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/asa_gui/views/widgets/popup_combo.py +0 -0
  153. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/__init__.py +0 -0
  154. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/__main__.py +0 -0
  155. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/app.py +0 -0
  156. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/runner.py +0 -0
  157. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/state.py +0 -0
  158. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/gallery/styles.tcss +0 -0
  159. {canns-1.0.0 → canns-1.0.1}/src/canns/pipeline/launcher.py +0 -0
  160. {canns-1.0.0 → canns-1.0.1}/src/canns/py.typed +0 -0
  161. {canns-1.0.0 → canns-1.0.1}/src/canns/task/__init__.py +0 -0
  162. {canns-1.0.0 → canns-1.0.1}/src/canns/task/_base.py +0 -0
  163. {canns-1.0.0 → canns-1.0.1}/src/canns/task/closed_loop_navigation.py +0 -0
  164. {canns-1.0.0 → canns-1.0.1}/src/canns/task/navigation_base.py +0 -0
  165. {canns-1.0.0 → canns-1.0.1}/src/canns/task/open_loop_navigation.py +0 -0
  166. {canns-1.0.0 → canns-1.0.1}/src/canns/task/tracking.py +0 -0
  167. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/__init__.py +0 -0
  168. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/_base.py +0 -0
  169. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/bcm.py +0 -0
  170. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/hebbian.py +0 -0
  171. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/oja.py +0 -0
  172. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/sanger.py +0 -0
  173. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/stdp.py +0 -0
  174. {canns-1.0.0 → canns-1.0.1}/src/canns/trainer/utils.py +0 -0
  175. {canns-1.0.0 → canns-1.0.1}/src/canns/typing/__init__.py +0 -0
  176. {canns-1.0.0 → canns-1.0.1}/src/canns/utils/__init__.py +0 -0
  177. {canns-1.0.0 → canns-1.0.1}/src/canns/utils/benchmark.py +0 -0
@@ -186,6 +186,7 @@ cython_debug/
186
186
  *.npy
187
187
  *.png
188
188
  !docs/_static/*.png
189
+ !docs/_static/*.gif
189
190
  /.ref
190
191
 
191
192
  # Model checkpoints
@@ -5,12 +5,37 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.1] - 2026-02-06
9
+
10
+ ### Added
11
+ - CLI module (`src/canns/__main__.py`) for command-line interface support
12
+ - Comprehensive test coverage for CLI, lazy imports, data loaders, and utilities
13
+ - Integration tests for pipeline launcher
14
+ - Unit tests for task base classes and benchmarking utilities
15
+ - 1D CANN smooth-tracking example in documentation
16
+
17
+ ### Changed
18
+ - Restructured test suite into `unit/` and `integration/` directories (PR #96)
19
+ - Optimized CI pipeline for faster test execution (PR #96)
20
+ - Relocated documentation images from `images/` to `docs/_static/`
21
+ - Updated status badge to "stable" and maintenance year to 2026
22
+ - Enhanced installation instructions with accelerator options (cuda12, cuda13, tpu, gui)
23
+ - Expanded architecture diagram caption with five-layer hierarchy description
24
+ - Normalized pip install examples by removing unnecessary quotes
25
+ - Updated documentation URL to https://routhleck.com/canns
26
+ - Added Zenodo DOI badge for v1.0.0 release
27
+ - Updated citation information with expanded author list and affiliations
28
+
29
+ ### Fixed
30
+ - Improved test organization and maintainability
31
+ - Updated all documentation image references to new paths
32
+
8
33
  ## [1.0.0] - 2026-02-02
9
34
 
10
35
  ### Added
11
- - Architecture diagram (`images/architecture.png`) explaining modular design principles
12
- - Comprehensive analyzer visualization showcase (`images/analyzer-display.png`, 4.7MB)
13
- - ASA GUI preview animation (`images/asa-gui.gif`, 898KB)
36
+ - Architecture diagram (`docs/_static/architecture.png`) explaining modular design principles
37
+ - Comprehensive analyzer visualization showcase (`docs/_static/analyzer-display.png`, 4.7MB)
38
+ - ASA GUI preview animation (`docs/_static/asa-gui.gif`, 898KB)
14
39
 
15
40
  ### Changed
16
41
  - **Production Ready Milestone**: v1.0.0 marks API stability and production readiness
@@ -235,7 +260,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
235
260
  - Comprehensive plotting functions for ASA analysis types
236
261
  - New example scripts: cohomap.py, cohospace.py, firing_field_map.py, path_compare.py, tda_vis.py
237
262
  - Research paper draft (paper.md) with comprehensive bibliography (paper.bib)
238
- - Architecture diagram (images/architecture.png)
263
+ - Architecture diagram (docs/_static/architecture.png)
239
264
  - GitHub Actions workflow for draft PDF generation
240
265
  - CLI entry point for ASA TUI: `python -m canns.pipeline.asa`
241
266
  - Image preview and external viewer support in TUI
@@ -602,6 +627,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
602
627
  - Basic structure template
603
628
  - Core application structure
604
629
 
630
+ [1.0.1]: https://github.com/routhleck/canns/compare/v1.0.0...v1.0.1
605
631
  [1.0.0]: https://github.com/routhleck/canns/compare/v0.15.1...v1.0.0
606
632
  [0.15.1]: https://github.com/routhleck/canns/compare/v0.15.0...v0.15.1
607
633
  [0.15.0]: https://github.com/routhleck/canns/compare/v0.14.3...v0.15.0
@@ -642,4 +668,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
642
668
  [0.4.0]: https://github.com/routhleck/canns/compare/v0.3.0...v0.4.0
643
669
  [0.3.0]: https://github.com/routhleck/canns/compare/v0.2.0...v0.3.0
644
670
  [0.2.0]: https://github.com/routhleck/canns/compare/v0.1.0...v0.2.0
645
- [0.1.0]: https://github.com/routhleck/canns/releases/tag/v0.1.0
671
+ [0.1.0]: https://github.com/routhleck/canns/releases/tag/v0.1.0
@@ -0,0 +1,139 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it as below."
3
+ type: software
4
+ title: "CANNs: Continuous Attractor Neural Networks Toolkit"
5
+ authors:
6
+ - family-names: "He"
7
+ given-names: "Sichao"
8
+ email: "sichaohe@outlook.com"
9
+ affiliation:
10
+ - "School of Psychological and Cognitive Sciences, Peking University"
11
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
12
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
13
+ - "Center of Quantitative Biology, Peking University"
14
+ orcid: "https://orcid.org/0009-0009-4564-1753"
15
+ - family-names: "Tuerhong"
16
+ given-names: "Aiersi"
17
+ affiliation: "College of Mathematics and Statistics, Chongqing University"
18
+ orcid: "https://orcid.org/0009-0006-4603-4734"
19
+ - family-names: "She"
20
+ given-names: "Shangjun"
21
+ affiliation:
22
+ - "School of Psychological and Cognitive Sciences, Peking University"
23
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
24
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
25
+ - "Center of Quantitative Biology, Peking University"
26
+ orcid: "https://orcid.org/0009-0008-4490-7612"
27
+ - family-names: "Chu"
28
+ given-names: "Tianhao"
29
+ affiliation:
30
+ - "School of Psychological and Cognitive Sciences, Peking University"
31
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
32
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
33
+ - "Center of Quantitative Biology, Peking University"
34
+ orcid: "https://orcid.org/0000-0001-9910-9361"
35
+ - family-names: "Wu"
36
+ given-names: "Yuling"
37
+ affiliation:
38
+ - "School of Psychological and Cognitive Sciences, Peking University"
39
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
40
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
41
+ - "Center of Quantitative Biology, Peking University"
42
+ orcid: "https://orcid.org/0009-0001-5303-5413"
43
+ - family-names: "Zuo"
44
+ given-names: "Junfeng"
45
+ affiliation:
46
+ - "School of Psychological and Cognitive Sciences, Peking University"
47
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
48
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
49
+ - "Center of Quantitative Biology, Peking University"
50
+ - family-names: "Wu"
51
+ given-names: "Si"
52
+ affiliation:
53
+ - "School of Psychological and Cognitive Sciences, Peking University"
54
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
55
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
56
+ - "Center of Quantitative Biology, Peking University"
57
+ orcid: "https://orcid.org/0000-0001-9650-6935"
58
+ repository-code: "https://github.com/Routhleck/canns"
59
+ url: "https://routhleck.com/canns"
60
+ abstract: "A research toolkit built on BrainPy and JAX that bundles model collections, task generators, analyzers, and the ASA pipeline (GUI/TUI) so researchers can run simulations and analyze results in a consistent workflow."
61
+ keywords:
62
+ - continuous attractor neural networks
63
+ - CANNs
64
+ - computational neuroscience
65
+ - spatial cognition
66
+ - neural dynamics
67
+ - JAX
68
+ - brain-inspired computing
69
+ license: Apache-2.0
70
+ version: "v1.0.0"
71
+ date-released: "2026-02-02"
72
+ identifiers:
73
+ - type: doi
74
+ value: "10.5281/zenodo.18453893"
75
+ description: "The versioned DOI for version v1.0.0"
76
+ - type: doi
77
+ value: "10.5281/zenodo.17412545"
78
+ description: "The concept DOI (always resolves to latest version)"
79
+ preferred-citation:
80
+ type: software
81
+ title: "CANNs: Continuous Attractor Neural Networks Toolkit"
82
+ authors:
83
+ - family-names: "He"
84
+ given-names: "Sichao"
85
+ email: "sichaohe@outlook.com"
86
+ affiliation:
87
+ - "School of Psychological and Cognitive Sciences, Peking University"
88
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
89
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
90
+ - "Center of Quantitative Biology, Peking University"
91
+ orcid: "https://orcid.org/0009-0009-4564-1753"
92
+ - family-names: "Tuerhong"
93
+ given-names: "Aiersi"
94
+ affiliation: "College of Mathematics and Statistics, Chongqing University"
95
+ orcid: "https://orcid.org/0009-0006-4603-4734"
96
+ - family-names: "She"
97
+ given-names: "Shangjun"
98
+ affiliation:
99
+ - "School of Psychological and Cognitive Sciences, Peking University"
100
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
101
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
102
+ - "Center of Quantitative Biology, Peking University"
103
+ orcid: "https://orcid.org/0009-0008-4490-7612"
104
+ - family-names: "Chu"
105
+ given-names: "Tianhao"
106
+ affiliation:
107
+ - "School of Psychological and Cognitive Sciences, Peking University"
108
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
109
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
110
+ - "Center of Quantitative Biology, Peking University"
111
+ orcid: "https://orcid.org/0000-0001-9910-9361"
112
+ - family-names: "Wu"
113
+ given-names: "Yuling"
114
+ affiliation:
115
+ - "School of Psychological and Cognitive Sciences, Peking University"
116
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
117
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
118
+ - "Center of Quantitative Biology, Peking University"
119
+ orcid: "https://orcid.org/0009-0001-5303-5413"
120
+ - family-names: "Zuo"
121
+ given-names: "Junfeng"
122
+ affiliation:
123
+ - "School of Psychological and Cognitive Sciences, Peking University"
124
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
125
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
126
+ - "Center of Quantitative Biology, Peking University"
127
+ - family-names: "Wu"
128
+ given-names: "Si"
129
+ affiliation:
130
+ - "School of Psychological and Cognitive Sciences, Peking University"
131
+ - "Peking-Tsinghua Center for Life Sciences, Academy for Advanced Interdisciplinary Studies, Peking University"
132
+ - "PKU-IDG/McGovern Institute for Brain Research, Peking University"
133
+ - "Center of Quantitative Biology, Peking University"
134
+ orcid: "https://orcid.org/0000-0001-9650-6935"
135
+ doi: "10.5281/zenodo.18453893"
136
+ url: "https://github.com/Routhleck/canns"
137
+ version: "v1.0.0"
138
+ year: 2026
139
+ month: 2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: canns
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: A Python Library for Continuous Attractor Neural Networks
5
5
  Project-URL: Repository, https://github.com/routhleck/canns
6
6
  Author-email: Sichao He <sichaohe@outlook.com>
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
60
60
  [<img src="https://badges.ws/maintenance/yes/2026" />](https://github.com/routhleck/canns)
61
61
  <picture><img src="https://badges.ws/github/release/routhleck/canns" /></picture>
62
62
  <picture><img src="https://badges.ws/github/license/routhleck/canns" /></picture>
63
- [![DOI](https://zenodo.org/badge/1001781809.svg)](https://doi.org/10.5281/zenodo.17412545)
63
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18453893.svg)](https://doi.org/10.5281/zenodo.18453893)
64
64
 
65
65
 
66
66
  <picture><img src="https://badges.ws/github/stars/routhleck/canns?logo=github" /></picture>
@@ -77,9 +77,9 @@ CANNs (Continuous Attractor Neural Networks toolkit) is a research toolkit built
77
77
  ## Architecture
78
78
 
79
79
  <p align="center">
80
- <img src="images/architecture.png" alt="CANNs Architecture" width="900">
80
+ <img src="docs/_static/architecture.png" alt="CANNs Architecture" width="900">
81
81
  <br>
82
- <span style="color: grey; font-size: 14px;">Library architecture overview: models, tasks, analyzers, trainers, and pipeline built on BrainPy/JAX with optional Rust acceleration.</span>
82
+ <span style="color: grey; font-size: 14px;">Layer hierarchy of the CANNs library showing five levels: Application (Pipeline orchestration), Functional (Task, Trainer, Analyzer, Utils modules), Core Models (CANN implementations), Foundation (BrainPy/JAX and Rust FFI backends), and Hardware (CPU/GPU/TPU support)</span>
83
83
  </p>
84
84
 
85
85
  The CANNs library follows a modular architecture guided by two core principles: **separation of concerns** and **extensibility through
@@ -115,12 +115,12 @@ seamlessly integrate with the built-in ecosystem.
115
115
  </p>
116
116
 
117
117
  <p align="center">
118
- <img src="images/analyzer-display.png" alt="Analyzer Display" width="900">
118
+ <img src="docs/_static/analyzer-display.png" alt="Analyzer Display" width="900">
119
119
  <br>
120
120
  <span style="color: grey; font-size: 14px;">Rich Analyzer Visualization Results</span>
121
121
  </p>
122
122
  <p align="center">
123
- <img src="images/asa-gui.gif" alt="ASA GUI Preview" width="720">
123
+ <img src="docs/_static/asa-gui.gif" alt="ASA GUI Preview" width="720">
124
124
  <br>
125
125
  <span style="color: grey; font-size: 14px;">ASA GUI preview</span>
126
126
  </p>
@@ -229,12 +229,12 @@ energy_landscape_1d_animation(
229
229
  pip install canns
230
230
 
231
231
  # Optional accelerators (Linux)
232
- pip install "canns[cuda12]"
233
- pip install "canns[cuda13]"
234
- pip install "canns[tpu]"
232
+ pip install canns[cuda12]
233
+ pip install canns[cuda13]
234
+ pip install canns[tpu]
235
235
 
236
236
  # GUI (ASA Pipeline)
237
- pip install "canns[gui]"
237
+ pip install canns[gui]
238
238
  ```
239
239
 
240
240
  Optional (uv):
@@ -250,6 +250,32 @@ uv pip install canns
250
250
  - Sphinx docs and notebooks: `docs/`
251
251
  - ASA GUI entry: `canns-gui`
252
252
 
253
+ ## Citation
254
+
255
+ If you use CANNs in your research, please cite:
256
+
257
+ ```bibtex
258
+ @software{he_2026_canns,
259
+ author = {He, Sichao and
260
+ Tuerhong, Aiersi and
261
+ She, Shangjun and
262
+ Chu, Tianhao and
263
+ Wu, Yuling and
264
+ Zuo, Junfeng and
265
+ Wu, Si},
266
+ title = {CANNs: Continuous Attractor Neural Networks Toolkit},
267
+ month = feb,
268
+ year = 2026,
269
+ publisher = {Zenodo},
270
+ version = {v1.0.0},
271
+ doi = {10.5281/zenodo.18453893},
272
+ url = {https://doi.org/10.5281/zenodo.18453893}
273
+ }
274
+ ```
275
+
276
+ **Plain text:**
277
+ > He, S., Tuerhong, A., She, S., Chu, T., Wu, Y., Zuo, J., & Wu, S. (2026). CANNs: Continuous Attractor Neural Networks Toolkit (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.18453893
278
+
253
279
  ## Contributing & License
254
280
 
255
281
  Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a PR.
@@ -9,7 +9,7 @@
9
9
  [<img src="https://badges.ws/maintenance/yes/2026" />](https://github.com/routhleck/canns)
10
10
  <picture><img src="https://badges.ws/github/release/routhleck/canns" /></picture>
11
11
  <picture><img src="https://badges.ws/github/license/routhleck/canns" /></picture>
12
- [![DOI](https://zenodo.org/badge/1001781809.svg)](https://doi.org/10.5281/zenodo.17412545)
12
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18453893.svg)](https://doi.org/10.5281/zenodo.18453893)
13
13
 
14
14
 
15
15
  <picture><img src="https://badges.ws/github/stars/routhleck/canns?logo=github" /></picture>
@@ -26,9 +26,9 @@ CANNs (Continuous Attractor Neural Networks toolkit) is a research toolkit built
26
26
  ## Architecture
27
27
 
28
28
  <p align="center">
29
- <img src="images/architecture.png" alt="CANNs Architecture" width="900">
29
+ <img src="docs/_static/architecture.png" alt="CANNs Architecture" width="900">
30
30
  <br>
31
- <span style="color: grey; font-size: 14px;">Library architecture overview: models, tasks, analyzers, trainers, and pipeline built on BrainPy/JAX with optional Rust acceleration.</span>
31
+ <span style="color: grey; font-size: 14px;">Layer hierarchy of the CANNs library showing five levels: Application (Pipeline orchestration), Functional (Task, Trainer, Analyzer, Utils modules), Core Models (CANN implementations), Foundation (BrainPy/JAX and Rust FFI backends), and Hardware (CPU/GPU/TPU support)</span>
32
32
  </p>
33
33
 
34
34
  The CANNs library follows a modular architecture guided by two core principles: **separation of concerns** and **extensibility through
@@ -64,12 +64,12 @@ seamlessly integrate with the built-in ecosystem.
64
64
  </p>
65
65
 
66
66
  <p align="center">
67
- <img src="images/analyzer-display.png" alt="Analyzer Display" width="900">
67
+ <img src="docs/_static/analyzer-display.png" alt="Analyzer Display" width="900">
68
68
  <br>
69
69
  <span style="color: grey; font-size: 14px;">Rich Analyzer Visualization Results</span>
70
70
  </p>
71
71
  <p align="center">
72
- <img src="images/asa-gui.gif" alt="ASA GUI Preview" width="720">
72
+ <img src="docs/_static/asa-gui.gif" alt="ASA GUI Preview" width="720">
73
73
  <br>
74
74
  <span style="color: grey; font-size: 14px;">ASA GUI preview</span>
75
75
  </p>
@@ -178,12 +178,12 @@ energy_landscape_1d_animation(
178
178
  pip install canns
179
179
 
180
180
  # Optional accelerators (Linux)
181
- pip install "canns[cuda12]"
182
- pip install "canns[cuda13]"
183
- pip install "canns[tpu]"
181
+ pip install canns[cuda12]
182
+ pip install canns[cuda13]
183
+ pip install canns[tpu]
184
184
 
185
185
  # GUI (ASA Pipeline)
186
- pip install "canns[gui]"
186
+ pip install canns[gui]
187
187
  ```
188
188
 
189
189
  Optional (uv):
@@ -199,6 +199,32 @@ uv pip install canns
199
199
  - Sphinx docs and notebooks: `docs/`
200
200
  - ASA GUI entry: `canns-gui`
201
201
 
202
+ ## Citation
203
+
204
+ If you use CANNs in your research, please cite:
205
+
206
+ ```bibtex
207
+ @software{he_2026_canns,
208
+ author = {He, Sichao and
209
+ Tuerhong, Aiersi and
210
+ She, Shangjun and
211
+ Chu, Tianhao and
212
+ Wu, Yuling and
213
+ Zuo, Junfeng and
214
+ Wu, Si},
215
+ title = {CANNs: Continuous Attractor Neural Networks Toolkit},
216
+ month = feb,
217
+ year = 2026,
218
+ publisher = {Zenodo},
219
+ version = {v1.0.0},
220
+ doi = {10.5281/zenodo.18453893},
221
+ url = {https://doi.org/10.5281/zenodo.18453893}
222
+ }
223
+ ```
224
+
225
+ **Plain text:**
226
+ > He, S., Tuerhong, A., She, S., Chu, T., Wu, Y., Zuo, J., & Wu, S. (2026). CANNs: Continuous Attractor Neural Networks Toolkit (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.18453893
227
+
202
228
  ## Contributing & License
203
229
 
204
230
  Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a PR.
@@ -9,7 +9,7 @@
9
9
  [<img src="https://badges.ws/maintenance/yes/2026" />](https://github.com/routhleck/canns)
10
10
  <picture><img src="https://badges.ws/github/release/routhleck/canns" /></picture>
11
11
  <picture><img src="https://badges.ws/github/license/routhleck/canns" /></picture>
12
- [![DOI](https://zenodo.org/badge/1001781809.svg)](https://doi.org/10.5281/zenodo.17412545)
12
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18453893.svg)](https://doi.org/10.5281/zenodo.18453893)
13
13
 
14
14
 
15
15
  <picture><img src="https://badges.ws/github/stars/routhleck/canns?logo=github" /></picture>
@@ -26,9 +26,9 @@ CANNs(Continuous Attractor Neural Networks toolkit)是基于 [BrainPy](https
26
26
  ## 架构
27
27
 
28
28
  <p align="center">
29
- <img src="images/architecture.png" alt="CANNs Architecture" width="900">
29
+ <img src="docs/_static/architecture.png" alt="CANNs Architecture" width="900">
30
30
  <br>
31
- <span style="color: grey; font-size: 14px;">架构概览:模型、任务、分析器、训练器与流水线基于 BrainPy/JAX,部分环节可选 Rust 加速。</span>
31
+ <span style="color: grey; font-size: 14px;">CANNs 库的层级结构,展示了五个层级:应用层(流水线编排)、功能层(任务、训练器、分析器、工具模块)、核心模型层(CANN 实现)、基础层(BrainPy/JAX Rust FFI 后端)以及硬件层(CPU/GPU/TPU 支持)</span>
32
32
  </p>
33
33
 
34
34
  CANNs 采用模块化架构,遵循两条核心原则:**关注点分离** 与 **通过基类实现可扩展性**。
@@ -62,12 +62,12 @@ CANNs 采用模块化架构,遵循两条核心原则:**关注点分离** 与
62
62
  </p>
63
63
 
64
64
  <p align="center">
65
- <img src="images/analyzer-display.png" alt="Analyzer Display" width="900">
65
+ <img src="docs/_static/analyzer-display.png" alt="Analyzer Display" width="900">
66
66
  <br>
67
67
  <span style="color: grey; font-size: 14px;">丰富的 Analyzer 可视化结果</span>
68
68
  </p>
69
69
  <p align="center">
70
- <img src="images/asa-gui.gif" alt="ASA GUI Preview" width="720">
70
+ <img src="docs/_static/asa-gui.gif" alt="ASA GUI Preview" width="720">
71
71
  <br>
72
72
  <span style="color: grey; font-size: 14px;">ASA GUI 预览</span>
73
73
  </p>
@@ -176,12 +176,12 @@ energy_landscape_1d_animation(
176
176
  pip install canns
177
177
 
178
178
  # 可选加速(Linux)
179
- pip install "canns[cuda12]"
180
- pip install "canns[cuda13]"
181
- pip install "canns[tpu]"
179
+ pip install canns[cuda12]
180
+ pip install canns[cuda13]
181
+ pip install canns[tpu]
182
182
 
183
183
  # GUI(ASA Pipeline)
184
- pip install "canns[gui]"
184
+ pip install canns[gui]
185
185
  ```
186
186
 
187
187
  可选(uv):
@@ -198,6 +198,32 @@ uv pip install canns
198
198
  - Sphinx 文档与 Notebook:`docs/`
199
199
  - ASA GUI 入口:`canns-gui`
200
200
 
201
+ ## 引用
202
+
203
+ 如果您在研究中使用了 CANNs,请引用:
204
+
205
+ ```bibtex
206
+ @software{he_2026_canns,
207
+ author = {He, Sichao and
208
+ Tuerhong, Aiersi and
209
+ She, Shangjun and
210
+ Chu, Tianhao and
211
+ Wu, Yuling and
212
+ Zuo, Junfeng and
213
+ Wu, Si},
214
+ title = {CANNs: Continuous Attractor Neural Networks Toolkit},
215
+ month = feb,
216
+ year = 2026,
217
+ publisher = {Zenodo},
218
+ version = {v1.0.0},
219
+ doi = {10.5281/zenodo.18453893},
220
+ url = {https://doi.org/10.5281/zenodo.18453893}
221
+ }
222
+ ```
223
+
224
+ **纯文本格式:**
225
+ > He, S., Tuerhong, A., She, S., Chu, T., Wu, Y., Zuo, J., & Wu, S. (2026). CANNs: Continuous Attractor Neural Networks Toolkit (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.18453893
226
+
201
227
  ## 贡献&许可证
202
228
 
203
229
  欢迎提交 Issue / PR。请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。
@@ -64,6 +64,7 @@ dependencies = [
64
64
  dev = [
65
65
  "pytest>=8.3.5",
66
66
  "pytest-sugar>=1.0.0",
67
+ "pytest-cov>=6.0.0",
67
68
  "ruff>=0.11.9",
68
69
  "codespell>=2.4.1",
69
70
  "rich>=14.0.0",
@@ -116,7 +117,7 @@ gui = [
116
117
 
117
118
  [project.scripts]
118
119
  # Add script entry points here:
119
- canns = "canns:master"
120
+ canns = "canns.__main__:main"
120
121
  canns-tui = "canns.pipeline.launcher:main"
121
122
  canns-gallery = "canns.pipeline.gallery:main"
122
123
  canns-gui = "canns.pipeline.asa_gui:main"
@@ -245,13 +246,31 @@ reportOperatorIssue = false
245
246
  # skip = "foo.py,bar.py"
246
247
 
247
248
  [tool.pytest.ini_options]
248
- python_files = ["*.py"]
249
+ python_files = ["test_*.py"]
249
250
  python_classes = ["Test*"]
250
251
  python_functions = ["test_*"]
251
252
  testpaths = [
252
- "src",
253
253
  "tests",
254
254
  ]
255
255
  norecursedirs = []
256
256
  filterwarnings = []
257
- addopts = "--assert=plain"
257
+ addopts = "--assert=plain -ra"
258
+ markers = [
259
+ "integration: tests that exercise multi-module flows or external dependencies",
260
+ "visualization: tests that generate plots or graphics",
261
+ "slow: tests that are notably slower than unit tests",
262
+ ]
263
+
264
+ [tool.coverage.run]
265
+ branch = true
266
+ source = ["canns"]
267
+
268
+ [tool.coverage.report]
269
+ skip_covered = true
270
+ show_missing = true
271
+ exclude_lines = [
272
+ "pragma: no cover",
273
+ "if TYPE_CHECKING:",
274
+ "if __name__ == .__main__.:",
275
+ "raise NotImplementedError",
276
+ ]
@@ -11,12 +11,10 @@ Examples:
11
11
  >>> print(list(canns.data.DATASETS))
12
12
  """
13
13
 
14
- from . import analyzer as analyzer
15
- from . import data as data
16
- from . import models as models
17
- from . import pipeline as pipeline
18
- from . import trainer as trainer
19
- from . import utils as utils
14
+ from __future__ import annotations
15
+
16
+ import importlib
17
+ from typing import TYPE_CHECKING
20
18
 
21
19
  # Version information
22
20
  try:
@@ -49,6 +47,27 @@ Examples:
49
47
  >>> print(canns.version_info)
50
48
  """
51
49
 
50
+ _LAZY_SUBMODULES = {
51
+ "analyzer",
52
+ "data",
53
+ "models",
54
+ "pipeline",
55
+ "trainer",
56
+ "utils",
57
+ }
58
+
59
+ if TYPE_CHECKING: # pragma: no cover
60
+ from . import analyzer, data, models, pipeline, trainer, utils
61
+
62
+
63
+ def __getattr__(name: str):
64
+ if name in _LAZY_SUBMODULES:
65
+ module = importlib.import_module(f"{__name__}.{name}")
66
+ globals()[name] = module
67
+ return module
68
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
69
+
70
+
52
71
  __all__ = [
53
72
  "analyzer",
54
73
  "data",
@@ -0,0 +1,69 @@
1
+ """Command-line entry point for the CANNs toolkit.
2
+
3
+ `pip/uv install canns` installs several console scripts:
4
+ - `canns`: convenience wrapper (this module)
5
+ - `canns-tui`: Textual launcher (ASA / Gallery)
6
+ - `canns-gallery`: Gallery TUI
7
+ - `canns-gui`: ASA GUI (requires `canns[gui]`)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import sys
14
+ from collections.abc import Sequence
15
+
16
+
17
+ def main(argv: Sequence[str] | None = None) -> int:
18
+ parser = argparse.ArgumentParser(prog="canns", description="CANNs toolkit entry point.")
19
+ parser.add_argument(
20
+ "--version",
21
+ action="store_true",
22
+ help="Print installed CANNs version and exit.",
23
+ )
24
+ group = parser.add_mutually_exclusive_group()
25
+ group.add_argument("--asa", action="store_true", help="Run the ASA TUI directly.")
26
+ group.add_argument("--gallery", action="store_true", help="Run the model gallery TUI directly.")
27
+ group.add_argument("--gui", action="store_true", help="Run the ASA GUI (requires canns[gui]).")
28
+
29
+ args = parser.parse_args(list(argv) if argv is not None else None)
30
+
31
+ if args.version:
32
+ try:
33
+ from importlib.metadata import version
34
+
35
+ print(version("canns"))
36
+ except Exception:
37
+ try:
38
+ from canns._version import __version__
39
+
40
+ print(__version__)
41
+ except Exception:
42
+ print("unknown")
43
+ return 0
44
+
45
+ if args.gui:
46
+ from canns.pipeline.asa_gui import main as gui_main
47
+
48
+ return int(gui_main())
49
+
50
+ if args.gallery:
51
+ from canns.pipeline.gallery import main as gallery_main
52
+
53
+ gallery_main()
54
+ return 0
55
+
56
+ if args.asa:
57
+ from canns.pipeline.asa import main as asa_main
58
+
59
+ asa_main()
60
+ return 0
61
+
62
+ from canns.pipeline.launcher import main as launcher_main
63
+
64
+ launcher_main()
65
+ return 0
66
+
67
+
68
+ if __name__ == "__main__":
69
+ raise SystemExit(main(sys.argv[1:]))
@@ -10,7 +10,6 @@ from ...visualization.core import PlotConfig, finalize_figure
10
10
  from .path import _align_activity_to_coords, skew_transform
11
11
  from .utils import _ensure_parent_dir, _ensure_plot_config
12
12
 
13
-
14
13
  # =====================================================================
15
14
  # CohoSpace visualization and selectivity metrics (CohoScore)
16
15
  # =====================================================================
@@ -2,8 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any
6
-
7
5
  import numpy as np
8
6
  from matplotlib import pyplot as plt
9
7
  from scipy.ndimage import gaussian_filter1d