o
    i e9                     @   s   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 deZG dd dejZG dd dejZdd ZdS )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                   @   s   e Zd ZdZdS )	_FunctionN)__name__
__module____qualname__scope r   r   b/var/www/myenv/lib/python3.10/site-packages/tensorflow/python/autograph/converters/control_flow.pyr   "   s    r   c                   @   sp   e Zd Z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d ZdS )ControlFlowTransformerz>Transforms control flow structures like loops an conditionals.c                 C   sJ   | j t }t|tjj|_| |W  d    S 1 sw   Y  d S N)stater   r   getannoStaticSCOPEr   generic_visitselfnodefnr   r   r   visit_Lambda*      $z#ControlFlowTransformer.visit_Lambdac                 C   sJ   | j t }t|tjj|_| |W  d    S 1 sw   Y  d S r   )	r   r   r   r   r   NodeAnno
BODY_SCOPEr   r   r   r   r   r   visit_FunctionDef/   r"   z(ControlFlowTransformer.visit_FunctionDefc                    sp   t |}g }| jt jj|@   r|tdd  D   fdd|D }|r6|tdd |D  |S )Nc                 S      g | ]}t |qS r   str.0vr   r   r   
<listcomp>:       zHControlFlowTransformer._create_nonlocal_declarations.<locals>.<listcomp>c                    s    g | ]}|  s| vr|qS r   is_compositer)   global_varsr   r   r,   <   s    c                 S   r&   r   r'   r)   r   r   r   r,   ?   r-   )	setr   r   r   globalsappendgastGlobalNonlocal)r   vars_resultsnonlocal_varsr   r0   r   _create_nonlocal_declarations4   s   
z4ControlFlowTransformer._create_nonlocal_declarationsc              
   C   s|   |sd}t j|||dS g }|D ]}| r|| q|t jd|tjt|d dd qd}t j|||||t|d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_simpler4   replace_as_expressionr5   Constantr(   tuple)r   
block_varsrB   r<   r=   templateguarded_block_varsr+   r   r   r   _create_state_functionsC   s2   z.ControlFlowTransformer._create_state_functionsc                 C   s~   t |t jjstg g S t |t jj}tj|vr!tg g S |tj }t	|
  \}}dd |D }t|}t||S )Nc                 S   s   g | ]	}t j|d dqS Nr>   )r5   rH   r*   sr   r   r   r,   s   s    z?ControlFlowTransformer._create_loop_options.<locals>.<listcomp>)r   hasannoBasic
DIRECTIVESr5   Dictr   r   set_loop_optionszipitemslist)r   r   loop_directives	opts_dictstr_keysvalueskeysr   r   r   _create_loop_optionsi   s   

z+ControlFlowTransformer._create_loop_optionsc              	   C   s8   g }|D ]}d}|t j||tj| d dd7 }q|S )Nz1
        var = ag__.Undefined(symbol_name)
      r>   )varsymbol_name)r	   rE   r5   rH   ssf)r   undefined_symbolsassignmentsrP   rK   r   r   r   _create_undefined_assignsw   s   
