U
    L?h]                     @   sP   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	 G dd de	Z
dS )	    )Indexed)Tuple)Dummy)sympify)Integralc                       s4   e Zd ZdZdd Z fddZedd Z  ZS )IndexedIntegrala/  
    Experimental class to test integration by indexed variables.

    Usage is analogue to ``Integral``, it simply adds awareness of
    integration over indices.

    Contraction of non-identical index symbols referring to the same
    ``IndexedBase`` is not yet supported.

    Examples
    ========

    >>> from sympy.sandbox.indexed_integrals import IndexedIntegral
    >>> from sympy import IndexedBase, symbols
    >>> A = IndexedBase('A')
    >>> i, j = symbols('i j', integer=True)
    >>> ii = IndexedIntegral(A[i], A[i])
    >>> ii
    Integral(_A[i], _A[i])
    >>> ii.doit()
    A[i]**2/2

    If the indices are different, indexed objects are considered to be
    different variables:

    >>> i2 = IndexedIntegral(A[j], A[i])
    >>> i2
    Integral(A[j], _A[i])
    >>> i2.doit()
    A[i]*A[j]
    c                 O   sR   t |\}}t|}||}tj| |f||}||_dd | D |_|S )Nc                 S   s   i | ]\}}||qS  r   ).0keyvalr   r   Q/var/www/html/venv/lib/python3.8/site-packages/sympy/sandbox/indexed_integrals.py
<dictcomp>/   s      z+IndexedIntegral.__new__.<locals>.<dictcomp>)	r   _indexed_process_limitsr   xreplacer   __new__Z_indexed_replitems_indexed_reverse_repl)clsfunctionlimitsZassumptionsreplobjr   r   r   r   )   s    
zIndexedIntegral.__new__c                    s   t   }|| jS )N)superdoitr   r   )selfres	__class__r   r   r   2   s    
zIndexedIntegral.doitc                 C   s   i }g }| D ]t}t |tttfr6|d }|dd  }n|}d}t |trv||krdtt|}|||< ||f|  q|| q||fS )Nr      r   )
isinstancetuplelistr   r   r   strappend)r   r   Z	newlimitsivZvrestrr   r   r   r   6   s    
z'IndexedIntegral._indexed_process_limits)	__name__
__module____qualname____doc__r   r   staticmethodr   __classcell__r   r   r   r   r      s
    	r   N)Zsympy.tensorr   Zsympy.core.containersr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.integrals.integralsr   r   r   r   r   r   <module>   s
   