
    AVh}                     *   d 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	 ddlm
Z
 ddlmZ dd	lmZ d
 Zd Zej"                  d        Zej"                  d        Zej"                  d        ZddZd Z G d de      Z G d dej2                        Zy)zUtility functions for TPU.    N)packed_distributed_variable)context)def_function)constant_op)ops)resource_variable_ops)tpu_replicationc                      t               d   S )zEReturns the TPUReplicateContext, which exists inside a tpu.rewrite().r   )enclosing_tpu_context_and_graph     U/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/distribute/tpu_util.pyenclosing_tpu_contextr      s    	(	*1	--r   c                      t        j                         } | O| j                         }|-t        |t        j
                        r|| fS |j                  }|-t        | dd      } | Oy)z^Returns the TPUReplicateContext which exists inside a tpu.rewrite(), and its associated graph.Nouter_graph)NN)r   get_default_graph_get_control_flow_context
isinstancer	   TPUReplicateContextouter_contextgetattr)graphctxs     r   r   r   !   sr    



!%

)
)
+C
/	C<<	=Ezc / E=$/E 	 
r   c               #      K   t               \  } }| d y|j                         }|j                  | j                         d |j                  |       yw)zOReturns a context manager that skips current enclosing context if there is any.N)r   r   _set_control_flow_contextr   )r   r   saved_contexts      r   outside_or_skip_tpu_contextr   0   sO      /0*#u[	335M	##C$5$56		##M2s   AAc              #      K   t        j                         s.t        | t        j                        st        j
                         rd  y | j                  j                         5  d  d d d        y # 1 sw Y   y xY wwN)r   executing_eagerlyr   r   EagerTensorhas_default_graphr   
as_default)tensors    r   _maybe_enter_graphr%   =   sW      !Z%H				 	 	"   s   A"A>$A2)	A>2A;7A>c              #      K   t        | t        j                        r-t        j                  | j                        5  d  d d d        y d  y # 1 sw Y   y xY wwr   )r   packedPackedVarAndDevicer   device)vars    r   _maybe_on_devicer+   I   sI      V../	CJJ	   
 s   :AAAAAc                      d fd	}|S )a:  Wrap `raw_assign_fn` with the proper graph context and device scope.

  Args:
    raw_assign_fn: the function to be wrapped.
    use_handle: if True, the `raw_assign_fn` will be applied to the handle of a
      variable; otherwise it will be applied to the variable itself.

  Returns:
    The wrapped function.
  c           	         ~r| j                   n| }t        |      5  t        |       5   |t        j                  || j
                        |      }t        j                  |g      5  |r=r| j                         n| j                         cd d d        cd d d        cd d d        S |cd d d        cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)N)dtypename)	handler%   r+   r   convert_to_tensorr.   control_dependencies_read_variable_op
read_value)	r*   valueuse_lockingr0   r5   r1   opraw_assign_fn
use_handles	          r   	assign_fnz%make_raw_assign_fn.<locals>.assign_fn_   s    %SZZ3F	F	# %5c%: 
#''SYY?dLb##RD) ,6&&(CNN<L    	          sS   C3AC+$C	C	C3+C,	C5	C3CC	C3C'	#C33C<)FNTr   )r9   r:   r;   s   `` r   make_raw_assign_fnr<   S   s     
r   c                      d fd	}|S )zLWrap `raw_scatter_xxx_fn` so that it can be called w/ and w/o packed handle.c           
         ~| j                   }t        |      5  t        |       5   ||j                  t	        j
                  |j                  | j                        |      }t	        j                  |g      5  | j                         cd d d        cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr/   )
r1   r%   r+   indicesr   r2   valuesr.   r3   r4   )r*   sparse_deltar7   r0   r1   r8   raw_scatter_xxx_fns         r   scatter_xxx_fnz/make_raw_scatter_xxx_fn.<locals>.scatter_xxx_fnr   s    ZZF	F	# '%5c%: '






 3 3SYY
?	b
 ##RD) '$$&' '' ' '' ' '' ' ' ' ' 'sA   CAB=;B'	B=	C'B0,B=4	C=C	CC)FNr   )rB   rC   s   ` r   make_raw_scatter_xxx_fnrD   o   s    ' 
r   c                   "    e Zd ZdZd Zd Zd Zy)LazyVariableTrackerz,Class to track uninitialized lazy variables.c                     g | _         y r   )_uninitialized_var_list)selfs    r   __init__zLazyVariableTracker.__init__   s
    #%D r   c                 "   d }t        j                  |dd      }t        j                         5  t	        | j
                        dkD  r || j
                         n || j
                         ddd       g | _        y# 1 sw Y   g | _        yxY w)z<Initialize all uninitialized lazy variables stored in scope.c                 0   | D ]q  }|j                   }t        |dd       }t        |d|j                        }t        j                  |j                        5  t        j                  ||       d d d        s t        j                  g       S # 1 sw Y   xY w)N_packed_varpacked_handle)resourcer6   )	_initial_valuer   r1   r   r)   r   AssignVariableOpr   constant)uninitialized_var_listr*   val
packed_varr1   s        r   assign_functionz;LazyVariableTracker.initialize_all.<locals>.assign_function   s    ' M#  S-6
_cjjAZZ& 	M

0
0&
L	M 	MM !!"%%	M 	Ms   BB	F)	autographjit_compile   N)r   functionr   
init_scopelenrH   )rI   rV   assign_tf_functions      r   initialize_allz"LazyVariableTracker.initialize_all   s    & &..5e> 
	 6	T))	*Q	.4778445	6 $&D 6 $&D s   >A>>Bc                 :    | j                   j                  |       y r   )rH   append)rI   r*   s     r   add_uninitialized_varz)LazyVariableTracker.add_uninitialized_var   s      '',r   N)__name__
__module____qualname____doc__rJ   r^   ra   r   r   r   rF   rF      s    4&&0-r   rF   c                   F     e Zd ZdZ fdZd fd	Zd fd	Zd fd	Z xZS )TPUUninitializedVariablezUninitializedVariable component for TPU.

  Sometimes user might assign (different values) to a single component of a
  mirrored TPU variable. Thus we need to initialize_all when the assign* or read
  is invoked on a single component.
  c                 T    | j                   j                          t        |          S r   )_lazy_scoper^   superr5   )rI   	__class__s    r   r5   z#TPUUninitializedVariable.read_value   s#    ##%7r   c                 ^    | j                   j                          t        |   ||||      S N)r7   r0   r5   )ri   r^   rj   
assign_subrI   deltar7   r0   r5   rk   s        r   rn   z#TPUUninitializedVariable.assign_sub   5    ##%7;Tj   r   c                 ^    | j                   j                          t        |   ||||      S rm   )ri   r^   rj   assign)rI   r6   r7   r0   r5   rk   s        r   rs   zTPUUninitializedVariable.assign   s4    ##%7>;Tj   r   c                 ^    | j                   j                          t        |   ||||      S rm   )ri   r^   rj   
assign_addro   s        r   ru   z#TPUUninitializedVariable.assign_add   rq   r   )NNT)	rb   rc   rd   re   r5   rn   rs   ru   __classcell__)rk   s   @r   rg   rg      s!      r   rg   )T)re   
contextlibtensorflow.python.distributer   r'   tensorflow.python.eagerr   r   tensorflow.python.frameworkr   r   tensorflow.python.opsr   tensorflow.python.tpur	   r   r   contextmanagerr   r%   r+   r<   rD   objectrF   UninitializedVariablerg   r   r   r   <module>r      s    !  N + 0 3 + 7 1.
 	3 	3   
 
8&-& -D4JJ r   