ó
¡¼™\c           @  sÊ   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
 d  d l m Z d  d l m Z d  d l m Z m Z d „  Z d	 „  Z d
 e
 f d „  ƒ  YZ d e
 f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   print_functiont   division(   t   St   Integer(   t   ranget
   SYMPY_INTS(   t   Function(   t	   fuzzy_not(   t   prod(   t   has_dupst   default_sort_keyc          O  s   t  |  | Ž  S(   s”   
    Represent the Levi-Civita symbol.

    This is just compatibility wrapper to ``LeviCivita()``.

    See Also
    ========

    LeviCivita

    (   t
   LeviCivita(   t   argst   kwargs(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   Eijk   s    c            sB   d d l  m ‰ t ˆ  ƒ ‰ t ‡  ‡ ‡ f d †  t ˆ ƒ Dƒ ƒ S(   s   Evaluate Levi-Civita symbol.iÿÿÿÿ(   t	   factorialc         3  sE   |  ]; ‰  t  ‡ ‡  f d  †  t ˆ  d ˆ ƒ Dƒ ƒ ˆ ˆ  ƒ Vq d S(   c         3  s!   |  ] } ˆ  | ˆ  ˆ Vq d  S(   N(    (   t   .0t   j(   R   t   i(    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pys	   <genexpr>#   s    i   N(   R   R   (   R   (   R   R   t   n(   R   sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pys	   <genexpr>#   s   (   t   sympyR   t   lenR   R   (   R   (    (   R   R   R   sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   eval_levicivita   s
    R   c           B  s,   e  Z d  Z e Z e d „  ƒ Z d „  Z RS(   s/  Represent the Levi-Civita symbol.

    For even permutations of indices it returns 1, for odd permutations -1, and
    for everything else (a repeated index) it returns 0.

    Thus it represents an alternating pseudotensor.

    Examples
    ========

    >>> from sympy import LeviCivita
    >>> from sympy.abc import i, j, k
    >>> LeviCivita(1, 2, 3)
    1
    >>> LeviCivita(1, 3, 2)
    -1
    >>> LeviCivita(1, 2, 2)
    0
    >>> LeviCivita(i, j, k)
    LeviCivita(i, j, k)
    >>> LeviCivita(i, j, i)
    0

    See Also
    ========

    Eijk

    c         G  s7   t  d „  | Dƒ ƒ r  t | Œ  St | ƒ r3 t j Sd  S(   Nc         s  s$   |  ] } t  | t t f ƒ Vq d  S(   N(   t
   isinstanceR   R   (   R   t   a(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pys	   <genexpr>K   s    (   t   allR   R	   R   t   Zero(   t   clsR   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   evalI   s    
c         C  s   t  |  j Œ  S(   N(   R   R   (   t   self(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   doitP   s    (   t   __name__t
   __module__t   __doc__t   Truet
   is_integert   classmethodR   R   (    (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyR   (   s   t   KroneckerDeltac           B  s¶   e  Z d  Z e Z e d „  ƒ Z d „  Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d	 „  ƒ Z d
 „  Z e d „  ƒ Z d „  Z RS(   s>  The discrete, or Kronecker, delta function.

    A function that takes in two integers `i` and `j`. It returns `0` if `i` and `j` are
    not equal or it returns `1` if `i` and `j` are equal.

    Parameters
    ==========

    i : Number, Symbol
        The first index of the delta function.
    j : Number, Symbol
        The second index of the delta function.

    Examples
    ========

    A simple example with integer indices::

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> KroneckerDelta(1, 2)
        0
        >>> KroneckerDelta(3, 3)
        1

    Symbolic indices::

        >>> from sympy.abc import i, j, k
        >>> KroneckerDelta(i, j)
        KroneckerDelta(i, j)
        >>> KroneckerDelta(i, i)
        1
        >>> KroneckerDelta(i, i + 1)
        0
        >>> KroneckerDelta(i, i + 1 + k)
        KroneckerDelta(i, i + k + 1)

    See Also
    ========

    eval
    sympy.functions.special.delta_functions.DiracDelta

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Kronecker_delta
    c         C  s²   | | } | j  r t j St | j  ƒ r0 t j S| j j d ƒ r[ | j j d ƒ r[ t j S| j j d ƒ r† | j j d ƒ r† t j S| t | | d t ƒk	 r® |  | | ƒ Sd S(   sÚ  
        Evaluates the discrete delta function.

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy.abc import i, j, k

        >>> KroneckerDelta(i, j)
        KroneckerDelta(i, j)
        >>> KroneckerDelta(i, i)
        1
        >>> KroneckerDelta(i, i + 1)
        0
        >>> KroneckerDelta(i, i + 1 + k)
        KroneckerDelta(i, i + k + 1)

        # indirect doctest

        t   below_fermit   above_fermit   keyN(	   t   is_zeroR   t   OneR   R   t   assumptions0t   gett   minR
   (   R   R   R   t   diff(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyR   ‡   s    
	c         C  s2   | j  r |  S| j r. | t j k	 r. d |  Sd  S(   Ni   (   t   is_positivet   is_negativeR   R*   (   R   t   expt(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   _eval_power°   s    	c         C  s>   |  j  d j j d ƒ r t S|  j  d j j d ƒ r: t St S(   s‡  
        True if Delta can be non-zero above fermi

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> p = Symbol('p')
        >>> q = Symbol('q')
        >>> KroneckerDelta(p, a).is_above_fermi
        True
        >>> KroneckerDelta(p, i).is_above_fermi
        False
        >>> KroneckerDelta(p, q).is_above_fermi
        True

        See Also
        ========

        is_below_fermi, is_only_below_fermi, is_only_above_fermi


        i    R&   i   (   R   R+   R,   t   FalseR"   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   is_above_fermi¶   s
    c         C  s>   |  j  d j j d ƒ r t S|  j  d j j d ƒ r: t St S(   s†  
        True if Delta can be non-zero below fermi

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> p = Symbol('p')
        >>> q = Symbol('q')
        >>> KroneckerDelta(p, a).is_below_fermi
        False
        >>> KroneckerDelta(p, i).is_below_fermi
        True
        >>> KroneckerDelta(p, q).is_below_fermi
        True

        See Also
        ========

        is_above_fermi, is_only_above_fermi, is_only_below_fermi

        i    R'   i   (   R   R+   R,   R3   R"   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   is_below_fermiØ   s
    c         C  s6   |  j  d j j d ƒ p5 |  j  d j j d ƒ p5 t S(   s“  
        True if Delta is restricted to above fermi

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> p = Symbol('p')
        >>> q = Symbol('q')
        >>> KroneckerDelta(p, a).is_only_above_fermi
        True
        >>> KroneckerDelta(p, q).is_only_above_fermi
        False
        >>> KroneckerDelta(p, i).is_only_above_fermi
        False

        See Also
        ========

        is_above_fermi, is_below_fermi, is_only_below_fermi


        i    R'   i   (   R   R+   R,   R3   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   is_only_above_fermiù   s    c         C  s6   |  j  d j j d ƒ p5 |  j  d j j d ƒ p5 t S(   s“  
        True if Delta is restricted to below fermi

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> p = Symbol('p')
        >>> q = Symbol('q')
        >>> KroneckerDelta(p, i).is_only_below_fermi
        True
        >>> KroneckerDelta(p, q).is_only_below_fermi
        False
        >>> KroneckerDelta(p, a).is_only_below_fermi
        False

        See Also
        ========

        is_above_fermi, is_below_fermi, is_only_above_fermi


        i    R&   i   (   R   R+   R,   R3   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   is_only_below_fermi  s    c         C  s|   |  j  d j j d ƒ r6 |  j  d j j d ƒ r6 t S|  j  d j j d ƒ rl |  j  d j j d ƒ rl t S|  j o{ |  j S(   sp  
        Returns True if indices are either both above or below fermi.

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> p = Symbol('p')
        >>> q = Symbol('q')
        >>> KroneckerDelta(p, q).indices_contain_equal_information
        True
        >>> KroneckerDelta(p, q+1).indices_contain_equal_information
        True
        >>> KroneckerDelta(i, p).indices_contain_equal_information
        False

        i    R&   i   R'   (   R   R+   R,   R"   R5   R4   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt!   indices_contain_equal_information;  s    c         C  s&   |  j  ƒ  r |  j d S|  j d Sd S(   s-  
        Returns the index which is preferred to keep in the final expression.

        The preferred index is the index with more information regarding fermi
        level.  If indices contain same information, 'a' is preferred before
        'b'.

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> j = Symbol('j', below_fermi=True)
        >>> p = Symbol('p')
        >>> KroneckerDelta(p, i).preferred_index
        i
        >>> KroneckerDelta(p, a).preferred_index
        a
        >>> KroneckerDelta(i, j).preferred_index
        i

        See Also
        ========

        killable_index

        i   i    N(   t   _get_preferred_indexR   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   preferred_index[  s    c         C  s&   |  j  ƒ  r |  j d S|  j d Sd S(   s=  
        Returns the index which is preferred to substitute in the final
        expression.

        The index to substitute is the index with less information regarding
        fermi level.  If indices contain same information, 'a' is preferred
        before 'b'.

        Examples
        ========

        >>> from sympy.functions.special.tensor_functions import KroneckerDelta
        >>> from sympy import Symbol
        >>> a = Symbol('a', above_fermi=True)
        >>> i = Symbol('i', below_fermi=True)
        >>> j = Symbol('j', below_fermi=True)
        >>> p = Symbol('p')
        >>> KroneckerDelta(p, i).killable_index
        p
        >>> KroneckerDelta(p, a).killable_index
        p
        >>> KroneckerDelta(i, j).killable_index
        j

        See Also
        ========

        preferred_index

        i    i   N(   R9   R   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   killable_index  s     c         C  sb   |  j  s- |  j d j j d ƒ r& d Sd Sn1 |  j sZ |  j d j j d ƒ rS d Sd Sn d Sd S(   sñ   
        Returns the index which is preferred to keep in the final expression.

        The preferred index is the index with more information regarding fermi
        level.  If indices contain same information, index 0 is returned.
        i    R&   i   R'   N(   R4   R   R+   R,   R5   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyR9   ¤  s    		c         C  s   |  j  d d !S(   Ni    i   (   R   (   R   (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   indices¸  s    c         C  s9   d d  l  j } | j |  j d j ƒ  |  j d j ƒ  ƒ S(   Niÿÿÿÿi    i   (   t   sage.allR   t   kronecker_deltaR   t   _sage_(   R   t   sage(    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyR?   ¼  s    (   R   R    R!   R"   R#   R$   R   R2   t   propertyR4   R5   R6   R7   R8   R:   R;   R9   R<   R?   (    (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyR%   T   s   /)	"!!! $%	N(   t
   __future__R    R   t
   sympy.coreR   R   t   sympy.core.compatibilityR   R   t   sympy.core.functionR   t   sympy.core.logicR   t   sympy.core.mulR   t   sympy.utilities.iterablesR	   R
   R   R   R   R%   (    (    (    sG   lib/python2.7/site-packages/sympy/functions/special/tensor_functions.pyt   <module>   s   		
,