o
    ?e5                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 G dd	 d	e
jZG d
d deZ			dddZeee dS )zFA variable which packs a list of variables distributed across devices.    )device_util)context)ops)tensor_conversion_registry)math_ops)resource_variable_opsc                       s  e Zd ZdZd3 fdd	Zedd Zdd Zd	d
 Zdd Z	dd Z
edd Zedd Z fddZdd Zd4 fdd	Z fddZd5ddZd5ddZd5d d!Zd6d#d$Zd6d%d&Zd6d'd(Zd6d)d*Zd6d+d,Zd6d-d.Zd6d/d0Zd7 fd1d2	Z  ZS )8PackedDistributedVariablea$  A variable which packs multiple variables distributed across devices.

  It's only supported when eager execution is enabled.
  For op-by-op execution, use an unpacked handle on the current device; for
  function execution, use the packed handle to reduce the overhead of function
  calls.
  Nc           	   	      s  t  std|stdt|D ]\}}t|s%td|t|f q|| _dd |D | _t 	  t j
|ddds}t d	d |D }t |}d
|t  f }tt| jd i d|d jd|d jd|d jd|d|d jd|d jd|d jd|d jd|d|d|dddddddddddddd W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )!a  Packs a list of variables which are distributed across devices.

    Args:
      distributed_variables: A list of distributed Variables to pack.
      name: Optional name for the variable. Defaults to `'Variable'` and gets
        uniquified automatically.
    z:PackedDistributedVariable should be created in eager mode.z-Expect a non-empty list of variables to pack.zHExpect a list of ResourceVariables to pack, but the %d-th variable is %sc                 S      g | ]}|j qS  )device).0vr
   r
   y/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/distribute/packed_distributed_variable.py
<listcomp>5       z6PackedDistributedVariable.__init__.<locals>.<listcomp>VariableF)Zskip_on_eagerc                 S   r	   r
   )handle)r   varr
   r
   r   r   9   r   z%s_%d	trainabler   shapedtyper   synchronization
constraintaggregationZdistribute_strategyname	unique_idhandle_nameZgraph_elementNinitial_valueZinitializer_opZis_initialized_opZcached_valueZcaching_deviceZis_distributed_variablesTr
   )r   Z#executing_eagerly_outside_functions
ValueError	enumerater   Zis_resource_variabletype_distributed_variables_devicesZ
init_scopeZ
name_scopeZpack_eager_tensorsZname_from_scope_nameuidsuperr   __init__r   r   r   r   r   r   Z_distribute_strategy)	selfZdistributed_variablesr   Zunused_kwargsir   r   r   r   	__class__r
   r   r%   "   s|   










	
"z"PackedDistributedVariable.__init__c                 C      | j S N)r"   r&   r
   r
   r   devicesP      z!PackedDistributedVariable.devicesc                 C   s
   t | |S r+   )PackedVarAndDevicer&   r   r
   r
   r   	on_deviceT      
z#PackedDistributedVariable.on_devicec                 C   s6   t | jD ]\}}||kr| j|   S qtd| )NzDevice %s is not found)r   r"   r!   r   )r&   r   r'   dr
   r
   r   get_var_on_deviceW   s
   z+PackedDistributedVariable.get_var_on_devicec                 C   s   t t  }| |S r+   )r   Zcanonicalizecurrentr4   )r&   Zcurrent_devicer
   r
   r   get_var_on_current_device]   s   
z3PackedDistributedVariable.get_var_on_current_devicec                 C   s   |  |jS )z>Returns the Tensor used as the initial value for the variable.)r4   r   r0   r
   r
   r   r   a   s   z'PackedDistributedVariable.initial_valuec                 C   s   t  r	|  jS | jS r+   )r   executing_eagerlyr6   r   _handler,   r
   r
   r   r   e   s   
z PackedDistributedVariable.handlec                 C   r*   r+   )r8   r,   r
   r
   r   packed_handlel   r.   z'PackedDistributedVariable.packed_handlec                    s"   t  r
