U
    -e                     @   s   U d dl Z d dlmZ d dlmZmZ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r~d dlZd dlZe Zdaee ed
< G dd deedef ZdS )    N)Mapping)TYPE_CHECKINGDictOptional   )config)
get_logger)
map_nested   )TensorFormatterDEVICE_MAPPINGc                       s   e Zd Zd fdd	Zeeedf dddZdd	 Zd
d Z	dd Z
edddZejedddZejddddZejedddZ  ZS )JaxFormatterNc              
      s   t  j|d dd l}ddlm} t||rFtd| dt| dt|trT|nt|	 d | _
td krv|  a| j
tt krtd| j
 dtt  d	t|	 d  d
 t|	 d | _
|| _d S )N)featuresr   )Devicez	Expected z to be a `str` not z, as `jaxlib.xla_extension.Device` is not serializable neither with `pickle` nor with `dill`. Instead you can surround the device with `str()` to get its string identifier that will be internally mapped to the actual `jaxlib.xla_extension.Device`.zDevice with string identifier z) not listed among the available devices: z), so falling back to the default device: .)super__init__jaxZjaxlib.xla_clientr   
isinstance
ValueErrortypestrdevicesdevicer   _map_devices_to_strlistkeysloggerwarningjnp_array_kwargs)selfr   r   r   r   r   	__class__ b/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/datasets/formatting/jax_formatter.pyr   '   s     
 ,zJaxFormatter.__init__zjaxlib.xla_extension.Device)returnc                  C   s   dd l } dd |  D S )Nr   c                 S   s   i | ]}t ||qS r#   )r   ).0r   r#   r#   r$   
<dictcomp>F   s      z4JaxFormatter._map_devices_to_str.<locals>.<dictcomp>)r   r   )r   r#   r#   r$   r   B   s    z JaxFormatter._map_devices_to_strc                    sL   dd l dd lm} t trH rHt fdd D rH|j ddS  S )Nr   c                 3   s:   | ]2}t |jo0|j d  jko0|j d  jkV  qdS )r   N)r   Arrayshapedtype)r&   xcolumnr   r#   r$   	<genexpr>M   s    z,JaxFormatter._consolidate.<locals>.<genexpr>)Zaxis)r   	jax.numpynumpyr   r   allstack)r    r-   jnpr#   r,   r$   _consolidateH   s    zJaxFormatter._consolidatec              
   C   sH  dd l }dd lm} t|tttd fr,|S t|tjtj	frVt
|jtjrV| S i }t|tjtj	frt
|jtjr|jjrd|ji}qd|ji}n^t|tjtj	frt
|jtjrd|ji}n0tjrdtjkrdd l}t||jjrt|}td kr|  a|t| j " |j|f|| j W  5 Q R  S Q R X d S )Nr   r*   PIL)!r   r/   r0   r   r   bytesr   np	characterndarrayZ
issubdtyper*   tolistnumberintegerr   Zjax_enable_x64Zint64Zint32ZfloatingZfloat32ZPIL_AVAILABLEsysmodulesZ	PIL.ImageZImageZasarrayr   r   Zdefault_devicer   arrayr   )r    valuer   r3   Zdefault_dtyper5   r#   r#   r$   
_tensorizeS   s*    """

zJaxFormatter._tensorizec                    s   dd l }tjrFdtjkrFdd l}t||jrF |	 
  d S t|drdt||jsd| }t|tjr|jtkr  fdd|D S n&t|ttfr  fdd|D S  |S )Nr   torchr#   	__array__c                    s   g | ]}  |qS r#   recursive_tensorizer&   Z	substructr    r#   r$   
<listcomp>   s     z5JaxFormatter._recursive_tensorize.<locals>.<listcomp>c                    s   g | ]}  |qS r#   rD   rF   rG   r#   r$   rH      s     )r   r   ZTORCH_AVAILABLEr=   r>   rB   r   ZTensorrA   detachcpur0   hasattrr(   rC   r7   r9   r*   objectr4   r   tuple)r    data_structr   rB   r#   rG   r$   _recursive_tensorizex   s    
z!JaxFormatter._recursive_tensorize)rN   c                 C   s   t | j|ddS )NF)Zmap_list)r	   rO   )r    rN   r#   r#   r$   rE      s    z JaxFormatter.recursive_tensorize)pa_tabler%   c                 C   s$   |   |}| j|}| |S N)numpy_arrow_extractorZextract_rowpython_features_decoderZ
decode_rowrE   )r    rP   rowr#   r#   r$   
format_row   s    zJaxFormatter.format_row	jax.Arrayc                 C   s:   |   |}| j||jd }| |}| |}|S )Nr   )rR   Zextract_columnrS   Zdecode_columnZcolumn_namesrE   r4   )r    rP   r-   r#   r#   r$   format_column   s
    

zJaxFormatter.format_columnc                 C   sD   |   |}| j|}| |}|D ]}| || ||< q(|S rQ   )rR   Zextract_batchrS   Zdecode_batchrE   r4   )r    rP   batchZcolumn_namer#   r#   r$   format_batch   s    
zJaxFormatter.format_batch)NN)__name__
__module____qualname__r   staticmethodr   r   r   r4   rA   rO   dictrE   paTabler   rU   rW   rY   __classcell__r#   r#   r!   r$   r   &   s   %r   rV   )r=   collections.abcr   typingr   r   r   r0   r7   Zpyarrowr_    r   Zutils.loggingr   Zutils.py_utilsr	   Z
formattingr   r   Zjaxlibr   r   r^   __annotations__r   r#   r#   r#   r$   <module>   s    