
    qi=                        U d dl mZmZmZ d dlZd dlZd dlmZmZm	Z	m
Z
 d dlmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ ej        Zeed<   ej        Zeed	<    e	d
          Z e	d          Ze
 G d de                      Z  ej!        d           G d d                      Z" ej!        d           G d de                       Z#dee          de fdZ$ ej!        d           G d de                       Z% ej!        d           G d de                       Z& ej!        d           G d de                       Z' ej!        d           G d de                       Z( ej!        d           G d d e                       Z) ej!        d           G d! d"e                       Z* ej!        d           G d# d$e                       Z+ ej!        d           G d% d&e                       Z, ej!        d           G d' d(e                       Z- ej!        d           G d) d*e                       Z. ej!        d           G d+ d,e                       Z/ ej!        d           G d- d.e                       Z0 ej!        d           G d/ d0e                       Z1d1ej        de2fd2Z3d1e2dej        fd3Z4d4ee5e5dz  f         d1ej        dej        fd5Z6d6d7d1ej        e         d8ej        e         d9eeegef         d:e7dej        e         f
d;Z8dHd>ej9        d?e:d@e:dAe;dej9        f
dBZ<dCe:de=e7dDf         fdEZ>dFej        e         ddfdGZ?dS )I    )CallableMappingSequenceN)Protocol	TypeAliasTypeVarruntime_checkable)image_tools)	tokenizer)array_typing)	normalizeDataDict	NormStatsTSc                       e Zd ZdedefdZdS )DataTransformFndatareturnc                     dS )a  Apply transformation to the data.

        Args:
            data: The data to apply the transform to. This is a possibly nested dictionary that contains
                unbatched data elements. Each leaf is expected to be a numpy array. Using JAX arrays is allowed
                but not recommended since it may result in extra GPU memory usage inside data loader worker
                processes.

        Returns:
            The transformed data. Could be the input `data` that was modified in place, or a new data structure.
        N selfr   s     2/home/robot-lab/Pi0.5_yam/src/openpi/transforms.py__call__zDataTransformFn.__call__   s          N)__name__
__module____qualname__r   r   r   r   r   r   r      s6        X (      r   r   T)frozenc                   |    e Zd ZU dZdZee         ed<   dZee         ed<   ddddee         dee         dd fdZ	dS )	GroupzA group of transforms.r   inputsoutputsr#   r$   r   c                L    t          g | j        |R g || j        R           S )a4  Append transforms to the group and return a new group.

        Args:
            inputs: Appended to the *end* of the current input transforms.
            outputs: Appended to the *beginning* of the current output transforms.

        Returns:
            A new group with the appended transforms.
        r%   )r"   r#   r$   )r   r#   r$   s      r   pushz
