
    BVh9                        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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      Z G d dej*                        Z G d dej.                        Zd Zy)z0Handles control flow statements: while, for, if.    N)	converter)
directives)anno)cfg)origin_info)parser)
qual_names)	templates)activity)annos)liveness)reaching_definitions)reaching_fndefsc                       e Zd ZdZy)	_FunctionN)__name__
__module____qualname__scope     c/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/autograph/converters/control_flow.pyr   r   "   s    
%r   r   c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)ControlFlowTransformerz>Transforms control flow structures like loops an conditionals.c                     | j                   t           5 }t        j                  |t        j                  j
                        |_        | j                  |      cd d d        S # 1 sw Y   y xY wN)stater   r   getannoStaticSCOPEr   generic_visitselfnodefns      r   visit_Lambdaz#ControlFlowTransformer.visit_Lambda*   sO    	I	 &"dDKK$5$56bh%& & &   AA""A+c                     | j                   t           5 }t        j                  |t        j
                  j                        |_        | j                  |      cd d d        S # 1 sw Y   y xY wr   )	r   r   r   r   r   NodeAnno
BODY_SCOPEr   r!   r"   s      r   visit_FunctionDefz(ControlFlowTransformer.visit_FunctionDef/   sO    	I	 &"dENN$=$=>bh%& & &r'   c           
         t        |      }g }| j                  t           j                  j                  |z  }|r;|j                  t        j                  |D cg c]  }t        |       c}             |D cg c]  }|j                         r||vs| }}|r;|j                  t        j                  |D cg c]  }t        |       c}             |S c c}w c c}w c c}w r   )setr   r   r   globalsappendgastGlobalstris_compositeNonlocal)r#   vars_resultsglobal_varsvnonlocal_varss         r   _create_nonlocal_declarationsz4ControlFlowTransformer._create_nonlocal_declarations4   s    JEG**Y'--55=KnnT[[+!>Q#a&!>?@ K 0Qk5IKM KnnT]]M#BqCF#BCDN "?K $Cs   C9CCC:C#c                 f   |sd}t        j                  |||      S g }|D ]i  }|j                         r|j                  |       %|j                  t        j                  d|t        j                  t        |      d                    k d}t        j                  |||||t        |            S )Nzj
        def getter_name():
          return ()
        def setter_name(block_vars):
          pass
      )getter_namesetter_namezag__.ldu(lambda: var_, name)kind)var_namez
      def getter_name():
        return guarded_state_vars,
      def setter_name(vars_):
        nonlocal_declarations
        state_vars, = vars_
    )nonlocal_declarationsr<   guarded_state_varsr=   
state_vars)	r
   replace	is_simpler/   replace_as_expressionr0   Constantr2   tuple)r#   
block_varsrB   r<   r=   templateguarded_block_varsr8   s           r   _create_state_functionsz.ControlFlowTransformer._create_state_functionsC   s    
h 
F F  8	
!!!$!!++.]]3q657	8	8H 3-$& &r   c                 "   t        j                  |t         j                  j                        st	        j
                  g g       S t        j                  |t         j                  j                        }t        j                  |vrt	        j
                  g g       S |t        j                     }t        |j                          \  }}|D cg c]  }t	        j                  |d        }}t        |      }t	        j
                  ||      S c c}w Nr>   )r   hasannoBasic
DIRECTIVESr0   Dictr   r   set_loop_optionszipitemsrH   list)r#   r$   loop_directives	opts_dictstr_keysvaluesskeyss           r   _create_loop_optionsz+ControlFlowTransformer._create_loop_optionsi   s    <<djj334YYr2ll4)>)>?O""/9YYr2
 ; ;<IIOO-.Hf19:ADMM!$':D:&\F99T6"" ;s   Dc           
          g }|D ]B  }d}|t        j                  ||t        j                  |j	                         d             z  }D |S )Nz1
        var = ag__.Undefined(symbol_name)
      r>   )varsymbol_name)r
   rE   r0   rH   ssf)r#   undefined_symbolsassignmentsr\   rK   s        r   _create_undefined_assignsz0ControlFlowTransformer._create_undefined_assignsw   sX    K 9
h Y&&
mmAEEG$79 9k	9 r   c                     | j                   t           j                  j                  }g }|D ]0  }|j	                         r||v s||v s||v r|j                  |       2 t        |      S r   )r   r   r   	nonlocalsr3   r/   	frozenset)r#   modifiedlive_inlive_outrg   basic_scope_varsr\   s          r   _get_block_basic_varsz,ControlFlowTransformer._get_block_basic_vars   sr    

9%++55I 	
	 
