U
    ZÊ¹jÂ/  ã                   @  sÞ   U 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„ deƒZd	d
„ ZG dd„ dƒZdd„ Zeƒ Zded< dgZdd„ Zefdd„ZG dd„ dƒZdd„ ZG dd„ deƒZdd„ Zdd„ ZdS ) é    )Úannotations)ÚwarnNé   )ÚorderingÚambiguitiesÚsuper_signatureÚAmbiguityWarning)Úexpand_tuplesc                   @  s   e Zd ZdZdS )ÚMDNotImplementedErrorz- A NotImplementedError for multiple dispatch N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/multipledispatch/dispatcher.pyr
   
   s   r
   c                 C  s   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   r   r   r   Úambiguity_warn   s    r   c                   @  s    e Zd ZdZdd„ Zdd„ ZdS )ÚRaiseNotImplementedErrorz*Raise ``NotImplementedError`` when called.c                 C  s
   || _ d S ©N)r   )Úselfr   r   r   r   Ú__init__$   s    z!RaiseNotImplementedError.__init__c                 O  s.   t dd„ |D ƒƒ}td| jjt|ƒf ƒ‚d S )Nc                 s  s   | ]}t |ƒV  qd S r   ©Útype)Ú.0Úar   r   r   Ú	<genexpr>(   s     z4RaiseNotImplementedError.__call__.<locals>.<genexpr>z Ambiguous signature for %s: <%s>)ÚtupleÚNotImplementedErrorr   r   Ústr_signature)r   ÚargsÚkwargsÚtypesr   r   r   Ú__call__'   s     ÿÿz!RaiseNotImplementedError.__call__N)r   r   r   r   r   r$   r   r   r   r   r   !   s   r   c                 C  s@   |D ]6}t t|ƒƒ}tt|ƒƒdkr&q| j|t| ƒtd� qd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Ú	signaturer   r   r   r*   .   s     þr*   zset[Dispatcher]Ú_unresolved_dispatchersTc                   C  s   dt d< d S )NFr   )Ú_resolver   r   r   r   Úhalt_orderingN   s    r/   c                 C  s&   dt d< tr"t ¡ }|j| d� qd S )NTr   r%   )r.   r-   ÚpopÚreorder)r&   r   r   r   r   Úrestart_orderingR   s    r2   c                   @  s¾   e Zd ZdZdZd(dd„Zdd„ Zedd	„ ƒZed
d„ ƒZ	e
fdd„Ze
fdd„Zdd„ Zdd„ ZeZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZd d!„ Zd"d#„ Zd$d%„ Zd&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                 C  s(   | | _ | _i | _i | _g | _|| _d S r   )r   r   r4   r5   r   r6   )r   r   r6   r   r   r   r   q   s
    zDispatcher.__init__c                   s   ‡ ‡‡fd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                   s   ˆj ˆ| fˆ Ž | S r   )r)   )Úfunc©r"   r   r#   r   r   Ú_“   s    zDispatcher.register.<locals>._r   )r   r#   r"   r9   r   r8   r   Úregisterx   s    zDispatcher.registerc                 C  s"   t tdƒrt |¡}|j ¡ S d S )Nr,   )ÚhasattrÚinspectr,   Ú
parametersÚvalues©Úclsr7   Úsigr   r   r   Úget_func_params˜   s    

zDispatcher.get_func_paramsc                   sV   |   |¡}|rRtj‰ ‡ fdd„|D ƒ}tdd„ |D ƒƒ}t‡ fdd„|D ƒƒsR|S dS )z; Get annotations of function positional parameters
        c                 3  s$   | ]}|j ˆ jˆ jfkr|V  qd S r   )ÚkindÚPOSITIONAL_ONLYÚPOSITIONAL_OR_KEYWORD©r   Úparam©Ú	Parameterr   r   r   ¦   s    ÿÿÿz2Dispatcher.get_func_annotations.<locals>.<genexpr>c                 s  s   | ]}|j V  qd S r   )Ú
