haliax 1.4.dev410__tar.gz → 1.4.dev411__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 (125) hide show
  1. {haliax-1.4.dev410 → haliax-1.4.dev411}/.agents/projects/api_parity.md +1 -1
  2. {haliax-1.4.dev410 → haliax-1.4.dev411}/PKG-INFO +1 -1
  3. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/api.md +1 -0
  4. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/__about__.py +1 -1
  5. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/__init__.py +2 -0
  6. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/ops.py +24 -0
  7. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_ops.py +23 -0
  8. {haliax-1.4.dev410 → haliax-1.4.dev411}/.coveragerc +0 -0
  9. {haliax-1.4.dev410 → haliax-1.4.dev411}/.flake8 +0 -0
  10. {haliax-1.4.dev410 → haliax-1.4.dev411}/.github/workflows/publish_dev.yaml +0 -0
  11. {haliax-1.4.dev410 → haliax-1.4.dev411}/.github/workflows/run_pre_commit.yaml +0 -0
  12. {haliax-1.4.dev410 → haliax-1.4.dev411}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
  13. {haliax-1.4.dev410 → haliax-1.4.dev411}/.github/workflows/run_tests.yaml +0 -0
  14. {haliax-1.4.dev410 → haliax-1.4.dev411}/.gitignore +0 -0
  15. {haliax-1.4.dev410 → haliax-1.4.dev411}/.playbooks/add-types.md +0 -0
  16. {haliax-1.4.dev410 → haliax-1.4.dev411}/.playbooks/wrap-non-named.md +0 -0
  17. {haliax-1.4.dev410 → haliax-1.4.dev411}/.pre-commit-config.yaml +0 -0
  18. {haliax-1.4.dev410 → haliax-1.4.dev411}/.readthedocs.yaml +0 -0
  19. {haliax-1.4.dev410 → haliax-1.4.dev411}/AGENTS.md +0 -0
  20. {haliax-1.4.dev410 → haliax-1.4.dev411}/AUTHORS.md +0 -0
  21. {haliax-1.4.dev410 → haliax-1.4.dev411}/CONTRIBUTING.md +0 -0
  22. {haliax-1.4.dev410 → haliax-1.4.dev411}/CONTRIBUTORS.md +0 -0
  23. {haliax-1.4.dev410 → haliax-1.4.dev411}/LICENSE +0 -0
  24. {haliax-1.4.dev410 → haliax-1.4.dev411}/README.md +0 -0
  25. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/broadcasting.md +0 -0
  26. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/cheatsheet.md +0 -0
  27. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/css/material.css +0 -0
  28. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/css/mkdocstrings.css +0 -0
  29. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/faq.md +0 -0
  30. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/data_parallel_mesh.png +0 -0
  31. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/data_parallel_mesh_replicated.png +0 -0
  32. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_1d.png +0 -0
  33. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_1d_zero.png +0 -0
  34. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d.png +0 -0
  35. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
  36. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
  37. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
  38. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
  39. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/figures/device_mesh_2d_zero.png +0 -0
  40. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/fp8.md +0 -0
  41. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/index.md +0 -0
  42. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/indexing.md +0 -0
  43. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/matmul.md +0 -0
  44. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/nn.md +0 -0
  45. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/partitioning.md +0 -0
  46. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/primer.md +0 -0
  47. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/rearrange.ipynb +0 -0
  48. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/rearrange.md +0 -0
  49. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/requirements.txt +0 -0
  50. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/scan.md +0 -0
  51. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/state-dict.md +0 -0
  52. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/tutorial.md +0 -0
  53. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/typing.md +0 -0
  54. {haliax-1.4.dev410 → haliax-1.4.dev411}/docs/vmap.md +0 -0
  55. {haliax-1.4.dev410 → haliax-1.4.dev411}/etc/license_header.txt +0 -0
  56. {haliax-1.4.dev410 → haliax-1.4.dev411}/mkdocs.yml +0 -0
  57. {haliax-1.4.dev410 → haliax-1.4.dev411}/pyproject.toml +0 -0
  58. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/__init__.py +0 -0
  59. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/compile_utils.py +0 -0
  60. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/dot.py +0 -0
  61. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/einsum.py +0 -0
  62. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/fp8.py +0 -0
  63. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/parsing.py +0 -0
  64. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/rearrange.py +0 -0
  65. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/scan.py +0 -0
  66. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/state_dict.py +0 -0
  67. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/_src/util.py +0 -0
  68. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/axis.py +0 -0
  69. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/core.py +0 -0
  70. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/debug.py +0 -0
  71. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/field.py +0 -0
  72. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/haxtyping.py +0 -0
  73. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/hof.py +0 -0
  74. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/jax_utils.py +0 -0
  75. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/__init__.py +0 -0
  76. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/activations.py +0 -0
  77. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/attention.py +0 -0
  78. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/conv.py +0 -0
  79. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/dropout.py +0 -0
  80. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/embedding.py +0 -0
  81. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/linear.py +0 -0
  82. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/loss.py +0 -0
  83. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/mlp.py +0 -0
  84. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/normalization.py +0 -0
  85. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/pool.py +0 -0
  86. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/nn/scan.py +0 -0
  87. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/partitioning.py +0 -0
  88. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/quantization.py +0 -0
  89. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/random.py +0 -0
  90. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/specialized_fns.py +0 -0
  91. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/state_dict.py +0 -0
  92. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/tree_util.py +0 -0
  93. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/types.py +0 -0
  94. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/util.py +0 -0
  95. {haliax-1.4.dev410 → haliax-1.4.dev411}/src/haliax/wrap.py +0 -0
  96. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/core_test.py +0 -0
  97. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_attention.py +0 -0
  98. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_axis.py +0 -0
  99. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_bitwise_ops.py +0 -0
  100. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_conv.py +0 -0
  101. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_debug.py +0 -0
  102. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_dot.py +0 -0
  103. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_dtype_typing.py +0 -0
  104. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_einsum.py +0 -0
  105. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_field.py +0 -0
  106. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_fp8.py +0 -0
  107. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_hof.py +0 -0
  108. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_int8.py +0 -0
  109. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_moe_linear.py +0 -0
  110. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_namedarray_typing.py +0 -0
  111. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_nan_reductions.py +0 -0
  112. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_nn.py +0 -0
  113. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_parsing.py +0 -0
  114. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_partitioning.py +0 -0
  115. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_pool.py +0 -0
  116. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_random.py +0 -0
  117. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_rearrange.py +0 -0
  118. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_scan.py +0 -0
  119. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_scatter_gather.py +0 -0
  120. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_specialized_fns.py +0 -0
  121. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_state_dict.py +0 -0
  122. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_tree_util.py +0 -0
  123. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_utils.py +0 -0
  124. {haliax-1.4.dev410 → haliax-1.4.dev411}/tests/test_visualize_sharding.py +0 -0
  125. {haliax-1.4.dev410 → haliax-1.4.dev411}/uv.lock +0 -0
