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.
- {haliax-1.4.dev379 → haliax-1.4.dev380}/PKG-INFO +1 -1
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/api.md +1 -0
- haliax-1.4.dev380/src/haliax/__about__.py +1 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/__init__.py +2 -1
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/ops.py +41 -3
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_ops.py +13 -0
- haliax-1.4.dev379/src/haliax/__about__.py +0 -1
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.coveragerc +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.flake8 +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/publish_dev.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_pre_commit.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.github/workflows/run_tests.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.gitignore +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.playbooks/add-types.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.pre-commit-config.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/.readthedocs.yaml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/AGENTS.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/CONTRIBUTING.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/LICENSE +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/README.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/broadcasting.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/cheatsheet.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/css/material.css +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/css/mkdocstrings.css +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/faq.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/data_parallel_mesh.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/data_parallel_mesh_replicated.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_1d.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_1d_zero.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/figures/device_mesh_2d_zero.png +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/fp8.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/index.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/indexing.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/matmul.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/nn.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/partitioning.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/rearrange.ipynb +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/rearrange.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/requirements.txt +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/scan.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/state-dict.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/tutorial.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/typing.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/docs/vmap.md +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/mkdocs.yml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/pyproject.toml +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/__init__.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/compile_utils.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/dot.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/einsum.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/fp8.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/parsing.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/rearrange.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/scan.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/state_dict.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/_src/util.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/axis.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/core.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/debug.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/haxtyping.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/hof.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/jax_utils.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/__init__.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/activations.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/attention.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/conv.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/dropout.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/embedding.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/linear.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/loss.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/mlp.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/normalization.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/pool.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/nn/scan.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/partitioning.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/quantization.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/random.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/specialized_fns.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/state_dict.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/tree_util.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/types.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/util.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/src/haliax/wrap.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/core_test.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_attention.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_axis.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_conv.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_debug.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_dot.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_dtype_typing.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_einsum.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_fp8.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_hof.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_int8.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_namedarray_typing.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_nn.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_parsing.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_partitioning.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_pool.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_random.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_rearrange.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_scan.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_scatter_gather.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_specialized_fns.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_state_dict.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_tree_util.py +0 -0
- {haliax-1.4.dev379 → haliax-1.4.dev380}/tests/test_utils.py +0 -0
- {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.
|
|
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/
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|