Skip to content

Commit ed1220e

Browse files
mblondelOptaxDev
authored andcommitted
Add tree_max.
PiperOrigin-RevId: 689070753
1 parent 6da1711 commit ed1220e

4 files changed

Lines changed: 30 additions & 0 deletions

File tree

docs/api/utilities.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ Tree
100100
tree_l1_norm
101101
tree_l2_norm
102102
tree_map_params
103+
tree_max
103104
tree_mul
104105
tree_ones_like
105106
tree_random_like
@@ -156,6 +157,10 @@ Tree map parameters
156157
~~~~~~~~~~~~~~~~~~~
157158
.. autofunction:: tree_map_params
158159

160+
Tree max
161+
~~~~~~~~
162+
.. autofunction:: tree_max
163+
159164
Tree multiply
160165
~~~~~~~~~~~~~
161166
.. autofunction:: tree_mul

optax/tree_utils/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from optax.tree_utils._tree_math import tree_full_like
3333
from optax.tree_utils._tree_math import tree_l1_norm
3434
from optax.tree_utils._tree_math import tree_l2_norm
35+
from optax.tree_utils._tree_math import tree_max
3536
from optax.tree_utils._tree_math import tree_mul
3637
from optax.tree_utils._tree_math import tree_ones_like
3738
from optax.tree_utils._tree_math import tree_scalar_mul

optax/tree_utils/_tree_math.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,20 @@ def tree_sum(tree: Any) -> chex.Numeric:
168168
return jax.tree.reduce(operator.add, sums, initializer=0)
169169

170170

171+
def tree_max(tree: Any) -> chex.Numeric:
172+
"""Compute the max of all the elements in a pytree.
173+
174+
Args:
175+
tree: pytree.
176+
177+
Returns:
178+
a scalar value.
179+
"""
180+
maxes = jax.tree.map(jnp.max, tree)
181+
# initializer=-jnp.inf should work but pytype wants a jax.Array.
182+
return jax.tree.reduce(jnp.maximum, maxes, initializer=jnp.array(-jnp.inf))
183+
184+
171185
def _square(leaf):
172186
return jnp.square(leaf.real) + jnp.square(leaf.imag)
173187

optax/tree_utils/_tree_math_test.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ def test_tree_sum(self):
133133
got = tu.tree_sum(self.tree_a)
134134
np.testing.assert_allclose(expected, got)
135135

136+
@parameterized.parameters(
137+
'array_a', 'tree_a', 'tree_a_dict', 'tree_b', 'tree_b_dict'
138+
)
139+
def test_tree_max(self, key):
140+
tree = self.data[key]
141+
values, _ = flatten_util.ravel_pytree(tree)
142+
expected = jnp.max(values)
143+
got = tu.tree_max(tree)
144+
np.testing.assert_allclose(expected, got)
145+
136146
def test_tree_l2_norm(self):
137147
expected = jnp.sqrt(jnp.vdot(self.array_a, self.array_a).real)
138148
got = tu.tree_l2_norm(self.array_a)

0 commit comments

Comments
 (0)