Group.push1   s7     3dk3F33=Vw=V=V=VWWWWr   N)
r   r   r   __doc__r#   r   r   __annotations__r$   r'   r   r   r   r"   r"   '   s            )+FH_%*** *,GXo&+++:<ce 
X 
X 
Xh7 
XxP_G` 
Xjq 
X 
X 
X 
X 
X 
Xr   r"   c                   :    e Zd ZU dZee         ed<   dedefdZdS )CompositeTransformzEA composite transform that applies a sequence of transforms in order.
transformsr   r   c                 0    | j         D ]} ||          }|S Nr,   )r   r   	transforms      r   r   zCompositeTransform.__call__D   s'     	# 	#I9T??DDr   N)	r   r   r   r(   r   r   r)   r   r   r   r   r   r+   r+   >   sO         OO))))X (      r   r+   r,   r   c                      t          |           S )z9Compose a sequence of transforms into a single transform.)r+   r/   s    r   composer2   J   s    j)))r   c                   D    e Zd ZU dZej        e         ed<   dedefdZ	dS )RepackTransforma  Repacks an input dictionary into a new dictionary.

    Repacking is defined using a dictionary where the keys are the new keys and the values
    are the flattened paths to the old keys. We use '/' as the separator during flattening.

    Example:
    {
        "images": {
            "cam_high": "observation.images.top",
            "cam_low": "observation.images.bottom",
        },
        "state": "observation.state",
        "actions": "action",
    }
    	structurer   r   c                 r    t          |          t          j                            fd| j                  S )Nc                     |          S r.   r   )k	flat_items    r   <lambda>z*RepackTransform.__call__.<locals>.<lambda>e   s    il r   )flatten_dictjaxtreemapr5   )r   r   r9   s     @r   r   zRepackTransform.__call__c   s2     &&	x||2222DNCCCr   N)
r   r   r   r(   atPyTreestrr)   r   r   r   r   r   r4   r4   O   s^            y~DX D( D D D D D Dr   r4   c                   0    e Zd ZU edz  ed<   dedefdZdS )InjectDefaultPromptNpromptr   r   c                 T    | j          d|vrt          j        | j                   |d<   |S )NrD   )rD   npasarrayr   s     r   r   zInjectDefaultPrompt.__call__l   s.    ;"xt';';Z44DNr   )r   r   r   rA   r)   r   r   r   r   r   rC   rC   h   sH         $JX (      r   rC   c                       e Zd ZU ej        e         dz  ed<   dZeed<   dZ	eed<   d Z
dedefd	Zd
efdZd
efdZdS )	NormalizeN
norm_statsFuse_quantilesstrictc                 R    | j         | j        rt          | j                    d S d S d S r.   rJ   rK   _assert_quantile_statsr   s    r   __post_init__zNormalize.__post_init__z   6    ?&4+=&"4?33333 '&&&r   r   r   c                 t    | j         |S t          || j         | j        r| j        n| j        | j                  S )NrL   )rJ   
apply_treerK   _normalize_quantile
_normalizerL   r   s     r   r   zNormalize.__call__~   sH    ?"KO(,(:OD$$;	
 
 
 	
r   statsc                     |j         dd |j        d         f         |j        dd |j        d         f         }}||z
  |dz   z  S )N.ư>)meanshapestdr   xrX   r\   r^   s        r   rW   zNormalize._normalize   sJ    JsMagbkM12EIc=QWR[=>P4QcDS4Z((r   c                     |j         J |j        J |j         dd |j        d         f         |j        dd |j        d         f         }}||z
  ||z
  dz   z  dz  dz
  S )N.rZ   r[          @      ?)q01q99r]   )r   r`   rX   rd   re   s        r   rV   zNormalize._normalize_quantile   su    y$$$y$$$9S-AGBK-/0%)C172;<N2OSCC#I,-3c99r   )r   r   r   r?   r@   r   r)   rK   boolrL   rQ   r   r   rW   rV   r   r   r   rI   rI   r   s         	)$t++++M4FD4 4 4	
X 	
( 	
 	
 	
 	
)9 ) ) ) ):I : : : : : :r   rI   c                   r    e Zd ZU ej        e         dz  ed<   dZeed<   d Z	de
de
fdZd	efd
Zd	efdZdS )UnnormalizeNrJ   FrK   c                 R    | j         | j        rt          | j                    d S d S d S r.   rN   rP   s    r   rQ   zUnnormalize.__post_init__   rR   r   r   r   c                 j    | j         |S t          || j         | j        r| j        n| j        d          S )NTrT   )rJ   rU   rK   _unnormalize_quantile_unnormalizer   s     r   r   zUnnormalize.__call__   sI    ?"K O*.*<SD&&$BS	
 
 
 	
