
    ^jn                        U d dl mZ d dlmZ ddlmZmZ er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 dd	l
mZ  G d
 d      Z G d de      Zi Zded<   ddZddZefddZddZy)    )annotations)TYPE_CHECKING   )reifyunify)CallableIterable)Var)firstgroupby)	_toposortfreeze)isvarc                  <    e Zd ZddZddZd	dZ	 	 	 	 d
dZddZy)
Dispatcherc                .    || _         i | _        g | _        y N)namefuncsordering)selfr   s     r/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/experimental/unification/match.py__init__zDispatcher.__init__   s    	:<
&(    c                h    || j                   t        |      <   t        | j                         | _        y r   )r   r   r   )r   	signaturefuncs      r   addzDispatcher.add   s%    (,

6)$% ,r   c                :    | j                  |      \  }} ||i |S r   )resolve)r   argskwargsr   _s        r   __call__zDispatcher.__call__   s$    ,,t$aT$V$$r   c                   t        |      }| j                  D ]?  }t        |      |k7  rt        t        |      |      }|dus,| j                  |   }||fc S  t        dt        | j                        z   dz   t        |      z         )NFz No match found. 
Known matches: z
Input: )lenr   r   r   r   NotImplementedErrorstr)r   r!   nr   sresults         r   r    zDispatcher.resolve    s     I 	!I9~"fTlI.A~I.qy 	! "/$-- ! $i
 	
r   c                     d fd}|S )Nc                ,    j                  |        S r   )r   )r   r   r   s    r   r#   zDispatcher.register.<locals>._3   s    HHY%Kr   r   Callable[..., object]returnr    )r   r   r#   s   `` r   registerzDispatcher.register2   s    	 r   N)r   r(   r0   None)r   tuple[object, ...]r   r/   r0   r3   r!   objectr"   r6   r0   r6   )r!   r4   r0   z/tuple[Callable[..., object], dict[Var, object]])r   r6   r0   r/   )__name__
__module____qualname__r   r   r$   r    r2   r1   r   r   r   r      s+    )
-%
&
	8
$r   r   c                      e Zd ZdZddZy)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                    | j                  |      \  }}|j                         D ci c]  \  }}|j                  | }}} |di |S c c}}w )Nr1   )r    itemstoken)r   r!   r"   r   r*   kvds           r   r$   zVarDispatcher.__call__K   sJ    ,,t$a$%GGI.DAqQWWaZ..yay /s   A
Nr5   )r7   r8   r9   __doc__r$   r1   r   r   r;   r;   :   s     r   r;   zdict[str, Dispatcher]global_namespacec                 t     |j                  dt              |j                  dt              d fd}|S )N	namespacer   c                l    | j                   }|vr |      |<   |   }|j                  |        |S r   )r7   r   )r   r   rA   dispatcher_clsrE   r   s      r   r#   zmatch.<locals>._\   s>    }}y ,T2IdOdO	ir   r.   )getrC   r   )r   r"   r#   rG   rE   s   `  @@r   matchrI   T   s8    '-zz%(I (.zzj(N	 Hr   c                   t        |      rt        |       syt        | |      }|du ry|j                         D ci c]  \  }}t        |      rt        |      s||  }}}t        | |      | k(  ryt        ||      |k(  ryyc c}}w )z)``a`` is a more specific match than ``b``TF)r   r   r=   r   )abr*   r?   r@   s        r   
supercedesrM   j   s    QxaaAEz GGI	AqQxuQx 	
1	A 	
 Q{aQ{a	s   #Bc                X    t        | |      rt        ||       r ||        ||      kD  S yy)zUA should be checked before B
    Tie broken by tie_breaker, defaults to ``hash``
    TF)rM   )rK   rL   tie_breakers      r   edgerP   ~   s1     !Qaq>KN22r   c                v   t        t        t        |             } | D cg c]  }| D ]  }t        ||      s||f  }}}t	        t
        |      }| D ]  }||vsg ||<    |j                         D ci c]  \  }}||D cg c]  \  }}|	 c}} }}}}}t        |      S c c}}w c c}}w c c}}}}w )zA sane ordering of signatures to check, first to last
    Topological sort of edges as given by ``edge`` and ``supercedes``
    )listmaptuplerP   r   r   r=   r   )
signaturesrK   rL   edgesr*   r?   r@   s          r   r   r      s     c%,-J'JJAtAqzaVJVJEJE5!E E>E!H /4kkm<<daQq!tq!!!<E<U K
 "<s"   B'B'7B3
B-B3
-B3
N)r   r6   r"   r6   r0   r/   )rK   r6   rL   r6   r0   bool)rK   r6   rL   r6   rO   zCallable[[object], int]r0   rW   )rU   zIterable[object]r0   zlist[object])
__future__r   typingr   corer   r   collections.abcr   r	   variabler
   unification_toolsr   r   utilsr   r   r   r   r;   rC   __annotations__rI   rM   hashrP   r   r1   r   r   <module>ra      sb    "    2 - $ % %PJ . +- ' ,,( GK 	r   