§
    P�’jè  ã                  óÜ   — d dl mZ d dlmZ ddlmZmZm	Z	m
Z
 ddlmZ erddlmZ g d¢Zdd„Zdd„Zdd„Zdd„Z eee¦  «        dd„¦   «         Zdd„Z eeee¦  «        dd„¦   «         ZdS ) é    )Úannotations)ÚTYPE_CHECKINGé   )Ú_reifyÚ_unifyÚreifyÚunify)Údispatch)ÚVar)Ú	unifiableÚreify_objectÚunify_objectÚclsÚtypeÚreturnc                óŒ   — t          j        | | t          ft          ¦  «         t	          j        | t          ft
          ¦  «         | S )aÏ  Register standard unify and reify operations on class
    This uses the type and __dict__ or __slots__ attributes to define the
    nature of the term
    See Also:
    >>> # xdoctest: +SKIP
    >>> class A(object):
    ...     def __init__(self, a, b):
    ...         self.a = a
    ...         self.b = b
    >>> unifiable(A)
    <class 'unification.more.A'>
    >>> x = var("x")
    >>> a = A(1, 2)
    >>> b = A(1, x)
    >>> unify(a, b, {})
    {~x: 2}
    )Ú
core_unifyÚaddÚdictr   Ú
core_reifyr   )r   s    úTC:\Projects\DSCons\.venv\Lib\site-packages\torch\fx\experimental\unification\more.pyr   r      s8   € õ$ „N�C˜�dÐ#¥\Ñ2Ô2Ð2Ý„N�C��;¥Ñ-Ô-Ð-à€Jó    ÚoÚobjectÚsúdict[Var, object]c                ób   — t          | d¦  «        rt          | |¦  «        S t          | |¦  «        S )a¨  Reify a Python object with a substitution
    >>> # xdoctest: +SKIP
    >>> class Foo(object):
    ...     def __init__(self, a, b):
    ...         self.a = a
    ...         self.b = b
    ...
    ...     def __str__(self):
    ...         return "Foo(%s, %s)" % (str(self.a), str(self.b))
    >>> x = var("x")
    >>> f = Foo(1, x)
    >>> print(f)
    Foo(1, ~x)
    >>> print(reify_object(f, {x: 2}))
    Foo(1, 2)
    Ú	__slots__)ÚhasattrÚ_reify_object_slotsÚ_reify_object_dict©r   r   s     r   r   r   2   s6   € õ" ˆq�+ÑÔð (Ý" 1 aÑ(Ô(Ð(å! ! QÑ'Ô'Ð'r   c                óÌ   — t                                t          | ¦  «        ¦  «        }t          | j        |¦  «        }|| j        k    r| S |j                             |¦  «         |S )N)r   Ú__new__r   r   Ú__dict__Úupdate)r   r   ÚobjÚds       r   r!   r!   I   sU   € Ý
�.Š.�˜a™œÑ
!Ô
!€CÝˆaŒj˜!ÑÔ€AØˆAŒJ‚€ØˆØ„L×Ò˜ÑÔÐØ€Jr   c                ó  ‡ — ˆ fd„‰ j         D ¦   «         }t          ||¦  «        }||k    r‰ S t                               t	          ‰ ¦  «        ¦  «        }t          ‰ j         |¦  «        D ]\  }}t          |||¦  «         Œ|S )Nc                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS © ©Úgetattr)Ú.0Úattrr   s     €r   ú
<listcomp>z'_reify_object_slots.<locals>.<listcomp>S   s3   ø€ ð ð ð àõ 	��4ÑÔðð ð r   )r   r   r   r$   r   ÚzipÚsetattr)r   r   ÚattrsÚ	new_attrsÚnewobjÚslotr/   s   `      r   r    r    R   s¤   ø€ ðð ð ð à”Kðñ ô €Eõ �e˜Q‘”€IØ�	ÒÐØˆå—’¥ Q¡¤Ñ(Ô(ˆÝØŒKØñ
ô 
ð 	(ð 	(‰JˆD�$õ �F˜D $Ñ'Ô'Ð'Ð'Øˆr   Úslicec                óT   — t          t          | j        | j        | j        f|¦  «        Ž S )zReify a Python ``slice`` object)r7   r   ÚstartÚstopÚstepr"   s     r   r   r   d   s&   € õ •%˜œ !¤&¨!¬&Ð1°1Ñ5Ô5Ð6Ð6r   ÚuÚvúdict[Var, object] | boolc                ó  ‡ ‡— t          ‰ ¦  «        t          ‰¦  «        urdS t          ‰ d¦  «        r3t          ˆ fd„‰ j        D ¦   «         ˆfd„‰j        D ¦   «         |¦  «        S t          ‰ j        ‰j        |¦  «        S )a¶  Unify two Python objects
    Unifies their type and ``__dict__`` attributes
    >>> # xdoctest: +SKIP
    >>> class Foo(object):
    ...     def __init__(self, a, b):
    ...         self.a = a
    ...         self.b = b
    ...
    ...     def __str__(self):
    ...         return "Foo(%s, %s)" % (str(self.a), str(self.b))
    >>> x = var("x")
    >>> f = Foo(1, x)
    >>> g = Foo(1, 2)
    >>> unify_object(f, g, {})
    {~x: 2}
    Fr   c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r+   r,   )r.   r6   r<   s     €r   r0   z unify_object.<locals>.<listcomp>‡   ó3   ø€ ð ð ð àõ ˜˜4Ñ Ô ðð ð r   c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r+   r,   )r.   r6   r=   s     €r   r0   z unify_object.<locals>.<listcomp>‹   rA   r   )r   r   r	   r   r%   ©r<   r=   r   s   `` r   r   r   p   s¼   øø€ õ& ˆA�w„w•d˜1‘g”gÐÐØˆuÝˆq�+ÑÔð 
Ýðð ð ð àœKðñ ô ðð ð ð àœKðñ ô ð ñ

ô 

ð 
	
õ ØŒJØŒJØñ
ô 
ð 	
r   c                ól   — t          | j        | j        | j        f|j        |j        |j        f|¦  «        S )zUnify a Python ``slice`` object)r	   r9   r:   r;   rC   s      r   r   r   ™   s0   € õ �!”'˜1œ6 1¤6Ð*¨Q¬W°a´f¸a¼fÐ,EÀqÑIÔIÐIr   N)r   r   r   r   )r   r   r   r   r   r   )r   r7   r   r   r   r7   )r<   r   r=   r   r   r   r   r>   )r<   r7   r=   r7   r   r   r   r>   )Ú
__future__r   Útypingr   Úcorer   r   r   r   r   r	   r
   Úvariabler   Ú__all__r   r   r!   r    r7   r   r   r+   r   r   ú<module>rJ      ss  ðØ "Ð "Ð "Ð "Ð "Ð "à  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð ð ð ØÐÐÐÐÐð 8Ð
7Ð
7€ðð ð ð ð:(ð (ð (ð (ð.ð ð ð ðð ð ð ð$ 
€ˆ%�ÑÔð7ð 7ð 7ñ Ôð7ð&
ð &
ð &
ð &
ðR 
€ˆ%�˜ÑÔðJð Jð Jñ ÔðJð Jð Jr   