spacecore 0.3.0__tar.gz → 0.3.2__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 (225) hide show
  1. spacecore-0.3.2/CHANGELOG.md +315 -0
  2. spacecore-0.3.2/CONTRIBUTING.md +55 -0
  3. spacecore-0.3.2/MANIFEST.in +12 -0
  4. spacecore-0.3.2/PKG-INFO +206 -0
  5. spacecore-0.3.2/README.md +165 -0
  6. spacecore-0.3.2/docs/dev/0.3.1-docs-inventory.md +102 -0
  7. spacecore-0.3.2/docs/dev/0.3.1-docstring-audit.md +48 -0
  8. spacecore-0.3.2/docs/dev/adr/001_backend_layer.md +38 -0
  9. spacecore-0.3.2/docs/dev/adr/002_context_and_conversion.md +40 -0
  10. spacecore-0.3.2/docs/dev/adr/003_space_hierarchy.md +38 -0
  11. spacecore-0.3.2/docs/dev/adr/004_inner_product_and_geometry.md +38 -0
  12. spacecore-0.3.2/docs/dev/adr/005_space_subclasses_and_capabilities.md +38 -0
  13. spacecore-0.3.2/docs/dev/adr/006_current_batching_model.md +38 -0
  14. spacecore-0.3.2/docs/dev/adr/007_linop_contract.md +39 -0
  15. spacecore-0.3.2/docs/dev/adr/008_linop_subclasses.md +38 -0
  16. spacecore-0.3.2/docs/dev/adr/009_metric_adjoint.md +44 -0
  17. spacecore-0.3.2/docs/dev/adr/010_functional_contract.md +36 -0
  18. spacecore-0.3.2/docs/dev/adr/011_linalg_contract.md +38 -0
  19. spacecore-0.3.2/docs/dev/adr/012_jordan_spectrum.md +36 -0
  20. spacecore-0.3.2/docs/dev/adr/013_tree_structured_spaces.md +36 -0
  21. spacecore-0.3.2/docs/dev/adr/014_check_policy.md +43 -0
  22. spacecore-0.3.2/docs/dev/adr/015_dtype_default_vs_scalar_field.md +40 -0
  23. spacecore-0.3.2/docs/dev/adr/README.md +71 -0
  24. spacecore-0.3.2/docs/dev/contributing/architecture.md +94 -0
  25. spacecore-0.3.2/docs/dev/contributing/labels.md +53 -0
  26. spacecore-0.3.2/docs/dev/contributing/prerequisites.md +29 -0
  27. spacecore-0.3.2/docs/dev/contributing/process.md +78 -0
  28. spacecore-0.3.2/docs/dev/contributing/setup.md +49 -0
  29. spacecore-0.3.2/docs/dev/current.md +32 -0
  30. spacecore-0.3.2/docs/dev/docstring_style.md +134 -0
  31. spacecore-0.3.2/docs/dev/vision.md +68 -0
  32. spacecore-0.3.2/docs/source/_static/custom.css +22 -0
  33. spacecore-0.3.2/docs/source/api/backend.rst +58 -0
  34. spacecore-0.3.2/docs/source/api/context.rst +42 -0
  35. spacecore-0.3.2/docs/source/api/functionals.rst +80 -0
  36. spacecore-0.3.2/docs/source/api/index.rst +15 -0
  37. spacecore-0.3.2/docs/source/api/linalg.rst +78 -0
  38. spacecore-0.3.2/docs/source/api/linops.rst +133 -0
  39. spacecore-0.3.2/docs/source/api/spaces.rst +198 -0
  40. spacecore-0.3.2/docs/source/conf.py +89 -0
  41. spacecore-0.3.2/docs/source/design/backend_ops_array_api.rst +57 -0
  42. spacecore-0.3.2/docs/source/design/batching.rst +45 -0
  43. spacecore-0.3.2/docs/source/design/capability_dispatch.rst +80 -0
  44. spacecore-0.3.2/docs/source/design/checking_policy.rst +69 -0
  45. spacecore-0.3.2/docs/source/design/context_ownership.rst +58 -0
  46. spacecore-0.3.2/docs/source/design/conversion_policy.rst +57 -0
  47. spacecore-0.3.2/docs/source/design/dtype_policy.rst +62 -0
  48. spacecore-0.3.2/docs/source/design/geometry.rst +105 -0
  49. spacecore-0.3.2/docs/source/design/index.rst +19 -0
  50. spacecore-0.3.2/docs/source/design/jax_integration.rst +44 -0
  51. spacecore-0.3.2/docs/source/design/performance.rst +19 -0
  52. spacecore-0.3.2/docs/source/dev/adr.rst +9 -0
  53. spacecore-0.3.2/docs/source/dev/contributing.rst +36 -0
  54. spacecore-0.3.2/docs/source/dev/index.rst +12 -0
  55. spacecore-0.3.2/docs/source/dev/vision.rst +9 -0
  56. spacecore-0.3.2/docs/source/index.rst +87 -0
  57. spacecore-0.3.2/docs/source/release_notes.rst +462 -0
  58. spacecore-0.3.2/docs/source/tutorials/backend_ops.rst +104 -0
  59. spacecore-0.3.2/docs/source/tutorials/context.rst +103 -0
  60. spacecore-0.3.2/docs/source/tutorials/conversion_policy.rst +102 -0
  61. spacecore-0.3.2/docs/source/tutorials/index.rst +88 -0
  62. spacecore-0.3.2/docs/source/tutorials/linops.rst +139 -0
  63. spacecore-0.3.2/docs/source/tutorials/regularized_ot.rst +662 -0
  64. spacecore-0.3.2/docs/source/tutorials/spaces.rst +124 -0
  65. spacecore-0.3.2/docs/source/tutorials/weighted_tikhonov.rst +194 -0
  66. spacecore-0.3.2/examples/__init__.py +0 -0
  67. spacecore-0.3.2/examples/weighted_tikhonov.py +267 -0
  68. {spacecore-0.3.0 → spacecore-0.3.2}/pyproject.toml +2 -1
  69. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/__init__.py +9 -10
  70. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_contextual/_policies.py +1 -0
  71. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_contextual/_state.py +33 -32
  72. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_version.py +1 -1
  73. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/__init__.py +1 -0
  74. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/_ops.py +57 -53
  75. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/cupy/_ops.py +3 -1
  76. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/jax/_ops.py +46 -32
  77. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/numpy/_ops.py +41 -32
  78. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/torch/_ops.py +13 -4
  79. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/functional/_linear.py +3 -8
  80. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/functional/_quadratic.py +7 -1
  81. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_cg.py +6 -2
  82. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_lanczos.py +8 -5
  83. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_lsqr.py +2 -0
  84. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_power.py +3 -0
  85. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_algebra.py +96 -131
  86. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_base.py +7 -6
  87. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_dense.py +27 -14
  88. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_diagonal.py +16 -4
  89. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_metric.py +4 -1
  90. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/_sparse.py +37 -16
  91. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/product/_base.py +5 -7
  92. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/product/_from_single.py +9 -2
  93. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/product/_to_single.py +9 -2
  94. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/_structure.py +1 -2
  95. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/__init__.py +2 -0
  96. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_inner_product.py +3 -1
  97. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_jordan.py +0 -1
  98. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/checks/__init__.py +2 -0
  99. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/checks/_base.py +4 -11
  100. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/__init__.py +2 -0
  101. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/_dense_vector.py +4 -2
  102. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/_hermitian.py +15 -14
  103. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/_product.py +33 -19
  104. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/_stacked.py +26 -18
  105. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/types/_misc.py +1 -1
  106. spacecore-0.3.2/spacecore.egg-info/PKG-INFO +206 -0
  107. spacecore-0.3.2/spacecore.egg-info/SOURCES.txt +219 -0
  108. spacecore-0.3.2/tests/__init__.py +0 -0
  109. spacecore-0.3.2/tests/_helpers.py +103 -0
  110. spacecore-0.3.2/tests/backend/__init__.py +0 -0
  111. spacecore-0.3.2/tests/backend/test_backend_consistency.py +142 -0
  112. spacecore-0.3.2/tests/backend/test_backend_loops.py +119 -0
  113. spacecore-0.3.2/tests/backend/test_backend_ops_delegation.py +257 -0
  114. spacecore-0.3.2/tests/backend/test_backend_registry.py +102 -0
  115. spacecore-0.3.2/tests/backend/test_cupy_ops.py +66 -0
  116. spacecore-0.3.2/tests/backend/test_jax_ops.py +43 -0
  117. spacecore-0.3.2/tests/backend/test_numpy_ops.py +39 -0
  118. spacecore-0.3.2/tests/backend/test_torch_consistency.py +51 -0
  119. spacecore-0.3.2/tests/backend/test_torch_ops.py +108 -0
  120. spacecore-0.3.2/tests/conftest.py +7 -0
  121. spacecore-0.3.2/tests/context/__init__.py +0 -0
  122. spacecore-0.3.2/tests/context/test_checked_method.py +133 -0
  123. spacecore-0.3.2/tests/context/test_context.py +34 -0
  124. spacecore-0.3.2/tests/context/test_context_manager.py +46 -0
  125. spacecore-0.3.2/tests/context/test_context_resolution.py +115 -0
  126. spacecore-0.3.2/tests/context/test_enable_checks.py +126 -0
  127. spacecore-0.3.2/tests/context/test_errors.py +46 -0
  128. spacecore-0.3.2/tests/examples/__init__.py +0 -0
  129. spacecore-0.3.2/tests/examples/test_weighted_tikhonov.py +109 -0
  130. spacecore-0.3.2/tests/functional/test_functional.py +243 -0
  131. spacecore-0.3.2/tests/functional/test_metric_gradient.py +262 -0
  132. spacecore-0.3.2/tests/integration/__init__.py +0 -0
  133. spacecore-0.3.2/tests/integration/test_github_labels.py +24 -0
  134. spacecore-0.3.2/tests/integration/test_imports.py +34 -0
  135. spacecore-0.3.2/tests/integration/test_public_api.py +122 -0
  136. spacecore-0.3.2/tests/integration/test_smoke_jax.py +29 -0
  137. spacecore-0.3.2/tests/integration/test_smoke_numpy.py +22 -0
  138. spacecore-0.3.2/tests/integration/test_smoke_torch.py +34 -0
  139. spacecore-0.3.2/tests/linalg/__init__.py +1 -0
  140. spacecore-0.3.2/tests/linalg/test_expm.py +255 -0
  141. spacecore-0.3.2/tests/linalg/test_krylov.py +939 -0
  142. spacecore-0.3.2/tests/linalg/test_metric_solvers.py +68 -0
  143. spacecore-0.3.2/tests/linops/__init__.py +0 -0
  144. spacecore-0.3.2/tests/linops/test_adjoint_identity.py +844 -0
  145. spacecore-0.3.2/tests/linops/test_algebra.py +533 -0
  146. spacecore-0.3.2/tests/linops/test_algebra_linop.py +242 -0
  147. spacecore-0.3.2/tests/linops/test_batched_apply.py +79 -0
  148. spacecore-0.3.2/tests/linops/test_batched_lifting.py +181 -0
  149. spacecore-0.3.2/tests/linops/test_block_diagonal_linop.py +27 -0
  150. spacecore-0.3.2/tests/linops/test_conversion_linops.py +62 -0
  151. spacecore-0.3.2/tests/linops/test_dense_linop.py +322 -0
  152. spacecore-0.3.2/tests/linops/test_diagonal_linop.py +162 -0
  153. spacecore-0.3.2/tests/linops/test_linop_jit.py +166 -0
  154. spacecore-0.3.2/tests/linops/test_product_linop_batching.py +201 -0
  155. spacecore-0.3.2/tests/linops/test_product_structure.py +231 -0
  156. spacecore-0.3.2/tests/linops/test_sparse_linop.py +345 -0
  157. spacecore-0.3.2/tests/linops/test_stacked_linop.py +18 -0
  158. spacecore-0.3.2/tests/linops/test_sum_to_single_linop.py +18 -0
  159. spacecore-0.3.2/tests/linops/test_to_dense.py +277 -0
  160. spacecore-0.3.2/tests/spaces/__init__.py +0 -0
  161. spacecore-0.3.2/tests/spaces/test_conversion_spaces.py +45 -0
  162. spacecore-0.3.2/tests/spaces/test_geometry.py +243 -0
  163. spacecore-0.3.2/tests/spaces/test_hermitian_space.py +54 -0
  164. spacecore-0.3.2/tests/spaces/test_product_space.py +68 -0
  165. spacecore-0.3.2/tests/spaces/test_product_structure.py +268 -0
  166. spacecore-0.3.2/tests/spaces/test_space_apply.py +159 -0
  167. spacecore-0.3.2/tests/spaces/test_space_checks.py +164 -0
  168. spacecore-0.3.2/tests/spaces/test_space_hierarchy.py +654 -0
  169. spacecore-0.3.2/tests/spaces/test_spectrum.py +237 -0
  170. spacecore-0.3.2/tests/spaces/test_stacked_space.py +156 -0
  171. spacecore-0.3.2/tests/spaces/test_vector_space.py +55 -0
  172. spacecore-0.3.2/tests/spaces/test_vectorized_checks.py +145 -0
  173. spacecore-0.3.2/tutorials/1_BackendOps.ipynb +628 -0
  174. spacecore-0.3.2/tutorials/2_Context.ipynb +602 -0
  175. spacecore-0.3.2/tutorials/3_Space.ipynb +821 -0
  176. spacecore-0.3.2/tutorials/4_LinOp.ipynb +951 -0
  177. spacecore-0.3.2/tutorials/5_Conversion_Policy.ipynb +208 -0
  178. spacecore-0.3.2/tutorials/6_Regularized_Opt_Transport.ipynb +789 -0
  179. spacecore-0.3.2/tutorials/7_Quadratic_Program.ipynb +320 -0
  180. spacecore-0.3.2/tutorials/8_Linalg_MatrixFree.ipynb +560 -0
  181. spacecore-0.3.2/tutorials/9_Linalg_Comparison.ipynb +558 -0
  182. spacecore-0.3.2/tutorials/README.md +33 -0
  183. spacecore-0.3.2/tutorials/weighted_tikhonov.ipynb +539 -0
  184. spacecore-0.3.0/PKG-INFO +0 -247
  185. spacecore-0.3.0/README.md +0 -206
  186. spacecore-0.3.0/spacecore.egg-info/PKG-INFO +0 -247
  187. spacecore-0.3.0/spacecore.egg-info/SOURCES.txt +0 -78
  188. {spacecore-0.3.0 → spacecore-0.3.2}/LICENSE +0 -0
  189. {spacecore-0.3.0 → spacecore-0.3.2}/setup.cfg +0 -0
  190. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_batching.py +0 -0
  191. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_checks.py +0 -0
  192. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_contextual/__init__.py +0 -0
  193. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_contextual/_bound.py +0 -0
  194. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/_tree.py +0 -0
  195. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/_context.py +0 -0
  196. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/_family.py +0 -0
  197. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/cupy/__init__.py +0 -0
  198. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/jax/__init__.py +0 -0
  199. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/jax/_pytree.py +0 -0
  200. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/numpy/__init__.py +0 -0
  201. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/backend/torch/__init__.py +0 -0
  202. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/functional/__init__.py +0 -0
  203. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/functional/_base.py +0 -0
  204. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/functional/_composed.py +0 -0
  205. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/__init__.py +0 -0
  206. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_expm.py +0 -0
  207. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linalg/_utils.py +0 -0
  208. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/__init__.py +0 -0
  209. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/product/__init__.py +0 -0
  210. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/linop/product/_block.py +0 -0
  211. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/__init__.py +0 -0
  212. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_coordinate.py +0 -0
  213. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_space.py +0 -0
  214. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_star.py +0 -0
  215. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/base/_vector.py +0 -0
  216. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/checks/_coordinate.py +0 -0
  217. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/checks/_product.py +0 -0
  218. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/space/concrete/_dense_coordinate.py +0 -0
  219. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/types/__init__.py +0 -0
  220. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/types/_array.py +0 -0
  221. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore/types/_dtype.py +0 -0
  222. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore.egg-info/dependency_links.txt +0 -0
  223. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore.egg-info/requires.txt +0 -0
  224. {spacecore-0.3.0 → spacecore-0.3.2}/spacecore.egg-info/top_level.txt +0 -0
  225. {spacecore-0.3.0 → spacecore-0.3.2}/tests/test_backend_ops_complex.py +0 -0
