spacecore-optimize 0.0.1__tar.gz → 0.0.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 (43) hide show
  1. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/CHANGELOG.md +7 -0
  2. {spacecore_optimize-0.0.1/spacecore_optimize.egg-info → spacecore_optimize-0.0.2}/PKG-INFO +1 -1
  3. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/pyproject.toml +1 -1
  4. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/_optax.py +6 -3
  5. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2/spacecore_optimize.egg-info}/PKG-INFO +1 -1
  6. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_minimize_optax.py +9 -0
  7. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/LICENSE +0 -0
  8. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/MANIFEST.in +0 -0
  9. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/README.md +0 -0
  10. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/docs/api.rst +0 -0
  11. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/docs/changelog.rst +0 -0
  12. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/docs/conf.py +0 -0
  13. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/docs/index.rst +0 -0
  14. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/setup.cfg +0 -0
  15. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/__init__.py +0 -0
  16. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/_common.py +0 -0
  17. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/_scipy.py +0 -0
  18. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/__init__.py +0 -0
  19. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_entropy.py +0 -0
  20. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_huber.py +0 -0
  21. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_least_squares.py +0 -0
  22. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_proximal.py +0 -0
  23. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_realified.py +0 -0
  24. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/functionals/_spectral.py +0 -0
  25. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize/py.typed +0 -0
  26. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize.egg-info/SOURCES.txt +0 -0
  27. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize.egg-info/dependency_links.txt +0 -0
  28. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize.egg-info/requires.txt +0 -0
  29. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/spacecore_optimize.egg-info/top_level.txt +0 -0
  30. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/__init__.py +0 -0
  31. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/_helpers.py +0 -0
  32. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/conftest.py +0 -0
  33. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_battery_functionals.py +0 -0
  34. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_composed_functional.py +0 -0
  35. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_contracts.py +0 -0
  36. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_least_squares.py +0 -0
  37. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_line_search_scipy.py +0 -0
  38. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_metric_handoff.py +0 -0
  39. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_minimize_scipy.py +0 -0
  40. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_proximal.py +0 -0
  41. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_readme.py +0 -0
  42. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_realified.py +0 -0
  43. {spacecore_optimize-0.0.1 → spacecore_optimize-0.0.2}/tests/test_spectral.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.2] — 2026-10-27
4
+
5
+ ### Fixed
6
+
7
+ - `minimize_optax` returns `x_element` on the domain's JAX backend. It was a host NumPy
8
+ copy, which a JAX-backed space rejects as a member from check level `"standard"` up.
9
+
3
10
  ## [0.0.1] — 2026-10-18
4
11
 
5
12
  First release, carved out of SpaceCore 0.5.0, which keeps no optimization loops.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spacecore-optimize
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Optimization on top of SpaceCore: SciPy and optax adapters, and a catalogue of functionals and proximal steps.
5
5
  Author: Pavlo Pelikh
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spacecore-optimize"
7
- version = "0.0.1"
7
+ version = "0.0.2"
8
8
  description = "Optimization on top of SpaceCore: SciPy and optax adapters, and a catalogue of functionals and proximal steps."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -387,7 +387,8 @@ def minimize_optax(
387
387
  print(_ROW_FMT.format(i=0, v=float(np.real(value0)), d=0.0, g=float(grad_norm0)))
388
388
 
389
389
  t1 = perf_counter()
390
- result = jax.device_get(compiled(init_state, tol_arr))
390
+ out = compiled(init_state, tol_arr)
391
+ result = jax.device_get(out)
391
392
  execution_seconds = perf_counter() - t1
392
393
 
393
394
  # Unpack the result on the host.
@@ -403,8 +404,10 @@ def minimize_optax(
403
404
  final_value = float(np.real(final.value))
404
405
  final_grad_norm = float(final.grad_norm)
405
406
  # Return the minimizer as an element of F.domain (bound element for a
406
- # structured space; the raw array is already an element otherwise).
407
- x_element = X.element(final.params) if isinstance(X, TreeSpace) else final.params
407
+ # structured space; the raw array is already an element otherwise). It is
408
+ # taken from the device output, not the host copy, so it stays on X's backend.
409
+ params = out.state.params
410
+ x_element = X.element(params) if isinstance(X, TreeSpace) else params
408
411
  # Status 2: diverged; 0: converged; 1: iteration cap.
409
412
  finite = bool(np.asarray(result.finite))
410
413
  success = finite and final_grad_norm <= tol
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spacecore-optimize
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Optimization on top of SpaceCore: SciPy and optax adapters, and a catalogue of functionals and proximal steps.
5
5
  Author: Pavlo Pelikh
6
6
  License-Expression: Apache-2.0
@@ -78,6 +78,15 @@ class TestConvergence:
78
78
  assert res.nfev == res.njev == res.num_iters + 1
79
79
  np.testing.assert_allclose(to_numpy(res.x_element), x_star, atol=1e-2)
80
80
 
81
+ def test_x_element_stays_on_the_jax_backend(self):
82
+ # The minimizer is handed back to the domain's own methods, which check the backend.
83
+ import optax
84
+
85
+ ctx = make_ctx("jax", np.float32, check_level="standard") # the space checks its members' backend
86
+ X, F, _ = euclidean_problem(ctx)
87
+ res = spo.minimize_optax(F, X.zeros(), optax.adam(1e-1), max_iter=50, verbose=0)
88
+ X.norm(res.x_element)
89
+
81
90
  def test_weighted_metric_handoff(self):
82
91
  """X.riesz coordinate-gradient handoff drives optax to the metric minimizer."""
83
92
  import optax