gh!y." %&&r   c                     g }|D ]U  }|j                         st        d |j                  D              }t        fd|D              sE|j	                  |       W t        |      S )Nc              3   B   K   | ]  }|j                         s|  y wr   )	is_symbol).0ssss     r   	<genexpr>zCControlFlowTransformer._get_block_composite_vars.<locals>.<genexpr>   s      ";#--/#";   c              3   &   K   | ]  }|v  
 y wr   r   )rq   rr   rj   s     r   rs   zCControlFlowTransformer._get_block_composite_vars.<locals>.<genexpr>   s     ?C?s   )r3   rI   support_setallr/   rh   )r#   ri   rj   composite_scope_varsr\   support_set_symbolss     `   r   _get_block_composite_varsz0ControlFlowTransformer._get_block_composite_vars   sq     %^^ " ";"; ;?+>??!!!$'%( )**r   c                    t        j                  |t         j                  j                        }t        j                  |t         j                  j                        }t        j                  |t         j                  j
                        }| j                  t           j                  }| j                  |||      }| j                  ||      }t        ||z        }	||z
  |j                  z
  |j                  z
  }
t        d |
D              }|||z
  z  t        |	fd      }	t        |	      t              z
  }|	||fS )zBDetermines the variables affected inside a control flow statement.c              3   B   K   | ]  }|j                         r|  y wr   )r3   )rq   r8   s     r   rs   z9ControlFlowTransformer._get_block_vars.<locals>.<genexpr>   s     LA1>>;KaLrt   c                     | v | fS r   r   )r8   
input_onlys    r   <lambda>z8ControlFlowTransformer._get_block_vars.<locals>.<lambda>   s    1
?A2F r   )key)r   r   r   DEFINED_VARS_INLIVE_VARS_INLIVE_VARS_OUTr   r   r   rm   rz   rI   r.   rg   sortedlen)r#   r$   ri   
defined_inrj   rk   fn_scoperl   rx   
scope_varspossibly_undefined	undefinednoutsr~   s                @r   _get_block_varsz&ControlFlowTransformer._get_block_vars   s   dDKK$?$?@Jll4!9!9:G||D$++";";<Hzz)$**H11  99(GL'*>>?J 	: 0 0083E3EE L!3LLI "Gh$66J 
(FGJ
Oc*o-Ey%''r   c                 2   | j                  |      }t        j                  |t        j                  j
                        }t        j                  |t        j                  j                        }| j                  ||j                  |j                  z        \  }}}| j                  |      }| j                  |      }|j                  |j                  z  }	| j                  j                  j                  d|	      }
| j                  j                  j                  d|	      }| j                  |||
|      }|j                   }|st#        j$                         g}d}t'        j(                  ||j*                  | j                  j                  j                  d|	      || j                  j                  j                  d|	      |t#        j,                  |d       ||
|t/        d |D              |j0                  |      }t3        j4                  ||d	          |S )
N	get_state	set_stateac  
      state_functions
      def body_name():
        nonlocal_declarations
        body
      def orelse_name():
        nonlocal_declarations
        orelse
      undefined_assigns
      ag__.if_stmt(
        test,
        body_name,
        orelse_name,
        state_getter_name,
        state_setter_name,
        (symbol_names,),
        nouts)
    if_body	else_bodyr>   c              3   \   K   | ]$  }t        j                  t        |      d        & y wrO   r0   rH   r2   rq   r\   s     r   rs   z2ControlFlowTransformer.visit_If.<locals>.<genexpr>   "     O4==Qd;;O   *,)body	body_nameorelseorelse_namerB   r   state_functionsstate_getter_namestate_setter_namesymbol_namestestundefined_assigns)r!   r   r   r   r)   r*   ORELSE_SCOPEr   boundre   r:   
referencedctxnamer
new_symbolrM   r   r0   Passr
   rE   r   rH   rI   r   r   copy_origin)r#   r$   
body_scopeorelse_scope	cond_varsr   r   r   rB   reservedr   r   r   orelse_bodyrK   	new_nodess                   r   visit_IfzControlFlowTransformer.visit_If   s   d#DdENN$=$=>J<<enn&A&ABL"&"6"6j!3!33#5Iy% 66yA >>yI$$|'>'>>H11+xH11+xH22(*;=NPO ++KYY[MkH$ !!YY((..++Ix@HHNN--k8D3mmE-'++OYOOYY+-I D)B-0r   c                 R   | j                  |      }t        j                  |t        j                  j
                        }| j                  ||j                        \  }}}| j                  |      }| j                  |      }|j                  }| j                  j                  j                  d|      }	| j                  j                  j                  d|      }
| j                  |||	|
      }| j                  |      }d}t!        j"                  ||j$                  | j                  j                  j                  d|      ||||	|
