o
    iV                     @   s   d dl mZmZ d dlmZmZ d dlmZmZ d dl	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 )   )reifyunify)firstgroupby)	_toposortfreezeisvarc                   @   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   d/home/ubuntu/veenaModal/venv/lib/python3.10/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   _r   r   r   __call__   s   zDispatcher.__call__c                 C   sl   t |}| jD ]}t ||krqtt||}|dur&| j| }||f  S qtdt| j d t| )NFz No match found. 
Known matches: z
Input: )lenr   r   r   r   NotImplementedErrorstr)r   r   nr   sresultr   r   r   r      s$   

zDispatcher.resolvec                    s    fdd}|S )Nc                    s     |   S r   )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 )VarDispatcheraX  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 }|di |S )Nc                 S   s   i | ]\}}|j |qS r   )token.0kvr   r   r   
<dictcomp>A   s    z*VarDispatcher.__call__.<locals>.<dictcomp>r   )r   items)r   r   r   r   r   dr   r   r   r   ?   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.   
dispatcherr0   r   r   r   r   L   s   zmatch.<locals>._)getglobal_namespacer
   )r   r   r   r   r1   r   matchH   s   r5   c                 C   sd   t |r
t | s
dS t| |}|du rdS dd | D }t| || kr'dS t|||kr0d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,   a   s   & zsupercedes.<locals>.<dictcomp>N)r	   r   r-   r   )abr   r   r   r   
supercedesZ   s   
r8   c                 C   s,   t | |rt || r|| ||kS dS dS )zUA should be checked before B
    Tie broken by tie_breaker, defaults to ``hash``
    TF)r8   )r6   r7   tie_breakerr   r   r   edgei   s
   

r:   c                    s^   t tt   fdd D }tt|} D ]
}||vr!g ||< qdd | D }t|S )zA 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   )r:   r)   r6   r7   
signaturesr   r   
<listcomp>{   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>      s    z'ordering.<locals>.<dictcomp>.<listcomp>r   r(   r   r   r   r,      s     zordering.<locals>.<dictcomp>)listmaptupler   r   r-   r   )r=   edgesr   r   r<   r   r   v   s   
r   N)corer   r   unification_toolsr   r   utilsr   r   variabler	   r
   r&   r4   r5   r8   hashr:   r   r   r   r   r   <module>   s   &