§
    ž²Åj”  ã                   óÌ   — d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlZd dlmZmZmZ ddlmZmZmZ ddlmZmZ dd	lmZ  e j        e¦  «        Z G d
„ d¦  «        ZdS )é    N)Úpartial)ÚAnyÚCallableÚDictÚUnion)ÚExpr)Úbound_sympyÚValueRangeAnalysisÚValueRangesé   )ÚInterpreterShimÚLoopBodyÚLoopBodyBlock)Úcache_on_selfÚdominated_nodes)ÚVc                   óš  — e Zd ZdZdeddfd„Zdefd„Zede	e
j        j        ee         f         fd„¦   «         Zde	eed	ef         f         de	eed	ee         f         f         fd
„Zdede	e
j        j        ee         f         dedede	eed	ef         f         dee         fd„Zdedee         dee         fd„Zdedee         fd„ZdS )Ú	BoundVarsa¢  
    Performs Value Range Analysis on LoopBody's fx graph by calling BoundVars.run()
    It exposes the ranges of the nodes in the `bounds` variable

    Note. A current limitation of this analysis is that it just works on a per-loop basis.
    We should be able to propagate the bounds between across the whole graph. This may benefit
    the case a bounded variable is returned by a kernel and fed into another.
    Ú	loop_bodyÚreturnNc                 ó*  ‡— dt           t          t          f         dt          fd„Š|| _        ˆfd„|j                             ¦   «         D ¦   «         | _        t          d„ | j                             ¦   «         D ¦   «         ¦  «        | _	        i | _
        d S )NÚvr   c                 óX   — t          | t          ¦  «        rt          | ¦  «        j        n| S ©N)Ú
isinstancer   r	   Úupper)r   s    úGC:\Projects\Historical\venv\Lib\site-packages\torch/_inductor/bounds.pyÚupper_boundz'BoundVars.__init__.<locals>.upper_bound   s%   € Ý+5°a½Ñ+>Ô+>ÐE•;˜q‘>”>Ô'Ð'ÀAÐEó    c           	      óf   •— i | ]-\  }}|t          t                   d  ‰|¦  «        dz
  ¦  «        “Œ.S )r   r   )r   r   )Ú.0Úkr   r   s      €r   ú
<dictcomp>z&BoundVars.__init__.<locals>.<dictcomp>"   sK   ø€ ð !
ð !
ð !
á��1ð �{�4Ô   K K°¡N¤N°QÑ$6Ñ7Ô7ð!
ð !
ð !
r   c              3   óX   K  — | ]%}|j         d dt          j        fv s	d|j         v ¯!|V — Œ&dS )ÚloadÚ	reductionÚmasked_subblockN)ÚtargetÚoperatorÚgetitem©r!   Únodes     r   ú	<genexpr>z%BoundVars.__init__.<locals>.<genexpr>'   sT   è è € ð .
ð .
àØŒ{˜v {µHÔ4DÐEÐEÐEØ  D¤KÐ/Ð/ð ð 0Ð/Ð/Ð/ð	.
ð .
r   )r   r   Úintr   Ú
var_rangesÚitemsÚreplacement_valsr   Ú	get_nodesÚunbounded_varsÚ_bounds)Úselfr   r   s     @r   Ú__init__zBoundVars.__init__   sÄ   ø€ ð	F�5¥¥s Ô+ð 	Fµð 	Fð 	Fð 	Fð 	Fð #ˆŒð!
ð !
ð !
ð !
à!Ô,×2Ò2Ñ4Ô4ð!
ñ !
ô !
ˆÔõ
 .ð .
