haliax 1.4.dev438__tar.gz → 1.4.dev441__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 (134) hide show
  1. {haliax-1.4.dev438 → haliax-1.4.dev441}/PKG-INFO +1 -1
  2. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/api.md +31 -0
  3. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/__about__.py +1 -1
  4. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/__init__.py +1 -0
  5. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/mup.py +1 -1
  6. haliax-1.4.dev441/src/haliax/tree.py +59 -0
  7. {haliax-1.4.dev438 → haliax-1.4.dev441}/.agents/projects/api_parity.md +0 -0
  8. {haliax-1.4.dev438 → haliax-1.4.dev441}/.coveragerc +0 -0
  9. {haliax-1.4.dev438 → haliax-1.4.dev441}/.flake8 +0 -0
  10. {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/publish_dev.yaml +0 -0
  11. {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_pre_commit.yaml +0 -0
  12. {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
  13. {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_tests.yaml +0 -0
  14. {haliax-1.4.dev438 → haliax-1.4.dev441}/.gitignore +0 -0
  15. {haliax-1.4.dev438 → haliax-1.4.dev441}/.playbooks/add-types.md +0 -0
  16. {haliax-1.4.dev438 → haliax-1.4.dev441}/.playbooks/wrap-non-named.md +0 -0
  17. {haliax-1.4.dev438 → haliax-1.4.dev441}/.pre-commit-config.yaml +0 -0
  18. {haliax-1.4.dev438 → haliax-1.4.dev441}/.readthedocs.yaml +0 -0
  19. {haliax-1.4.dev438 → haliax-1.4.dev441}/AGENTS.md +0 -0
  20. {haliax-1.4.dev438 → haliax-1.4.dev441}/AUTHORS.md +0 -0
  21. {haliax-1.4.dev438 → haliax-1.4.dev441}/CONTRIBUTING.md +0 -0
  22. {haliax-1.4.dev438 → haliax-1.4.dev441}/CONTRIBUTORS.md +0 -0
  23. {haliax-1.4.dev438 → haliax-1.4.dev441}/LICENSE +0 -0
  24. {haliax-1.4.dev438 → haliax-1.4.dev441}/README.md +0 -0
  25. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/broadcasting.md +0 -0
  26. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/cheatsheet.md +0 -0
  27. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/css/material.css +0 -0
  28. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/css/mkdocstrings.css +0 -0
  29. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/faq.md +0 -0
  30. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/data_parallel_mesh.png +0 -0
  31. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/data_parallel_mesh_replicated.png +0 -0
  32. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_1d.png +0 -0
  33. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_1d_zero.png +0 -0
  34. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d.png +0 -0
  35. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
  36. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
  37. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
  38. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
  39. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_zero.png +0 -0
  40. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/fp8.md +0 -0
  41. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/index.md +0 -0
  42. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/indexing.md +0 -0
  43. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/matmul.md +0 -0
  44. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/nn.md +0 -0
  45. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/partitioning.md +0 -0
  46. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/primer.md +0 -0
  47. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/rearrange.ipynb +0 -0
  48. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/rearrange.md +0 -0
  49. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/requirements.txt +0 -0
  50. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/scan.md +0 -0
  51. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/state-dict.md +0 -0
  52. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/tutorial.md +0 -0
  53. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/typing.md +0 -0
  54. {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/vmap.md +0 -0
  55. {haliax-1.4.dev438 → haliax-1.4.dev441}/etc/license_header.txt +0 -0
  56. {haliax-1.4.dev438 → haliax-1.4.dev441}/mkdocs.yml +0 -0
  57. {haliax-1.4.dev438 → haliax-1.4.dev441}/pyproject.toml +0 -0
  58. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/__init__.py +0 -0
  59. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/compile_utils.py +0 -0
  60. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/dot.py +0 -0
  61. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/einsum.py +0 -0
  62. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/fp8.py +0 -0
  63. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/parsing.py +0 -0
  64. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/rearrange.py +0 -0
  65. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/scan.py +0 -0
  66. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/state_dict.py +0 -0
  67. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/util.py +0 -0
  68. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/axis.py +0 -0
  69. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/core.py +0 -0
  70. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/debug.py +0 -0
  71. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/fft.py +0 -0
  72. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/field.py +0 -0
  73. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/haxtyping.py +0 -0
  74. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/hof.py +0 -0
  75. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/jax_utils.py +0 -0
  76. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/__init__.py +0 -0
  77. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/activations.py +0 -0
  78. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/attention.py +0 -0
  79. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/conv.py +0 -0
  80. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/dropout.py +0 -0
  81. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/embedding.py +0 -0
  82. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/linear.py +0 -0
  83. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/loss.py +0 -0
  84. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/mlp.py +0 -0
  85. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/normalization.py +0 -0
  86. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/pool.py +0 -0
  87. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/scan.py +0 -0
  88. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/ops.py +0 -0
  89. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/partitioning.py +0 -0
  90. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/poly.py +0 -0
  91. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/quantization.py +0 -0
  92. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/random.py +0 -0
  93. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/specialized_fns.py +0 -0
  94. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/state_dict.py +0 -0
  95. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/tree_util.py +0 -0
  96. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/types.py +0 -0
  97. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/util.py +0 -0
  98. {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/wrap.py +0 -0
  99. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/core_test.py +0 -0
  100. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_attention.py +0 -0
  101. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_axis.py +0 -0
  102. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_bitwise_ops.py +0 -0
  103. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_conv.py +0 -0
  104. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_debug.py +0 -0
  105. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_dot.py +0 -0
  106. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_dtype_typing.py +0 -0
  107. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_einsum.py +0 -0
  108. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_fft.py +0 -0
  109. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_field.py +0 -0
  110. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_fp8.py +0 -0
  111. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_hof.py +0 -0
  112. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_int8.py +0 -0
  113. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_moe_linear.py +0 -0
  114. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_coordinate_check.py +0 -0
  115. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_embedding.py +0 -0
  116. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_linear.py +0 -0
  117. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_namedarray_typing.py +0 -0
  118. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_nan_reductions.py +0 -0
  119. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_nn.py +0 -0
  120. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_ops.py +0 -0
  121. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_parsing.py +0 -0
  122. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_partitioning.py +0 -0
  123. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_poly_ops.py +0 -0
  124. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_pool.py +0 -0
  125. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_random.py +0 -0
  126. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_rearrange.py +0 -0
  127. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_scan.py +0 -0
  128. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_scatter_gather.py +0 -0
  129. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_specialized_fns.py +0 -0
  130. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_state_dict.py +0 -0
  131. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_tree_util.py +0 -0
  132. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_utils.py +0 -0
  133. {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_visualize_sharding.py +0 -0
  134. {haliax-1.4.dev438 → haliax-1.4.dev441}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haliax
3
- Version: 1.4.dev438
3
+ Version: 1.4.dev441
4
4
  Summary: Named Tensors for Legible Deep Learning in JAX
5
5
  Project-URL: Homepage, https://github.com/stanford-crfm/haliax
6
6
  Project-URL: Bug Tracker, https://github.com/stanford-crfm/haliax/issues/
@@ -4,6 +4,37 @@ that we use names (either strings or [haliax.Axis][] objects) to specify axes in
4
4
  arrays (see [haliax.zeros][] and [haliax.ones][]) as well as things like reductions (see [haliax.sum][] and
5
5
  [haliax.mean][]).
6
6
 
7
+ ## PyTree Helpers
8
+
9
+ PyTrees are the lingua franca for composing state in JAX ecosystems. Haliax provides drop-in replacements for the
10
+ [`jax.tree`][] helpers that are aware of [`NamedArray`][haliax.NamedArray] semantics. They preserve axis metadata across
11
+ transformations while interoperating with standard JAX containers, so you can use them anywhere you would have reached
12
+ for JAX's versions.
13
+
14
+ Use these helpers whenever you need to map, flatten, or rebuild PyTrees that might include `NamedArray` instances:
15
+
16
+ * [`haliax.tree.map`][] mirrors [`jax.tree.map`][] but forwards to Haliax's [`haliax.tree_util.tree_map`][] so axis names remain
17
+ intact.
18
+ * [`haliax.tree.scan_aware_map`][] descends into [`haliax.nn.Stacked`][haliax.nn.Stacked] modules so that each layer is
19
+ transformed individually, effectively treating them as if they were unrolled when applying
20
+ [`haliax.tree_util.scan_aware_tree_map`][].
21
+ * [`haliax.tree.flatten`][] / [`haliax.tree.unflatten`][] match the familiar flattening API while handling `NamedArray`
22
+ payloads safely.
23
+ * [`haliax.tree.leaves`][] and [`haliax.tree.structure`][] provide direct access to the leaves and PyTree structure.
24
+
25
+ All of these helpers accept the same `is_leaf` hook you might already use with JAX's utilities. They should be the first
26
+ tools you reach for when you need deterministic tree transforms that understand named axes.
27
+
28
+ ::: haliax.tree.map
29
+ ::: haliax.tree.scan_aware_map
30
+ ::: haliax.tree.flatten
31
+ ::: haliax.tree.unflatten
32
+ ::: haliax.tree.leaves
33
+ ::: haliax.tree.structure
34
+
35
+ [`jax.tree`]: https://jax.readthedocs.io/en/latest/_autosummary/jax.tree.html
36
+ [`jax.tree.map`]: https://jax.readthedocs.io/en/latest/_autosummary/jax.tree.map.html
37
+
7
38
  ## Axis Types
8
39
 
9
40
  If you already speak NumPy or `jax.numpy`, think of Haliax as swapping positional axes (`axis=0`) for named axes
@@ -3,4 +3,4 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
 
6
- __version__ = "1.4.dev438"
6
+ __version__ = "1.4.dev441"
@@ -16,6 +16,7 @@ import haliax.nn as nn
16
16
  import haliax.quantization as quantization
17
17
  import haliax.random as random
18
18
  import haliax.state_dict as state_dict
19
+ import haliax.tree as tree # noqa: F401
19
20
  import haliax.tree_util as tree_util
20
21
  import haliax.util as util
21
22
  from .field import field
@@ -168,7 +168,7 @@ class EmbeddingStandardParam(AbstractEmbeddingReparam):
168
168
 
169
169
  @property
170
170
  def unembed_active_scale(self):
171
- return 1 / hax.axis_size(self.Embed)
171
+ return 1
172
172
 
173
173
 
174
174
  class EmbeddingMup(AbstractEmbeddingReparam):
@@ -0,0 +1,59 @@
1
+ # Copyright 2025 The Levanter Authors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """Convenience wrappers for :mod:`haliax.tree_util` that mirror :mod:`jax.tree`."""
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Any, Callable, Iterable, Sequence, TypeVar
10
+
11
+ from . import tree_util
12
+
13
+ T = TypeVar("T")
14
+
15
+
16
+ def map(fn: Callable[..., T], tree: Any, *rest: Any, is_leaf: Callable[[Any], bool] | None = None) -> Any:
17
+ """Alias for :func:`haliax.tree_util.tree_map` matching :func:`jax.tree.map`."""
18
+
19
+ return tree_util.tree_map(fn, tree, *rest, is_leaf=is_leaf)
20
+
21
+
22
+ def scan_aware_map(fn: Callable[..., T], tree: Any, *rest: Any, is_leaf: Callable[[Any], bool] | None = None) -> Any:
23
+ """Alias for :func:`haliax.tree_util.scan_aware_tree_map` with :mod:`jax.tree` style naming."""
24
+
25
+ return tree_util.scan_aware_tree_map(fn, tree, *rest, is_leaf=is_leaf)
26
+
27
+
28
+ def flatten(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> tuple[Sequence[Any], Any]:
29
+ """Alias for :func:`haliax.tree_util.tree_flatten` matching :func:`jax.tree.flatten`."""
30
+
31
+ return tree_util.tree_flatten(tree, is_leaf=is_leaf)
32
+
33
+
34
+ def unflatten(treedef: Any, leaves: Iterable[Any]) -> Any:
35
+ """Alias for :func:`haliax.tree_util.tree_unflatten` matching :func:`jax.tree.unflatten`."""
36
+
37
+ return tree_util.tree_unflatten(treedef, leaves)
38
+
39
+
40
+ def leaves(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> Sequence[Any]:
41
+ """Alias for :func:`haliax.tree_util.tree_leaves` matching :func:`jax.tree.leaves`."""
42
+
43
+ return tree_util.tree_leaves(tree, is_leaf=is_leaf)
44
+
45
+
46
+ def structure(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> Any:
47
+ """Alias for :func:`haliax.tree_util.tree_structure` matching :func:`jax.tree.structure`."""
48
+
49
+ return tree_util.tree_structure(tree, is_leaf=is_leaf)
50
+
51
+
52
+ __all__ = [
53
+ "map",
54
+ "scan_aware_map",
55
+ "flatten",
56
+ "unflatten",
57
+ "leaves",
58
+ "structure",
59
+ ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes