
    uki                        d Z ddlmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddZ	 	 d	 	 	 ddZ G d d	ej                        Z G d
 dej                        Zy)z*Pickling support for precompiled binaries.    )annotationsN)
xla_client)Sequencec                   t        | j                  dd      }|t        d      t        |dd      r!|j                  j                  rt        d      t
        j                  j                  | j                        \  }}| j                  j                  rt        d      t        j                         5 }t        |      j                  ||| j                   f       |j#                         || j$                  fcddd       S # 1 sw Y   yxY w)zSerializes a compiled binary.

  Because pytrees are not serializable, they are returned so that
  the user can handle them properly.
  _unloaded_executableNz*Compilation does not support serializationmutz4can't serialize with a closed-over mutable array refz%serialize_executables with const_args)getattr_executable
ValueErrorr   in_mutjax	tree_utiltree_flatten	args_info_params
const_argsNotImplementedErrorioBytesIO_JaxPjrtPicklerdump
_no_kwargsgetvalueout_tree)compiledunloaded_executableargs_info_flatin_treefiles        `/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/experimental/serialize_executable.py	serializer!      s       4 4 6> 
A
BB %.3F3J3J3Q3Q
K
LLMM66x7I7IJ.'  
E
FF	zz| 7tD	nh.A.ABD==?GX%6%667 7 7s   4ADDc                    |t        |t              r"t        j                  |      d   j                  }||j                         }nQ|d   j                  }||k7  r=t        d|j                  |j                  f d|j                  |j                  f       t        t        j                  |       ||      j                         \  }}}|j                  |      }	|j                         }
t        j                  j                  |
g |	||      S )z>Constructs a jax.stages.Compiled from a serialized executable.r   OExecution devices belong to a client other than `backend`. Got backend client:  and execution devices client: )	no_kwargs)
isinstancestrr   devicesclientr   platformplatform_version_JaxPjrtUnpicklerr   r   load	unflattenstagesCompiled)
serializedr   r   backendexecution_devicesdevice_backendr   r   r%   r   loaded_compiled_objs              r    deserialize_and_loadr6   0   s    _
7C0kk'"1%,,G)&q)00N %..0H0HIJ K'%%~'F'FGHJK K "	zz*w(9;;?46 /)+002			2y(i 
 
I I    c                  F    e Zd Zej                  fZej                  fZd Zy)r   c                T   t        |t        j                        rd|j                  j	                  |      fS t        |t        j
                  j                        rd|j                         fS t        || j                        rd|j                  fS t        || j                        ryy )Nexecdevice)r)   )r&   xcLoadedExecutabler)   serialize_executable_xla
Executabler!   device_typesidclient_types)selfobjs     r    persistent_idz_JaxPjrtPickler.persistent_idU   s    #r**+cjj55c:;;#rww))*cmmo&&#t(()#t(() *r7   N)	__name__
__module____qualname__r<   DevicerA   ClientrC   rF    r7   r    r   r   Q   s    )),)),r7   r   c                  &     e Zd Zd fd	Zd Z xZS )r,   c                   t         |   |       || _        ||j                         }nQ|d   j                  }||k7  r=t        d|j                  |j                  f d|j                  |j                  f       |D ci c]  }|j                  | c}| _	        t        j                  t        |            | _        y c c}w )Nr   r#   r$   )super__init__r2   r(   r)   r   r*   r+   rB   devices_by_idr<   
DeviceListtupler3   )rD   r   r2   r3   r4   d	__class__s         r    rP   z_JaxPjrtUnpickler.__init__b   s    	GTDL !//+(+22n	7	" ' 0 0'2J2JKL M-'')H)HIJLM 	M
 ,==a!$$'=D]]51B+CDD >s    C c                    |d   dk(  r*| j                   j                  |d   | j                        S |d   dk(  r| j                  |d      S |d   dk(  r| j                   S t        j
                  )Nr   r:      )executable_devicesr;   r)   )r2   deserialize_executabler3   rQ   pickleUnpicklingError)rD   pids     r    persistent_loadz!_JaxPjrtUnpickler.persistent_loadr   s|    
1v\\00
a&T%;%; 1 = =
1vA''
1v\\

 
  r7   )N)rG   rH   rI   rP   r]   __classcell__)rU   s   @r    r,   r,   `   s    E !r7   r,   )r   zjax.stages.Compiled)NN)r2   zstr | xc.Client | Noner3   zSequence[xc.Device] | None)__doc__
__future__r   rZ   r   r   jax._src.libr   r<   collections.abcr   r!   r6   Picklerr   	Unpicklerr,   rL   r7   r    <module>re      sj    1 "  	 
 ) $72 <@IM	I #9I -G	IBfnn !(( !r7   