
    Ed/                        d dl mZ d dlmZ d dlZddlmZmZm	Z	m
Z
 ddlmZ d dlZ G d de          Zd	 Z G d
 d          Zd Z e            ZdgZd ZefdZ G d d          Zd Z G d de          Zd Zd ZdS )    )Set)warnN   )orderingambiguitiessuper_signatureAmbiguityWarning)expand_tuplesc                       e Zd ZdZdS )MDNotImplementedErrorz- A NotImplementedError for multiple dispatch N)__name__
__module____qualname____doc__     Alib/python3.11/site-packages/sympy/multipledispatch/dispatcher.pyr   r   
   s        7777r   r   c                 V    t          t          | j        |          t                     dS )aC   Raise warning when ambiguity is detected

    Parameters
    ----------
    dispatcher : Dispatcher
        The dispatcher on which the ambiguity was detected
    ambiguities : set
        Set of type signature pairs that are ambiguous within this dispatcher

    See Also:
        Dispatcher.add
        warning_text
    N)r   warning_textnamer	   )
dispatcherr   s     r   ambiguity_warnr      s'     	jo{	3	35EFFFFFr   c                       e Zd ZdZd Zd ZdS )RaiseNotImplementedErrorz*Raise ``NotImplementedError`` when called.c                     || _         d S N)r   )selfr   s     r   __init__z!RaiseNotImplementedError.__init__$   s    $r   c                     t          d |D                       }t          d| j        j        dt	          |          d          )Nc              3   4   K   | ]}t          |          V  d S r   type).0as     r   	<genexpr>z4RaiseNotImplementedError.__call__.<locals>.<genexpr>(   s(      ,,!d1gg,,,,,,r   zAmbiguous signature for : <>)tupleNotImplementedErrorr   r   str_signature)r   argskwargstypess       r   __call__z!RaiseNotImplementedError.__call__'   sV    ,,t,,,,,!!O   -"6"6"6"6
  	r   N)r   r   r   r   r   r.   r   r   r   r   r   !   s8        44% % %    r   r   c                     |D ]i}t          t          |                    }t          t          |                    dk    r?|                     |t          |           t                     jdS )a  
    If super signature for ambiguous types is duplicate types, ignore it.
    Else, register instance of ``RaiseNotImplementedError`` for ambiguous types.

    Parameters
    ----------
    dispatcher : Dispatcher
        The dispatcher on which the ambiguity was detected
    ambiguities : set
        Set of type signature pairs that are ambiguous within this dispatcher

    See Also:
        Dispatcher.add
        ambiguity_warn
    r   on_ambiguityN)r(   r   lensetaddr   #ambiguity_register_error_ignore_dup)r   r   amb	signatures       r   r5   r5   .   s       
 
/#..//	s9~~!# 	/
;;< 	 	
 	
 	
 	
	
 
r   Tc                      dt           d<   d S )NFr   )_resolver   r   r   halt_orderingr:   N   s    HQKKKr   c                     dt           d<   t          r8t                                          }|                    |            t          6d S d S )NTr   r0   )r9   _unresolved_dispatcherspopreorder)r1   r   s     r   restart_orderingr?   R   sY    HQK
! 6,0022
555 " 6 6 6 6 6r   c                       e Zd ZdZdZddZd Zed             Zed             Z	e
fdZe
fd	Zd
 Zd ZeZd Zd Zd Zd Zd Zed             Zd Zd Zd Zd ZdS )
