U
    ZÊ¹j  ã                   @   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 ddlmZ dd	lmZ dd
lmZ G dd„ deƒZdS )é   )Ú
MatrixExpr)ÚIdentityé    )ÚS)ÚExprBuilder)Úcacheit)ÚPow)Ú_sympify)Ú
MatrixBase)ÚNonSquareMatrixErrorc                       sŽ   e Zd Zd‡ fdd„	Ze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dd„ Zdd„ Z‡  ZS )ÚMatPowFc                    sX   t |ƒ}|jstdƒ‚|jdkr,td| ƒ‚t |ƒ}tƒ  | ||¡}|rT|jdd�}|S )NzMatPow base should be a matrixFzPower of non-square matrix %s)Údeep)r	   Z	is_MatrixÚ	TypeErrorZ	is_squarer   ÚsuperÚ__new__Údoit)ÚclsÚbaseÚexpÚevaluateÚoptionsÚobj©Ú	__class__© ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/expressions/matpow.pyr      s    
zMatPow.__new__c                 C   s
   | j d S )Nr   ©Úargs©Úselfr   r   r   r      s    zMatPow.basec                 C   s
   | j d S )Nr   r   r   r   r   r   r   !   s    z
MatPow.expc                 C   s   | j jS ©N)r   Úshaper   r   r   r   r!   %   s    zMatPow.shapec                 C   s   | j  ¡ | j S r    )r   Zas_explicitr   r   r   r   r   Ú_get_explicit_matrix)   s    zMatPow._get_explicit_matrixc                    sˆ   ddl m} |  ¡ ‰ tˆ tƒr|ˆ jjrLˆ jjrL|‡ fdd„tˆ jƒD ƒŽ ‰ n0|  	¡ sdˆ  
¡ ||f S ddlm} || ||ƒS ˆ ||f S )Nr   ©ÚMatMulc                    s   g | ]
}ˆ j ‘qS r   ©r   )Ú.0Úk©ÚAr   r   Ú
<listcomp>3   s     z!MatPow._entry.<locals>.<listcomp>)ÚMatrixElement)Úsympy.matrices.expressionsr$   r   Ú
isinstancer   r   Z
is_IntegerZis_positiveÚrangeZ_is_shape_symbolicr"   Z"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ƒrT||jd 9 }|jd }q0t|tƒrf|| S |tjkrt|S |tjkrˆt|j	ƒS |tj
kr®ddlm} ||ƒjf ˆ ŽS t|dd ƒ}|d k	rÊ||ƒS t||ƒS )	Nr   Tc                 3   s   | ]}|j f ˆ ŽV  qd S r    )r   )r&   Úarg©Úhintsr   r   Ú	<genexpr>>   s     zMatPow.doit.<locals>.<genexpr>r   r   ©ÚInverseZ_eval_power)Úgetr   r-   r   r
   r   ZOneZZeror   ÚrowsZNegativeOner,   r8   r   Úgetattr)r   r5   r   r   r8   Z
eval_powerr   r4   r   r   <   s&    






zMatPow.doitc                 C   s   | j \}}t| ¡ |ƒS r    )r   r   Z	transpose©r   r   r   r   r   r   Ú_eval_transposeZ   s    
zMatPow._eval_transposec                 C   s   | j \}}t| ¡ |ƒS r    )r   r   Zadjointr<   r   r   r   Ú_eval_adjoint^   s    
zMatPow._eval_adjointc                 C   s   | j \}}t| ¡ |ƒS r    )r   r   Ú	conjugater<   r   r   r   Ú_eval_conjugateb   s    
zMatPow._eval_conjugatec                 C   s   t  | |¡S r    )r   Ú_eval_derivative)r   Úxr   r   r   rA   f   s    zMatPow._eval_derivativec           
         sŽ  ddl m} ddlm} ddlm} ddlm‰  ˆj}ˆj	j
dkrÞ| |¡sÞˆj	 |¡}|D ]|}t|t|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|_q\|S |dkdk�r
| ‡fdd„t|ƒD ƒ¡}	nz|dkdk�r(ˆ ˆj	ƒ |¡S |dk dk�rX| ‡ ‡fdd„t| ƒD ƒ¡}	n,|dkdk�rtˆ ¡  |¡S tdˆ|f ƒ‚|	 |¡S )Nr   )ÚArrayContractioné   )ÚArrayTensorProductr   r#   r7   )r   r   )r   rD   é   )é   é   é   )Ú	validatorrF   Tc                    s   g | ]
}ˆ j ‘qS r   r%   ©r&   r/   r   r   r   r*   Š   s     z8MatPow._eval_derivative_matrix_lines.<locals>.<listcomp>éÿÿÿÿc                    s   g | ]}ˆ ˆj ƒ‘qS r   r%   rK   ©r8   r   r   r   r*   Ž   s     z cannot evaluate %s derived by %s)Z0sympy.tensor.array.expressions.array_expressionsrC   Z*tensor.array.expressions.array_expressionsrE   Úmatmulr$   Zinverser8   r   r   r!   ÚhasÚ_eval_derivative_matrix_linesr   r   Ú_linesÚ	_validater   Z_first_pointer_parentZ_first_pointer_indexZ_second_pointer_parentZ_second_pointer_indexZfromiterr.   r   ÚNotImplementedError)
r   rB   rC   rE   r$   r   Úlrr/   ZsubexprZnewexprr   rM   r   rP   i   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!   r   r"   r2   r   r=   r>   r@   rA   rP   rU   Ú__classcell__r   r   r   r   r      s"   



,r   N)Zmatexprr   Úspecialr   Z
sympy.corer   Zsympy.core.exprr   Zsympy.core.cacher   Zsympy.core.powerr   Zsympy.core.sympifyr	   Zsympy.matricesr
   Zsympy.matrices.exceptionsr   r   r   r   r   r   Ú<module>   s   