z0ControlFlowTransformer._create_undefined_assignsc                 C   sP   | j t jj}g }|D ]}| rq||v s||v s||v r#|| qt|S r   )r   r   r   	nonlocalsr/   r4   	frozenset)r   modifiedlive_inlive_outre   basic_scope_varsrP   r   r   r   _get_block_basic_vars   s   
z,ControlFlowTransformer._get_block_basic_varsc                    sV   g }|D ]"}|  sqtdd |jD }t fdd|D s!q|| qt|S )Nc                 s   s    | ]	}|  r|V  qd S r   )	is_symbolr*   sssr   r   r   	<genexpr>   s    
zCControlFlowTransformer._get_block_composite_vars.<locals>.<genexpr>c                 3   s    | ]}| v V  qd S r   r   rm   rh   r   r   ro      s    )r/   rI   support_setallr4   rf   )r   rg   rh   composite_scope_varsrP   support_set_symbolsr   rp   r   _get_block_composite_vars   s   z0ControlFlowTransformer._get_block_composite_varsc                    s   t |t jj}t |t jj}t |t jj}| jt j}| 	|||}| 
||}t||B }	|| |j |j }
tdd |
D }||| @  t|	 fddd}	t|	t  }|	||fS )zBDetermines the variables affected inside a control flow statement.c                 s   s    | ]	}|  s|V  qd S r   r.   r)   r   r   r   ro      s    z9ControlFlowTransformer._get_block_vars.<locals>.<genexpr>c                    s   |  v | fS r   r   )r+   
input_onlyr   r   <lambda>   s    z8ControlFlowTransformer._get_block_vars.<locals>.<lambda>)key)r   r   r   DEFINED_VARS_INLIVE_VARS_INLIVE_VARS_OUTr   r   r   rk   ru   rI   r3   re   sortedlen)r   r   rg   
defined_inrh   ri   fn_scoperj   rs   
scope_varspossibly_undefined	undefinednoutsr   rv   r   _get_block_vars   s$   
z&ControlFlowTransformer._get_block_varsc                 C   s  |  |}t|tjj}t|tjj}| ||j|jB \}}}| 	|}| 
|}|j|jB }	| jjd|	}
| jjd|	}| |||
|}|j}|sTt g}d}tj||j| jjd|	|| jjd|	|tj|d d||
|tdd |D |j|d	}t||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                 s   "    | ]}t jt|d dV  qd S rN   r5   rH   r(   rO   r   r   r   ro           z2ControlFlowTransformer.visit_If.<locals>.<genexpr>)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   boundrd   r;   
referencedctxnamer
new_symbolrM   r   r5   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_nodesr   r   r   visit_If   sF   




zControlFlowTransformer.visit_Ifc                 C   s   |  |}t|tjj}| ||j\}}}| |}| 	|}|j
}| jjd|}	| jjd|}
| |||	|
}| |}d}tj||j| jjd|||||	|
tdd |D |j| jjd||d}t||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                 s   r   rN   r   rO   r   r   r   ro   -  r   z5ControlFlowTransformer.visit_While.<locals>.<genexpr>	loop_test)r   r   rB   optsr   r   r   r   r   	test_namer   r   )r   r   r   r   r#   r$   r   r   rd   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   r   r   r   visit_While  s:   



z"ControlFlowTransformer.visit_Whilec                 C   s  |  |}t|tjj}t|tjj}| ||j|jB \}}}| 	|}| 
|}|j|jB }	| jjd|	}
| jjd|	}| |||
|}| |}|jtjdd d |jtjtj|jddd d t|tjjrt|tjj}| jjd|	}d}tj|||||d	}ntd
}g }| jjd|	}d}tj|||jd}t || d}tj||j!| jjd|	|||||j"||t#dd |D ||
||d}t ||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                 s   r   rN   r   rO   r   r   r   ro     r   z3ControlFlowTransformer.visit_For.<locals>.<genexpr>)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   rd   r;   r   r   r   r   rM   r^   r]   r4   r5   rH   r\   r   unparsetargetrQ   rR   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   r   r   r   	visit_For4  sx   






z ControlFlowTransformer.visit_ForN)r   r   r   __doc__r!   r%   r;   rM   r^   rd   rk   ru   r   r   r   r   r   r   r   r   r   '   s    &92r   c                       s   e Zd Z fddZ  ZS )AnnotatedDefc                    s   t t|   i | _d S r   )superr   __init__r   )r   	__class__r   r   r     s   
zAnnotatedDef.__init__)r   r   r   r   __classcell__r   r   r   r   r     s    r   c                 C   s^   t | }t| } t| |d } t| ||} t| ||} t| ||} t|	| } | S r   )
r   buildr   resolver
   r   r   r   r   visit)r   r   graphsr   r   r   	transform  s   

r   )r   r5    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   r   <module>   s*     h