t'        d |D              |j(                  | j                  j                  j                  d|      |      }t+        j,                  ||d          |S )	Nr   r   aF  
      state_functions
      def body_name():
        nonlocal_declarations
        body
      def test_name():
        return test
      undefined_assigns
      ag__.while_stmt(
          test_name,
          body_name,
          state_getter_name,
          state_setter_name,
          (symbol_names,),
          opts)
    	loop_bodyc              3   \   K   | ]$  }t        j                  t        |      d        & y wrO   r   r   s     r   rs   z5ControlFlowTransformer.visit_While.<locals>.<genexpr>-  r   r   	loop_test)r   r   rB   optsr   r   r   r   r   	test_namer   r   )r!   r   r   r   r)   r*   r   r   re   r:   r   r   r   r   rM   r^   r
   rE   r   rI   r   r   r   )r#   r$   r   	loop_varsr   _r   rB   r   r   r   r   r   rK   r   s                  r   visit_Whilez"ControlFlowTransformer.visit_While  ss   d#DdENN$=$=>J"2249I9IJIy!66yA >>yI$$H11+xH11+xH22(*;=NPO $$T*DH  !!YY((..++KB3'++OYOOYY((..++KB+-I D)B-0r   c                    | j                  |      }t        j                  |t        j                  j
                        }t        j                  |t        j                  j                        }| j                  ||j                  |j                  z        \  }}}| j                  |      }| j                  |      }|j                  |j                  z  }	| j                  j                  j                  d|	      }
| j                  j                  j                  d|	      }| j                  |||
|      }| j!                  |      }|j"                  j%                  t'        j(                  dd              |j*                  j%                  t'        j(                  t-        j.                  |j0                  d      d              t        j2                  |t        j4                  j6                        rqt        j                  |t        j4                  j6                        }| j                  j                  j                  d|	      }d}t9        j:                  |||||	      }nt-        j<                  d
      }g }| j                  j                  j                  d|	      }d}t9        j:                  |||j0                        }t?        j@                  ||       d}t9        j:                  ||jB                  | j                  j                  j                  d|	      |||||jD                  ||tG        d |D              ||
||      }t?        j@                  ||d          |S )Nr   r   iterate_namesr>   F)include_encoding_marker
extra_testzg
        def extra_test_name():
          nonlocal_declarations
          return extra_test_expr
      )extra_test_exprextra_test_namer   rB   Noneitrz'
      iterates = iterate_arg_name
    )iterate_arg_nameiteratesaw  
      state_functions
      def body_name(iterate_arg_name):
        nonlocal_declarations
        iterate_expansion
        body
      extra_test_function
      undefined_assigns
      ag__.for_stmt(
          iterated,
          extra_test_name,
          body_name,
          state_getter_name,
          state_setter_name,
          (symbol_names,),
          opts)
    r   c              3   \   K   | ]$  }t        j                  t        |      d        & y wrO   r   r   s     r   rs   z3ControlFlowTransformer.visit_For.<locals>.<genexpr>  r   r   )r   r   extra_test_functionr   r   iterate_expansioniteratedrB   r   r   r   r   r   r   r   )$r!   r   r   r   r)   r*   ITERATE_SCOPEr   r   re   r:   r   r   r   r   rM   r^   r]   r/   r0   rH   r[   r   unparsetargetrP   rQ   EXTRA_LOOP_TESTr
   rE   parse_expressionr   r   r   iterrI   )r#   r$   r   
iter_scoper   r   r   r   rB   r   r   r   r   r   r   r   rK   r   r   r   r   s                        r   	visit_Forz ControlFlowTransformer.visit_For4  s   d#DdENN$=$=>JdENN$@$@AJ"22j!1!113Iy! 66yA >>yI$$z'<'<<H11+xH11+xH22(*;=NPO $$T*DIIT]]?>?KKt}}t{{EBO P ||D$**445<<djj&@&@Aj11
"o
h
 &--
$) 57 //7o xx~~00AH "))#3dkkKD"34H" !!YY((..++KB/')+3OYOO'+++-I  D)B-0r   N)r   r   r   __doc__r&   r+   r:   rM   r^   re   rm   rz   r   r   r   r   r   r   r   r   r   '   sE    F&
&
$&L#
'+2(>7r0dVr   r   c                        e Zd Z fdZ xZS )AnnotatedDefc                 8    t         t        |           i | _        y r   )superr   __init__r   )r#   	__class__s    r   r   zAnnotatedDef.__init__  s    	,&(DOr   )r   r   r   r   __classcell__)r   s   @r   r   r     s     r   r   c                 F   t        j                  |       }t        j                  |       } t	        j                  | |d       } t        j                  | ||      } t        j                  | ||      } t        j                  | ||      } t        |      j                  |       } | S r   )
r   buildr	   resolver   r   r   r   r   visit)r$   r   graphss      r   	transformr     s    99T?&			D	!$			$T	*$		%	%dC	8$		 	 sF	3$			$V	,$		$	*	*4	0$	+r   )r   r0    tensorflow.python.autograph.corer    tensorflow.python.autograph.langr    tensorflow.python.autograph.pyctr   r   r   r   r	   r
   0tensorflow.python.autograph.pyct.static_analysisr   r   r   r   r   objectr   Baser   
Definitionr   r   r   r   r   <module>r      sk    7  6 7 1 0 8 3 7 6 E B E Q L 
cY^^ cL'22 	r   