o
    TZh                     @   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deedf fddZdd	 Zd
d Z	dd Z
defddZdejdefddZdejddfddZdejdefddZ  ZS )JaxFormatterNc              
      s   t  j|d dd l}ddlm} t||r#td| dt| dt|tr*|nt|	 d | _
td u r;|  a| j
tt vrgt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__ X/var/www/html/lang_env/lib/python3.10/site-packages/datasets/formatting/jax_formatter.pyr   '   s(   
 


zJaxFormatter.__init__returnzjaxlib.xla_extension.Devicec                  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       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r$ r$t fdd D r$|j ddS  S )Nr   c                 3   s<    | ]}t |jo|j d  jko|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   sZ  dd l }dd lm} t|tttd fr|S t|tjtj	fr+t
|jtjr+| S i }t|tjtj	frNt
|jtjrN|jjrHd|ji}n5d|ji}n/t|tjtj	fret
|jtjred|ji}ntjr}dtjv r}dd l}t||jjr}t|}td u r|  a|t| j  |j|fi i || j W  d    S 1 sw   Y  d S )Nr   r+   PIL)!r   r0   r1   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   r4   Zdefault_dtyper6   r#   r#   r$   
_tensorizeS   s,   """
$zJaxFormatter._tensorizec                    s   dd l }tjr#dtjv r#dd l}t||jr# |	 
  d S t|dr2t||js2| }t|tjrJ|jtkrI  fdd|D S nt|ttfr]  fdd|D S  |S )Nr   torchr#   	__array__c                       g | ]}  |qS r#   recursive_tensorizer&   Z	substructr    r#   r$   
<listcomp>   r(   z5JaxFormatter._recursive_tensorize.<locals>.<listcomp>c                    rE   r#   rF   rH   rI   r#   r$   rJ      r(   )r   r   ZTORCH_AVAILABLEr>   r?   rC   r   ZTensorrB   detachcpur1   hasattrr)   rD   r8   r:   r+   objectr5   r   tuple)r    data_structr   rC   r#   rI   r$   _recursive_tensorizex   s   

z!JaxFormatter._recursive_tensorizerP   c                 C   s   t | j|ddS )NF)Zmap_list)r	   rQ   )r    rP   r#   r#   r$   rG      s   z JaxFormatter.recursive_tensorizepa_tablec                 C   s$   |   |}| j|}| |S N)numpy_arrow_extractorZextract_rowpython_features_decoderZ
decode_rowrG   )r    rR   rowr#   r#   r$   
format_row   s   
zJaxFormatter.format_row	jax.Arrayc                 C   s:   |   |}| j||jd }| |}| |}|S )Nr   )rT   Zextract_columnrU   Zdecode_columnZcolumn_namesrG   r5   )r    rR   r.   r#   r#   r$   format_column   s
   

zJaxFormatter.format_columnc                 C   sD   |   |}| j|}| |}|D ]}| || ||< q|S rS   )rT   Zextract_batchrU   Zdecode_batchrG   r5   )r    rR   batchZcolumn_namer#   r#   r$   format_batch   s   
zJaxFormatter.format_batch)NN)__name__
__module____qualname__r   staticmethodr   r   r   r5   rB   rQ   dictrG   paTabler   rW   rY   r[   __classcell__r#   r#   r!   r$   r   &   s    %r   rX   )r>   collections.abcr   typingr   r   r   r1   r8   Zpyarrowra    r   Zutils.loggingr   Zutils.py_utilsr	   Z
formattingr   r   Zjaxlibr   r   r`   __annotations__r   r#   r#   r#   r$   <module>   s   
