
    BVh6                         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	e
j                        Z G d
 de      Z	 	 	 ddZ ej                   ee       y)zFA variable which packs a list of variables distributed across devices.    )device_util)context)ops)tensor_conversion_registry)math_ops)resource_variable_opsc                        e Zd ZdZd fd	Zed        Zd Zd Zd Z	d Z
ed        Zed	        Zd fd
	Zd Zd fd	Z fdZddZddZddZddZddZddZddZddZddZddZd fd	Z xZS )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.
  c                    t        j                         st        d      |st        d      t        |      D ]3  \  }}t	        j
                  |      rt        d|t        |      fz         || _        |D cg c]  }|j                   c}| _	        t        j                         5  t        j                  |dd      5 }t        j                  |D cg c]  }|j                   c}      }t        j                  |      }d|t        j                         fz  }	t         t"        | K  |d   j&                  |d   j(                  |d   j*                  ||d   j,                  |d   j.                  |d   j0                  |d   j2                  ||	|d	d	d	d	d	d	d
       d	d	d	       d	d	d	       y	c c}w c c}w # 1 sw Y   xY w# 1 sw Y   y	xY w)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 %sVariableF)skip_on_eagerz%s_%dr   NT)	trainableshapedtypehandlesynchronization
constraintaggregationdistribute_strategyname	unique_idhandle_namegraph_elementinitial_valueinitializer_opis_initialized_opcached_valuecaching_deviceis_distributed_variables)r   #executing_eagerly_outside_functions
ValueError	enumerater   is_resource_variabletype_distributed_variablesdevice_devices
init_scope
name_scopepack_eager_tensorsr   name_from_scope_nameuidsuperr
   __init__r   r   r   r   r   r   _distribute_strategy)selfdistributed_variablesr   unused_kwargsivarvr   r   r   	__class__s             h/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/distribute/packed_distributed_variable.pyr.   z"PackedDistributedVariable.__init__"   s    224
FH H FGG12 J3"77< 8;<d3i.I J 	JJ
 #8D'<=!QXX=DM		 +>>$
%@ +D''#89CSZZ9;..t4{CGGI66	'7+A.88'*00'*001!4DD,Q/::-a0<< 5a 8 M M#"%)% 	8 	+++ + > :+ ++ +s=   :F/)GF9F4)B5F9G4F99G	>GGc                     | j                   S N)r'   r0   s    r7   devicesz!PackedDistributedVariable.devicesP   s    ==    c                     t        | |      S r9   )PackedVarAndDevicer0   r&   s     r7   	on_devicez#PackedDistributedVariable.on_deviceT   s    dF++r<   c                    t        | j                        D ]  \  }}||k(  s| j                  |   c S  t        | j                        D ].  \  }}t        j                  |      |k(  s| j                  |   c S  t        d|z        )NzDevice %s is not found)r"   r'   r%   r   get_host_for_devicer!   )r0   r&   r3   ds       r7   get_var_on_devicez+PackedDistributedVariable.get_var_on_deviceW   s    $--( .1	
f**1--. $--( .1		(	(	+v	5**1--. -6
77r<   c                 r    t        j                  t        j                               }| j                  |      S r9   )r   canonicalizecurrentrD   )r0   current_devices     r7   get_var_on_current_devicez3PackedDistributedVariable.get_var_on_current_devicea   s,     --k.A.A.CDN!!.11r<   c                 8    | j                  |      j                  S )z>Returns the Tensor used as the initial value for the variable.)rD   r   r?   s     r7   r   z'PackedDistributedVariable.initial_valuee   s    !!&)777r<   c                 v    t        j                         r| j                         j                  S | j                  S r9   )r   executing_eagerlyrI   r   _handler:   s    r7   r   z PackedDistributedVariable.handlei   s-      "++-444\\r<   c                     | j                   S r9   )rM   r:   s    r7   packed_handlez'PackedDistributedVariable.packed_handlep       <<r<   c                     t        j                         r| j                         j                         S t        |   |      S r9   )r   rL   rI   valuer-   _read_variable_op)r0   no_copyr6   s     r7   rS   z+PackedDistributedVariable._read_variable_opt   s7      "++-3355W&w//r<   c                 "    | j                         S r9   )rS   r:   s    r7   rR   zPackedDistributedVariable.valuez   s    !!##r<   c                 j   t        j                         r| j                  d   j                         }| j                  dd D ]&  }t	        j
                  ||j                               }( t	        j
                  || j                  d   j                         |      }|S t        j                  | j                  d         5  t        t        |   |      }d d d        | j                  dd D ]I  }t        j                  |      5  t        t        |   |      }d d d        t	        j
                        }K t        j                  | j                  d         5  t        t        |   |      }d d d        t	        j
                  |      }|S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ;xY w)Nr      )r   )r   rL   r%   is_initializedr   logical_andr   r&   r'   r-   r
   )r0   r   resultr5   rC   initializedr6   s         r7   rY   z(PackedDistributedVariable.is_initialized}   s     "**1-<<>f**1R0 B!%%fa.>.>.@AB##
