haliax 1.4.dev379__tar.gz → 1.4.dev380__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 (114) hide show
  1. {haliax-1.4.dev379 → haliax-1.4.dev380}/PKG-INFO +1 -1
  2. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/api.md +1 -0
  3. haliax-1.4.dev380/src/haliax/__about__.py +1 -0
  4. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/__init__.py +2 -1
  5. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/ops.py +41 -3
  6. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_ops.py +13 -0
  7. haliax-1.4.dev379/src/haliax/__about__.py +0 -1
  8. {haliax-1.4.dev379 → haliax-1.4.dev380}/.coveragerc +0 -0
  9. {haliax-1.4.dev379 → haliax-1.4.dev380}/.flake8 +0 -0
  10. {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/publish_dev.yaml +0 -0
  11. {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_pre_commit.yaml +0 -0
  12. {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
  13. {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_tests.yaml +0 -0
  14. {haliax-1.4.dev379 → haliax-1.4.dev380}/.gitignore +0 -0
  15. {haliax-1.4.dev379 → haliax-1.4.dev380}/.playbooks/add-types.md +0 -0
  16. {haliax-1.4.dev379 → haliax-1.4.dev380}/.pre-commit-config.yaml +0 -0
  17. {haliax-1.4.dev379 → haliax-1.4.dev380}/.readthedocs.yaml +0 -0
  18. {haliax-1.4.dev379 → haliax-1.4.dev380}/AGENTS.md +0 -0
  19. {haliax-1.4.dev379 → haliax-1.4.dev380}/CONTRIBUTING.md +0 -0
  20. {haliax-1.4.dev379 → haliax-1.4.dev380}/LICENSE +0 -0
  21. {haliax-1.4.dev379 → haliax-1.4.dev380}/README.md +0 -0
  22. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/broadcasting.md +0 -0
  23. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/cheatsheet.md +0 -0
  24. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/css/material.css +0 -0
  25. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/css/mkdocstrings.css +0 -0
  26. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/faq.md +0 -0
  27. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/data_parallel_mesh.png +0 -0
  28. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/data_parallel_mesh_replicated.png +0 -0
  29. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_1d.png +0 -0
  30. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_1d_zero.png +0 -0
  31. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d.png +0 -0
  32. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
  33. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
  34. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
  35. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
  36. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_zero.png +0 -0
  37. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/fp8.md +0 -0
  38. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/index.md +0 -0
  39. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/indexing.md +0 -0
  40. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/matmul.md +0 -0
  41. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/nn.md +0 -0
  42. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/partitioning.md +0 -0
  43. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/rearrange.ipynb +0 -0
  44. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/rearrange.md +0 -0
  45. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/requirements.txt +0 -0
  46. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/scan.md +0 -0
  47. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/state-dict.md +0 -0
  48. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/tutorial.md +0 -0
  49. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/typing.md +0 -0
  50. {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/vmap.md +0 -0
  51. {haliax-1.4.dev379 → haliax-1.4.dev380}/mkdocs.yml +0 -0
  52. {haliax-1.4.dev379 → haliax-1.4.dev380}/pyproject.toml +0 -0
  53. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/__init__.py +0 -0
  54. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/compile_utils.py +0 -0
  55. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/dot.py +0 -0
  56. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/einsum.py +0 -0
  57. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/fp8.py +0 -0
  58. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/parsing.py +0 -0
  59. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/rearrange.py +0 -0
  60. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/scan.py +0 -0
  61. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/state_dict.py +0 -0
  62. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/util.py +0 -0
  63. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/axis.py +0 -0
  64. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/core.py +0 -0
  65. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/debug.py +0 -0
  66. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/haxtyping.py +0 -0
  67. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/hof.py +0 -0
  68. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/jax_utils.py +0 -0
  69. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/__init__.py +0 -0
  70. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/activations.py +0 -0
  71. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/attention.py +0 -0
  72. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/conv.py +0 -0
  73. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/dropout.py +0 -0
  74. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/embedding.py +0 -0
  75. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/linear.py +0 -0
  76. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/loss.py +0 -0
  77. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/mlp.py +0 -0
  78. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/normalization.py +0 -0
  79. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/pool.py +0 -0
  80. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/scan.py +0 -0
  81. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/partitioning.py +0 -0
  82. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/quantization.py +0 -0
  83. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/random.py +0 -0
  84. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/specialized_fns.py +0 -0
  85. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/state_dict.py +0 -0
  86. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/tree_util.py +0 -0
  87. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/types.py +0 -0
  88. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/util.py +0 -0
  89. {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/wrap.py +0 -0
  90. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/core_test.py +0 -0
  91. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_attention.py +0 -0
  92. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_axis.py +0 -0
  93. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_conv.py +0 -0
  94. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_debug.py +0 -0
  95. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_dot.py +0 -0
  96. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_dtype_typing.py +0 -0
  97. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_einsum.py +0 -0
  98. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_fp8.py +0 -0
  99. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_hof.py +0 -0
  100. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_int8.py +0 -0
  101. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_namedarray_typing.py +0 -0
  102. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_nn.py +0 -0
  103. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_parsing.py +0 -0
  104. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_partitioning.py +0 -0
  105. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_pool.py +0 -0
  106. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_random.py +0 -0
  107. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_rearrange.py +0 -0
  108. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_scan.py +0 -0
  109. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_scatter_gather.py +0 -0
  110. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_specialized_fns.py +0 -0
  111. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_state_dict.py +0 -0
  112. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_tree_util.py +0 -0
  113. {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_utils.py +0 -0
  114. {haliax-1.4.dev379 → haliax-1.4.dev380}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haliax
3
- Version: 1.4.dev379
3
+ Version: 1.4.dev380
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/
@@ -258,6 +258,7 @@ These are all more or less directly from JAX's NumPy API.
258
258
 
259
259
  ::: haliax.clip
260
260
  ::: haliax.isclose
261
+ ::: haliax.pad
261
262
  ::: haliax.top_k
262
263
  ::: haliax.trace
263
264
  ::: haliax.tril
@@ -0,0 +1 @@
1
+ __version__ = "1.4.dev380"
@@ -66,7 +66,7 @@ from .core import (
66
66
  from .haxtyping import Named
67
67
  from .hof import fold, map, scan, vmap
68
68
  from .jax_utils import tree_checkpoint_name
69
- from .ops import clip, isclose, pad_left, trace, tril, triu, where
69
+ from .ops import clip, isclose, pad_left, pad, trace, tril, triu, where
70
70
  from .partitioning import auto_sharded, axis_mapping, fsdp, named_jit, shard, shard_with_axis_mapping
71
71
  from .specialized_fns import top_k
72
72
  from .types import Scalar
@@ -1082,6 +1082,7 @@ __all__ = [
1082
1082
  "are_shape_checks_enabled",
1083
1083
  "isclose",
1084
1084
  "pad_left",
1085
+ "pad",
1085
1086
  "stack",
1086
1087
  "concatenate",
1087
1088
  "eliminate_axes",
@@ -1,10 +1,10 @@
1
1
  import typing
2
- from typing import Optional, Union
2
+ from typing import Mapping, Optional, Union
3
3
 
4
4
  import jax
5
5
  import jax.numpy as jnp
6
6
 
7
- from .axis import Axis, AxisSelector
7
+ from .axis import Axis, AxisSelector, axis_name
8
8
  from .core import NamedArray, NamedOrNumeric, broadcast_arrays, broadcast_arrays_and_return_axes, named
9
9
  from .jax_utils import is_scalarish
10
10
 
@@ -152,10 +152,48 @@ def pad_left(array: NamedArray, axis: Axis, new_axis: Axis, value=0) -> NamedArr
152
152
  return NamedArray(padded, array.axes[:idx] + (new_axis,) + array.axes[idx + 1 :])
153
153
 
154
154
 
155
+ def pad(
156
+ array: NamedArray,
157
+ pad_width: Mapping[AxisSelector, tuple[int, int]],
158
+ *,
159
+ mode: str = "constant",
160
+ constant_values: NamedOrNumeric = 0,
161
+ **kwargs,
162
+ ) -> NamedArray:
163
+ """Version of ``jax.numpy.pad`` that works with ``NamedArray``.
164
+
165
+ ``pad_width`` should be a mapping from axis (or axis name) to a ``(before, after)``
166
+ tuple specifying how much padding to add on each side of that axis. Any axis
167
+ not present in ``pad_width`` will not be padded.
168
+ """
169
+
170
+ padding = []
171
+ new_axes = []
172
+ for ax in array.axes:
173
+ left_right = pad_width.get(ax)
174
+ if left_right is None:
175
+ left_right = pad_width.get(axis_name(ax)) # type: ignore[arg-type]
176
+ if left_right is None:
177
+ left_right = (0, 0)
178
+ left, right = left_right
179
+ padding.append((left, right))
180
+ new_axes.append(ax.resize(ax.size + left + right))
181
+
182
+ result = jnp.pad(
183
+ array.array,
184
+ padding,
185
+ mode=mode,
186
+ constant_values=raw_array_or_scalar(constant_values),
187
+ **kwargs,
188
+ )
189
+
190
+ return NamedArray(result, tuple(new_axes))
191
+
192
+
155
193
  def raw_array_or_scalar(x: NamedOrNumeric):
156
194
  if isinstance(x, NamedArray):
157
195
  return x.array
158
196
  return x
159
197
 
160
198
 
161
- __all__ = ["trace", "where", "tril", "triu", "isclose", "pad_left", "clip"]
199
+ __all__ = ["trace", "where", "tril", "triu", "isclose", "pad_left", "pad", "clip"]
@@ -237,3 +237,16 @@ def test_reductions_produce_scalar_named_arrays_when_None_axis():
237
237
  # But if we specify axes, we always get a NamedArray, even if it's a scalar
238
238
  assert isinstance(hax.mean(named1, axis=("Height", "Width")), NamedArray)
239
239
  assert hax.mean(named1, axis=("Height", "Width")).axes == ()
240
+
241
+
242
+ def test_pad():
243
+ Height = Axis("Height", 3)
244
+ Width = Axis("Width", 2)
245
+
246
+ arr = hax.arange((Height, Width))
247
+ padded = hax.pad(arr, {Height: (1, 2), Width: (0, 1)}, mode="constant", constant_values=0)
248
+
249
+ expected = jnp.pad(arr.array, [(1, 2), (0, 1)], mode="constant", constant_values=0)
250
+ assert padded.axes[0].size == Height.size + 3
251
+ assert padded.axes[1].size == Width.size + 1
252
+ assert jnp.all(expected == padded.array)
@@ -1 +0,0 @@
1
- __version__ = "1.4.dev379"
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