r   rX   c                     t          |j        |j        d         dd          }t          |j        |j        d         dd          }||dz   z  |z   S )NrZ           )axisvaluerc   r[   )
pad_to_dimr\   r]   r^   r_   s        r   rl   zUnnormalize._unnormalize   sR    %*agbk#FFFAGBKbDDDC$J$&&r   c                 "   |j         J |j        J |j         |j        }}|j        d         x}|j        d         k     r>t          j        |dd |f         dz   dz  ||z
  dz   z  |z   |d|d f         gd          S |dz   dz  ||z
  dz   z  |z   S )NrZ   .rc   rb   r[   ro   )rd   re   r]   rF   concatenate)r   r`   rX   rd   re   dims         r   rk   z!Unnormalize._unnormalize_quantile   s    y$$$y$$$9eiS9R= CAGBK//>Ac4C4iL3$6##=sTAQ#RUX#XZ[\_adaeae\eZf"gnpqqqqC3#)d"23c99r   )r   r   r   r?   r@   r   r)   rK   rf   rQ   r   r   rl   rk   r   r   r   rh   rh      s         	)$t++++M44 4 4

X 

( 

 

 

 

'Y ' ' ' '
:i : : : : : :r   rh   c                   4    e Zd ZU eed<   eed<   dedefdZdS )ResizeImagesheightwidthr   r   c                 Z      fd|d                                          D             |d<   |S )Nc                 X    i | ]&\  }}|t          j        |j        j                  'S r   )r
   resize_with_padrx   ry   ).0r8   vr   s      r   
<dictcomp>z)ResizeImages.__call__.<locals>.<dictcomp>   s5    vvvX\XY[\K74;
SSvvvr   image)itemsr   s   ` r   r   zResizeImages.__call__   s8    vvvv`del`m`s`s`u`uvvvWr   Nr   r   r   intr)   r   r   r   r   r   rw   rw      sJ         KKKJJJX (      r   rw   c                   *    e Zd ZU eed<   dedefdZdS )SubsampleActionsstrider   r   c                 8    |d         d d | j                  |d<   |S Nactions)r   r   s     r   r   zSubsampleActions.__call__   s!    y/..T[.9Yr   Nr   r   r   r   r   r      sA         KKKX (      r   r   c                   @    e Zd ZU dZee         dz  ed<   dedefdZdS )DeltaActionsz1Repacks absolute actions into delta action space.Nmaskr   r   c                 "   d|vs| j         |S |d         |d         }}t          j        | j                   }|j        d         }|dd |fxx         t          j        t          j        ||dd |f         d          d          z  cc<   ||d<   |S Nr   staterZ   .r   rs   r   rF   rG   r]   expand_dimswherer   r   r   r   r   dimss         r   r   zDeltaActions.__call__       D  DI$5KgYwz$)$$z"~UdU
r~bhtU3:=NPQ.R.RY[\\\\!Yr   	r   r   r   r(   r   rf   r)   r   r   r   r   r   r   r      U         ;;
 4.4

X 
( 
 
 
 
 
 
r   r   c                   @    e Zd ZU dZee         dz  ed<   dedefdZdS )AbsoluteActionsz1Repacks delta actions into absolute action space.Nr   r   r   c                 "   d|vs| j         |S |d         |d         }}t          j        | j                   }|j        d         }|dd |fxx         t          j        t          j        ||dd |f         d          d          z  cc<   ||d<   |S r   r   r   s         r   r   zAbsoluteActions.__call__   r   r   r   r   r   r   r   r      r   r   r   c                   B    e Zd ZU ej        ed<   dZeed<   dedefdZ	dS )TokenizePromptr   Fdiscrete_state_inputr   r   c                 R   |                     dd           x}t          d          | j        r(|                    dd           x}t          d          nd }t	          |t
                    s|                                }| j                            ||          \  }}i |||dS )NrD   Prompt is requiredr   zState is required.)tokenized_prompttokenized_prompt_mask)	pop