$--b1@@BOf M ::dmmA&' M0$FtLM}}Qr" ;!ZZ] 	97"337$8 	9 %%fk:	;
 ::dmmB'( 75 115"6 	7 ##FKdCfMM M	9 	97 7s$   FFF)FF&	)F2c                     t        j                         r || j                         |fi |S  |t        t        |       |fi |S r9   )r   rL   rI   r-   r
   )r0   	update_fnrR   kwargsr6   s       r7   _updatez!PackedDistributedVariable._update   sD      "t557I&IIu6=uOOOr<   c                 4    d }| j                  |||||      S )Nc                 &     | j                   |i |S r9   )
assign_subr4   akws      r7   <lambda>z6PackedDistributedVariable.assign_sub.<locals>.<lambda>       .#..!*Br*B r<   r^   rR   use_lockingr   
read_valuer`   )r0   deltarj   r   rk   assign_sub_fns         r7   rc   z$PackedDistributedVariable.assign_sub   ,    BM<<   r<   c                 4    d }| j                  |||||      S )Nc                 &     | j                   |i |S r9   )
assign_addrd   s      r7   rg   z6PackedDistributedVariable.assign_add.<locals>.<lambda>   rh   r<   ri   rl   )r0   rm   rj   r   rk   assign_add_fns         r7   rr   z$PackedDistributedVariable.assign_add   ro   r<   c                 4    d }| j                  |||||      S )Nc                 &     | j                   |i |S r9   )assignrd   s      r7   rg   z2PackedDistributedVariable.assign.<locals>.<lambda>   s    jcjj!&:r&: r<   ri   rl   )r0   rR   rj   r   rk   	assign_fns         r7   rv   z PackedDistributedVariable.assign   s,    :I<<   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_subrd   s      r7   rg   z7PackedDistributedVariable.scatter_sub.<locals>.<lambda>       ?3??A+D+D r<   r^   rR   rj   r   rl   )r0   sparse_deltarj   r   scatter_sub_fns        r7   rz   z%PackedDistributedVariable.scatter_sub   )    DN<< 	   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_addrd   s      r7   rg   z7PackedDistributedVariable.scatter_add.<locals>.<lambda>   r{   r<   r|   rl   )r0   r}   rj   r   scatter_add_fns        r7   r   z%PackedDistributedVariable.scatter_add   r   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_mulrd   s      r7   rg   z7PackedDistributedVariable.scatter_mul.<locals>.<lambda>   r{   r<   r|   rl   )r0   r}   rj   r   scatter_mul_fns        r7   r   z%PackedDistributedVariable.scatter_mul   r   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_divrd   s      r7   rg   z7PackedDistributedVariable.scatter_div.<locals>.<lambda>   r{   r<   r|   rl   )r0   r}   rj   r   scatter_div_fns        r7   r   z%PackedDistributedVariable.scatter_div   r   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_minrd   s      r7   rg   z7PackedDistributedVariable.scatter_min.<locals>.<lambda>   r{   r<   r|   rl   )r0   r}   rj   r   scatter_min_fns        r7   r   z%PackedDistributedVariable.scatter_min   r   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_maxrd   s      r7   rg   z7PackedDistributedVariable.scatter_max.<locals>.<lambda>   r{   r<   r|   rl   )r0   r}   rj   r   scatter_max_fns        r7   r   z%PackedDistributedVariable.scatter_max   r   r<   c                 2    d }| j                  ||||      S )Nc                 &     | j                   |i |S r9   )scatter_updaterd   s      r7   rg   z:PackedDistributedVariable.scatter_update.<locals>.<lambda>   s    .@c.@.@!.Jr.J r<   r|   rl   )r0   r}   rj   r   scatter_update_fns        r7   r   z(PackedDistributedVariable.scatter_update   s*    J<<#	   r<   c                     t        j                         r"| j                         j                  |||      S t        t
        |   |||      S N)r   r   as_ref)r   rL   rI   _dense_var_to_tensorr-   r
   )r0   r   r   r   r6   s       r7   r   z.PackedDistributedVariable._dense_var_to_tensor   s`      "++-BB C  
 ,dH I  r<   )NN)Fr9   NNTFNNNF)__name__
