a
    d&                     @   s   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 G dd dZG dd deZi Zd	d
 Zdd ZefddZdd ZdS )   )unifyreifyisvar)	_toposortfreeze)groupbyfirstc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
Dispatcherc                 C   s   || _ i | _g | _d S N)namefuncsordering)selfr    r   p/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/fx/experimental/unification/match.py__init__   s    zDispatcher.__init__c                 C   s   || j t|< t| j | _d S r   )r   r   r   )r   	signaturefuncr   r   r   add   s    zDispatcher.addc                 O   s   |  |\}}||i |S r   )resolve)r   argskwargsr   sr   r   r   __call__   s    zDispatcher.__call__c                 C   sp   t |}| jD ]>}t ||kr qtt||}|dur| j| }||f  S qtdt| j d t| d S )NFz No match found. 
Known matches: z
Input: )lenr   r   r   r   NotImplementedErrorstr)r   r   nr   r   resultr   r   r   r      s    

zDispatcher.resolvec                    s    fdd}|S )Nc                    s     |   S r   )r   )r   r   r   r   r   _"   s    zDispatcher.register.<locals>._r   )r   r   r!   r   r    r   register!   s    zDispatcher.registerN)__name__
__module____qualname__r   r   r   r   r"   r   r   r   r   r
      s
   r
   c                   @   s   e Zd ZdZdd ZdS )VarDispatcheraY   A dispatcher that calls functions with variable names
    >>> # xdoctest: +SKIP
    >>> d = VarDispatcher('d')
    >>> x = var('x')
    >>> @d.register('inc', x)
    ... def f(x):
    ...     return x + 1
    >>> @d.register('double', x)
    ... def f(x):
    ...     return x * 2
    >>> d('inc', 10)
    11
    >>> d('double', 10)
    20
    c                 O   s.   |  |\}}dd | D }|f i |S )Nc                 S   s   i | ]\}}|j |qS r   )token.0kvr   r   r   
<dictcomp>:       z*VarDispatcher.__call__.<locals>.<dictcomp>)r   items)r   r   r   r   r   dr   r   r   r   8   s    zVarDispatcher.__call__N)r#   r$   r%   __doc__r   r   r   r   r   r&   (   s   r&   c                     s,   | dt| dt  fdd}|S )N	namespacer
   c                    s2   | j }|vr ||< | }||  |S r   )r#   r   )r   r   r/   
dispatcherr1   r   r   r   r!   E   s    zmatch.<locals>._)getglobal_namespacer
   )r   r   r!   r   r2   r   matchA   s    
r6   c                 C   sd   t |rt | sdS t| |}|du r*dS dd | D }t| || krNdS t|||kr`dS dS )z+ ``a`` is a more specific match than ``b`` TFc                 S   s&   i | ]\}}t |rt |s||qS r   r   r(   r   r   r   r,   Y   r-   zsupercedes.<locals>.<dictcomp>N)r   r   r.   r   )abr   r   r   r   
supercedesR   s    
r9   c                 C   s,   t | |r(t || r$|| ||kS dS dS )zV A should be checked before B
    Tie broken by tie_breaker, defaults to ``hash``
    TF)r9   )r7   r8   Ztie_breakerr   r   r   edgea   s
    

r:   c                    s^   t tt   fdd D }tt|} D ]}||vr.g ||< q.dd | D }t|S )z A sane ordering of signatures to check, first to last
    Topoological sort of edges as given by ``edge`` and ``supercedes``
    c                    s(   g | ] } D ]}t ||r||fqqS r   )r:   r)   r7   r8   
signaturesr   r   
<listcomp>s   r-   zordering.<locals>.<listcomp>c                 S   s    i | ]\}}|d d |D qS )c                 S   s   g | ]\}}|qS r   r   r;   r   r   r   r>   x   r-   z'ordering.<locals>.<dictcomp>.<listcomp>r   r(   r   r   r   r,   x   r-   zordering.<locals>.<dictcomp>)listmaptupler   r	   r.   r   )r=   edgesr   r   r<   r   r   n   s    

r   N)corer   r   variabler   utilsr   r   Zunification_toolsr   r	   r
   r&   r5   r6   r9   hashr:   r   r   r   r   r   <module>   s   !