
    qi*                         d Z ddlmZ ddlZddlmZ ddlmZ ddlZddlZddl	m
Z
 ddlZddlmc mZ  G d de          Zej         G d	 d
                      Z G d d          ZdS )a8  
RLDS-based data loader for DROID.
While openpi typically uses LeRobot's data loader, it is not currently scalable enough for larger datasets like DROID.
Thus, we provide a data loader example here that uses the RLDS data format.
The data loader also applies a few DROID-specific data filters / transformations.
    )SequenceN)Enum)auto)Pathc                   :    e Zd ZdZ e            Z e            ZdS )DroidActionSpacezAction space for DROID dataset.N)__name__
__module____qualname____doc__r   JOINT_POSITIONJOINT_VELOCITY     C/home/robot-lab/Pi0.5_yam/src/openpi/training/droid_rlds_dataset.pyr   r      s*        ))TVVNTVVNNNr   r   c                   B    e Zd ZU eed<   eed<   eed<   dZedz  ed<   dS )RLDSDatasetnameversionweightNfilter_dict_path)r	   r
   r   str__annotations__floatr   r   r   r   r   r      sB         
IIILLLMMM#'cDj'''''r   r   c                   r    e Zd Zddej        ddddddeded	ee         d
e	dedededededefdZ
d Zd ZdS )DroidRldsDatasetT   d   i )shuffleaction_chunk_sizeaction_spacemax_loaded_steps_per_episodeshuffle_buffer_sizenum_parallel_readsnum_parallel_callsdata_dir
batch_sizedatasetsr    r!   r"   r#   r$   r%   r&   c                   	
 dd l dd ldd lj                            g d           t          d |D                       dk    s
J d            dt          f
	 f
dt          j        dt          |           d	           t          j        d
           |D ]/}t          j        d|j
         d|j         d|j        d           0t          j        d
           fd|D             }d |D             }j                            ||          }|                    |          }|                    |          }|                    d          }| _        | _         _        d S )Nr   GPUc              3   $   K   | ]}|j         V  d S Nr   .0datasets     r   	<genexpr>z,DroidRldsDataset.__init__.<locals>.<genexpr>>   s$      ::g7>::::::r   g      ?zDataset weights must sum to 1.0dataset_cfgc                 L  
 | j         | j        }}                    ||          }j                            |d          }|                    fd          }|                                }| j        }|Tt          j	        |          }t          |                              d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          j        dt!          |           d           g }	g }
t#          j        |                                d	          D ]Q\  }}|D ]I\  }}t'          ||          D ]3}| d
| }|	                    |           |
                    d           4JRj                            j                            |	|
          d          _        t          j        d           n<j                            j                            dgdg          d          _        fd}|                    |          }fd}|                    |          }|                              }d }|                    |          }d }|                    |          }fd}|                    |          S )N)r'   r   train)splitr    r%   c                 j    j                             | d         d         d         d         d          S )Ntraj_metadataepisode_metadata	file_pathr   z.*success.*)stringsregex_full_matchtrajtfs    r   <lambda>zKDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.<lambda>J   s3    RZ88)*<=kJ1M}  r   rzUsing filter dictionary with z	 episodesz"Creating idle filter hash table...)desc--TF)default_valuezFilter hash table initialized c                                          	t          j        k    r d         d         n d         d          d         d         fd          }                    j                            g           dk     fd	 fd
          } d         d         }j                             d          d          d         g          d         }                     d                   d         }                    	                    |                    } d         d         d         dz    d         d         d         z   dz   |z   }