ð .
àœ×0Ò0Ñ2Ô2ð.
ñ .
ô .
ñ 
ô 
ˆÔð @BˆŒˆˆr   c           
      ó`   — | j         j        › d| j        › d| j        › d| j        › d| j        › d�
S )Nz(loop_body=z,
 replacement_vals=z, 
unbounded_vars=z, 
_bounds=ú))Ú	__class__Ú__name__r   r1   r3   r4   )r5   s    r   Ú__repr__zBoundVars.__repr__0   s`   € àŒ~Ô&ð 'ð 'Øœð'ð 'à $Ô 5ð'ð 'ð #Ô1ð'ð 'ð ”|ð	'ð 'ð 'ð	
r   c                 ón  — |                       | j        j        ¦  «        }| j        D ]Z}t	          |j        t          ¦  «        rd|j        vr5d|j        vr,t          t                    	                    ¦   «         | j
        |<   Œ[t          j        t          ¦   «         ¦  «        5  t          | j        j        j        |¦  «        }t"                               d| j        j        j        ¦  «         |                     t          j        ¦   «         | j
        ¬¦  «         d d d ¦  «         n# 1 swxY w Y   | j
        S )Nr'   Úset_indirectzget_bounds:
%s©Úinitial_env)Úswap_submodulesr   Ú
submodulesr3   r   r(   Ústrr   r   Úunknownr4   r   Úset_ops_handlerr
   r   Ú
root_blockÚgraphÚlogÚdebugÚrunÚget_ops_handler)r5   rA   r,   Úinterpreters       r   Ú
get_boundszBoundVars.get_bounds9   sZ  € à×)Ò)¨$¬.Ô*CÑDÔDˆ
ð Ô'ð 	Að 	AˆDå˜dœk­3Ñ/Ô/ð AØ!¨¬Ð4Ð4Ø"¨$¬+Ð5Ð5å%0µÔ%6×%>Ò%>Ñ%@Ô%@�”˜TÑ"øåÔÕ1Ñ3Ô3Ñ4Ô4ð 	Kð 	KÝ)¨$¬.Ô*CÔ*IÈ:ÑVÔVˆKÝ�IŠIÐ'¨¬Ô)BÔ)HÑIÔIÐIØ�OŠO�AÔ-Ñ/Ô/¸T¼\ˆOÑJÔJÐJð	Kð 	Kð 	Kñ 	Kô 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Køøøð 	Kð 	Kð 	Kð 	Kð Œ|Ðs   Â"A7D%Ä%D)Ä,D)rA   .c                 óæ  ‡ ‡— i Š|                      ¦   «         D ]×}|dk    r‰ j        ‰|<   Œd|v rZ‰ j        j        |         }dt          dt
          t          t          gt          t                   f         fˆˆ fd„} ||¦  «        ‰|<   Œqd|v rQt          |t          d¦  «        d …         ¦  «        }‰ j        j        |         }t          ‰ j        |¦  «        }|‰|<   ŒÆd|v sJ ‚||         ‰|<   ŒØ‰S )NÚ	get_indexr'   Úsubblockr   c                 ó   •‡ — ˆˆˆ fd„S )Nc                 ó@   •— ‰                      ‰‰j        | |‰¦  «        S r   )r'   r4   )ÚmaskÚvalueÚresultr5   rO   s     €€€r   ú<lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>_   s$   ø€ ¨t×/CÒ/CØ  $¤,°°e¸Vñ0ô 0€ r   © )rO   rT   r5   s   `€€r   Úmake_fnz*BoundVars.swap_submodules.<locals>.make_fn\   s'   øø€ ðð ð ð ð ð ð r   r=   Úscan)ÚkeysrN   r   Ú	subblocksr   r   r   r   r   r.   ÚlenÚindirect_varsr   r=   )	r5   rA   ÚkeyrO   rW   ÚidxÚvarÚindirectrT   s	   `       @r   r@   zBoundVars.swap_submodulesL   s,  øø€ ð ?AˆØ—?’?Ñ$Ô$ð 	.ð 	.ˆCØ�kÒ!Ð!Ø"œn��s‘�Ø" cÐ)Ð)Øœ>Ô3°CÔ8�ðÝ+ðå�s¥C˜j­+µdÔ*;Ð;Ô<ðð ð ð ð ð ð ð &˜g hÑ/Ô/��s‘�Ø 3Ð&Ð&Ý˜#�c .Ñ1Ô1Ð3Ð3Ô4Ñ5Ô5�Ø”nÔ2°3Ô7�Ý" 4Ô#4°cÑ:Ô:�Ø&��s‘�à �}�}�}�}Ø(¨œo��s‘�àˆr   rO   ÚenvrR   rS   c                 óø   — t          |j        |¦  «        }|                     t          j        ¦   «         |¬¦  «         d„ |j        j        D ¦   «         }t          |¦  «        dk    sJ ‚|j        |d                  S )Nr>   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )Úoutput)r(   r+   s     r   ú
