o
     ݱi$                     @   s   d dl Z d dlZd dl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mZ d dlmZ d dlmZ G dd de
ZG d	d
 d
e
ZdS )    N)Dataset)CompressedTrajectoryBuffer)LinearNormalizerNestedDictLinearNormalizer)unflatten_obs)TrajectorySamplerc                   @   s   e Zd Z					d!dedededed	ed
edededefddZdd Z	dd Z
dd ZdefddZdefddZdedeeejf fddZdd Zd S )"DroidDataset   F           namebuffer_path
shape_metaseq_lenhistory_lennormalize_lowdimnormalize_action	val_rationum_workersc
                 C   s\  || _ || _|| _|	| _|d }
i | _i | _|
 D ](\}}|d }t|d }|dkr2|| j|< q|dkr<|| j|< qtd| t|d d | _	t
|j| _| || _| jj}tj|td}|d	krt|| }tt|d
|d
 }tjjd	d}|j||dd}d||< | | _d| _t| j| j| j| _|r|  | _|r|   | _!d S d S )Nobstypeshapergblow_dimzUnsupported obs type: actiondtyper   r	   )seedF)replaceT)"r   r   r   r   _image_shapes_lowdim_shapesitemstupleRuntimeError_action_shapepathlibPathparent
buffer_dir_init_bufferbuffernum_episodesnpzerosboolroundminmaxrandomdefault_rngchoice
train_maskis_validationr   sampler_init_lowdim_normalizerlowdim_normalizer_init_action_normalizeraction_normalizer)selfr   r   r   r   r   r   r   r   r   Zobs_shape_metakeyattrZobs_typeZ	obs_shaper+   Zval_maskZnum_val_episodesrngZval_inds r@   B/data/cameron/vidgen/unified-world-model/datasets/droid/dataset.py__init__   sD   
zDroidDataset.__init__c                 C   s   i }| j  D ]\}}|tjd|d| < q| j D ]\}}|tjd|d| < q| jtjd|d< t||d}|jsEJ d| |S )N)r   r   obs.r   )storage_pathmetadatazBuffer not found at )	r   r!   r,   uint8r    float32r$   r   restored)r<   r   rE   r=   r   r*   r@   r@   rA   r)   L   s   zDroidDataset._init_bufferc           	      C   s   | j d }| rtd|  t|}t|S i }| j D ]/}t	| j
d|  }|jdd }|jdd }|| d }|| d }||f||< q tj|fi | t|S )Nzlowdim_normalizer_stats.npzz%Loading lowdim normalizer stats from rC   r   axis       @)r(   existsprintr,   loadr   r    keysda	from_zarrr*   r0   computer1   savez)	r<   normalizer_stats_pathstatsr=   datamin_valmax_valscaleoffsetr@   r@   rA   r8   Z   s   

z$DroidDataset._init_lowdim_normalizerc           	      C   s   d| j  d}| j| }| r%td|  t|}t|d |d S t| j	d }|j
dd }|jdd }|| d	 }|| d	 }tj|||d
 t||S )NZaction_normalizer_stats_lenz.npzz%Loading action normalizer stats from rY   rZ   r   r   rI   rK   )rY   rZ   )r   r(   rL   rM   r,   rN   r   rP   rQ   r*   r0   rR   r1   rS   )	r<   Znormalizer_stats_namerT   rU   actionsZ
min_actionZ
max_actionrY   rZ   r@   r@   rA   r:   o   s   


z$DroidDataset._init_action_normalizerreturnc                 C   
   t | jS N)lenr7   r<   r@   r@   rA   __len__      
zDroidDataset.__len__c                 C   s   d| j  dt|  d| j S )Nz<DroidDataset>
name: z
num_samples: 
)r   r_   r*   r`   r@   r@   rA   __repr__   s   zDroidDataset.__repr__idxc                 C   s   | j |}t| dr$| j D ]}| j| |d|  |d| < qt| dr2| |d |d< dd | D }t|}|S )Nr9   rC   r;   r   c                 S      i | ]
\}}|t |qS r@   torch
from_numpy.0kvr@   r@   rA   
<dictcomp>       z,DroidDataset.__getitem__.<locals>.<dictcomp>)	r7   sample_sequencehasattrr    rO   r9   r;   r!   r   )r<   re   rV   r=   r@   r@   rA   __getitem__   s   
$
zDroidDataset.__getitem__c                 C   s4   t  | }| j |_t| j| j| j |_d|_|S )NT)copyr5   r   r*   r   r7   r6   )r<   val_setr@   r@   rA   get_validation_dataset   s
   

z#DroidDataset.get_validation_datasetN)r	   FFr
   r   )__name__
__module____qualname__strdictintr.   floatrB   r)   r8   r:   ra   rd   rh   Tensorrr   ru   r@   r@   r@   rA   r      s@    	

;r   c                   @   sL   e Zd Z	ddededefddZdd Zd	d
 ZdefddZ	dd Z
dS )DroidMixtureDatasetFbase_datasetvideo_buffer_pathbalance_datasetsc                 C   sL  || _ | j || _t| j| j j| _|r}t| j }t| j}t||}t	|| }t	|| }g }	t
|D ]	}
|	t
| q8g }t
|D ]	}
|t
| qH|	d | }	|d | }g }|	D ]	}|d|f qb|D ]	}|d|f qn|| _d S g }t
t| j D ]	}|d|f qt
t| jD ]	}|d|f q|| _d S )NTF)r   r)   Zvideo_bufferr   r   video_samplerr_   r1   mathceilrangeextendappend	index_map)r<   r   r   r   Z	len_robotZ	len_videomax_lenZrobot_factorZvideo_factorZrobot_indices_Zvideo_indicesZcombined_indicesZr_iZv_ir@   r@   rA   rB      s>   





zDroidMixtureDataset.__init__c                 C   s&   | drtd| dt| j|S )Nr   z(Attempting to access private attribute '')
startswithAttributeErrorgetattrr   )r<   r   r@   r@   rA   __getattr__   s   
zDroidMixtureDataset.__getattr__c                 C   r]   r^   )r_   r   r`   r@   r@   rA   ra      rb   zDroidMixtureDataset.__len__r\   c                 C   s0   d| j j dt| j  dt| j d| j j S )Nz<DroidMixtureDataset>
name: z
num_robot_samples: z
num_video_samples: rc   )r   r   r_   r   r*   r`   r@   r@   rA   rd      s   zDroidMixtureDataset.__repr__c                 C   sr   | j | \}}|r| j| }tjdtjd|d< |S | j|}dd | D }t|}tjdtjd|d< |S )Nr	   r   Zaction_maskc                 S   rf   r@   rg   rj   r@   r@   rA   rn      ro   z3DroidMixtureDataset.__getitem__.<locals>.<dictcomp>r   )	r   r   rh   tensorr.   r   rp   r!   r   )r<   re   Zis_robotdataset_idxrV   r@   r@   rA   rr      s   
zDroidMixtureDataset.__getitem__N)F)rv   rw   rx   r   ry   r.   rB   r   ra   rd   rr   r@   r@   r@   rA   r~      s    
5	r~   )rs   r   r%   Z
dask.arrayarrayrP   numpyr,   rh   torch.utils.datar   datasets.utils.bufferr   Zdatasets.utils.normalizerr   r   Zdatasets.utils.obs_utilsr   Zdatasets.utils.samplerr   r   r~   r@   r@   r@   rA   <module>   s     