§
    ŠŠtjj  ã                   ó¦  — d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ g d¢Zdej        j        d	dfd
„Zdej        j        d	dfd„Zdee         d	eeedf         eedf         f         fd„Zdee         d	efd„Zdeeef         ded	efd„Zdej        j        deeef         d	dfd„Zdej        j        dej        j        d	efd„ZdS )é    )ÚAnyN)ÚRefine)ÚEquality)ÚunifyÚVar)Ú
TensorType)Úcheck_for_type_equalityÚ
convert_eqÚinfer_symbolic_typesÚ infer_symbolic_types_single_passÚsubstitute_all_typesÚsubstitute_solution_one_typeÚunify_eqÚtracedÚreturnc                 óž   — t          | ¦  «        }|                     ¦   «          t          |j        ¦  «        }t	          | j        |¦  «         dS )z-
    Calls our symbolic inferencer once.
    N)r   Úrefiner   Úconstraintsr   Úgraph©r   ÚrÚmgus      úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/fx/experimental/unify_refinements.pyr   r      sC   € õ 	ˆv‰Œ€AØ‡H‚H�J„J€JÝ
�1”=Ñ
!Ô
!€CÝ˜œ sÑ+Ô+Ð+Ð+Ð+ó    c                 ó^  — t          | ¦  «        }|                     ¦   «          t          |j        ¦  «        }t	          | j        |¦  «         t          | ¦  «        }|                     ¦   «          t          |j        ¦  «        }t	          | j        |¦  «         |                     ¦   «          dS )z¥
    Calls our symbolic inferencer twice.
    This is useful when one pass is not enough
    to infer all the information such as the case
    for broadcasting.
    N)r   r   r   r   r   r   Úsymbolic_relationsr   s      r   r   r       sŽ   € õ 	ˆv‰Œ€AØ‡H‚H�J„J€JÝ
�1”=Ñ
!Ô
!€CÝ˜œ sÑ+Ô+Ð+åˆv‰Œ€AØ‡H‚H�J„J€JÝ
�1”=Ñ
!Ô
!€CÝ˜œ sÑ+Ô+Ð+à×ÒÑÔÐÐÐr   Ú
list_of_eq.c                 ó¸   — g }g }| D ]6}|                      |j        ¦  «         |                      |j        ¦  «         Œ7t          |¦  «        t          |¦  «        fS )za
    Convert equality constraints in the right format
    to be used by unification library.
    )ÚappendÚlhsÚrhsÚtuple)r   r    r!   Úeqs       r   r
   r
   4   s_   € ð
 €CØ
€CØð ð ˆØ�
Š
�2”6ÑÔÐØ�
Š
�2”6ÑÔÐÐÝ�‰:Œ:•u˜S‘z”zÐ!Ð!r   c                 óF   — t          | ¦  «        \  }}t          ||¦  «        S )z@
    Apply unification to a set of
    equality constraints
    )r
   r   )r   r    r!   s      r   r   r   A   s#   € õ
 ˜*Ñ%Ô%�H€CˆÝ��c‰?Œ?Ðr   ÚmappingÚtc                 óN  — t          |t          ¦  «        r|| v r| |         S |S t          |t          ¦  «        r]g }|j        D ]7}|| v r|                     | |         ¦  «         Œ"|                     |¦  «         Œ8t          t          |¦  «        ¦  «        S t          |t          ¦  «        r,g }|D ]%}|                     t          | |¦  «        ¦  «         Œ&|S t          |t
          ¦  «        r9g }|D ]%}|                     t          | |¦  «        ¦  «         Œ&t          |¦  «        S |S )z2
    Apply the most general unifier to a type
    )Ú
isinstancer   r   Údimsr   r"   Úlistr   )r%   r&   Únew_typeÚtyps       r   r   r   J   sI  € õ �!•SÑÔð Ø�ˆ<ˆ<Ø˜1”:ÐàˆHå	�A•zÑ	"Ô	"ð ØˆØ”6ð 	%ð 	%ˆCØ�gˆ~ˆ~Ø—’ ¨¤Ñ-Ô-Ð-Ð-à—’ Ñ$Ô$Ð$Ð$Ý�% ™/œ/Ñ*Ô*Ð*å	�A•tÑ	Ô	ð ØˆØð 	Hð 	HˆCØ�OŠOÕ8¸À#ÑFÔFÑGÔGÐGÐGØˆå	�A•uÑ	Ô	ð ØˆØð 	Hð 	HˆCØ�OŠOÕ8¸À#ÑFÔFÑGÔGÐGÐGÝ�X‰ŒÐð ˆr   r   c                 óÎ   — d}|r<d}|D ]5}||         }||         |v r||         }||         ||<   |||         k    rd}Œ6|°<| j         D ]}t          ||j        ¦  «        |_        ŒdS )zž
    Apply the most general unifier to all types in a graph
    till reaching a fixed point. If the input and output graph
    are the same, we converge.
    TFN)Únodesr   Útype)r   r%   ÚflagÚkÚold_mapping_valÚnew_keyÚns          r   r   r   m   s¥   € ð €DØ
ð ØˆØð 	ð 	ˆAØ% aœjˆOØ�qŒz˜WÐ$Ð$Ø! !œ*�Ø$ WÔ-�˜‘
Ø '¨!¤*Ò,Ð,Ø�øð ð ð Œ[ð ?ð ?ˆÝ-¨g°q´vÑ>Ô>ˆŒˆð?ð ?r   Úg1Úg2c                 ól   — t          | j        |j        ¦  «        D ]\  }}|j        |j        k    r dS ŒdS )zv
    A check equality to be used in fixed points.
    We do not use graph equality but instead type
    equality.
    FT)Úzipr.   r/   )r5   r6   r4   Úms       r   r	   r	   ‚   sE   € õ �B”H˜bœhÑ'Ô'ð ð ‰ˆˆ1ØŒ6�Q”VÒÐØ�5�5ð àˆ4r   )Útypingr   ÚtorchÚtorch.fxÚ/torch.fx.experimental.graph_gradual_typecheckerr   Ú&torch.fx.experimental.refinement_typesr   Ú!torch.fx.experimental.unificationr   r   Útorch.fx.tensor_typer   Ú__all__ÚfxÚGraphModuler   r   r*   r"   r
   r   ÚdictÚobjectr   ÚGraphr   Úboolr	   © r   r   ú<module>rI      sâ  ðØ Ð Ð Ð Ð Ð à €€€Ø €€€Ø BÐ BÐ BÐ BÐ BÐ BØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø +Ð +Ð +Ð +Ð +Ð +ðð ð €ð,¨U¬XÔ-Að ,Àdð ,ð ,ð ,ð ,ð ¤Ô!5ð ¸$ð ð ð ð ð(
"˜4 œ>ð 
"¨e°E¸#¸s¸(´OÀUÈ3ÐPSÈ8Ä_Ð4TÔ.Uð 
"ð 
"ð 
"ð 
"ð˜˜hœð ¨Cð ð ð ð ð ¨$¨v°v¨~Ô*>ð  À6ð  Ècð  ð  ð  ð  ðF? ¤¤ð ?¸¸fÀf¸nÔ9Mð ?ÐRVð ?ð ?ð ?ð ?ð*	 ¤¤ð 	°E´H´Nð 	Àtð 	ð 	ð 	ð 	ð 	ð 	r   