U
    yh@                     @   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   Y/var/www/html/venv/lib/python3.8/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   |  |\}}|||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k	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 |S )Nc                 S   s   i | ]\}}|j |qS r   )token.0kvr   r   r   
<dictcomp>;   s      z*VarDispatcher.__call__.<locals>.<dictcomp>)r   items)r   r   r   r   r   dr   r   r   r   9   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 }|kr ||< | }||  |S r   )r#   r   )r   r   r.   
dispatcherr0   r   r   r   r!   F   s    zmatch.<locals>._)getglobal_namespacer
   )r   r   r!   r   r1   r   matchB   s    
r5   c                 C   sd   t |rt | sdS t| |}|dk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,   Z   s
        zsupercedes.<locals>.<dictcomp>N)r   r   r-   r   )abr   r   r   r   
supercedesS   s    
r8   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)r8   )r6   r7   Ztie_breakerr   r   r   edgeb   s
    

r9   c                    s^   t tt   fdd D }tt|} D ]}||kr.g ||< q.dd | D }t|S )z A sane ordering of signatures to check, first to last
    Topological sort of edges as given by ``edge`` and ``supercedes``
    c                    s(   g | ] } D ]}t ||r||fqqS r   )r9   r)   r6   r7   
signaturesr   r   
<listcomp>t   s
       
 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=   y   s     z'ordering.<locals>.<dictcomp>.<listcomp>r   r(   r   r   r   r,   y   s      zordering.<locals>.<dictcomp>)listmaptupler   r	   r-   r   )r<   edgesr   r   r;   r   r   o   s    

r   N)corer   r   variabler   utilsr   r   Zunification_toolsr   r	   r
   r&   r4   r5   r8   hashr9   r   r   r   r   r   <module>   s   !