Dispatcheraj   Dispatch methods based on type signature

    Use ``dispatch`` to add implementations

    Examples
    --------

    >>> from sympy.multipledispatch import dispatch
    >>> @dispatch(int)
    ... def f(x):
    ...     return x + 1

    >>> @dispatch(float)
    ... def f(x): # noqa: F811
    ...     return x - 1

    >>> f(3)
    4
    >>> f(3.0)
    2.0
    )r   r   funcsr   _cachedocNc                 Z    |x| _         | _        i | _        i | _        g | _        || _        d S r   )r   r   rB   rC   r   rD   )r   r   rD   s      r   r   zDispatcher.__init__q   s0    $((	DM
r   c                       fd}|S )a#   Register dispatcher with new implementation

        >>> from sympy.multipledispatch.dispatcher import Dispatcher
        >>> f = Dispatcher('f')
        >>> @f.register(int)
        ... def inc(x):
        ...     return x + 1

        >>> @f.register(float)
        ... def dec(x):
        ...     return x - 1

        >>> @f.register(list)
        ... @f.register(tuple)
        ... def reverse(x):
        ...     return x[::-1]

        >>> f(1)
        2

        >>> f(1.0)
        0.0

        >>> f([1, 2, 3])
        [3, 2, 1]
        c                 &     j         | fi  | S r   )r4   )funcr,   r   r-   s    r   _zDispatcher.register.<locals>._   s$    DHUD++F+++Kr   r   )r   r-   r,   rI   s   ``` r   registerzDispatcher.registerx   s/    6	 	 	 	 	 	 	 r   c                     t          t          d          r-t          j        |          }|j                                        S d S )Nr7   )hasattrinspectr7   
parametersvaluesclsrH   sigs      r   get_func_paramszDispatcher.get_func_params   sB    7K(( 	+#D))C>((***	+ 	+r   c                     |                      |          }|rPt          j        fd|D             }t          d |D                       }t	          fd|D                       s|S dS dS )z; Get annotations of function positional parameters
        c              3   F   K   | ]}|j         j        j        fv |V  d S r   )kindPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORD)r#   param	Parameters     r   r%   z2Dispatcher.get_func_annotations.<locals>.<genexpr>   sS       9 9 0 6889e 9 9 9 9 9 9r   c              3   $   K   | ]}|j         V  d S r   )
annotation)r#   rY   s     r   r%   z2Dispatcher.get_func_annotations.<locals>.<genexpr>   s9        %  %   %  %  %  %  %  %r   c              3   *   K   | ]}|j         u V  d S r   )empty)r#   annrZ   s     r   r%   z2Dispatcher.get_func_annotations.<locals>.<genexpr>   s*      EE#sio-EEEEEEr   N)rS   rM   rZ   r(   any)rQ   rH   paramsannotationsrZ   s       @r   get_func_annotationszDispatcher.get_func_annotations   s     $$T** 	#)I9 9 9 9 9 9 9F
    %  %# %  %  % % %K EEEEEEEEE #""	# 	## #r   c           	         |s|                      |          }|r|}t          d |D                       r+t          |          D ]}|                     |||           dS |D ]S}t	          |t
                    s<d                    d |D                       }t          d|d|d| j                  T|| j	        |<   | 
                    |           | j                                         dS )	a   Add new types/method pair to dispatcher

        >>> from sympy.multipledispatch import Dispatcher
        >>> D = Dispatcher('add')
        >>> D.add((int, int), lambda x, y: x + y)
        >>> D.add((float, float), lambda x, y: x + y)

        >>> D(1, 2)
        3
        >>> D(1, 2.0)
        Traceback (most recent call last):
        ...
        NotImplementedError: Could not find signature for add: <int, float>

        When ``add`` detects a warning it calls the ``on_ambiguity`` callback
        with a dispatcher/itself, and a set of ambiguous type signature pairs
        as inputs.  See ``ambiguity_warn`` for an example.
        c              3   @   K   | ]}t          |t                    V  d S r   )
isinstancer(   )r#   typs     r   r%   z!Dispatcher.add.<locals>.<genexpr>   s,      ;;#z#u%%;;;;;;r   N, c              3   l   K   | ]/}t          |t                    r|j        nt          |          V  0d S r   )rf   r"   r   str)r#   cs     r   r%   z!Dispatcher.add.<locals>.<genexpr>   s\       $D $D45 3=Q2E2E %0AJJ),Q$D $D $D $D $D $Dr   zTried to dispatch on non-type: z
In signature: <z>
In function: r0   )rc   r`   r
   r4   rf   r"   join	TypeErrorr   rB   r>   rC   clear)r   r7   rH   r1   rb   typsrg   str_sigs           r   r4   zDispatcher.add   sH   (  	(33D99K ('	 ;;;;;;; 	%i00 3 3t\2222F 	; 	;Cc4(( ;)) $D $D9B$D $D $D D Di "%gggtyy!: ; ; ;; !%
