ó
Ąź\c           @  sŤ   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
 d  d l m Z m Z d  d l Z d e f d	     YZ d
 e e f d     YZ d S(   i˙˙˙˙(   t   print_functiont   division(   t   Basic(   t   Expr(   t   Integer(   t   sympify(   t
   SYMPY_INTSt   IterableNt	   NDimArrayc           B  sŻ  e  Z d  Z e Z d) d  Z d   Z d   Z d   Z	 d   Z
 e d    Z e d) d) d   Z d   Z e d	    Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z e Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d   Z& e" Z' e# Z( d   Z) d    Z* d!   Z+ d"   Z, d#   Z- d$   Z. d%   Z/ d&   Z0 d'   Z1 e d(    Z2 RS(*   sŠ  

    Examples
    ========

    Create an N-dim array of zeros:

    >>> from sympy import MutableDenseNDimArray
    >>> a = MutableDenseNDimArray.zeros(2, 3, 4)
    >>> a
    [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]

    Create an N-dim array from a list;

    >>> a = MutableDenseNDimArray([[2, 3], [4, 5]])
    >>> a
    [[2, 3], [4, 5]]

    >>> b = MutableDenseNDimArray([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]])
    >>> b
    [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]

    Create an N-dim array from a flat list with dimension shape:

    >>> a = MutableDenseNDimArray([1, 2, 3, 4, 5, 6], (2, 3))
    >>> a
    [[1, 2, 3], [4, 5, 6]]

    Create an N-dim array from a matrix:

    >>> from sympy import Matrix
    >>> a = Matrix([[1,2],[3,4]])
    >>> a
    Matrix([
    [1, 2],
    [3, 4]])
    >>> b = MutableDenseNDimArray(a)
    >>> b
    [[1, 2], [3, 4]]

    Arithmetic operations on N-dim arrays

    >>> a = MutableDenseNDimArray([1, 1, 1, 1], (2, 2))
    >>> b = MutableDenseNDimArray([4, 4, 4, 4], (2, 2))
    >>> c = a + b
    >>> c
    [[5, 5], [5, 5]]
    >>> a - b
    [[-3, -3], [-3, -3]]

    c         K  s    d d l  m } | | | |  S(   Ni˙˙˙˙(   t   ImmutableDenseNDimArray(   t   sympy.tensor.arrayR	   (   t   clst   iterablet   shapet   kwargsR	   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __new__B   s    c         C  sĚ   t  | t t f  r7 | |  j k r3 t d   n  | St |  |  j k r[ t d   n  d } xd t |  j  D]S } | | |  j | k rŤ t d t	 |  d   n  | |  j | | | } qq W| S(   Ns   index out of ranges   Wrong number of array axesi    s   Index s    out of border(
   t
   isinstanceR   R   t
   _loop_sizet
   ValueErrort   lent   _rankt   rangeR   t   str(   t   selft   indext
   real_indext   i(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _parse_indexF   s    c         C  s[   g  } x> t  t |  j   D]' \ } } | j | |  | | } q W| j   t |  S(   N(   t	   enumeratet   reversedR   t   appendt   reverset   tuple(   R   t   integer_indexR   R   t   sh(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _get_tuple_indexY   s    "
c         C  sÇ   t  | t  r | n | f } t g  | D] } t  | t  oD | j ^ q(  rĂ xS t | |  j  D]? \ } } | d k  t k s | | k t k rc t d   qc qc Wd d l	 m
 } | |  |  Sd  S(   Ni    s   index out of rangei˙˙˙˙(   t   Indexed(   R   R    t   anyR   t	   is_numbert   zipR   t   TrueR   t   sympy.tensorR$   t   None(   R   R   t   tuple_indexR   t   nth_dimR$   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _check_symbolic_indexa   s    2$c         C  s5   d d l  m } t | t | t f  r1 t  n  d  S(   Ni˙˙˙˙(   t
   MatrixBase(   t   sympy.matrices.matricesR.   R   R   R   t   NotImplementedError(   R   t   valueR.   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _setter_iterable_checkl   s    c           s     f d       |  S(   Nc           s­   t  |  t  s |  g d f Sg  } t g  |  D] }   |  ^ q,   \ } } t t |   d k rt t d   n  x | D] } | j |  q{ W| t |  f | d f S(   Ni   s'   could not determine shape unambiguouslyi    (    (   R   R   R'   R   t   setR   t   extend(   t   pointert   resultR   t   elemst   shapes(   t   f(    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR9   s   s    +(    (   R   R   (    (   R9   s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _scan_iterable_shapeq   s    c         K  sx  d d l  m } | d  k r7 | d  k r7 d } d } nŇ | d  k rj t | t  rj | j } t |  } n | d  k r t | t  r |  j |  \ } } nl | d  k rÄ t | |  rÄ | j } nE | d  k rë t | t  rë | j } n | d  k	 rú n d } | f } t | t	 t
 f  r*| f } n  t g  | D] } t | t	 t
 f  ^ q4 rht d   n  t |  | f S(   Ni˙˙˙˙(   R.   s#   Shape should contain integers only.(    (    (    (   R/   R.   R*   R   R   R   t   listR   R:   R   R   R%   t	   TypeErrorR    (   R   R   R   R   R.   t   dim(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _handle_ndarray_creation_inputs   s,    			/c         C  s   |  j  S(   s-  Overload common function len(). Returns number of elements in array.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.zeros(3, 3)
        >>> a
        [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
        >>> len(a)
        9

        (   R   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __len__¨   s    c         C  s   |  j  S(   sŕ   
        Returns array shape (dimension).

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.zeros(3, 3)
        >>> a.shape
        (3, 3)

        (   t   _shape(   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR   ¸   s    c         C  s   |  j  S(   s×   
        Returns rank of array.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.zeros(3,4,5,6,3)
        >>> a.rank()
        5

        (   R   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   rankČ   s    c         O  s6   d d l  m } | j d t  | |  j   | |  S(   s5  
        Calculate the derivative of each element in the array.

        Examples
        ========

        >>> from sympy import ImmutableDenseNDimArray
        >>> from sympy.abc import x, y
        >>> M = ImmutableDenseNDimArray([[x, y], [1, x*y]])
        >>> M.diff(x)
        [[1, 0], [0, y]]

        i˙˙˙˙(   t
   Derivativet   evaluate(   t   sympyRB   t
   setdefaultR(   t   as_immutable(   R   t   argsR   RB   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   diff×   s    c         C  s   | j  |   S(   N(   t   _visit_eval_derivative_array(   R   t   s(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _accept_eval_derivativeé   s    c           s   |  j    f d    S(   Nc           s     j  |   S(   N(   RH   (   t   x(   t   base(    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   <lambda>î   t    (   t	   applyfunc(   R   RM   (    (   RM   s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _visit_eval_derivative_scalarě   s    c         C  s   d d l  m } | | |   S(   Ni˙˙˙˙(   t   derive_by_array(   RD   RR   (   R   RM   RR   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRI   đ   s    c         C  s   t  j |  | |  S(   N(   R   t   _eval_derivative_n_times(   R   RJ   t   n(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRS   ő   s    c           sr   d d l  m } d d l  m } d d l m } t   t | | t f  rX | |     S|  j   f d    Sd  S(   Ni˙˙˙˙(   RR   (   t   Tuple(   t   MatrixCommonc           s   |  j     S(   N(   RH   (   RL   (   t   arg(    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRN   ˙   RO   (	   RD   RR   RU   t   sympy.matrices.commonRV   R   R   R   RP   (   R   RW   RR   RU   RV   (    (   RW   s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _eval_derivativeř   s    c         C  s   t  |   t | |   |  j  S(   s[  Apply a function to each element of the N-dim array.

        Examples
        ========

        >>> from sympy import ImmutableDenseNDimArray
        >>> m = ImmutableDenseNDimArray([i*2+j for i in range(2) for j in range(2)], (2, 2))
        >>> m
        [[0, 1], [2, 3]]
        >>> m.applyfunc(lambda i: 2*i)
        [[0, 2], [4, 6]]
        (   t   typet   mapR   (   R   R9   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRP     s    c           sN      f d      j    d k r2  d j   S   j  j d  j  S(   sţ   Returns string, allows to use standard functions print() and str().

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.zeros(2, 2)
        >>> a
        [[0, 0], [0, 0]]

        c           s´   t  |  d k rM d d j g  t | |  D] } t  |  ^ q+  d S|  | d }  d d j g  t | d  D]3 }   |  | d | | |  | | d |   ^ qu  d S(   Ni   t   [s   , t   ]i    (   R   t   joinR   R   (   R"   t
   shape_leftR   t   jt   e(   R9   R   (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR9     s    ;i    (    (   RA   t   __str__R   R   (   R   (    (   R9   R   s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRb     s    c         C  s
   |  j    S(   N(   Rb   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __repr__(  s    c         C  s*   d d l  m } | |  d d } d | S(   s^  
        IPython/Jupyter LaTeX printing

        To change the behavior of this (e.g., pass in some settings to LaTeX),
        use init_printing(). init_printing() will also enable LaTeX printing
        for built in numeric types like ints and container types that contain
        SymPy objects, like lists and dictionaries of expressions.
        i˙˙˙˙(   t   latext   modet   plains   $\displaystyle %s$(   t   sympy.printing.latexRd   (   R   Rd   RJ   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _repr_latex_/  s    	c           s.      f d        j   j d  j   S(   s?  
        Converting MutableDenseNDimArray to one-dim list

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray([1, 2, 3, 4], (2, 2))
        >>> a
        [[1, 2], [3, 4]]
        >>> b = a.tolist()
        >>> b
        [[1, 2], [3, 4]]
        c      	     s   t  |  d k r6 g  t | |  D] }  | ^ q" Sg  } |  | d }  xL t | d  D]: } | j   |  | d | | |  | | d |    q[ W| S(   Ni   i    (   R   R   R   (   R"   R_   R   R`   Ra   R6   (   R9   R   (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR9   N  s    $8i    (   R   R   (   R   (    (   R9   R   s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   tolist>  s    	c         C  s   t  | t  s$ t t |    n  |  j | j k rE t d   n  g  t |  |  D] \ } } | | ^ qU } t |   | |  j  S(   Ns   array shape mismatch(   R   R   R<   R   R   R   R'   RZ   (   R   t   otherR   R`   t   result_list(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __add__Y  s    ,c         C  s   t  | t  s$ t t |    n  |  j | j k rE t d   n  g  t |  |  D] \ } } | | ^ qU } t |   | |  j  S(   Ns   array shape mismatch(   R   R   R<   R   R   R   R'   RZ   (   R   Rj   R   R`   Rk   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __sub__c  s    ,c         C  sv   d d l  m } t | t t | f  r7 t d   n  t |  } g  |  D] } | | ^ qJ } t |   | |  j  S(   Ni˙˙˙˙(   R.   s=   scalar expected, use tensorproduct(...) for tensorial product(	   R/   R.   R   R   R   R   R   RZ   R   (   R   Rj   R.   R   Rk   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __mul__m  s    c         C  sv   d d l  m } t | t t | f  r7 t d   n  t |  } g  |  D] } | | ^ qJ } t |   | |  j  S(   Ni˙˙˙˙(   R.   s=   scalar expected, use tensorproduct(...) for tensorial product(	   R/   R.   R   R   R   R   R   RZ   R   (   R   Rj   R.   R   Rk   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __rmul__v  s    c         C  sv   d d l  m } t | t t | f  r7 t d   n  t |  } g  |  D] } | | ^ qJ } t |   | |  j  S(   Ni˙˙˙˙(   R.   s   scalar expected(	   R/   R.   R   R   R   R   R   RZ   R   (   R   Rj   R.   R   Rk   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __div__  s    c         C  s   t  d   d  S(   Ns"   unsupported operation on NDimArray(   R0   (   R   Rj   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __rdiv__  s    c         C  s0   g  |  D] } | ^ q } t  |   | |  j  S(   N(   RZ   R   (   R   R   Rk   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __neg__  s    c         C  s;   t  | t  s t S|  j | j k o: t |   t |  k S(   sę  
        NDimArray instances can be compared to each other.
        Instances equal if they have same shape and data.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.zeros(2, 3)
        >>> b = MutableDenseNDimArray.zeros(2, 3)
        >>> a == b
        True
        >>> c = a.reshape(3, 2)
        >>> c == b
        False
        >>> a[0,0] = 1
        >>> b[0,0] = 2
        >>> a == b
        False
        (   R   R   t   FalseR   R;   (   R   Rj   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __eq__  s    c         C  s   |  | k S(   N(    (   R   Rj   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   __ne__¨  s    c         C  s>   |  j    d k r! t d   n  d d l m } | |  d  S(   Ni   s   array rank not 2i   (   t   permutedimsi    (   i   i    (   RA   R   t   arrayopRv   (   R   Rv   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _eval_transposeŽ  s    c         C  s
   |  j    S(   N(   Rx   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt	   transpose´  s    c         C  s,   |  j  g  |  D] } | j   ^ q |  j  S(   N(   t   funct	   conjugateR   (   R   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _eval_conjugateˇ  s    c         C  s
   |  j    S(   N(   R|   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR{   ş  s    c         C  s   |  j    j   S(   N(   Ry   R{   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _eval_adjoint˝  s    c         C  s
   |  j    S(   N(   R}   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   adjointŔ  s    c         C  s[   t  | t  s | f S| j |  \ } } } g  t | | |  D] } | | | ^ qC S(   N(   R   t   slicet   indicesR   (   R   RJ   R=   t   startt   stopt   stepR   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _slice_expandĂ  s    c         C  sP   g  t  | |  j  D] \ } } |  j | |  ^ q } t j |   } | | f S(   N(   R'   R   R   t	   itertoolst   product(   R   R   R   R=   t
   sl_factorst   eindices(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt    _get_slice_data_for_array_accessÉ  s    7c         C  sz   t  | t  s$ t |   |  } n  |  j |  \ } } g  | D]' } t  | t  ra t |  n d  ^ q@ } | | | f S(   N(   R   R   RZ   R   R;   t   minR*   (   R   R   R1   R   R   R   t   slice_offsets(    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt$   _get_slice_data_for_array_assignmentÎ  s
    4c         C  s^   | d k r- t  |  d k r- t d   n  | d k rZ t  |  d k rZ t d   n  d  S(   Ni   s*   arrays without shape need one scalar valuei    s/   if array shape is (0,) there cannot be elements(    (   i    (   R   R   (   R   t	   flat_listR   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   _check_special_boundsÖ  s    N(3   t   __name__t
   __module__t   __doc__R(   t	   _diff_wrtR*   R   R   R#   R-   R2   t   classmethodR:   R>   R?   t   propertyR   RA   RH   RK   RQ   RI   RS   RY   RP   Rb   Rc   Rh   t   _repr_latex_origRi   Rl   Rm   Rn   Ro   Rp   Rq   Rr   Rt   Ru   t   __truediv__t   __rtruediv__Rx   Ry   R|   R{   R}   R~   R   R   R   R   (    (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR      s\   3				&															
	
																			t   ImmutableNDimArrayc           B  s)   e  Z d  Z d   Z d   Z d   Z RS(   g      &@c         C  s   t  j |   S(   N(   R   t   __hash__(   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR   á  s    c         C  s   |  S(   N(    (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyRF   ä  s    c         C  s   t  d   d  S(   Ns   abstract method(   R0   (   R   (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt
   as_mutableç  s    (   R   R   t   _op_priorityR   RF   R   (    (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyR   Ţ  s   		(   t
   __future__R    R   RD   R   t   sympy.core.exprR   t   sympy.core.numbersR   t   sympy.core.sympifyR   t   sympy.core.compatibilityR   R   R   t   objectR   R   (    (    (    s<   lib/python2.7/site-packages/sympy/tensor/array/ndim_array.pyt   <module>   s   ˙ Ô