ValueErrorr   get
isinstancerA   itemr   tokenize)r   r   rD   r   tokenstoken_maskss         r   r   zTokenizePrompt.__call__   s    hhx...F71222$ 	'40009 !5666 : E&#&& 	#[[]]F"n55feDDY$YF[YYYYr   N)
r   r   r   
_tokenizerPaligemmaTokenizerr)   r   rf   r   r   r   r   r   r   r      s`         ,,,,!&$&&&ZX Z( Z Z Z Z Z Zr   r   c                   4    e Zd ZU ej        ed<   dedefdZdS )TokenizeFASTInputsr   r   r   c                 4   |                     dd           x}t          d          t          |t                    s|                                }|d         |                    d          }}| j                            |||          \  }}}}i |||||dS )NrD   r   r   r   )r   r   token_ar_masktoken_loss_mask)r   r   r   rA   r   r   r   r   )	r   r   rD   r   r   r   
token_maskar_mask	loss_masks	            r   r   zTokenizeFASTInputs.__call__  s    hhx...F71222&#&& 	#[[]]Fg(;(;w151H1HQVX_1`1`.
GY

 &%/$(
 
 
 	
r   N)r   r   r   r   FASTTokenizerr)   r   r   r   r   r   r   r     sG         ''''
X 
( 
 
 
 
 
 
r   r   c                   H    e Zd ZU ej        ed<   eed<   eed<   dedefdZdS )ExtractFASTActionsr   action_horizon
action_dimr   r   c                     d|vr|S |                     d          }| j                            |                    t          j                  | j        | j                  }i |d|iS r   )r   r   extract_actionsastyperF   int32r   r   )r   r   r   r   s       r   r   zExtractFASTActions.__call__)  sr    D  K)$$.00rx1H1H$J]_c_noo

w
 
 	
r   N)	r   r   r   r   r   r)   r   r   r   r   r   r   r   r   #  s\         ''''OOO	
X 	
( 	
 	
 	
 	
 	
 	
r   r   c                   >    e Zd ZU dZeeef         ed<   dedefdZ	dS )PromptFromLeRobotTaskz8Extracts a prompt from the current LeRobot dataset task.tasksr   r   c                     d|vrt          d          t          |d                   }| j                            |          x}t          d|d| j                   i |d|iS )N
task_indexz*Cannot extract prompt without "task_index"ztask_index=z not found in task mapping: rD   )r   r   r   r   )r   r   r   rD   s       r   r   zPromptFromLeRobotTask.__call__<  s}    t##IJJJl+,,
jnnZ000F9U
UUUUVVV)$)&)))r   N)
r   r   r   r(   dictr   rA   r)   r   r   r   r   r   r   r   5  sT         BB S>*X *( * * * * * *r   r   c                   .    e Zd ZU dZeed<   dedefdZdS )PadStatesAndActionsz;Zero-pads states and actions to the model action dimension.model_action_dimr   r   c                     t          |d         | j        d          |d<   d|v r t          |d         | j        d          |d<   |S )Nr   rZ   rs   r   )rq   r   r   s     r   r   zPadStatesAndActions.__call__M  sQ    "4=$2GbQQQW(i$:OVXYYYDOr   N)r   r   r   r(   r   r)   r   r   r   r   r   r   r   G  sJ         EEX (      r   r   r=   c                 .    t          j        | d          S )z7Flatten a nested dictionary. Uses '/' as the separator./sep)traverse_utilr;   r=   s    r   r;   r;   T  s    %d4444r   c                 .    t          j        | d          S )zKUnflatten a flattened dictionary. Assumes that '/' was used as a separator.r   r   )r   unflatten_dictr   s    r   r   r   Y  s    '#6666r   patternsc                 L   t          |          }d |                                 D             }i }|D ]u}|                                D ]8\  }}|                    |          r||                    ||d          nd} n9|}|"||v rt	          d| d          ||         ||<   vt          |          }	t          t          |	          dz
            D ]@}
|	|
|
dz            \  }}|                    |dz             rt	          d	| d
| d          At          |          S )a  Transform the structure of a nested dictionary using a set of patterns.

    The transformation is defined using the `patterns` dictionary. The keys are the
    input keys that should be matched and the values are the new names inside the output
    dictionary. If the value is None, the input key is removed.

    Both keys and values should represent flattened paths using '/' as the separator.
    Keys can be regular expressions and values can include backreferences to the
    matched groups (see `re.sub` for more details). Note that the regular expression
    must match the entire key.

    The order inside the `patterns` dictionary is important. Only the first pattern that
    matches the input key will be used.

    See unit tests for more examples.

    Args:
        patterns: A mapping from old keys to new keys.
        tree: The nested dictionary to transform.

    Returns:
        The transformed nested dictionary.
    c                 >    i | ]\  }}t          j        |          |S r   )recompile)r}   r8   r~   s      r   r   z"transform_dict.<locals>.<dictcomp>y  s&    >>>TQ
1q>>>r   N   )countzKey 'z' already exists in output   r   zLeaf 'z' aliases a node of '')
r;   r   	fullmatchsubr   sortedrangelen
startswithr   )r   r=   r   compiledoutputr8   patternreplnew_knamesiname	next_names                r   transform_dictr   ^  sy   0 D ?>X^^-=-=>>>HF $ $%^^-- 	 	MGT  ## 9=9ID!1555t
 E !J!J!J!JKKK GF5M 6NNE3u::>"" O OAE	*is
++ 	OMdMMMMMNNN	O &!!!r   FrT   selectorfnrL   c                   t          |           } t                    dt          dt          dt          ffd|rD ]}|| vrt          d| d          t	          fd|                                 D                       S )Nr8   r~   r   c                 4    | v r ||                    S |S r.   r   )r8   r~   r   r   s     r   r0   zapply_tree.<locals>.transform  s'    ==2a!%%%r   zSelector key z not found in treec                 0    i | ]\  }}| ||          S r   r   )r}   r8   r~   r0   s      r   r   zapply_tree.<locals>.<dictcomp>  s)    GGG$!Q1ii1ooGGGr   )r;   rA   r   r   r   r   )r=   r   r   rL   r8   r0   s    ``  @r   rU   rU     s     DH%%HS Q 1       
  H 	H 	HA}} !F!F!F!FGGG  GGGG$**,,GGGHHHr   rZ   rn   r`   