9,///r   c                     t           d         r?t          | j                  | _        t          | j                  }|r || |           d S d S t                              |            d S )Nr   )r9   r   rB   r   r<   r4   )r   r1   r6   s      r   r>   zDispatcher.reorder   st    A; 	.$TZ00DMdj))C (T3'''''( ( $''-----r   c           	         t          d |D                       }	 | j        |         }nN# t          $ rA  | j        | }|s(t	          d| j        dt          |          d          || j        |<   Y nw xY w	  ||i |S # t          $ rc  | j        | }t          |           |D ]}	  ||i |c cY S # t          $ r Y w xY wt	          d| j        dt          |          d          w xY w)Nc                 ,    g | ]}t          |          S r   r!   r#   args     r   
<listcomp>z'Dispatcher.__call__.<locals>.<listcomp>       111StCyy111r   Could not find signature for r&   r'   zMatching functions for z(> found, but none completed successfully)
r(   rC   KeyErrordispatchr)   r   r*   r   dispatch_iternext)r   r+   r,   r-   rH   rB   s         r   r.   zDispatcher.__call__   s   11D11122	&;u%DD 	& 	& 	& 4=%(D 7))YYYe 4 4 4 467 7 7 "&DK	&	K4(((($ 
	K 
	K 
	K&D&.EKKK  400000000,   D%%)-M%4H4H4H4H'J K K K
	Ks@   ) AA43A48B   'C-(B4/C-4
