B
    ™‘[  ã               @   sD   d dl mZ d dlmZ d dlmZmZmZmZ G dd„ deƒZ	dS )é    )ÚIterable)Úglobal_evaluate)ÚExprÚSÚMulÚsympifyc               @   s@   e Zd ZdZdZdd„ Zdd„ Zdd„ Zed	d
„ ƒZ	dd„ Z
dS )ÚTensorProductz,
    Generic class for tensor products.
    Fc             O   s  ddl m}m}m} ddlm}m} ddlm} dd„ |D ƒ}| 	dt
d ¡}	|	sftj| f|žŽ }
|
S g }g }tj}xL|D ]D}t|t||fƒrž| ||ƒ¡ qzt||fƒr¶| |¡ qz||9 }qzW |||Ž  }t|ƒdkrÞ|S |dkrò|g| }n|}tj| f|ž|Ž}
||
ƒS )	Nr   )Ú	NDimArrayÚtensorproductÚArray)Ú
MatrixBaseÚ
MatrixExpr)Úflattenc             S   s   g | ]}t |ƒ‘qS © )r   )Ú.0Úargr   r   ú5lib/python3.7/site-packages/sympy/tensor/functions.pyú
<listcomp>   s    z)TensorProduct.__new__.<locals>.<listcomp>Úevaluateé   )Zsympy.tensor.arrayr	   r
   r   Úsympyr   r   Zsympy.strategiesr   Úgetr   r   Ú__new__r   ZOneÚ
isinstancer   ÚappendÚlen)ÚclsÚargsÚkwargsr	   r
   r   r   r   r   r   ÚobjZarraysÚotherZscalarr   ZcoeffZnewargsr   r   r   r      s2    
zTensorProduct.__new__c             C   s
   t | jƒS )N)r   Úshape)Úselfr   r   r   Úrank-   s    zTensorProduct.rankc                s    ddl m‰  ‡ fdd„| jD ƒS )Nr   )r   c                s&   g | ]}t |d ƒr|jnˆ |ƒj‘qS )r!   )Úhasattrr!   )r   Úi)r   r   r   r   2   s    z2TensorProduct._get_args_shapes.<locals>.<listcomp>)r   r   r   )r"   r   )r   r   Ú_get_args_shapes0   s    zTensorProduct._get_args_shapesc             C   s   |   ¡ }t|dƒS )Nr   )r&   Úsum)r"   Z
shape_listr   r   r   r!   4   s    zTensorProduct.shapec                s,   t ˆ ƒ‰ t ‡ fdd„t| j|  ¡ ƒD ƒ¡S )Nc             3   s.   | ]&\}}|  t‡ fd d„|D ƒƒ¡V  qdS )c             3   s   | ]}t ˆ ƒV  qd S )N)Únext)r   r%   )Úindexr   r   ú	<genexpr><   s    z6TensorProduct.__getitem__.<locals>.<genexpr>.<genexpr>N)Ú__getitem__Útuple)r   r   Zshp)r)   r   r   r*   <   s   z,TensorProduct.__getitem__.<locals>.<genexpr>)Úiterr   ZfromiterÚzipr   r&   )r"   r)   r   )r)   r   r+   9   s    
zTensorProduct.__getitem__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	is_numberr   r#   r&   Úpropertyr!   r+   r   r   r   r   r      s   !r   N)
Zsympy.core.compatibilityr   Zsympy.core.evaluater   r   r   r   r   r   r   r   r   r   r   Ú<module>   s   