|   S tt|  S r+   )r   r7   r6   valuer$   r   _read_variable_opr,   r(   r
   r   r;   p   s   z+PackedDistributedVariable._read_variable_opc                 C   s   |   S r+   )r;   r,   r
   r
   r   r:   v   s   zPackedDistributedVariable.valuec              	      sF  t  r,| jd  }| jdd D ]
}t|| }qtj|| jd  |d}|S t| jd  t	t
| |}W d    n1 sGw   Y  | jdd D ]%}t| t	t
| |}W d    n1 smw   Y  t||}qSt| jd  t	t
| |}W d    n1 sw   Y  tj|||d}|S )Nr      )r   )r   r7   r!   is_initializedr   logical_andr   r   r"   r$   r   )r&   r   resultr   r3   Zinitializedr(   r
   r   r>   y   s:   z(PackedDistributedVariable.is_initializedc                    s6   t  r||  |fi |S |tt| |fi |S r+   )r   r7   r6   r$   r   )r&   	update_fnr:   kwargsr(   r
   r   _update   s   z!PackedDistributedVariable._updateTc                 C      dd }| j |||||dS )Nc                 _      | j |i |S r+   )
assign_subr   akwr
   r
   r   <lambda>       z6PackedDistributedVariable.assign_sub.<locals>.<lambda>rA   r:   use_lockingr   
read_valuerC   )r&   deltarM   r   rN   Zassign_sub_fnr
   r
   r   rF         z$PackedDistributedVariable.assign_subc                 C   rD   )Nc                 _   rE   r+   )