@@ -0,0 +1,315 @@
1
+ # Changelog
2
+
3
+ All notable changes to SpaceCore are documented in this file.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and the project adheres to [Semantic Versioning](https://semver.org/).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Fixed
11
+
12
+ - Corrected the matrix-free adjoint contract so `MatrixFreeLinOp` and its
13
+ adjoint view use user-supplied forward and reverse callables directly, without
14
+ applying matrix-backed Riesz-map adjoint corrections.
15
+
16
+ ## [0.3.1] — 2026-06-10
17
+
18
+ SpaceCore 0.3.1 is a release-candidate stabilization release for the `0.3.x`
19
+ API. It focuses on documentation consistency, tutorial execution, release
20
+ artifact checks, and public API audit cleanup. It does not add new solver
21
+ families or SDPLab-specific downstream integration.
22
+
23
+ ### Documentation
24
+
25
+ - Reworked API reference landing pages for backend, context, spaces, linear
26
+ operators, functionals, and linalg.
27
+ - Added design notes for context ownership, batching, and capability dispatch.
28
+ - Clarified conversion and dtype policy documentation for explicit target
29
+ contexts.
30
+ - Clarified adjoint documentation to distinguish coordinate transpose,
31
+ Euclidean adjoint, and metric/Riesz-represented adjoint behavior.
32
+
33
+ ### Examples and Tutorials
34
+
35
+ - Added a SpaceCore-only weighted Tikhonov worked example demonstrating
36
+ weighted spaces, metric adjoints, lazy operator algebra, CG, and an
37
+ independent dense NumPy reference solve.
38
+ - Integrated the weighted Tikhonov example into tests and documentation.
39
+
40
+ ### Testing and CI
41
+
42
+ - Documentation CI now builds Sphinx with warnings as errors.
43
+ - Release-candidate checks include full tests, strict docs build, public API
44
+ audit, artifact build, `twine check`, clean wheel installation, and smoke
45
+ testing.
46
+
47
+ ### Known limitations
48
+
49
+ - Optional backend behavior depends on installed optional dependencies. CuPy is
50
+ not required for the core release-candidate gate.
51
+ - The advanced regularized OT tutorial is an illustrative SpaceCore/JAX/Optax
52
+ example, not a claim that SpaceCore ships a production OT solver.
53
+
54
+ ## [0.3.0]
55
+
56
+ SpaceCore 0.3.0 is a breaking release for the unstable `0.x` series. Space
57
+ capabilities are now derived from actual structure, dtype, and inner product,
58
+ and conversions rebuild spaces through public factories so stale capabilities
59
+ are not retained.
60
+
61
+ ### Migration
62
+
63
+ | 0.2.x | 0.3.0 |
64
+ | --- | --- |
65
+ | `space.eigh(x)` | `space.spectral_decompose(x)` for eigenvalues and frame |
66
+ | `space.eigh(x)` | `space.spectrum(x)` for eigenvalues only |
67
+ | `sc.VectorSpace((n,))` | `sc.DenseVectorSpace((n,))` |
68
+ | `sc.VectorSpace((d, d))` | `sc.DenseCoordinateSpace((d, d))` |
69
+ | `ProductInnerProductSpace(...)` | `ProductSpace(...)` |
70
+ | `ProductStarSpace(...)` | `ProductSpace(...)` |
71
+ | `ProductJordanAlgebraSpace(...)` | `ProductSpace(...)` |
72
+ | `ProductEuclideanJordanAlgebraSpace(...)` | `ProductSpace(...)` |
73
+ | `StackedInnerProductSpace(...)` | `StackedSpace(...)` |
74
+ | `StackedStarSpace(...)` | `StackedSpace(...)` |
75
+ | `StackedJordanAlgebraSpace(...)` | `StackedSpace(...)` |
76
+ | `StackedEuclideanJordanAlgebraSpace(...)` | `StackedSpace(...)` |
77
+ | `BatchSpace` and `space.batch(...)` | leading-axis batched arrays with `vapply(...)` / `rvapply(...)` |
78
+ | `op.vapply(xs, batch_space=...)` | `op.vapply(xs)` |
79
+ | global context conversion policies | explicit `Context` construction and `obj.convert(ctx)` |
80
+ | global dtype preservation policies | target-context dtype during explicit conversion |
81
+
82
+ Prominent `eigh` replacement:
83
+
84
+ ```python
85
+ space.eigh(x)
86
+ # -> space.spectral_decompose(x) # eigenvalues and frame
87
+ # -> space.spectrum(x) # eigenvalues only
88
+ ```
89
+
90
+ ### Added
91
+
92
+ - `spectrum`, `spectral_decompose`, and `from_spectrum` as the public spectral
93
+ contract for Jordan spaces.
94
+ - `ElementwiseJordanSpace` for real or complex elementwise Jordan algebras.
95
+ - `EuclideanElementwiseJordanSpace` for real Euclidean elementwise Jordan
96
+ algebras.
97
+ - Jordan capability hierarchy separating `JordanAlgebraSpace` from
98
+ `EuclideanJordanAlgebraSpace`.
99
+ - `ProductStructure`, `TupleStructure`, `PytreeStructure`, and
100
+ `ProductSpace.from_template` for structured product elements.
101
+ - `ProductSpectralDecomposition` for product spectral data independent of
102
+ product element structure.
103
+ - `StackedSpace` for leading-axis repeated leaf spaces.
104
+ - Vectorizable axis-aware validation checks.
105
+ - `InnerProduct.validate_for(space)` and construction-time validation for
106
+ `WeightedInnerProduct`.
107
+ - `scripts/api_audit.py` for repository and downstream migration audits.
108
+
109
+ ### Changed
110
+
111
+ - `VectorSpace` is an abstract linear-capability base.
112
+ - Previous concrete `VectorSpace` use cases moved to `DenseVectorSpace` for
113
+ one-dimensional dense vectors and `DenseCoordinateSpace` for generic dense
114
+ coordinate arrays.
115
+ - `DenseVectorSpace` is now a plain one-dimensional vector space with star and
116
+ no Jordan capability by default.
117
+ - Elementwise Euclidean-Jordan capability is selected only for real dtype with
118
+ `EuclideanInnerProduct`.
119
+ - `ProductSpace(...)` and `StackedSpace(...)` are the only public product and
120
+ stacked constructors; they auto-dispatch to private implementation classes.
121
+ - `convert()` for elementwise, product, and stacked spaces recomputes
122
+ capabilities through public factories.
123
+ - `ProductSpace.spectral_decompose` returns explicit product spectral data
124
+ rather than routing decompositions through element structure adapters.
125
+
126
+ ### Removed
127
+
128
+ - Removed `eigh` from spaces. Use `spectral_decompose` when both eigenvalues
129
+ and a reconstruction frame are needed, or `spectrum` for eigenvalues only.
130
+ - Removed public specialized product and stacked constructors from the public
131
+ API.
132
+ - Removed `BatchSpace`, `Space.batch`, and `batch_space=` arguments from public
133
+ batching APIs. Use leading-axis vectorization through `vapply` and `rvapply`.
134
+ - Removed global context-policy and dtype-policy APIs. Conversion now follows
135
+ the requested target `Context` directly.
136
+
137
+ ## [0.2.0]
138
+
139
+ SpaceCore 0.2.0 is a major API expansion. The backend layer now sits on the
140
+ Array API standard. Operators gained a lazy algebra with adjoint views,
141
+ composition, sums, and scaling. A new `Functional` hierarchy provides
142
+ scalar-valued maps with gradients and pull-backs. A new `spacecore.linalg`
143
+ module ships four JIT-compatible iterative solvers. Spaces, operators, and
144
+ functionals share a single validation pattern via `checked_method`, and the
145
+ public API is documented to numpydoc standard with doctest coverage.
146
+
147
+ This release introduces breaking changes; see [Migration](#migration-from-01x).
148
+
149
+ ### Added
150
+
151
+ #### Backend
152
+
153
+ - Migrated `BackendOps` to the Array API standard via `array-api-compat`.
154
+ - `CuPyOps` and the `cupy` backend family as an optional install
155
+ (`pip install 'spacecore[cupy]'`).
156
+ - `BackendOps.is_complex_dtype` for backend-aware complex detection.
157
+ - `BackendOps.real_dtype` for extracting the real dtype matching a complex one.
158
+ - Broadened backend coverage for array creation, dtype conversion, sparse
159
+ conversion, indexing, reductions, linear algebra, loop primitives
160
+ (`fori_loop`, `while_loop`, `cond`), tree helpers, and vectorized mapping.
161
+ - JAX pytree registration for operator, space, and functional types so they
162
+ pass through `jax.jit`, `jax.vmap`, and `jax.grad` boundaries.
163
+
164
+ #### Context and checking
165
+
166
+ - Public free-function API in `spacecore._contextual`: `set_context`,
167
+ `get_context`, `resolve_context_priority`, `register_ops`, and the
168
+ resolution-policy accessors.
169
+ - Extended `checked_method` to support validation against `self` and multiple
170
+ input argument positions.
171
+ - Reusable space-validation checks: backend, dtype, shape, Hermitian,
172
+ square-matrix, product-structure, and product-component checks. Documented
173
+ at `docs/source/design/checking_policy.rst`.
174
+
175
+ #### Spaces
176
+
177
+ - `BatchSpace` for batched elements with explicit batch shape and batch-axis
178
+ metadata.
179
+
180
+ #### Linear operators
181
+
182
+ - Lazy operator algebra:
183
+ - `A @ B` composes operators.
184
+ - `A + B` sums operators.
185
+ - `alpha * A` scales an operator.
186
+ - `A.H` returns a cached adjoint view satisfying `A.H.H is A`.
187
+ - Algebraic simplification eliminates `I`, `Zero`, `alpha = 0`, `alpha = 1`,
188
+ and flattens nested sums.
189
+ - New operator types: `IdentityLinOp`, `ZeroLinOp`, `MatrixFreeLinOp`,
190
+ `DiagonalLinOp`.
191
+ - Structural `LinOp.is_hermitian()` reporting `True`, `False`, or `None`
192
+ (unknown) without applying incorrect Euclidean assumptions for custom space
193
+ geometries.
194
+ - `LinOp.to_dense()` for materializing operators as backend arrays.
195
+ - Product-structured operators and batched lifting:
196
+ - `ProductLinOp`
197
+ - `BlockDiagonalLinOp`
198
+ - `StackedLinOp`
199
+ - `SumToSingleLinOp`
200
+ - `vapply` / `rvapply` paths for batched operator application.
201
+
202
+ #### Functionals
203
+
204
+ - `Functional` as an abstract base for scalar-valued maps on spaces, with
205
+ `value`, `grad`, `hess_apply`, and batched counterparts.
206
+ - Linear functionals: `LinearFunctional`, `InnerProductFunctional`,
207
+ `MatrixFreeLinearFunctional`.
208
+ - Quadratic forms: `QuadraticForm`, `LinOpQuadraticForm`.
209
+ - `Functional.compose` and `ComposedFunctional` for pull-backs along linear
210
+ operators, with specializations that preserve the concrete functional type
211
+ when possible.
212
+
213
+ #### Linear algebra
214
+
215
+ The `spacecore.linalg` module is new in 0.2.0. It provides JIT-compatible
216
+ iterative solvers and structured result types.
217
+
218
+ - Iterative solvers:
219
+ - `cg` for Hermitian positive-definite systems.
220
+ - `lsqr` for rectangular least-squares problems.
221
+ - `power_iteration` for dominant-eigenpair estimates of a `LinOp` or
222
+ `QuadraticForm`.
223
+ - `lanczos_smallest` for smallest-Ritz-eigenpair estimates of Hermitian
224
+ operators.
225
+ - `expm_multiply` for Krylov matrix-exponential actions `exp(t A) v` on
226
+ Hermitian operators, with complex `t` supported for Schrodinger-type
227
+ evolution.
228
+ - Structured result types `CGResult`, `LSQRResult`, `PowerIterationResult`,
229
+ `LanczosResult`, and `ExpmMultiplyResult`, each carrying convergence
230
+ diagnostics and a compact `__repr__`.
231
+ - Solvers are geometry-aware: norms, inner products, and the default initial
232
+ vector use `Space.inner` and `Space.norm` rather than assuming Euclidean
233
+ geometry. This makes the solvers correct on custom inner products such as
234
+ RKHS or weighted spaces.
235
+
236
+ #### Documentation
237
+
238
+ - Numpydoc-standard public docstrings with runnable doctests for solvers,
239
+ spaces, operators, functionals, backends, and contextual helpers.
240
+ - API reference pages for backend ops, spaces, linear operators, functionals,
241
+ and linear algebra.
242
+ - JAX integration design note at `docs/source/design/jax_integration.rst`
243
+ covering trace-time operator algebra and recommended JIT usage.
244
+ - Tutorials for backend operations, linear operators, and matrix-free linalg
245
+ workflows.
246
+
247
+ #### Tooling
248
+
249
+ - Optional dependency groups: `[jax]`, `[torch]`, `[cupy]`, `[examples]`,
250
+ `[docs]`, `[dev]`.
251
+ - Explicit `__all__` at the top level covering new backends, operators,
252
+ functionals, solvers, result types, validation checks, and contextual
253
+ helpers.
254
+ - CI runs a JIT-traceability audit in `--check` mode and enforces a 70%
255
+ coverage floor via `pytest-cov`.
256
+ - Cross-backend tests covering NumPy, JAX, Torch, and optional CuPy.
257
+
258
+ ### Changed
259
+
260
+ - Restructured `_contextual` to hide implementation details while preserving
261
+ the public API via free functions.
262
+ - Replaced manual `if self._enable_checks` guards with `checked_method` across
263
+ `Space`, `LinOp`, and `Functional`. Inline guards are now reserved for
264
+ non-membership checks such as dense-array assertions and custom output-shape
265
+ checks.
266
+ - Improved `VectorSpace`, `HermitianSpace`, and `ProductSpace` conversion
267
+ behavior, validation, batching support, and docstrings.
268
+ - Improved linear-operator equality, representation, conversion, and JAX
269
+ pytree behavior.
270
+ - `spacecore.__version__` now resolves from package metadata via
271
+ `importlib.metadata` instead of a hand-maintained constant.
272
+ - Bumped the package version to `0.2.0`.
273
+
274
+ ### Fixed
275
+
276
+ - `LinOp.__eq__` returns `NotImplemented` instead of raising
277
+ `NotImplementedError` on the base class, so `op == None` and
278
+ `op in some_list` no longer raise.
279
+ - `DenseLinOp.is_hermitian` and `SparseLinOp.is_hermitian` return `None` for
280
+ custom space geometries instead of applying an incorrect Euclidean
281
+ matrix-symmetry test.
282
+
283
+ ### Migration from 0.1.x
284
+
285
+ - `BackendOps.eps` is now a method `eps(dtype)` rather than a property.
286
+ Callers must pass a dtype, typically `ctx.dtype`.
287
+ - The implementation attribute `DenseLinOp.A` is now a `cached_property`
288
+ backed by `_A`. The public attribute access `op.A` is unchanged.
289
+ - `LinOp.__eq__` returns `NotImplemented` rather than raising; downstream code
290
+ relying on the exception should be updated to handle the new behavior.
291
+ - Several module-internal helpers in `spacecore._contextual` moved to private
292
+ modules. Use the public functions re-exported from `spacecore._contextual`
293
+ (`set_context`, `get_context`, `resolve_context_priority`, `register_ops`,
294
+ `set_resolution_policy`, and the dtype-policy accessors) rather than
295
+ importing from internal modules.
296
+
297
+ ### Known limitations
298
+
299
+ - `cg`, `lsqr`, and `power_iteration` do not structurally validate operator
300
+ properties (positive-definiteness, full Hermiticity) and may silently
301
+ produce incorrect results on inputs that violate their preconditions. See
302
+ each function's `Notes` section for details.
303
+ - Operator algebra runs Python-level simplification at construction time. For
304
+ maximum JIT efficiency, assemble operator expressions outside the
305
+ `jax.jit` boundary; see the JAX integration design note.
306
+ - `MatrixFreeLinOp` stores its callables in pytree auxiliary data.
307
+ Constructing one inside a JIT-traced function with a new lambda each call
308
+ triggers retracing. Construct outside the traced region with a stable
309
+ callable reference.
310
+ - The CuPy backend is provided as a preview. Coverage of non-standard
311
+ operations and sparse handling may evolve in a subsequent release.
312
+
313
+ [0.3.1]: https://github.com/Pavlo3P/SpaceCore/releases/tag/v0.3.1
314
+ [0.3.0]: https://github.com/Pavlo3P/SpaceCore/releases/tag/v0.3.0
315
+ [0.2.0]: https://github.com/Pavlo3P/SpaceCore/releases/tag/v0.2.0
@@ -0,0 +1,55 @@
1
+ # Contributing
2
+
3
+ SpaceCore is a mathematical software library for typed vector spaces, operators,
4
+ functionals, backend-independent array code, and geometry-aware algorithms. It
5
+ gives mathematical structure to objects; it does not hide problem-specific
6
+ mathematics from contributors.
7
+
8
+ ## Setup
9
+
10
+ Use [docs/dev/contributing/setup.md](docs/dev/contributing/setup.md) for the
11
+ full environment setup. The minimal contributor workflow is:
12
+
13
+ ```bash
14
+ pip install -e ".[dev]"
15
+ pytest --co -q
16
+ pytest tests/ -x -q
17
+ ruff check .
18
+ ```
19
+
20
+ Optional JAX, Torch, and CuPy backend instructions live in the detailed setup
21
+ guide.
22
+
23
+ ## Architecture
24
+
25
+ Read [docs/dev/contributing/architecture.md](docs/dev/contributing/architecture.md)
26
+ before changing core behavior. It explains the backend, context, space, LinOp,
27
+ functional, linalg, batching, and cross-cutting infrastructure layers.
28
+
29
+ ## Prerequisites
30
+
31
+ Read [docs/dev/contributing/prerequisites.md](docs/dev/contributing/prerequisites.md)
32
+ to judge the mathematical background needed for a change. Docstring and test
33
+ fixes may need little background; geometry, adjoint, spectral-method, and linalg
34
+ changes require mathematical review. Mathematical correctness is part of
35
+ contribution review even when tests pass.
36
+
37
+ ## Process
38
+
39
+ Follow [docs/dev/contributing/process.md](docs/dev/contributing/process.md) for
40
+ branch, PR, and review expectations. PRs should include tests, updated docs or
41
+ docstrings when relevant, a changelog entry under `[Unreleased]`, and a
42
+ mathematical invariant statement for changes touching geometry, adjoints,
43
+ spectral methods, fields, or batching.
44
+
45
+ ## Beginner-Safe Issues
46
+
47
+ Start with
48
+ [good-first-issue](https://github.com/Pavlo3P/SpaceCore/labels/good-first-issue).
49
+ That label is reserved for issues with a specific file to change, an example to
50
+ follow, and a concrete done condition.
51
+
52
+ ## Current Project State
53
+
54
+ Check [docs/dev/current.md](docs/dev/current.md) before opening design-heavy
55
+ PRs. Unsettled questions should not be implemented without maintainer agreement.
@@ -0,0 +1,12 @@
1
+ include CHANGELOG.md
2
+ include CONTRIBUTING.md
3
+
4
+ recursive-include docs/source *.rst *.py *.css
5
+ recursive-include docs/dev *.md
6
+ recursive-include examples *.py
7
+ recursive-include tests *.py
8
+ recursive-include tutorials *.ipynb *.md
9
+
10
+ global-exclude *.py[cod]
11
+ global-exclude __pycache__
12
+ global-exclude .DS_Store
@@ -0,0 +1,206 @@
1
+ Metadata-Version: 2.4
2
+ Name: spacecore
3
+ Version: 0.3.2
4
+ Summary: Backend-agnostic vector spaces and linear operators.
5
+ Author: Pavlo Pelikh
6
+ License-Expression: Apache-2.0
7
+ Keywords: linear-algebra,jax,pytorch,numpy,operators,spaces
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Science/Research
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
14
+ Requires-Python: >=3.11
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: array-api-compat>=1.14.0
18
+ Requires-Dist: numpy>=2.0.0
19
+ Requires-Dist: scipy>=1.17
20
+ Provides-Extra: jax
21
+ Requires-Dist: jax>=0.9.1; extra == "jax"
22
+ Provides-Extra: torch
23
+ Requires-Dist: torch>=2.0; extra == "torch"
24
+ Provides-Extra: cupy
25
+ Requires-Dist: cupy>=13.0; extra == "cupy"
26
+ Provides-Extra: examples
27
+ Requires-Dist: matplotlib>=3.8; extra == "examples"
28
+ Requires-Dist: optax>=0.2; extra == "examples"
29
+ Provides-Extra: docs
30
+ Requires-Dist: sphinx>=8.0; extra == "docs"
31
+ Requires-Dist: pydata-sphinx-theme>=0.16; extra == "docs"
32
+ Requires-Dist: sphinx-copybutton>=0.5; extra == "docs"
33
+ Requires-Dist: sphinx-design>=0.6; extra == "docs"
34
+ Requires-Dist: numpydoc>=1.8; extra == "docs"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=8.0; extra == "dev"
37
+ Requires-Dist: pytest-cov>=5; extra == "dev"
38
+ Requires-Dist: ruff>=0.6; extra == "dev"
39
+ Requires-Dist: numpydoc>=1.7; extra == "dev"
40
+ Dynamic: license-file
41
+
42
+ # SpaceCore
43
+
44
+ [![CI](https://github.com/Pavlo3P/SpaceCore/actions/workflows/ci.yml/badge.svg)](https://github.com/Pavlo3P/SpaceCore/actions/workflows/ci.yml)
45
+ [![PyPI](https://img.shields.io/pypi/v/spacecore.svg)](https://pypi.org/project/spacecore/)
46
+ [![Python](https://img.shields.io/pypi/pyversions/spacecore.svg)](https://pypi.org/project/spacecore/)
47
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
48
+
49
+ SpaceCore provides typed vector spaces, structured elements, linear operators,
50
+ functionals, and small linear-algebra utilities for backend-aware numerical
51
+ code. An operator is a typed map `A : X -> Y` between spaces, not merely an
52
+ array. Spaces carry the rules needed to validate elements, compute inner
53
+ products, flatten structured values, and interpret adjoints.
54
+
55
+ The execution backend is explicit. A `Context` owns the backend operations,
56
+ default dtype, and validation policy used by spaces and operators. NumPy is the
57
+ baseline backend; JAX, Torch, and CuPy are optional backends when their extras
58
+ are installed.
59
+
60
+ SpaceCore's native solvers are intentionally small. They are a correctness
61
+ baseline and substrate layer for space-aware algorithms, not a replacement for
62
+ mature solver ecosystems such as SciPy, PETSc, Krylov.jl, or PyLops. External
63
+ adapters and backend-specific fast paths can be layered on top where breadth or
64
+ performance is required.
65
+
66
+ ## Install
67
+
68
+ ```bash
69
+ pip install spacecore
70
+ pip install "spacecore[jax]"
71
+ pip install "spacecore[torch]"
72
+ pip install "spacecore[cupy]"
73
+ ```
74
+
75
+ Python 3.11+ is required.
76
+
77
+ ## Quick Start
78
+
79
+ ```python
80
+ import numpy as np
81
+ import spacecore as sc
82
+
83
+ ctx = sc.Context(sc.NumpyOps(), dtype=np.float64)
84
+ X = sc.DenseCoordinateSpace((2,), ctx)
85
+ A = sc.DenseLinOp(ctx.asarray([[2.0, 0.0], [0.0, 3.0]]), X, X, ctx)
86
+ b = ctx.asarray([4.0, 9.0])
87
+
88
+ result = sc.cg(A, b, tol=1e-12, maxiter=10)
89
+ print(result.x)
90
+ print(result.converged)
91
+ ```
92
+
93
+ Expected output:
94
+
95
+ ```text
96
+ [2. 3.]
97
+ True
98
+ ```
99
+
100
+ ## Core Ideas
101
+
102
+ **Spaces.** `DenseCoordinateSpace`, `DenseVectorSpace`,
103
+ `ElementwiseJordanSpace`, `EuclideanElementwiseJordanSpace`, `HermitianSpace`,
104
+ `ProductSpace`, and `StackedSpace` describe element structure and geometry.
105
+ Dense coordinate spaces can use Euclidean or weighted inner products.
106
+
107
+ ```python
108
+ import numpy as np
109
+ import spacecore as sc
110
+
111
+ ctx = sc.Context(sc.NumpyOps(), dtype=np.float64)
112
+ weights = ctx.asarray([2.0, 5.0])
113
+ X = sc.DenseCoordinateSpace((2,), ctx, geometry=sc.WeightedInnerProduct(weights))
114
+ x = ctx.asarray([1.0, 2.0])
115
+ y = ctx.asarray([3.0, 4.0])
116
+
117
+ print(X.inner(x, y))
118
+ print(X.riesz(x))
119
+ ```
120
+
121
+ Expected output:
122
+
123
+ ```text
124
+ 46.0
125
+ [ 2. 10.]
126
+ ```
127
+
128
+ **Linear operators.** `DenseLinOp`, `SparseLinOp`, `DiagonalLinOp`,
129
+ `MatrixFreeLinOp`, `IdentityLinOp`, `ZeroLinOp`, and the algebraic operators
130
+ represent maps `A : X -> Y`. `apply` computes the forward map. `rapply`
131
+ computes the metric adjoint: the coordinate conjugate transpose only agrees
132
+ with it when both spaces use Euclidean geometry.
133
+
134
+ ```python
135
+ import numpy as np
136
+ import spacecore as sc
137
+
138
+ ctx = sc.Context(sc.NumpyOps(), dtype=np.float64)
139
+ X = sc.DenseCoordinateSpace((2,), ctx)
140
+ A = sc.DiagonalLinOp(ctx.asarray([2.0, 3.0]), X, ctx)
141
+
142
+ print(A.apply(ctx.asarray([1.0, 2.0])))
143
+ print(A.rapply(ctx.asarray([1.0, 1.0])))
144
+ ```
145
+
146
+ Expected output:
147
+
148
+ ```text
149
+ [2. 6.]
150
+ [2. 3.]
151
+ ```
152
+
153
+ **Functionals.** `LinearFunctional`, `InnerProductFunctional`,
154
+ `MatrixFreeLinearFunctional`, `QuadraticForm`, and `LinOpQuadraticForm` model
155
+ scalar-valued maps on spaces. Gradients are represented in the domain geometry.
156
+
157
+ **Linear algebra.** `cg`, `lsqr`, `lanczos_smallest`, `power_iteration`, and
158
+ `expm_multiply` operate on SpaceCore operators and spaces. They document their
159
+ mathematical preconditions; for example `cg` expects a square Hermitian positive
160
+ definite map `A : X -> X` with respect to `X.inner`.
161
+
162
+ **Backends.** `NumpyOps` is always available. `JaxOps`, `TorchOps`, and
163
+ `CuPyOps` are exported only when their optional dependencies are installed.
164
+ Backend portability means SpaceCore uses the same abstract operations and data
165
+ model; it does not erase backend-specific dtype, device, sparse, tracing, or
166
+ autograd behavior.
167
+
168
+ ## Batching
169
+
170
+ A space describes one element type. Batched computation is handled by vectorized
171
+ application methods such as `vapply`, `rvapply`, `vvalue`, and backend
172
+ vectorization. Batching does not change the mathematical domain or codomain of
173
+ an operator unless the operator itself is explicitly built over a stacked or
174
+ product space.
175
+
176
+ ## Documentation
177
+
178
+ - [Tutorials](https://pavlo3p.github.io/SpaceCore/tutorials/index.html)
179
+ - [Design notes](https://pavlo3p.github.io/SpaceCore/design/index.html)
180
+ - [API reference](https://pavlo3p.github.io/SpaceCore/api/index.html)
181
+ - [Release notes](https://pavlo3p.github.io/SpaceCore/release_notes.html)
182
+
183
+ ## Project Status
184
+
185
+ SpaceCore is experimental `0.3.x` software. Core abstractions are usable for
186
+ research and prototyping, but API details may still change before a stable
187
+ release.
188
+
189
+ ## Contributing
190
+
191
+ Bug reports, feature requests, and PRs are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
192
+
193
+ ## License
194
+
195
+ Apache 2.0. See [LICENSE](LICENSE).
196
+
197
+ ## Citation
198
+
199
+ ```bibtex
200
+ @software{spacecore,
201
+ author = {Pavlo Pelikh},
202
+ title = {SpaceCore: Backend-aware vector spaces and linear operators},
203
+ url = {https://github.com/Pavlo3P/SpaceCore},
204
+ year = {2026},
205
+ }
206
+ ```