<listcomp>z-BoundVars.masked_subblock.<locals>.<listcomp>y   s$   € ÐSÐSÐS˜4¸4¼;È(Ò;RÐ;R�$Ð;RÐ;RÐ;Rr   r   r   )r   rF   rI   r   rJ   Únodesr[   ra   )r5   rO   ra   rR   rS   rA   Úinterprd   s           r   r'   zBoundVars.masked_subblocko   sv   € õ ! ¤°Ñ<Ô<ˆØ�
Š
•1Ô$Ñ&Ô&°Cˆ
Ñ8Ô8Ð8ØSÐS 8¤>Ô#7ÐSÑSÔSˆÝ�6‰{Œ{˜aÒÐÐÐð Œz˜& œ)Ô$Ð$r   ÚoldÚnewc                 óH   — t          |t          ¦  «        sJ ‚|| j        |<   |S r   )r   r   r1   )r5   rh   ri   s      r   r=   zBoundVars.set_indirect   s*   € Ý˜#�{Ñ+Ô+Ð+Ð+Ð+Ø%(ˆÔ˜cÑ"Øˆ
r   Únamec                 ó    — | j         j        |         }| j                             |¦  «        }|€t	          || j        ¦  «        }|| j        |<   |S r   )r   Úindexing_exprsr1   Úgetr	   )r5   rk   ÚexprÚbounds       r   rN   zBoundVars.get_index„   sR   € ØŒ~Ô,¨TÔ2ˆØÔ%×)Ò)¨$Ñ/Ô/ˆØˆ=Ý  dÔ&;Ñ<Ô<ˆEð ',ˆÔ˜dÑ#Øˆr   )r:   Ú
__module__Ú__qualname__Ú__doc__r   r6   rB   r;   r   r   ÚtorchÚfxÚNoder   r   rL   r   r   r@   r   r'   r=   rN   rV   r   r   r   r      s¿  € € € € € ðð ðB (ð B¨tð Bð Bð Bð Bð&
˜#ð 
ð 
ð 
ð 
ð ð˜D ¤¤°¸DÔ0AÐ!AÔBð ð ð ñ „]ðð$!Ø˜s H¨S°#¨XÔ$6Ð6Ô7ð!à	ˆc�8˜C ¨TÔ!2Ð2Ô3Ð3Ô	4ð!ð !ð !ð !ðF%àð%ð �%”(”- ¨TÔ!2Ð2Ô3ð%ð ð	%ð
 ð%ð ˜˜h s¨C xÔ0Ð0Ô1ð%ð 
�TÔ	ð%ð %ð %ð %ð  ð ¨;°tÔ+<ð ÀÈTÔARð ð ð ð ð
	˜cð 	 k°$Ô&7ð 	ð 	ð 	ð 	ð 	ð 	r   r   )Úloggingr)   Ú	functoolsr   Útypingr   r   r   r   Úsympyr   rt   Útorch.utils._sympy.value_rangesr	   r
   r   r   r   r   r   Úutilsr   r   Úvirtualizedr   Ú	getLoggerr:   rG   r   rV   r   r   ú<module>r      s  ðØ €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à Ð Ð Ð Ð Ð à €€€Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ Xà ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø Ð Ð Ð Ð Ð ð €gÔ˜Ñ!Ô!€ðzð zð zð zð zñ zô zð zð zð zr   