annotationrF   r   r   r   r   «   s   ÿc                 3  s   | ]}|ˆ j kV  qd S r   )Úempty)r   ÚannrH   r   r   r   ¯   s     N)rB   r<   rI   r   Úany)r@   r7   Úparamsr   r   rH   r   Úget_func_annotationsž   s    
þzDispatcher.get_func_annotationsc                 C  s¨   |s|   |¡}|r|}tdd„ |D ƒƒrHt|ƒD ]}|  |||¡ q0dS |D ]6}t|tƒsLd dd„ |D ƒ¡}td||| jf ƒ‚qL|| j	|< | j
|d� | 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                 s  s   | ]}t |tƒV  qd S r   )Ú
isinstancer   )r   Útypr   r   r   r   Ì   s     z!Dispatcher.add.<locals>.<genexpr>Nú, c                 s  s&   | ]}t |tƒr|jnt|ƒV  qd S r   )rP   r   r   Ústr)r   Úcr   r   r   r   Ó   s   ÿzDTried to dispatch on non-type: %s
In signature: <%s>
In function: %sr%   )rO   rM   r	   r)   rP   r   ÚjoinÚ	TypeErrorr   r4   r1   r5   Úclear)r   r,   r7   r&   r   ZtypsrQ   Zstr_sigr   r   r   r)   ²   s&    


ÿ
ý
zDispatcher.addc                 C  s<   t d r.t| jƒ| _t| jƒ}|r8|| |ƒ n
t | ¡ d S )Nr   )r.   r   r4   r   r-   r)   )r   r&   r+   r   r   r   r1   Þ   s    
zDispatcher.reorderc                 O  sæ   t dd„ |D ƒƒ}z| j| }W nB tk
rb   | j|Ž }|sTtd| jt|ƒf ƒ‚|| j|< Y nX z|||ŽW S  tk
rà   | j|Ž }t	|ƒ |D ].}z|||ŽW    Y S  tk
rÂ   Y q–X q–td| jt|ƒf ƒ‚Y nX d S )Nc                 S  s   g | ]}t |ƒ‘qS r   r   ©r   Úargr   r   r   Ú
<listcomp>è   s     z'Dispatcher.__call__.<locals>.<listcomp>ú%Could not find signature for %s: <%s>zFMatching functions for %s: <%s> found, but none completed successfully)
r   r5   ÚKeyErrorÚdispatchr   r   r    r
   Údispatch_iterÚnext)r   r!   r"   r#   r7   r4   r   r   r   r$   ç   s2    
ÿÿ
þzDispatcher.__call__c                 C  s
   d| j  S )Nz<dispatched %s>©r   ©r   r   r   r   Ú__str__  s    zDispatcher.__str__c                 G  s@   || j kr| j | S zt| j|Ž ƒW S  tk
r:   Y dS X dS )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)r4   r_   r^   ÚStopIteration©r   r#   r   r   r   r]     s    

zDispatcher.dispatchc                 g  sD   t |ƒ}| jD ]0}t |ƒ|krttt||ƒƒr| j| }|V  qd S r   )r'   r   ÚallÚmapÚ
issubclassr4   )r   r#   Únr,   Úresultr   r   r   r^   #  s
    

zDispatcher.dispatch_iterc                 C  s   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   ÚDeprecationWarningr]   rd   r   r   r   Úresolve*  s    ÿzDispatcher.resolvec                 C  s   | j | jdœS )N©r   r4   rl   ra   r   r   r   Ú__getstate__5  s    ÿzDispatcher.__getstate__c                 C  s*   |d | _ |d | _t| jƒ| _i | _d S )Nr   r4   )r   r4   r   r5   )r   Údr   r   r   Ú__setstate__9  s    

