Coverage for src / bartz / jaxext / __init__.py: 91%
102 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-13 00:35 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-13 00:35 +0000
1# bartz/src/bartz/jaxext/__init__.py
2#
3# Copyright (c) 2024-2026, The Bartz Contributors
4#
5# This file is part of bartz.
6#
7# Permission is hereby granted, free of charge, to any person obtaining a copy
8# of this software and associated documentation files (the "Software"), to deal
9# in the Software without restriction, including without limitation the rights
10# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11# copies of the Software, and to permit persons to whom the Software is
12# furnished to do so, subject to the following conditions:
13#
14# The above copyright notice and this permission notice shall be included in all
15# copies or substantial portions of the Software.
16#
17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23# SOFTWARE.
25"""Additions to jax."""
27import math
28from collections.abc import Sequence
29from contextlib import nullcontext
30from functools import partial
32import jax
33from jax import (
34 Device,
35 debug_key_reuse,
36 device_count,
37 ensure_compile_time_eval,
38 jit,
39 random,
40 vmap,
41)
42from jax import numpy as jnp
43from jax.dtypes import prng_key
44from jax.lax import scan
45from jax.scipy.special import ndtr
46from jaxtyping import Array, Bool, Float32, Key, Scalar, Shaped
48from bartz.jaxext._autobatch import autobatch # noqa: F401
49from bartz.jaxext.scipy.special import ndtri
52def vmap_nodoc(fun, *args, **kw):
53 """
54 Acts like `jax.vmap` but preserves the docstring of the function unchanged.
56 This is useful if the docstring already takes into account that the
57 arguments have additional axes due to vmap.
58 """
59 doc = fun.__doc__
60 fun = jax.vmap(fun, *args, **kw)
61 fun.__doc__ = doc
62 return fun
65def minimal_unsigned_dtype(value):
66 """Return the smallest unsigned integer dtype that can represent `value`."""
67 if value < 2**8: 2J d e Z K 2 sctcuc;s}s~s=sk ata bto vkwk?sxkyk@sL b l 0 1 dbM f N O zk3 P Ak4 Q h R S i 5 BkCk[sDkEk]sFkVcGkHkIk^sw T U xcJk_sp j q yczcWcV c m W X KkLk`sv Mkrbsbtb6 ub8ss Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pcct9sdt!set#sft$s%s{s'sy + , z A hbB C D E F H ibx gt(s)s*s+s,s-s.s/s:shtitjtktjbkblbmbI nbobpbwbltxbmtybzbntAbBbotpt
68 return jnp.uint8 2J d e Z K 2 sctcuc}s~sk ata bto vkwk?sxkyk@sL b l 0 1 dbM f N O zk3 P Ak4 Q h R S i 5 BkCk[sDkEk]sFkVcGkHkIk^sw T U xcJk_sp j q yczcWcV c m W X KkLk`sv Mkrbsbtb6 ub8ss Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pcct9sdt!set#sft$s%s'sy + , z A hbB C D E F H ibx gt(s)s*s+s,s-s.s/s:shtitjtktjbkblbmbI nbobpbwbltxbmtybzbntAbBbotpt
69 if value < 2**16: 69 ↛ 71line 69 didn't jump to line 71 because the condition on line 69 was always true2J d e Z K sctcuc;s=sk a o vkwkxkykL b 0 1 M f O zkP AkQ h R S i BkCkDkEkFkVcHkIkw T U Jkp j q yczcV c W X KkLkv Mk6 8s9s!s#s$s%s{s's(s)s*s+s,s-s.s/s:s
70 return jnp.uint16 2J d e Z K sctcuc;s=sk a o vkwkxkykL b 0 1 M f O zkP AkQ h R S i BkCkDkEkFkVcHkIkw T U Jkp j q yczcV c W X KkLkv Mk6 8s9s!s#s$s%s{s's(s)s*s+s,s-s.s/s:s
71 if value < 2**32:
72 return jnp.uint32
73 return jnp.uint64
76@partial(jax.jit, static_argnums=(1,))
77def unique(
78 x: Shaped[Array, ' _'], size: int, fill_value: Scalar
79) -> tuple[Shaped[Array, ' {size}'], int]:
80 """
81 Restricted version of `jax.numpy.unique` that uses less memory.
83 Parameters
84 ----------
85 x
86 The input array.
87 size
88 The length of the output.
89 fill_value
90 The value to fill the output with if `size` is greater than the number
91 of unique values in `x`.
93 Returns
94 -------
95 out : Shaped[Array, '{size}']
96 The unique values in `x`, sorted, and right-padded with `fill_value`.
97 actual_length : int
98 The number of used values in `out`.
99 """
100 if x.size == 0: 2e a b l c m qt|svcwcwbxbybzbAbBb
101 return jnp.full(size, fill_value, x.dtype), 0 2qt
102 if size == 0: 2e a b l c m |svcwcwbxbybzbAbBb
103 return jnp.empty(0, x.dtype), 0 2|s
104 x = jnp.sort(x) 2e a b l c m vcwcwbxbybzbAbBb
106 def loop(carry, x): 2e a b l c m vcwcwbxbybzbAbBb
107 i_out, last, out = carry 2e a b l c m vcwcwbxbybzbAbBb
108 i_out = jnp.where(x == last, i_out, i_out + 1) 2e a b l c m vcwcwbxbybzbAbBb
109 out = out.at[i_out].set(x) 2e a b l c m vcwcwbxbybzbAbBb
110 return (i_out, x, out), None 2e a b l c m vcwcwbxbybzbAbBb
112 carry = 0, x[0], jnp.full(size, fill_value, x.dtype) 2e a b l c m vcwcwbxbybzbAbBb
113 (actual_length, _, out), _ = scan(loop, carry, x[:size]) 2e a b l c m vcwcwbxbybzbAbBb
114 return out, actual_length + 1 2e a b l c m vcwcwbxbybzbAbBb
117class split:
118 """
119 Split a key into `num` keys.
121 Parameters
122 ----------
123 key
124 The key to split.
125 num
126 The number of keys to split into.
128 Notes
129 -----
130 Unlike `jax.random.split`, this class supports a vector of keys as input. In
131 this case, it behaves as if everything had been vmapped over, so `keys.pop`
132 has an additional initial output dimension equal to the number of input
133 keys, and the deterministic dependency respects this axis.
134 """
136 _keys: tuple[Key[Array, '*batch'], ...]
137 _num_used: int
139 def __init__(self, key: Key[Array, '*batch'], num: int = 2):
140 if key.ndim: 2J - d Gbe qbZ . K Hb2 IbTcNkOkk a o / JbKb: LbMbL ; b Nbl ObPbPk0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw QkT RkU SkTkUk} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW VkX Wkcb+b,bv Xkrbsbtb6 ubYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^qUc_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+rr ,r-r.rn /rs Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pc-b:r.b;r/b=r:b?r;b@r=b[r?b]r@b^r[b_r]b`r^b{r_b|r`b}r{b~r|bas}bbsy ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnccsdsesfsgshsisjsksY lsocmsnsospspcqsvbrssstsusjbvskbwslbxsmbysI zsnbAsobBspbCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsqcUsVsWsrcXsYsZs0s1s2s3s4s5s6s7s
141 context = debug_key_reuse(False) 1deK2nx
142 else:
143 context = nullcontext() 2J - d Gbe qbZ . K Hb2 IbTcNkOkk a o / JbKb: LbMbL ; b Nbl ObPbPk0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw QkT RkU SkTkUk} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW VkX Wkcb+b,bv Xkrbsbtb6 ubYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^qUc_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+rr ,r-r.rn /rs Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pc-b:r.b;r/b=r:b?r;b@r=b[r?b]r@b^r[b_r]b`r^b{r_b|r`b}r{b~r|bas}bbsy ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnccsdsesfsgshsisjsksY lsocmsnsospspcqsvbrssstsusjbvskbwslbxsmbysI zsnbAsobBspbCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsqcUsVsWsrcXsYsZs0s1s2s3s4s5s6s7s
144 with context: 2J - d Gbe qbZ . K Hb2 IbTcNkOkk a o / JbKb: LbMbL ; b Nbl ObPbPk0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw QkT RkU SkTkUk} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW VkX Wkcb+b,bv Xkrbsbtb6 ubYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^qUc_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+rr ,r-r.rn /rs Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pc-b:r.b;r/b=r:b?r;b@r=b[r?b]r@b^r[b_r]b`r^b{r_b|r`b}r{b~r|bas}bbsy ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnccsdsesfsgshsisjsksY lsocmsnsospspcqsvbrssstsusjbvskbwslbxsmbysI zsnbAsobBspbCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsqcUsVsWsrcXsYsZs0s1s2s3s4s5s6s7s
145 # jitted-vmapped key split seems to be triggering a false positive
146 # with key reuse checks
147 self._keys = _split_unpack(key, num) 2J - d Gbe qbZ . K Hb2 IbTcNkOkk a o / JbKb: LbMbL ; b Nbl ObPbPk0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw QkT RkU SkTkUk} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW VkX Wkcb+b,bv Xkrbsbtb6 ubYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^qUc_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+rr ,r-r.rn /rs Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pc-b:r.b;r/b=r:b?r;b@r=b[r?b]r@b^r[b_r]b`r^b{r_b|r`b}r{b~r|bas}bbsy ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnccsdsesfsgshsisjsksY lsocmsnsospspcqsvbrssstsusjbvskbwslbxsmbysI zsnbAsobBspbCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsqcUsVsWsrcXsYsZs0s1s2s3s4s5s6s7s
148 self._num_used = 0 2J - d Gbe qbZ . K Hb2 IbTcNkOkk a o / JbKb: LbMbL ; b Nbl ObPbPk0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw QkT RkU SkTkUk} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW VkX Wkcb+b,bv Xkrbsbtb6 ubYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^qUc_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+rr ,r-r.rn /rs Ac7 Bc8 Cc9 Dc! Ec# Fc$ Gc% Hc' Ic( Jc) Kc* LcebMcfbNcgbOcG Pc-b:r.b;r/b=r:b?r;b@r=b[r?b]r@b^r[b_r]b`r^b{r_b|r`b}r{b~r|bas}bbsy ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnccsdsesfsgshsisjsksY lsocmsnsospspcqsvbrssstsusjbvskbwslbxsmbysI zsnbAsobBspbCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsqcUsVsWsrcXsYsZs0s1s2s3s4s5s6s7s
150 def __len__(self):
151 return len(self._keys) - self._num_used 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jstttpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
153 def pop(self, shape: int | tuple[int, ...] = ()) -> Key[Array, '*batch {shape}']:
154 """
155 Pop one or more keys from the list.
157 Parameters
158 ----------
159 shape
160 The shape of the keys to pop. If empty (default), a single key is
161 popped and returned. If not empty, the popped key is split and
162 reshaped to the target shape.
164 Returns
165 -------
166 The popped keys as a jax array with the requested shape.
168 Raises
169 ------
170 IndexError
171 If the list is empty.
172 """
173 if len(self) == 0: 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
174 msg = 'No keys left to pop' 1n
175 raise IndexError(msg) 1n
176 if not isinstance(shape, tuple): 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
177 shape = (shape,) 2n DbEbFbY vbQcRcSc
178 key = self._keys[self._num_used] 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
179 self._num_used += 1 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
180 if shape: 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
181 key = _split_shaped(key, shape) 2J d e k a o L b l M f N O 3 P 4 Q h R S i 5 w T U p j q V c m W X v Cbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG y + , z A hbB C D E F H ibx DbEbFbY vbQcRcScjbkblbmbI nbobpb
182 return key 2J - d Gbe qbZ . K Hb2 Ibsctcuck a o / JbKb: LbMbL ; b Nbl ObPb0 = 1 QbdbRbM ? f SbN TbO @ Ub3 VbP [ Wb4 XbQ ] h YbR ZbS ^ i 0b5 1b_ 2b3b` 4b5b{ 6b7b| 8b9bw T U xcXc} !b#bp ~ j $bq %bab'b(bV bbc )bm *bW X cb+b,bv YcrbZcsbtb6 ub0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,jt u r -jCbn s 7 8 9 ! # $ % ' ( ) * ebfbgbG -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}by ~b+ ac, bcz ccA dchbecB fcC gcD hcE icF jcH kciblcx mcnc.jDb/j:j;jEbFb=j?jY oc@j[jpcvbQcRcScjbkblbmbI nbobpb]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikqcjkkkrclkmknkokpkqkrksktkuk
185@partial(jit, static_argnums=(1,))
186def _split_unpack(
187 key: Key[Array, '*batch'], num: int
188) -> tuple[Key[Array, '*batch'], ...]:
189 if key.ndim == 0: 2d e qbTck o w p q Ucn s x
190 keys = random.split(key, num) 2e qbTck o w p q Ucn s
191 elif key.ndim == 1: 191 ↛ 193line 191 didn't jump to line 193 because the condition on line 191 was always true1denx
192 keys = vmap(random.split, in_axes=(0, None), out_axes=1)(key, num) 1denx
193 return tuple(keys) 2d e qbTck o w p q Ucn s x
196@partial(jit, static_argnums=(1,))
197def _split_shaped(
198 key: Key[Array, '*batch'], shape: tuple[int, ...]
199) -> Key[Array, '*batch {shape}']:
200 num = math.prod(shape) 2e k a o p q v Cbn s G y DbEbFbY I
201 if key.ndim == 0: 201 ↛ 203line 201 didn't jump to line 203 because the condition on line 201 was always true2e k a o p q v Cbn s G y DbEbFbY I
202 keys = random.split(key, num) 2e k a o p q v Cbn s G y DbEbFbY I
203 elif key.ndim == 1:
204 keys = vmap(random.split, in_axes=(0, None))(key, num)
205 return keys.reshape(*key.shape, *shape) 2e k a o p q v Cbn s G y DbEbFbY I
208def truncated_normal_onesided(
209 key: Key[Array, ''],
210 shape: Sequence[int],
211 upper: Bool[Array, '*'],
212 bound: Float32[Array, '*'],
213 *,
214 clip: bool = True,
215) -> Float32[Array, '*']:
216 """
217 Sample from a one-sided truncated standard normal distribution.
219 Parameters
220 ----------
221 key
222 JAX random key.
223 shape
224 Shape of output array, broadcasted with other inputs.
225 upper
226 True for (-∞, bound], False for [bound, ∞).
227 bound
228 The truncation boundary.
229 clip
230 Whether to clip the truncated uniform samples to (0, 1) before
231 transforming them to truncated normal. Intended for debugging purposes.
233 Returns
234 -------
235 Array of samples from the truncated normal distribution.
236 """
237 # Pseudocode:
238 # | if upper:
239 # | if bound < 0:
240 # | ndtri(uniform(0, ndtr(bound))) =
241 # | ndtri(ndtr(bound) * u)
242 # | if bound > 0:
243 # | -ndtri(uniform(ndtr(-bound), 1)) =
244 # | -ndtri(ndtr(-bound) + ndtr(bound) * (1 - u))
245 # | if not upper:
246 # | if bound < 0:
247 # | ndtri(uniform(ndtr(bound), 1)) =
248 # | ndtri(ndtr(bound) + ndtr(-bound) * (1 - u))
249 # | if bound > 0:
250 # | -ndtri(uniform(0, ndtr(-bound))) =
251 # | -ndtri(ndtr(-bound) * u)
252 shape = jnp.broadcast_shapes(shape, upper.shape, bound.shape) 1dabfhijctur
253 bound_pos = bound > 0 1dabfhijctur
254 ndtr_bound = ndtr(bound) 1dabfhijctur
255 ndtr_neg_bound = ndtr(-bound) 1dabfhijctur
256 scale = jnp.where(upper, ndtr_bound, ndtr_neg_bound) 1dabfhijctur
257 shift = jnp.where(upper, ndtr_neg_bound, ndtr_bound) 1dabfhijctur
258 u = random.uniform(key, shape) 1dabfhijctur
259 left_u = scale * (1 - u) # ~ uniform in (0, ndtr(±bound)] 1dabfhijctur
260 right_u = shift + scale * u # ~ uniform in [ndtr(∓bound), 1) 1dabfhijctur
261 truncated_u = jnp.where(upper ^ bound_pos, left_u, right_u) 1dabfhijctur
262 if clip: 1dabfhijctur
263 # on gpu the accuracy is lower and sometimes u can reach the boundaries
264 zero = jnp.zeros((), truncated_u.dtype) 1dabfhijctu
265 one = jnp.ones((), truncated_u.dtype) 1dabfhijctu
266 truncated_u = jnp.clip( 1dabfhijctu
267 truncated_u, jnp.nextafter(zero, one), jnp.nextafter(one, zero)
268 )
269 truncated_norm = ndtri(truncated_u) 1dabfhijctur
270 return jnp.where(bound_pos, -truncated_norm, truncated_norm) 1dabfhijctur
273def get_default_device() -> Device:
274 """Get the current default JAX device."""
275 with ensure_compile_time_eval(): 2g - . k / : ; = ? f N @ [ ] ^ _ ` { VcGk| } ~ ycabzcWcbbcbAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcz A B C D E F H rt
276 return jnp.zeros(()).device 2g - . k / : ; = ? f N @ [ ] ^ _ ` { VcGk| } ~ ycabzcWcbbcbAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcz A B C D E F H rt
279def get_device_count() -> int:
280 """Get the number of available devices on the default platform."""
281 device = get_default_device() 2- . k / : ; = ? @ [ ] ^ _ ` { | } ~ ycabzcWcbbcbz A B C D E F H
282 return device_count(device.platform) 2- . k / : ; = ? @ [ ] ^ _ ` { | } ~ ycabzcWcbbcbz A B C D E F H
285def is_key(x: object) -> bool:
286 """Determine if `x` is a jax random key."""
287 return isinstance(x, Array) and jnp.issubdtype(x.dtype, prng_key) 2J d e Z K 2 k a o vkwk?sxkyk@sL b l 0 1 dbM f N O zk3 P Ak4 Q h R S i 5 BkCk[sDkEk]sFkVcGkHkIk^sw T U xcJk_sp j q yczcWcV c m W X KkLk`sv MkCbs 7 8 9 ! # $ % ' ( ) * y + , z A B C D E F x