
    VhV                         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      Z G d de      Zi Zd	 Zd
 ZefdZd Zy)   )reifyunify)firstgroupby)	_toposortfreeze)isvarc                   *    e Zd Zd Zd Zd Zd Zd Zy)
Dispatcherc                 .    || _         i | _        g | _        y N)namefuncsordering)selfr   s     W/home/dcms/DCMS/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                       fd}|S )Nc                 ,    j                  |        S r   )r   )r   r   r   s    r   r   zDispatcher.register.<locals>._'   s    HHY%Kr    )r   r   r   s   `` r   registerzDispatcher.register&   s    	 r   N)__name__
__module____qualname__r   r   r   r   r)   r(   r   r   r   r      s    
-%
 r   r   c                       e Zd ZdZ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 )Nr(   )r   itemstoken)r   r   r   r   r$   kvds           r   r   zVarDispatcher.__call__?   sJ    ,,t$a$%GGI.DAqQWWaZ..yay /s   A
N)r*   r+   r,   __doc__r   r(   r   r   r.   r.   .   s     r   r.   c                  r     |j                  dt              |j                  dt               fd}|S )N	namespacer   c                 l    | j                   }|vr |      |<   |   }|j                  |        |S r   )r*   r   )r   r   r4   
dispatcherr7   r   s      r   r   zmatch.<locals>._L   s>    }}y (.IdOdO	ir   )getglobal_namespacer   )r   r   r   r9   r7   s   `  @@r   matchr<   H   s0    

;(89IL*5J	 Hr   c                    t        |      rt        |       syt        | |      }|du ry|j                         D ci c]  \  }}t        |      rt        |      r||! }}}t        | |      | k(  ryt        ||      |k(  ryyc c}}w )z)``a`` is a more specific match than ``b``TFN)r	   r   r0   r   )abr$   r2   r3   s        r   
supercedesr@   Z   s    QxaaAEz'')D$!Q5858ADADQ{aQ{a  	Es   B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)r@   )r>   r?   tie_breakers      r   edgerC   i   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tuplerC   r   r   r0   r   )
signaturesr>   r?   edgesr$   r2   r3   s          r   r   r   v   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)corer   r   unification_toolsr   r   utilsr   r   variabler	   r   r.   r;   r<   r@   hashrC   r   r(   r   r   <module>rO      sI     - $ # #LJ .  $   	r   