zDispatcher.__setstate__c                 C  s²   d| j  g}| jr| | j¡ g }| jd d d… D ]\}| j| }|jr€dt|ƒ }|dt|ƒ d 7 }||j ¡ 7 }| |¡ q2| t|ƒ¡ q2|r¨| dd 	|¡ ¡ d 	|¡S )	NzMultiply dispatched method: %séÿÿÿÿzInputs: <%s>
ú-Ú
zOther signatures:
    z
    ú

)
r   r6   Úappendr   r4   r   r    r'   ÚstriprU   )r   ÚdocsÚotherrA   r7   Úsr   r   r   r   ?  s    
zDispatcher.__doc__c                 G  s   | j tt|ƒŽ jS r   )r]   rf   r   r   )r   r!   r   r   r   Ú_helpV  s    zDispatcher._helpc                 O  s   t | j|Ž ƒ dS )z: Print docstring for the function corresponding to inputs N)Úprintry   ©r   r!   r"   r   r   r   ÚhelpY  s    zDispatcher.helpc                 G  s$   | j tt|ƒŽ }|stdƒ‚t|ƒS )NzNo function found)r]   rf   r   rV   Úsource)r   r!   r7   r   r   r   Ú_source]  s    zDispatcher._sourcec                 O  s   t | j|Ž ƒ dS )z< Print source code for the function corresponding to inputs N)rz   r~   r{   r   r   r   r}   c  s    zDispatcher.source)N)r   r   r   r   Ú	__slots__r   r:   ÚclassmethodrB   rO   r   r)   r1   r$   rb   Ú__repr__r]   r^   rk   rm   ro   Úpropertyry   r|   r~   r}   r   r   r   r   r3   Y   s0   
 

,	
r3   c                 C  s    dt  | ¡ }|t  | ¡ }|S )Nz
File: %s

)r<   ÚgetsourcefileÚ	getsource)r7   rx   r   r   r   r}   h  s    r}   c                   @  s,   e Zd ZdZedd„ ƒZdd„ Zdd„ ZdS )	ÚMethodDispatcherzP Dispatch methods based on type signature

    See Also:
        Dispatcher
    c                 C  s,   t tdƒr(t |¡}t |j ¡ dd ¡S d S )Nr,   r   )r;   r<   r,   ÚitlÚislicer=   r>   r?   r   r   r   rB   u  s    

z MethodDispatcher.get_func_paramsc                 C  s   || _ || _| S r   )Úobjr@   )r   ÚinstanceÚownerr   r   r   Ú__get__{  s    zMethodDispatcher.__get__c                 O  sH   t dd„ |D ƒƒ}| j|Ž }|s6td| jt|ƒf ƒ‚|| jf|ž|ŽS )Nc                 S  s   g | ]}t |ƒ‘qS r   r   rX   r   r   r   rZ   �  s     z-MethodDispatcher.__call__.<locals>.<listcomp>r[   )r   r]   r   r   r    rˆ   )r   r!   r"   r#   r7   r   r   r   r$   €  s    
ÿzMethodDispatcher.__call__N)r   r   r   r   r€   rB   r‹   r$   r   r   r   r   r…   n  s
   
r…   c                 C  s   d  dd„ | D ƒ¡S )z§ String representation of type signature

    >>> from sympy.multipledispatch.dispatcher import str_signature
    >>> str_signature((int, float))
    'int, float'
    rR   c                 s  s   | ]}|j V  qd S r   )r   )r   r@   r   r   r   r   �  s     z str_signature.<locals>.<genexpr>©rU   )rA   r   r   r   r    ‰  s    r    c                   sb   dˆ  }|d7 }|D ]$}|dd  dd„ |D ƒ¡ d 7 }q|d7 }|d	  ‡ fd
d„|D ƒ¡7 }|S )z! The text for ambiguity warnings z.
Ambiguities exist in dispatched function %s

z;The following signatures may result in ambiguous behavior:
ú	rR   c                 s  s   | ]}d t |ƒ d V  qdS )ú[ú]N)r    ©r   rx   r   r   r   r   ™  s     zwarning_text.<locals>.<genexpr>rr   z,

Consider making the following additions:

rs   c                   s$   g | ]}d t t|ƒƒ dˆ   ‘qS )z
@dispatch(z)
def %s(...))r    r   r�   r`   r   r   rZ   ›  s   ÿÿz warning_text.<locals>.<listcomp>rŒ   )r   r+   ÚtextÚpairr   r`   r   r   “  s    ÿÿÿ
r   )Ú
__future__r   Úwarningsr   r<   Úconflictr   r   r   r   Úutilsr	   Ú	itertoolsr†   r   r
   r   r   r*   r(   r-   Ú__annotations__r.   r/   r2   r3   r}   r…   r    r   r   r   r   r   Ú<module>   s*      
