o
    8Va                     @   s\   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	 d dl
mZ G dd	 d	eZd
S )    )NonSquareMatrixError   )
MatrixExpr)Identity)S)_sympify)
MatrixBasec                       sr   e Zd Zd fdd	Zedd Zedd Zedd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Z  ZS )MatPowFc                    sT   t |}|jstd|jstd| t |}t | ||}|r(|jdd}|S )NzMatPow base should be a matrixzPower of non-square matrix %sF)deep)r   Z	is_Matrix	TypeErrorZ	is_squarer   super__new__doit)clsbaseexpZevaluateoptionsobj	__class__ C/usr/lib/python3/dist-packages/sympy/matrices/expressions/matpow.pyr      s   zMatPow.__new__c                 C   
   | j d S )Nr   argsselfr   r   r   r         
zMatPow.basec                 C   r   )Nr   r   r   r   r   r   r      r   z
MatPow.expc                 C   s   | j jS N)r   shaper   r   r   r   r   "   s   zMatPow.shapec                    sp   ddl m} |   t tr2 jjr& jjr&| fddt jD   nddl	m
} || ||S  ||f S )Nr   MatMulc                       g | ]} j qS r   r   ).0kAr   r   
<listcomp>,       z!MatPow._entry.<locals>.<listcomp>)MatrixElement)sympy.matrices.expressionsr!   r   
isinstancer	   r   Z
is_IntegerZis_positiverangeZ"sympy.matrices.expressions.matexprr*   )r   ijkwargsr!   r*   r   r&   r   _entry&   s   
	zMatPow._entryc                    s     ddr fdd| jD \}}n| j\}}t|tr.||jd 9 }|jd }t|tst|tr7|| S |tjkr>|S |tjkrHt|j	S |tj
kr]ddlm} ||jd	i  S t|dd }|d urk||S t||S )
Nr
   Tc                    s   g | ]
}|j d i  qS )r   )r   )r$   argr0   r   r   r(   ;   s    zMatPow.doit.<locals>.<listcomp>r   r   InverseZ_eval_powerr   )getr   r,   r	   r   r   ZOneZZeror   ZrowsZNegativeOner+   r5   r   getattr)r   r0   r   r   r5   Z
eval_powerr   r3   r   r   9   s(   









zMatPow.doitc                 C   s   | j \}}t|j|S r   )r   r	   T)r   r   r   r   r   r   _eval_transposeW   s   
zMatPow._eval_transposec                 C   s   ddl m} || |S )Nr   )Pow)Zsympyr:   _eval_derivative)r   xr:   r   r   r   r;   [   s   zMatPow._eval_derivativec                    s  ddl m} ddlm} ddlm} ddlm} ddlm	  j
}jjd	kru||suj|}|D ]>}||||td|jd |j|d   |jd tdgd
dg|jd}	|	jd j|_d|_|	jd j|_d|_|	g|_q4|S |dkdkr|fddt|D }
n:|dkdkr j|S |dk dkr| fddt| D }
n|dkdkr |S td|f |
|S )Nr   )ExprBuilder)ArrayContraction   )ArrayTensorProductr   r    r4   )r   r   )r   r?      )         )Z	validatorrA   Tc                    r"   r   r#   r$   r.   r   r   r   r(      r)   z8MatPow._eval_derivative_matrix_lines.<locals>.<listcomp>c                    s   g | ]} j qS r   r#   rE   r5   r   r   r   r(      s    z cannot evaluate %s derived by %s)Zsympy.core.exprr=   Z0sympy.tensor.array.expressions.array_expressionsr>   Z*tensor.array.expressions.array_expressionsr@   matmulr!   Zinverser5   r   r   r   Zhas_eval_derivative_matrix_linesr   Z_linesZ	_validater   Z_first_pointer_parentZ_first_pointer_indexZ_second_pointer_parentZ_second_pointer_indexZfromiterr-   r   NotImplementedError)r   r<   r=   r>   r@   r!   r   Zlrr.   ZsubexprZnewexprr   rG   r   rI   _   sP   

"
z$MatPow._eval_derivative_matrix_linesc                 C   s   t | j| j S r   )r	   r   r   r   r   r   r   _eval_inverse   s   zMatPow._eval_inverse)F)__name__
__module____qualname__r   propertyr   r   r   r1   r   r9   r;   rI   rK   __classcell__r   r   r   r   r	   	   s    


-r	   N)Zsympy.matrices.commonr   Zmatexprr   Zspecialr   Z
sympy.corer   Zsympy.core.sympifyr   Zsympy.matricesr   r	   r   r   r   r   <module>   s    