j
                            |          }||| d         d          d         d         d|||dS )zBReformat observation and action keys, sample language instruction.action_dictjoint_positionjoint_velocitygripper_positionr   )axis)shapeg      ?c                        d         d         S )Nobservationexterior_image_1_leftr   r>   s   r   r@   z`DroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.restructure.<locals>.<lambda>       D/0GH r   c                        d         d         S )NrN   exterior_image_2_leftr   rP   s   r   r@   z`DroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.restructure.<locals>.<lambda>   rQ   r   rN   wrist_image_leftlanguage_instructionlanguage_instruction_2language_instruction_3r   actionr8   r9   recording_folderpathrC   r:   )imagewrist_imagerH   rJ   )actionsrN   promptstep_idpasses_filter)concatr   r   condrandomuniformr    rL   	as_stringrangefilter_tablelookup)r>   r\   exterior_img	wrist_imginstructiontraj_lenindicesr^   r_   r"   selfr?   s   `        r   restructurezNDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.restructures   s    ))  ,/?/NNN !/0@AA!%m!45E!F]+,>?  $ 
 
  "wwI%%B%//#5HHHHHHHH   
 !/0BC	 i//0148P3QSWXpSqr  88DN33A6,,rxx'9'9:: )*<=>TU?+,>?LM  	  !% 1 8 8 A A  '!-'0*.}*=>N*O,0,?@R,S	$ $ *&%2  r   c                                         | d                   d         }                                                  d         |g                                                  |          dddf         |g          z   }                    ||dz
            }                    | d         |          | d<   | S )z"Splits episode into action chunks.r\   r   N   )rL   broadcast_tore   minimumgather)r>   rk   action_chunk_indicesr!   r?   s      r   chunk_actionszPDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.chunk_actions   s    88DO44Q7 (*HH.//501( ( OOHHX&&qqq$w/01 ($ (*zz2FST'U'U$ #%))DO=Q"R"RYr   )r&   c                     | d         S Nr_   r   frames    r   filter_from_dictzSDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.filter_from_dict   s    _--r   c                 0    |                      d           | S rw   )poprx   s    r   remove_passes_filterzWDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.remove_passes_filter   s    		/***r   c                     j                             | d         d         dj                  | d         d<   j                             | d         d         dj                  | d         d<   | S )NrN   rZ   F)expand_animationsdtyper[   )iodecode_imageuint8r=   s    r   decode_imageszPDroidRldsDataset.__init__.<locals>.prepare_single_dataset.<locals>.decode_images   s    /1u/A/A'0EQSQY 0B 0 0]#G, 68U5G5G'6%WYW_ 6H 6 6]#M2 r   )r   r   builderDLataset	from_rldsfilterrepeatr   downloadmaybe_downloadr   openjsonloadlogginginfolentqdmitemsre   appendrg   StaticHashTableKeyValueTensorInitializerrf   traj_mapflattenmap	frame_map) r3   ds_namer   r   r1   r   cached_filter_dict_pathffilter_dictkeys_tensorvalues_tensorepisode_keyrangesstartendt	frame_keyrn   ru   rz   r}   r   r!   r"   r'   dlr&   r%   rm   r    r?   tfdss                          r   prepare_single_datasetz9DroidRldsDataset.__init__.<locals>.prepare_single_dataset@   s   */1DWGll7XwlOOGk++wL^ ,  G
 nn    G nn&&G  +;+*2*ABR*S*S'12277<< /"&)A,,K/ / / / / / / / / / / / / / /XS=M=MXXXYYY  "+/9[5F5F5H5HOs+t+t+t 7 7'K&, 7 7
s!&uc!2!2 7 7A+6(=(=!(=(=I'..y999)00666677
 %'I$=$=I77]SSch %> % %! <====$&I$=$=I77tfEEUY %> % %!6 6 6 6 6 6 6p &&{4FGGG     * &&}6HIIG oo9KoLLG. . . nn%566G   kk"677G     $$]4FGGGs   2CCCz
Preparing z datasets...z2--------------------------------------------------z    :z with weight z.2fc                 &    g | ]} |          S r   r   )r0   r1   r   s     r   
<listcomp>z-DroidRldsDataset.__init__.<locals>.<listcomp>   s%    PPPG..w77PPPr   c                     g | ]	}|j         
S r   r.   r/   s     r   r   z-DroidRldsDataset.__init__.<locals>.<listcomp>   s    :::g7>:::r   )weightsrp   )dlimp
tensorflowtensorflow_datasetsconfigset_visible_devicessumr   r   r   r   r   r   r   r   sample_from_datasetsr    batchwith_ram_budgetr1   r(   )rm   r'   r(   r)   r    r!   r"   r#   r$   r%   r&   r1   all_datasetsr   final_datasetr   r   r?   r   s   ``  ```  ``    @@@@r   __init__zDroidRldsDataset.__init__%   s   " 	**** 		%%b%000 :::::::cAAACdAAA^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H ^	H@ 	=#h--===>>>X 	c 	cGLaaawaaW^aaabbbbXPPPPxPPP:::::88w8WW%--.ABB%++J77%55a88$$r   c              #   H   K   | j                                         E d {V  d S r-   )r1   as_numpy_iteratorrm   s    r   __iter__zDroidRldsDataset.__iter__   s2      <1133333333333r   c                     dS )Ni -1r   r   s    r   __len__zDroidRldsDataset.__len__   s	     zr   N)r	   r
   r   r   r   r   intr   r   boolr   r   r   r   r   r   r   r   $   s         !#)9)H,/#*"$"$K K KK K ;'	K K K 'K '*K !K  K  K K K KZ4 4 4    r   r   )r   collections.abcr   dataclassesenumr   r   r   r   pathlibr   r   openpi.shared.downloadsharedr   r   	dataclassr   r   r   r   r   <module>r      s9    % $ $ $ $ $                          ) ) ) ) ) ) ) ) )    t    ( ( ( ( ( ( ( (T T T T T T T T T Tr   