@@ -107,7 +107,7 @@ APIs that don't translate well to named tensors are intentionally omitted here.
107
107
  - [x] `nanstd`
108
108
  - [x] `nansum`
109
109
  - [x] `nanvar`
110
- - [ ] `nonzero`
110
+ - [x] `nonzero`
111
111
  - [ ] `ogrid`
112
112
  - [x] `packbits`
113
113
  - [ ] `partition`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haliax
3
- Version: 1.4.dev410
3
+ Version: 1.4.dev411
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/
@@ -283,6 +283,7 @@ These are all more or less directly from JAX's NumPy API.
283
283
  ::: haliax.pad
284
284
  ::: haliax.searchsorted
285
285
  ::: haliax.top_k
286
+ ::: haliax.nonzero
286
287
  ::: haliax.trace
287
288
  ::: haliax.tril
288
289
  ::: haliax.triu
@@ -3,4 +3,4 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
 
6
- __version__ = "1.4.dev410"
6
+ __version__ = "1.4.dev411"
@@ -84,6 +84,7 @@ from .ops import (
84
84
  trace,
85
85
  tril,
86
86
  triu,
87
+ nonzero,
87
88
  unique,
88
89
  unique_values,
89
90
  unique_counts,
@@ -1199,6 +1200,7 @@ __all__ = [
1199
1200
  "map",
1200
1201
  "vmap",
1201
1202
  "trace",
1203
+ "nonzero",
1202
1204
  "where",
1203
1205
  "unique",
1204
1206
  "unique_values",
@@ -108,6 +108,30 @@ def where(
108
108
  return NamedArray(raw, condition.axes)
109
109
 
110
110
 
111
+ def nonzero(array: NamedArray, *, size: Axis, fill_value: int = 0) -> tuple[NamedArray, ...]:
112
+ """Like :func:`jax.numpy.nonzero`, but with named axes.
113
+
114
+ Args:
115
+ array: The input array to test for nonzero values. Must be a :class:`NamedArray`.
116
+ size: Axis specifying the size of the output axis. This is required because
117
+ JAX requires the size of the result at tracing time.
118
+ fill_value: Value used to fill the output when fewer than ``size`` elements are
119
+ nonzero. Defaults to ``0``.
120
+
121
+ Returns:
122
+ A tuple of :class:`NamedArray` objects, one for each axis of ``array``. Each
123
+ returned array has ``size`` as its only axis and contains the indices of the
124
+ nonzero elements along the corresponding input axis.
125
+ """
126
+
127
+ if not isinstance(array, NamedArray):
128
+ raise ValueError("array must be a NamedArray")
129
+
130
+ return tuple(
131
+ NamedArray(idx, (size,)) for idx in jnp.nonzero(array.array, size=size.size, fill_value=fill_value)
132
+ )
133
+
134
+
111
135
  def clip(array: NamedOrNumeric, a_min: NamedOrNumeric, a_max: NamedOrNumeric) -> NamedArray:
112
136
  """Like jnp.clip, but with named axes. This version currently only accepts the three argument form."""
113
137
  (array, a_min, a_max), axes = broadcast_arrays_and_return_axes(array, a_min, a_max)
@@ -161,6 +161,29 @@ def test_where(use_jit):
161
161
  assert jnp.all(unnamed_8 == named8.array)
162
162
 
163
163
 
164
+ @pytest.mark.parametrize("use_jit", [False, True])
165
+ def test_nonzero(use_jit):
166
+ Height = Axis("Height", 3)
167
+ Width = Axis("Width", 4)
168
+
169
+ data = jnp.array([[0, 1, 0, 2], [3, 0, 4, 0], [0, 0, 5, 6]])
170
+ named = hax.named(data, (Height, Width))
171
+
172
+ Nonzero = Axis("Nonzero", Height.size * Width.size)
173
+
174
+ hax_nonzero: Callable = hax.nonzero
175
+ if use_jit:
176
+ hax_nonzero = hax.named_jit(hax_nonzero)
177
+
178
+ i, j = hax_nonzero(named, size=Nonzero, fill_value=-1)
179
+ ui, uj = jnp.nonzero(data, size=Nonzero.size, fill_value=-1)
180
+
181
+ assert i.axes == (Nonzero,)
182
+ assert j.axes == (Nonzero,)
183
+ assert jnp.all(i.array == ui)
184
+ assert jnp.all(j.array == uj)
185
+
186
+
164
187
  def test_clip():
165
188
  Height = Axis("Height", 10)
166
189
  Width = Axis("Width", 3)
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