ó
¡¼™\c           @   së   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 d e f d „  ƒ  YZ d „  Z e ƒ  Z e g Z d	 „  Z e d
 „ Z d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d S(   iÿÿÿÿ(   t   warnNi   (   t   orderingt   ambiguitiest   super_signaturet   AmbiguityWarning(   t   expand_tuplest   MDNotImplementedErrorc           B   s   e  Z d  Z RS(   s-    A NotImplementedError for multiple dispatch (   t   __name__t
   __module__t   __doc__(    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR      s   c         C   s   t  t |  j | ƒ t ƒ d S(   sC   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    t   warning_textt   nameR   (   t
   dispatcherR   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   ambiguity_warn   s    c           C   s   t  t d <d  S(   Ni    (   t   Falset   _resolve(    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   halt_ordering!   s    c         C   s7   t  t d <x& t r2 t j ƒ  } | j d |  ƒ q Wd  S(   Ni    t   on_ambiguity(   t   TrueR   t   _unresolved_dispatcherst   popt   reorder(   R   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   restart_ordering%   s    
	t
   Dispatcherc           B   s×   e  Z d  Z d Z d d „ Z d „  Z e d	 „  ƒ Z e d
 „  ƒ Z	 e
 d „ Z e
 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 RS(   s]   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):
    ...     return x - 1

    >>> f(3)
    4
    >>> f(3.0)
    2.0
    R   R   t   funcsR   t   _cachet   docc         C   s>   | |  _  |  _ t ƒ  |  _ t ƒ  |  _ g  |  _ | |  _ d  S(   N(   R   R   t   dictR   R   R   R   (   t   selfR   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __init__D   s
    	c            s   ‡  ‡ ‡ f d †  } | S(   s#   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  ˆ |  ˆ   |  S(   N(   t   add(   t   func(   t   kwargsR   t   types(    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   _f   s    (    (   R   R!   R    R"   (    (   R    R   R!   s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   registerK   s    c         C   s/   t  t d ƒ r+ t j | ƒ } | j j ƒ  Sd  S(   Nt	   signature(   t   hasattrt   inspectR$   t
   parameterst   values(   t   clsR   t   sig(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   get_func_paramsk   s    c            sq   |  j  | ƒ } | rm t j ‰  ‡  f d †  | Dƒ } t d „  | Dƒ ƒ } t ‡  f d †  | Dƒ ƒ rm | Sn  d S(   s;    Get annotations of function positional parameters
        c         3   s0   |  ]& } | j  ˆ  j ˆ  j f k r | Vq d  S(   N(   t   kindt   POSITIONAL_ONLYt   POSITIONAL_OR_KEYWORD(   t   .0t   param(   t	   Parameter(    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>y   s    c         s   s   |  ] } | j  Vq d  S(   N(   t
   annotation(   R/   R0   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>   s   c         3   s   |  ] } | ˆ  j  k	 Vq d  S(   N(   t   empty(   R/   t   ann(   R1   (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>‚   s    N(   R+   R&   R1   t   tuplet   all(   R)   R   t   paramst   annotations(    (   R1   s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   get_func_annotationsq   s    	c         C   sñ   | s' |  j  | ƒ } | r' | } q' n  t d „  | Dƒ ƒ rk x' t | ƒ D] } |  j | | | ƒ qJ Wd SxU | D]M } t | t ƒ sr d j d „  | Dƒ ƒ } t d | | |  j f ƒ ‚ qr qr W| |  j	 | <|  j
 d | ƒ |  j j ƒ  d S(   s†   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(   N(   t
   isinstanceR5   (   R/   t   typ(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>Ÿ   s    Ns   , c         s   s3   |  ]) } t  | t ƒ r! | j n	 t | ƒ Vq d  S(   N(   R:   t   typeR   t   str(   R/   t   c(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>¦   s   sD   Tried to dispatch on non-type: %s
In signature: <%s>
In function: %sR   (   R9   t   anyR   R   R:   R<   t   joint	   TypeErrorR   R   R   R   t   clear(   R   R$   R   R   R8   t   typsR;   t   str_sig(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR   …   s"    c         C   sU   t  d rD t |  j ƒ |  _ t |  j ƒ } | rQ | |  | ƒ qQ n t j |  ƒ d  S(   Ni    (   R   R   R   R   R   R   (   R   R   t   amb(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR   ±   s    
c         O   s%  t  g  | D] } t | ƒ ^ q
 ƒ } y |  j | } WnU t k
 r |  j | Œ  } | s} t d |  j t | ƒ f ƒ ‚ n  | |  j | <n Xy | | | Ž  SWn t k
 r |  j	 | Œ  } t
 | ƒ x3 | D]+ } y | | | Ž  SWqÏ t k
 rù qÏ XqÏ Wt d |  j t | ƒ f ƒ ‚ n Xd  S(   Ns%   Could not find signature for %s: <%s>sF   Matching functions for %s: <%s> found, but none completed successfully(   R5   R<   R   t   KeyErrort   dispatcht   NotImplementedErrorR   t   str_signatureR   t   dispatch_itert   next(   R   t   argsR    t   argR!   R   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __call__º   s,    %
c         C   s   d |  j  S(   Ns   <dispatched %s>(   R   (   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __str__Ô   s    c         G   sJ   | |  j  k r |  j  | Sy t |  j | Œ  ƒ SWn t k
 rE d SXd S(   s`   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(   R   RK   RJ   t   StopIterationt   None(   R   R!   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRG   Ø   s    c         g   sc   t  | ƒ } xP |  j D]E } t  | ƒ | k r t t t | | ƒ ƒ r |  j | } | Vq q Wd  S(   N(   t   lenR   R6   t   mapt
   issubclassR   (   R   R!   t   nR$   t   result(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRJ   ö   s
    *c         C   s   t  d t ƒ |  j | Œ  S(   s“    Deterimine appropriate implementation for this type signature

        .. deprecated:: 0.4.4
            Use ``dispatch(*types)`` instead
        s-   resolve() is deprecated, use dispatch(*types)(   R    t   DeprecationWarningRG   (   R   R!   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   resolveý   s    c         C   s   i |  j  d 6|  j d 6S(   NR   R   (   R   R   (   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __getstate__  s    c         C   s<   | d |  _  | d |  _ t |  j ƒ |  _ t ƒ  |  _ d  S(   NR   R   (   R   R   R   R   R   (   R   t   d(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __setstate__  s    c         C   s÷   d |  j  g } |  j r, | j |  j ƒ n  g  } x’ |  j d  d  d … D]z } |  j | } | j r° d t | ƒ } | d t | ƒ d 7} | | j j ƒ  7} | j | ƒ qI | j t | ƒ ƒ qI W| rê | j d d j	 | ƒ ƒ n  d j	 | ƒ S(	   Ns   Multiply dispatched method: %siÿÿÿÿs   Inputs: <%s>
t   -s   
s   Other signatures:
    s   
    s   

(
   R   R   t   appendR   R   R	   RI   RR   t   stripR@   (   R   t   docst   otherR*   R   t   s(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR	     s    		c         G   s   |  j  t t | ƒ Œ  j S(   N(   RG   RS   R<   R	   (   R   RL   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   _help)  s    c         O   s   |  j  | Œ  GHd S(   s:    Print docstring for the function corresponding to inputs N(   Rb   (   R   RL   R    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   help,  s    c         G   s7   |  j  t t | ƒ Œ  } | s- t d ƒ ‚ n  t | ƒ S(   Ns   No function found(   RG   RS   R<   RA   t   source(   R   RL   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   _source0  s    c         O   s   |  j  | Œ  GHd S(   s<    Print source code for the function corresponding to inputs N(   Re   (   R   RL   R    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRd   6  s    (   R   R   R   R   R   R   N(   R   R   R	   t	   __slots__RQ   R   R#   t   classmethodR+   R9   R   R   R   RN   RO   t   __repr__RG   RJ   RX   RY   R[   t   propertyRb   Rc   Re   Rd   (    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR   ,   s*   	 ,											c         C   s*   d t  j |  ƒ } | t  j |  ƒ } | S(   Ns
   File: %s

(   R&   t   getsourcefilet	   getsource(   R   Ra   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRd   ;  s    t   MethodDispatcherc           B   s/   e  Z d  Z e d „  ƒ Z d „  Z d „  Z RS(   sP    Dispatch methods based on type signature

    See Also:
        Dispatcher
    c         C   s>   t  t d ƒ r: t j | ƒ } t j | j j ƒ  d d  ƒ Sd  S(   NR$   i   (   R%   R&   R$   t   itlt   isliceR'   R(   RQ   (   R)   R   R*   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR+   H  s    c         C   s   | |  _  | |  _ |  S(   N(   t   objR)   (   R   t   instancet   owner(    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   __get__N  s    		c         O   so   t  g  | D] } t | ƒ ^ q
 ƒ } |  j | Œ  } | s\ t d |  j t | ƒ f ƒ ‚ n  | |  j | | Ž S(   Ns%   Could not find signature for %s: <%s>(   R5   R<   RG   RH   R   RI   Ro   (   R   RL   R    RM   R!   R   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRN   S  s    %(   R   R   R	   Rg   R+   Rr   RN   (    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRl   A  s   	c         C   s   d j  d „  |  Dƒ ƒ S(   s§    String representation of type signature

    >>> from sympy.multipledispatch.dispatcher import str_signature
    >>> str_signature((int, float))
    'int, float'
    s   , c         s   s   |  ] } | j  Vq d  S(   N(   R   (   R/   R)   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>c  s    (   R@   (   R*   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyRI   \  s    c         C   s–   d |  } | d 7} x3 | D]+ } | d d j  d „  | Dƒ ƒ d 7} q W| d 7} | d j  g  | D]$ } d	 t t | ƒ ƒ d
 |  ^ qd ƒ 7} | S(   s!    The text for ambiguity warnings s.   
Ambiguities exist in dispatched function %s

s;   The following signatures may result in ambiguous behavior:
s   	s   , c         s   s#   |  ] } d  t  | ƒ d Vq d S(   t   [t   ]N(   RI   (   R/   Ra   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pys	   <genexpr>l  s    s   
s,   

Consider making the following additions:

s   

s
   @dispatch(s   )
def %s(...)(   R@   RI   R   (   R   RE   t   textt   pairRa   (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyR
   f  s    

&
2(   t   warningsR    R&   t   conflictR   R   R   R   t   utilsR   t	   itertoolsRm   RH   R   R   t   setR   R   R   R   R   t   objectR   Rd   Rl   RI   R
   (    (    (    s@   lib/python2.7/site-packages/sympy/multipledispatch/dispatcher.pyt   <module>   s    "				ÿ 		
