
    uki

                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	  G d d      Z
 e	j                  e
e
j                  e
j                         y	)
zA bounded functional stack implementation.

Used as a helper for expressing recursive algorithms such as QDWH-eig for
Eigendecomposition on TPU.
    )annotations)Any)lax)numpy)	tree_utilc                  \    e Zd ZdZd Zd Zedd       ZddZddZ	ddZ
d Zed	        Zy
)StackzCA bounded functional stack implementation. Elements may be pytrees.c                     || _         || _        y)zPrivate constructor.N_size_data)selfsizedatas      T/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/tpu/linalg/stack.py__init__zStack.__init__    s    DJDJ    c                <    d| j                    d| j                   dS )NzStack(z, )r   r   s    r   __repr__zStack.__repr__%   s    DJJ<r$**Q//r   c                r     t        t        j                  dd      t        j                   fd|            S )zCreates a stack with size `capacity` with elements like `prototype`.

    `prototype` can be any JAX pytree. This function looks only at its
    structure; the specific values are ignored.
    r   int32c                r    t        j                  ft        | j                        z   | j                        S N)jnpzerostupleshapedtype)xcapacitys    r   <lambda>zStack.create.<locals>.<lambda>2   s%    #))XK%.8!''B r   )r	   r   arrayr   tree_map)r"   	prototypes   ` r   createzStack.create(   s6     	ii7BIOP Pr   c                     | j                   dk(  S )z#Returns true if the stack is empty.r   )r   r   s    r   emptyzStack.empty4   s    ::?r   c                z     t         j                  dz   t        j                   fd j                  |            S )z:Pushes `elem` onto the stack, returning the updated stack.   c                H    t        j                  | |j                  d      S )Nr   )r   dynamic_update_index_in_dimr   )r!   yr   s     r   r#   zStack.push.<locals>.<lambda>=   s    S44Q4::qI r   )r	   r   r   r%   r   r   elems   ` r   pushz
Stack.push8   s5    
jj1nI

D r   c                     t        j                   fd j                        }|t         j                  dz
   j                        fS )z=Pops from the stack, returning an (elem, updated stack) pair.c                P    t        j                  | j                  dz
  dd      S )Nr+   r   F)keepdims)r   dynamic_index_in_dimr   )r!   r   s    r   r#   zStack.pop.<locals>.<lambda>C   s     ((DJJNAN r   r+   )r   r%   r   r	   r   r/   s   ` r   popz	Stack.pop@   s=    N
jjD tzzA~tzz222r   c                j    t        j                  | j                        \  }}| j                  g|z   |fS r   )r   tree_flattenr   r   )r   leavestreedefs      r   flattenzStack.flattenG   s0    ,,TZZ8OFGZZL6!G++r   c           	     N    t        |d   t        j                  | |dd              S )Nr   r+   )r	   r   tree_unflatten)r:   r9   s     r   	unflattenzStack.unflattenK   s&    I44WfQRjIJJr   N)r"   intr&   r   returnr	   )r@   r   )r0   r   r@   r	   )r@   ztuple[Any, Stack])__name__
__module____qualname____doc__r   r   staticmethodr'   r)   r1   r6   r;   r>    r   r   r	   r	      sO    K
0 	P 	P3, K Kr   r	   N)rD   
__future__r   typingr   jax._srcr   r   r   r   r	   register_pytree_noder;   r>   rF   r   r   <module>rK      sF    #   ! /K /Kb 	  uemmU__ Er   