C>C- C,C-c                     d| j         z  S )Nz<dispatched %s>)r   r   s    r   __str__zDispatcher.__str__  s     49,,r   c                     || j         v r| j         |         S 	 t           | j        |           S # t          $ r Y dS w xY w)a`   Deterimine appropriate implementation for this type signature

        This method is internal.  Users should call this object as a function.
        Implementation resolution occurs within the ``__call__`` method.

        >>> from sympy.multipledispatch import dispatch
        >>> @dispatch(int)
        ... def inc(x):
        ...     return x + 1

        >>> implementation = inc.dispatch(int)
        >>> implementation(3)
        4

        >>> print(inc.dispatch(float))
        None

        See Also:
            ``sympy.multipledispatch.conflict`` - module to determine resolution order
        N)rB   r|   r{   StopIterationr   r-   s     r   rz   zDispatcher.dispatch  s`    , DJ 	%:e$$	**E2333 	 	 	44	s   / 
==c              '      K   t          |          }| j        D ]I}t          |          |k    r4t          t          t          ||                    r| j        |         }|V  Jd S r   )r2   r   allmap
issubclassrB   )r   r-   nr7   results        r   r{   zDispatcher.dispatch_iter#  sp      JJ 	 	I9~~" s3z5)+L+L'M'M I.	 	r   c                 @    t          dt                      | j        | S )z Deterimine appropriate implementation for this type signature

        .. deprecated:: 0.4.4
            Use ``dispatch(*types)`` instead
        z-resolve() is deprecated, use dispatch(*types))r   DeprecationWarningrz   r   s     r   resolvezDispatcher.resolve*  s-     	<	! 	! 	! t}e$$r   c                      | j         | j        dS )Nr   rB   r   r~   s    r   __getstate__zDispatcher.__getstate__5  s    	% % 	%r   c                 z    |d         | _         |d         | _        t          | j                  | _        i | _        d S )Nr   rB   )r   rB   r   rC   )r   ds     r   __setstate__zDispatcher.__setstate__9  s4    fI	wZ
 ,,r   c                 ,   d| j         z  g}| j        r|                    | j                   g }| j        d d d         D ]}| j        |         }|j        r\dt          |          z  }|dt          |          z  dz   z  }||j                                        z  }|                    |           r|                    t          |                     |r+|                    dd	                    |          z              d	                    |          S )	NzMultiply dispatched method: %szInputs: <%s>
-
zOther signatures:
    z
    

)
r   rD   appendr   rB   r   r*   r2   striprl   )r   docsotherrR   rH   ss         r   r   zDispatcher.__doc__?  s   049<=8 	"KK!!!=2& 	1 	1C:c?D| 1$}S'9'99S3q66\D((T\'')))A]3//0000 	JKK1HMM%4H4HHIII{{4   r   c                 F     | j         t          t          |           j        S r   )rz   r   r"   r   )r   r+   s     r   _helpzDispatcher._helpV  s    t}c$oo.66r   c                 4    t           | j        |            dS )z: Print docstring for the function corresponding to inputs N)printr   r   r+   r,   s      r   helpzDispatcher.helpY  s    jdj$     r   c                 |     | j         t          t          |           }|st          d          t	          |          S )NzNo function found)rz   r   r"   rm   source)r   r+   rH   s      r   _sourcezDispatcher._source]  s;    t}c$oo. 	1/000d||r   c                 4    t           | j        |            dS )z< Print source code for the function corresponding to inputs N)r   r   r   s      r   r   zDispatcher.sourcec  s    ldlD!"""""r   r   )r   r   r   r   	__slots__r   rJ   classmethodrS   rc   r   r4   r>   r.   r   __repr__rz   r{   r   r   r   propertyr   r   r   r   r   r   r   rA   rA   Y   s{        * II     @ + + [+
 # # [#& 1? * * * *X $2 . . . .K K K4- - -H  <  	% 	% 	%% % %   ! ! X!,7 7 7! ! !  # # # # #r   rA   c                 b    dt          j        |           z  }|t          j        |           z   }|S )Nz
File: %s

)rM   getsourcefile	getsource)rH   r   s     r   r   r   h  s1    .t444A	Gd###AHr   c                   4    e Zd ZdZed             Zd Zd ZdS )MethodDispatcherzP Dispatch methods based on type signature

    See Also:
        Dispatcher
    c                     t          t          d          rAt          j        |          }t          j        |j                                        dd           S d S )Nr7   r   )rL   rM   r7   itlislicerN   rO   rP   s      r   rS   z MethodDispatcher.get_func_paramsu  sS    7K(( 	@#D))C:cn3355q$???	@ 	@r   c                 "    || _         || _        | S r   )objrQ   )r   instanceowners      r   __get__zMethodDispatcher.__get__{  s    r   c                     t          d |D                       } | j        | }|s(t          d| j        dt	          |          d           || j        g|R i |S )Nc                 ,    g | ]}t          |          S r   r!   rt   s     r   rv   z-MethodDispatcher.__call__.<locals>.<listcomp>  rw   r   rx   r&   r'   )r(   rz   r)   r   r*   r   )r   r+   r,   r-   rH   s        r   r.   zMethodDispatcher.__call__  s    11D11122t}e$ 	I%%'+yyy-2F2F2F2F'H I I ItDH.t...v...r   N)r   r   r   r   r   rS   r   r.   r   r   r   r   r   n  sZ          @ @ [@
  
/ / / / /r   r   c                 @    d                     d | D                       S )z String representation of type signature

    >>> from sympy.multipledispatch.dispatcher import str_signature
    >>> str_signature((int, float))
    'int, float'
    rh   c              3   $   K   | ]}|j         V  d S r   )r   )r#   rQ   s     r   r%   z str_signature.<locals>.<genexpr>  s$      11cS\111111r   rl   )rR   s    r   r*   r*     s%     9911S111111r   c                      d z  }|dz  }|D ]*}|dd                     d |D                       z   dz   z  }+|dz  }|d                      fd	|D                       z  }|S )
z! The text for ambiguity warnings z.
Ambiguities exist in dispatched function %s

z;The following signatures may result in ambiguous behavior:
	rh   c              3   @   K   | ]}d t          |          z   dz   V  dS )[]N)r*   )r#   r   s     r   r%   zwarning_text.<locals>.<genexpr>  s4      AAqcM!,,,s2AAAAAAr   r   z,

Consider making the following additions:

r   c                 Z    g | ]'}d t          t          |                    z   dz  z   (S )z
@dispatch(z)
def %s(...))r*   r   )r#   r   r   s     r   rv   z warning_text.<locals>.<listcomp>  sQ     A A A78 &oa6H6H(I(II+d23 A A Ar   r   )r   r6   textpairs   `   r   r   r     s    >$GDJJD I IIIAADAAAAABDHI 	I>>DFKK A A A A<?A A A B B BDKr   )typingr   tSetwarningsr   rM   conflictr   r   r   r	   utilsr
   	itertoolsr   r)   r   r   r   r5   r3   r<   r9   r:   r?   rA   r   r   r*   r   r   r   r   <module>r      s                N N N N N N N N N N N N                8 8 8 8 8/ 8 8 8G G G"       
 
 
8 #%% 6   #1 6 6 6 6L# L# L# L# L# L# L# L#^  / / / / /z / / /62 2 2
 
 
 
 
r   