__module____qualname____doc__r.   propertyr;   r@   rD   rI   r   r   rO   rS   rR   rY   r`   rc   rr   rv   rz   r   r   r   r   r   r   r   __classcell__)r6   s   @r7   r
   r
      s    ,+\  ,828    0$*P
 
r<   r
   c                       e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
d Ze	d	        Ze	d
        Zd Ze	dej                   fd       ZddZddZddZddZddZddZddZddZddZddZddZd Zy)r>   z1Holds a packed distributed variable and a device.c                      || _         || _        y r9   )_var_device)r0   r4   r&   s      r7   r.   zPackedVarAndDevice.__init__   s    DIDLr<   c                     	 t        j                  | j                        5  t        | j                  |      cd d d        S # 1 sw Y   y xY w#   xY wr9   )r   r&   r   getattrr   )r0   r   s     r7   __getattr__zPackedVarAndDevice.__getattr__   sC    ::dll# (tyy$'( ( (s'   A A	A A
A 
A Ac                     | j                   S r9   )r   r:   s    r7   r4   zPackedVarAndDevice.var  s    99r<   c                     t        j                  | j                        5  | j                  j	                         cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rR   r:   s    r7   rR   zPackedVarAndDevice.value  s5    	DLL	! YY__     AAc                     t        j                  | j                        5  | j                  j	                         cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rk   r:   s    r7   rk   zPackedVarAndDevice.read_value  s7    	DLL	! $YY!!#$ $ $r   c                 L    | j                   j                  | j                        S r9   )r   r   r   r:   s    r7   r   z PackedVarAndDevice.initial_value  s    99""4<<00r<   c                     t        j                  | j                        5  | j                  j	                         cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   initialized_valuer:   s    r7   r   z$PackedVarAndDevice.initialized_value!  s7    	DLL	! +YY((*+ + +r   c                     | j                   S r9   )r   r:   s    r7   r&   zPackedVarAndDevice.device%  rP   r<   c                     t        j                  | j                        5  | j                  j                  cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r:   s    r7   r   zPackedVarAndDevice.handle)  s4    	DLL	! YY     A  A	c                     t        j                  | j                        5  | j                  j	                         j
                  cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rI   r   r:   s    r7   on_device_handlez#PackedVarAndDevice.on_device_handle.  s=    	DLL	! :YY00299: : :s   $AAreturnc                     t        j                  | j                        5  | j                  j                  cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   opr:   s    r7   r   zPackedVarAndDevice.op2  s2    	DLL	! YY\\  r   Nc                     t        j                  | j                        5  | j                  j	                  ||||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rc   r0   rm   rj   r   rk   s        r7   rc   zPackedVarAndDevice.assign_sub7  C    	DLL	! HYY!!%dJGH H H   AAc                     t        j                  | j                        5  | j                  j	                  ||||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rr   r   s        r7   rr   zPackedVarAndDevice.assign_add;  r   r   c                     t        j                  | j                        5  | j                  j	                  ||||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rv   )r0   rR   rj   r   rk   s        r7   rv   zPackedVarAndDevice.assign?  sC    	DLL	! DYYe[$
CD D Dr   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   rz   r0   r}   rj   r   s       r7   rz   zPackedVarAndDevice.scatter_subC  A    	DLL	! DYY""<dCD D D   AAc                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   zPackedVarAndDevice.scatter_addG  r   r   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   zPackedVarAndDevice.scatter_mulK  r   r   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   zPackedVarAndDevice.scatter_divO  r   r   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   zPackedVarAndDevice.scatter_minS  r   r   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   zPackedVarAndDevice.scatter_maxW  r   r   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr9   )r   r&   r   r   r   r   s       r7   r   z!PackedVarAndDevice.scatter_update[  sA    	DLL	! GYY%%lKFG G Gr   c                     t        j                  | j                        5  | j                  j	                  |||      cd d d        S # 1 sw Y   y xY wr   )r   r&   r   r   r   )r0   r   r   r   s       r7   r   z'PackedVarAndDevice._dense_var_to_tensor_  sG    	DLL	! YY++ ,   r   c                 6    | j                   j                         S r9   )r   _as_graph_elementr:   s    r7   r   z$PackedVarAndDevice._as_graph_elementf  s    99&&((r<   r   r   r   )r   r   r   r   r.   r   r4   rR   rk   r   r   r   r&   r   r   r   	Operationr   rc   rr   rv   rz   r   r   r   r   r   r   r   r    r<   r7   r>   r>      s    9&$ 1 1+    : #--  HHDDDDDDDG)r<   r>   Nc                 *    | j                  |||      S r   )r   )r4   r   r   r   s       r7   (_tensor_conversion_packed_var_and_devicer   j  s     
	!	!D	!	HHr<   r   )r   tensorflow.python.distributer   tensorflow.python.eagerr   tensorflow.python.frameworkr   r   tensorflow.python.opsr   r   BaseResourceVariabler
   objectr>   r   #register_tensor_conversion_functionr   r<   r7   <module>r      sm    M 4 + + B * 7\ 5 J J \~o) o)f 482649I ?  > >@Br<   