
    sg@                         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      Z G d de      Zi Zd	 Zd
 ZefdZd Zy)   )unifyreify)isvar)	_toposortfreeze)groupbyfirstc                   *    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     Z/var/www/html/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   ss        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   r   results         r   r   zDispatcher.resolve   s    I 	!I9~"fTlI.A~I.qy 	! ""E$'$6#79D#EGJ4y#Q R 	Rr   c                       fd}|S )Nc                 ,    j                  |        S r   )r   )r   r   r   s    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   r   c                       e Zd ZdZd Zy)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                     | 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__9   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>._F   s>    }}y (.IdOdO	ir   )getglobal_namespacer   )r   r   r'   r9   r7   s   `  @@r   matchr<   B   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@   S   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)zV A should be checked before B
    Tie broken by tie_breaker, defaults to ``hash``
    TF)r@   )r>   r?   tie_breakers      r   edgerC   b   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 )z A 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   o   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   variabler   utilsr   r   unification_toolsr   r	   r   r.   r;   r<   r@   hashrC   r   r(   r   r   <module>rO      sI      $ - BJ ,  "   	r   