target_dimro   rp   c                     | j         |         }||k     r9dgt          | j                   z  }d||z
  f||<   t          j        | ||          S | S )zIPad an array to the target dimension with zeros along the specified axis.)r   r   r   )constant_values)r]   r   rF   pad)r`   r   ro   rp   current_dim	pad_widths         r   rq   rq     s[    '$-KZHs17||+	j;67	$vaE::::Hr   r   .c                      g }| D ]<}|dk    r|                     dg|z             "|                     dg| z             =t          |          S )a0  Make a boolean mask for the given dimensions.

    Example:
        make_bool_mask(2, -2, 2) == (True, True, False, False, True, True)
        make_bool_mask(2, 0, 2) == (True, True, True, True)

    Args:
        dims: The dimensions to make the mask for.

    Returns:
        A tuple of booleans.
    r   TF)extendtuple)r   resultru   s      r   make_bool_maskr     sf     F , ,77MM4&C.))))MM5'cT*++++==r   rJ   c                     t          |                                           D ]&\  }}|j        |j        t	          d| d          'd S )NzBquantile stats must be provided if use_quantile_norm is True. Key z is missing q01 or q99.)r;   r   rd   re   r   )rJ   r8   r~   s      r   rO   rO     sf    Z((..00  15=AEMoUVooo   * r   )rZ   rn   )@collections.abcr   r   r   dataclassesr   typingr   r   r   r	   flax.traverse_utilr   r<   numpyrF   openpi_clientr
   openpi.modelsr   r   openpi.sharedr   r?   r   rW   r@   r   r)   r   r   r   r   	dataclassr"   r+   r2   r4   rC   rI   rh   rw   r   r   r   r   r   r   r   r   r   r;   r   rA   r   rf   rU   ndarrayr   floatrq   r   r   rO   r   r   r   <module>r     sH   7 7 7 7 7 7 7 7 7 7 7     				 B B B B B B B B B B B B * * * * * * 



     % % % % % % 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1i)   !+	9 + + + GCLLGCLL     h    d###X X X X X X X $#X, d###       $#*1 *o * * * *
 d###D D D D Do D D $#D0 d###    /   $# d###: : : : : : : $#:B d### :  :  :  :  :/  :  : $# :F d###    ?   $# d###       $# d###    ?   $#* d###    o   $#* d###Z Z Z Z Z_ Z Z $#Z* d###
 
 
 
 
 
 
 $#
* d###
 
 
 
 
 
 
 $#
" d###* * * * *O * * $#*" d###	 	 	 	 	/ 	 	 $#	5ry 5T 5 5 5 5
7 7") 7 7 7 7
3"WS#*_5 3"RY 3"29 3" 3" 3" 3"n \aI I I
)A,I"$)A,I4<aVQY4GITXIYq\I I I I& "* # S e VXV`    # %c	"2    ,ry';       r   