o
    ?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   t/home/www/facesmatcher.com/pyenv/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StaticZ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   Zvars_resultsnonlocal_varsr   r/   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)Zvar_namez
      def getter_name():
        return guarded_state_vars,
      def setter_name(vars_):
        nonlocal_declarations
        state_vars, = vars_
    )nonlocal_declarationsr:   Zguarded_state_varsr;   Z
state_vars)	r	   replaceZ	is_simpler3   Zreplace_as_expressionr4   Constantr'   tuple)r   Z
block_varsr?   r:   r;   templateZ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<   )r4   rA   r)   sr   r   r   r+   s   s    z?ControlFlowTransformer._create_loop_options.<locals>.<listcomp>)r   hasannoBasicZ
DIRECTIVESr4   Dictr   r   Zset_loop_optionszipitemslist)r   r   Zloop_directivesZ	opts_dictZ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<   )varZsymbol_name)r	   r@   r4   rA   Zssf)r   Zundefined_symbolsZassignmentsrG   rC   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.   r3   	frozenset)r   modifiedlive_inlive_outrS   basic_scope_varsrG   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   )Z	is_symbolr)   Zsssr   r   r   	<genexpr>   s    
zCControlFlowTransformer._get_block_composite_vars.<locals>.<genexpr>c                 3   s    | ]}| v V  qd S r   r   rZ   rV   r   r   r[      s    )r.   rB   Zsupport_setallr3   rT   )r   rU   rV   composite_scope_varsrG   Zsupport_set_symbolsr   r\   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   r[      s    z9ControlFlowTransformer._get_block_vars.<locals>.<genexpr>c                    s   |  v | fS r   r   )r*   Z
input_onlyr   r   <lambda>   s    z8ControlFlowTransformer._get_block_vars.<locals>.<lambda>)key)r   r   r   ZDEFINED_VARS_INZLIVE_VARS_INZLIVE_VARS_OUTr   r   r   rY   r_   rB   r2   rS   sortedlen)r   r   rU   Z
defined_inrV   rW   Zfn_scoperX   r^   Z
scope_varsZpossibly_undefined	undefinednoutsr   r`   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)
    Zif_bodyZ	else_bodyr<   c                 s   "    | ]}t jt|d dV  qd S rE   r4   rA   r'   rF   r   r   r   r[           z2ControlFlowTransformer.visit_If.<locals>.<genexpr>)body	body_nameorelseZorelse_namer?   rf   state_functionsstate_getter_namestate_setter_namesymbol_namestestundefined_assigns)r   r   r   r   r"   r#   ZORELSE_SCOPErg   boundrR   r9   
referencedctxnamer
new_symbolrD   ro   r4   Passr	   r@   rm   rA   rB   rt   r   copy_origin)r   r   
body_scopeZorelse_scopeZ	cond_varsre   rf   ru   r?   reservedrq   rr   rp   Zorelse_bodyrC   	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 )
Nrh   ri   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   rj   rE   rk   rF   r   r   r   r[   -  rl   z5ControlFlowTransformer.visit_While.<locals>.<genexpr>Z	loop_test)rm   rn   r?   optsrp   rq   rr   rs   rt   Z	test_nameru   rv   )r   r   r   r   r"   r#   rg   rw   rR   r9   rx   ry   rz   r{   rD   rP   r	   r@   rm   rB   rt   r   r}   )r   r   r~   	loop_varsre   _ru   r?   r   rq   rr   rp   r   rC   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 )Nrh   ri   Ziterate_namesr<   F)Zinclude_encoding_marker
extra_testzg
        def extra_test_name():
          nonlocal_declarations
          return extra_test_expr
      )Zextra_test_exprextra_test_namer   r?   Noneitrz'
      iterates = iterate_arg_name
    )iterate_arg_nameZ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   rj   rE   rk   rF   r   r   r   r[     rl   z3ControlFlowTransformer.visit_For.<locals>.<genexpr>)rm   rn   extra_test_functionr   r   iterate_expansionZiteratedr?   r   rs   rp   rq   rr   ru   rv   )$r   r   r   r   r"   r#   ZITERATE_SCOPErg   rw   rR   r9   rx   ry   rz   r{   rD   rP   rO   r3   r4   rA   rN   r   unparsetargetrH   rI   ZEXTRA_LOOP_TESTr	   r@   Zparse_expressionr   r}   rm   iterrB   )r   r   r~   Z
iter_scoper   re   r   ru   r?   r   rq   rr   rp   r   r   r   rC   r   r   r   r   r   r   r   	visit_For4  sx   






z ControlFlowTransformer.visit_ForN)r   r   r   __doc__r    r$   r9   rD   rP   rR   rY   r_   rg   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   ry   Zgraphsr   r   r   	transform  s   

r   )r   r4   Z tensorflow.python.autograph.corer   Z tensorflow.python.autograph.langr   Z tensorflow.python.autograph.pyctr   r   r   r   r   r	   Z0tensorflow.python.autograph.pyct.static_analysisr
   r   r   r   r   objectr   ZBaser   Z
Definitionr   r   r   r   r   r   <module>   s*     h