assign_addrG   r
   r
   r   rJ      rK   z6PackedDistributedVariable.assign_add.<locals>.<lambda>rL   rO   )r&   rP   rM   r   rN   Zassign_add_fnr
   r
   r   rR      rQ   z$PackedDistributedVariable.assign_addc                 C   rD   )Nc                 _   rE   r+   )assignrG   r
   r
   r   rJ      rK   z2PackedDistributedVariable.assign.<locals>.<lambda>rL   rO   )r&   r:   rM   r   rN   Z	assign_fnr
   r
   r   rS      rQ   z PackedDistributedVariable.assignFc                 C      dd }| j ||||dS )Nc                 _   rE   r+   )scatter_subrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_sub.<locals>.<lambda>rA   r:   rM   r   rO   )r&   sparse_deltarM   r   Zscatter_sub_fnr
   r
   r   rU         z%PackedDistributedVariable.scatter_subc                 C   rT   )Nc                 _   rE   r+   )scatter_addrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_add.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_add_fnr
   r
   r   rY      rX   z%PackedDistributedVariable.scatter_addc                 C   rT   )Nc                 _   rE   r+   )scatter_mulrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_mul.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_mul_fnr
   r
   r   rZ      rX   z%PackedDistributedVariable.scatter_mulc                 C   rT   )Nc                 _   rE   r+   )scatter_divrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_div.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_div_fnr
   r
   r   r[      rX   z%PackedDistributedVariable.scatter_divc                 C   rT   )Nc                 _   rE   r+   )scatter_minrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_min.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_min_fnr
   r
   r   r\      rX   z%PackedDistributedVariable.scatter_minc                 C   rT   )Nc                 _   rE   r+   )scatter_maxrG   r
   r
   r   rJ      rK   z7PackedDistributedVariable.scatter_max.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_max_fnr
   r
   r   r]      rX   z%PackedDistributedVariable.scatter_maxc                 C   rT   )Nc                 _   rE   r+   )scatter_updaterG   r
   r
   r   rJ      rK   z:PackedDistributedVariable.scatter_update.<locals>.<lambda>rV   rO   )r&   rW   rM   r   Zscatter_update_fnr
   r
   r   r^      rX   z(PackedDistributedVariable.scatter_updatec                    s2   t  r|  j|||dS tt| j|||dS N)r   r   as_ref)r   r7   r6   _dense_var_to_tensorr$   r   r&   r   r   r`   r(   r
   r   ra      s   
z.PackedDistributedVariable._dense_var_to_tensor)NNr+   NNTFNNNF)__name__
__module____qualname____doc__r%   propertyr-   r1   r4   r6   r   r   r9   r;   r:   r>   rC   rF   rR   rS   rU   rY   rZ   r[   r\   r]   r^   ra   __classcell__r
   r
   r(   r   r      s8    .




	
	
	





r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
dd Ze	dd Ze	dd Zdd Ze	dd Zd3ddZd3ddZd3ddZd4d!d"Zd4d#d$Zd4d%d&Zd4d'd(Zd4d)d*Zd4d+d,Zd4d-d.Zd5d/d0Zd1d2 ZdS )6r/   z1Holds a packed distributed variable and a device.c                 C   s   || _ || _d S r+   )_var_device)r&   r   r   r
   r
   r   r%      s   
zPackedVarAndDevice.__init__c                 C   sJ   z t | j t| j|W  d    W S 1 sw   Y  W d S     r+   )r   r   rm   getattrrl   )r&   r   r
   r
   r   __getattr__   s   
(zPackedVarAndDevice.__getattr__c                 C   r*   r+   )rl   r,   r
   r
   r   r     s   zPackedVarAndDevice.varc                 C   :   t | j | j W  d    S 1 sw   Y  d S r+   )r   r   rm   rl   r:   r,   r
   r
   r   r:        $zPackedVarAndDevice.valuec                 C   rp   r+   )r   r   rm   rl   rN   r,   r
   r
   r   rN     rq   zPackedVarAndDevice.read_valuec                 C   s   | j | jS r+   )rl   r   rm   r,   r
   r
   r   r     s   z PackedVarAndDevice.initial_valuec                 C   rp   r+   )r   r   rm   rl   initialized_valuer,   r
   r
   r   rr     rq   z$PackedVarAndDevice.initialized_valuec                 C   r*   r+   )rm   r,   r
   r
   r   r   !  r.   zPackedVarAndDevice.devicec                 C   8   t | j | jjW  d    S 1 sw   Y  d S r+   )r   r   rm   rl   r   r,   r
   r
   r   r   %     $zPackedVarAndDevice.handlec                 C   s<   t | j | j jW  d    S 1 sw   Y  d S r+   )r   r   rm   rl   r6   r   r,   r
   r
   r   on_device_handle*  s   
$z#PackedVarAndDevice.on_device_handlec                 C   rs   r+   )r   r   rm   rl   opr,   r
   r
   r   rv   .  rt   zPackedVarAndDevice.opNTc                 C   B   t | j | j||||W  d    S 1 sw   Y  d S r+   )r   r   rm   rl   rF   r&   rP   rM   r   rN   r
   r
   r   rF   3     $zPackedVarAndDevice.assign_subc                 C   rw   r+   )r   r   rm   rl   rR   rx   r
   r
   r   rR   7  ry   zPackedVarAndDevice.assign_addc                 C   rw   r+   )r   r   rm   rl   rS   )r&   r:   rM   r   rN   r
   r
   r   rS   ;  ry   zPackedVarAndDevice.assignFc                 C   @   t | j | j|||W  d    S 1 sw   Y  d S r+   )r   r   rm   rl   rU   r&   rW   rM   r   r
   r
   r   rU   ?     $zPackedVarAndDevice.scatter_subc                 C   rz   r+   )r   r   rm   rl   rY   r{   r
   r
   r   rY   C  r|   zPackedVarAndDevice.scatter_addc                 C   rz   r+   )r   r   rm   rl   rZ   r{   r
   r
   r   rZ   G  r|   zPackedVarAndDevice.scatter_mulc                 C   rz   r+   )r   r   rm   rl   r[   r{   r
   r
   r   r[   K  r|   zPackedVarAndDevice.scatter_divc                 C   rz   r+   )r   r   rm   rl   r\   r{   r
   r
   r   r\   O  r|   zPackedVarAndDevice.scatter_minc                 C   rz   r+   )r   r   rm   rl   r]   r{   r
   r
   r   r]   S  r|   zPackedVarAndDevice.scatter_maxc                 C   rz   r+   )r   r   rm   rl   r^   r{   r
   r
   r   r^   W  r|   z!PackedVarAndDevice.scatter_updatec                 C   sB   t | j | jj|||dW  d    S 1 sw   Y  d S r_   )r   r   rm   rl   ra   rb   r
   r
   r   ra   [  s   $z'PackedVarAndDevice._dense_var_to_tensorc                 C   s
   | j  S r+   )rl   _as_graph_elementr,   r
   r
   r   r}   b  r2   z$PackedVarAndDevice._as_graph_elementrc   rd   re   )rf   rg   rh   ri   r%   ro   r   r:   rN   rj   r   rr   r   r   ru   rv   rF   rR   rS   rU   rY   rZ   r[   r\   r]   r^   ra   r}   r
   r
   r
   r   r/      s:    














r/   NFc                 C   s   | j |||dS r_   )ra   )r   r   r   r`   r
   r
   r   (_tensor_conversion_packed_var_and_devicef  s   r~   re   )ri   Ztensorflow.python.distributer   Ztensorflow.python.eagerr   Ztensorflow.python.frameworkr   r   Ztensorflow.python.opsr   r   ZBaseResourceVariabler   objectr/   r~   Z#register_tensor_conversion_functionr
   r
   r
   r   <module>   s"    \s
