o
    ‡ZŽh’  ã                   @   sn   d dl mZmZ d dlm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 )é   )ÚreifyÚunify)Údispatchc                 C   s&   t  | | tft¡ t | 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}
    )Ú_unifyÚaddÚdictÚunify_objectÚ_reifyÚreify_object)Úcls© r   úU/var/www/auris/lib/python3.10/site-packages/torch/fx/experimental/unification/more.pyÚ	unifiable   s   r   c                 C   s   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©ÚoÚsr   r   r   r
   #   s   


r
   c                 C   s8   t  t| ƒ¡}t| j|ƒ}|| jkr| S |j |¡ |S )N)ÚobjectÚ__new__Útyper   Ú__dict__Úupdate)r   r   ÚobjÚdr   r   r   r   :   s   
r   c                    s^   ‡ fdd„ˆ j D ƒ}t||ƒ}||krˆ S t tˆ ƒ¡}tˆ j |ƒD ]
\}}t|||ƒ q"|S )Nc                    ó   g | ]}t ˆ |ƒ‘qS r   ©Úgetattr)Ú.0Úattr©r   r   r   Ú
<listcomp>D   ó    z'_reify_object_slots.<locals>.<listcomp>)r   r   r   r   r   ÚzipÚsetattr)r   r   ÚattrsZ	new_attrsZnewobjÚslotr!   r   r"   r   r   C   s   
r   c                 C   s   t t| j| j| jf|ƒŽ S )zReify a Python ``slice`` object)Úslicer   ÚstartÚstopÚstepr   r   r   r   r	   O   s   r	   c                    sZ   t ˆ ƒt ˆƒkr
dS tˆ dƒr%t‡ fdd„ˆ jD ƒ‡fd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                    r   r   r   ©r    r(   )Úur   r   r#   o   r$   z unify_object.<locals>.<listcomp>c                    r   r   r   r-   )Úvr   r   r#   p   r$   )r   r   r   r   r   ©r.   r/   r   r   )r.   r/   r   r   Z   s   
ýr   c                 C   s$   t | j| j| jf|j|j|jf|ƒS )zUnify a Python ``slice`` object)r   r*   r+   r,   r0   r   r   r   r   w   s   $r   N)Úcorer   r   r   r   r
   r   r   r)   r   r	   r   r   r   r   r   r   Ú<module>   s   	


