B
    ™‘[  ã               @   s8   d dl mZ d dlmZmZmZmZ G dd„ deƒZdS )é    )ÚIndexed)ÚIntegralÚDummyÚsympifyÚTuplec                   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   sV   t  |¡\}}t|ƒ}| |¡}tj| |f|ž|Ž}||_tdd„ | ¡ D ƒƒ|_	|S )Nc             s   s   | ]\}}||fV  qd S )N© )Ú.0ÚkeyÚvalr   r   ú>lib/python3.7/site-packages/sympy/sandbox/indexed_integrals.pyú	<genexpr>,   s    z*IndexedIntegral.__new__.<locals>.<genexpr>)
r   Ú_indexed_process_limitsr   Úxreplacer   Ú__new__Z_indexed_replÚdictÚitemsÚ_indexed_reverse_repl)ÚclsZfunctionÚlimitsZassumptionsÚreplÚobjr   r   r   r   &   s    
zIndexedIntegral.__new__c                s   t t| ƒ ¡ }| | j¡S )N)Úsuperr   Údoitr   r   )ÚselfZres)Ú	__class__r   r   r   /   s    zIndexedIntegral.doitc             C   sŽ   i }g }x|| D ]t}t |tttfƒr8|d }|dd … }n|}d}t |tƒrx||krftt|ƒƒ}|||< | |f| ¡ q| |¡ qW ||fS )Nr   é   r   )Ú
isinstanceÚtupleÚlistr   r   r   ÚstrÚappend)r   r   Z	newlimitsÚiÚvZvrestÚrr   r   r   r   3   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sympyr   r   r   r   r   r   r   r   r   Ú<module>   s   