U
    ZÊ¹jw>  ã                   @   sL  d 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mZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ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,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5 edƒ\Z6Z7Z8edƒ\Z9Z:e#de8e8ƒZ;e#de8dƒZ<e#de8dƒZ=e#de8e8ƒZ>e#d e8e8ƒZ?e#d!e8e8ƒZ@e#d"e8e8ƒZAe#d#e8dƒZBe#d$e8dƒZCe#d%e8dƒZDe#d&e8dƒZEd'd(„ ZFdEd*d+„ZGd,d-„ ZHd.d/„ ZId0d1„ ZJd2d3„ ZKd4d5„ ZLd6d7„ ZMd8d9„ ZNd:d;„ ZOd<d=„ ZPd>d?„ ZQd@dA„ ZRdBdC„ ZSdDS )Fza
Some examples have been taken from:

http://www.math.uwaterloo.ca/~hwolkowi//matrixcookbook.pdf
é    )ÚKroneckerProduct)ÚPermutation)ÚSum)ÚRational)ÚS)Úsymbols)ÚexpÚlog)Úsqrt)ÚcosÚsinÚtan)ÚKroneckerDelta)ÚDeterminant)Ú
DiagMatrix)ÚHadamardPowerÚHadamardProductÚhadamard_product)ÚInverse)ÚMatrixSymbol)Ú	OneMatrix)ÚTrace)ÚMatAdd)ÚMatMul)ÚIdentityÚ
ZeroMatrix)ÚArrayDerivative)Úhadamard_power)ÚArrayAddÚArrayTensorProductÚPermuteDimszi j kzm nÚXÚxé   ÚyÚAÚBÚCÚDÚaÚbÚcÚdc                 C   s   t | |dtd fƒS )Nr   r#   )r   Úk)ÚiÚj© r0   úp/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/expressions/tests/test_derivatives.pyÚ<lambda>0   ó    r2   é   c                 C   s   d S d S ©N)Zxreplacer-   Zas_explicitÚdiffZreshapeÚshapeZtomatrixÚAssertionError)Úexprr"   ZdiffexprÚdimr0   r0   r1   Ú&_check_derivative_with_explicit_matrix3   s          r;   c                  C   s  t  t¡tttƒkst‚t tt  t  t¡ttdƒks<t‚t	 t¡ttdƒksTt‚t	j
t  t¡tddƒksrt‚t	t	j
  t¡tttƒks�t‚t	t  t¡ttdƒks¬t‚tt	dƒ t¡ttdƒksÊt‚tt	tƒ t¡ tt	 t¡tt	tƒƒ¡söt‚tt	tƒ t¡ttdƒk�st‚ttttdƒ t	tƒ t¡tt	tƒk�sBt‚tt	  t¡t	k�sZt‚ttƒt  t t	  t¡ttƒt  t t	 k�sŽt‚t	 t¡ t¡ttdƒk�s®t‚ttd t ƒ t¡dt ttƒ k�sÚt‚tdƒ} d|  t	 }| t	¡d|  ttƒ k�st‚d S )Nr#   r4   Úmu)r%   r6   r.   r   r-   r8   r!   r&   r+   r"   ÚTr$   r   Údummy_eqr   Ú	applyfuncr	   r   r   r   r   r   r   r   r   )r<   r9   r0   r0   r1   Ú test_matrix_derivative_by_scalarB   s&    $ÿ ,4 ,r@   c                   C   s*   t tjttdƒƒ t¡ttdƒks&t‚d S )Nr#   )r   r"   r=   r   r-   r6   r8   r0   r0   r0   r1   Útest_one_matrixX   s    rA   c                  C   sÈ   t tƒ} tt| | ƒtdƒddƒƒ}t t¡|ks4t‚tj t¡tt| | ƒtdƒdddƒƒks`t‚dt  t¡ttd|  | ƒtdƒddƒƒks�t‚t	ttƒ t¡t
||ƒks®t‚tt  t¡|ksÄt‚d S )Né   r#   r4   )r   r-   r    r   r   r%   r6   r8   r=   r   r   r&   )ÚIZAdAr0   r0   r1   Ú(test_matrix_derivative_non_matrix_result\   s    ,0rD   c                   C   s   t  t¡tt tƒkst‚d S r5   )r!   r6   r%   r   r8   r0   r0   r0   r1   Ú$test_matrix_derivative_trivial_casesg   s    rE   c                  C   sÀ   t jttƒ t } |  t¡ttƒj t  tj ttƒj ks@t‚tttƒƒ} tt	ttƒ t
 ƒ} |  t¡td t
 t	 td  j ksŠt‚tttt	 ƒƒ} |  t¡ttt	 ƒjd  ks¼t‚d S )Néÿÿÿÿr4   )r)   r=   r   r!   r*   r6   r8   r   r   r%   r&   ©r9   r0   r0   r1   Ú#test_matrix_derivative_with_inversem   s    .*rH   c                  C   sD  t  t ¡ttƒkst‚t tdf  t tdf ¡ ¡ tttƒksBt‚t j	 t ¡ttƒksZt‚t j	t
 } |  t ¡t
ksvt‚| d  t tdf ¡ ¡ t
tdf ks t‚t
j	t  } |  t ¡t
ks¼t‚t
j	t t } |  t¡t
tj	 ksât‚t
j	tj	 t } |  t¡tt
j	 k�st‚t
j	t t
 } |  t¡t
t
j	 k�s4t‚t
j	tj	 t
 } |  t¡t
t
j	 k�s^t‚tj	tj	 t t } |  t¡tt tj	 tt tj	  k�sžt‚tt  t j	t tt  t  } |  t ¡tj	t tt  t  tj	tj	 tt  t   k�sút‚t j	t t  } |  t ¡tt  tj	t   k�s*t‚tj	tj	 t t t } |  t¡tj	t t tj	 tt t tj	  k�sxt‚tt t j	t tt t  } |  t¡ttt t  tj	 tj	tt t  tj	  k�sÔt‚t| d  tttf ¡ ¡ ƒdk�süt‚t t j	 t  } ttƒ}|  t ¡t|t j	t  ƒdt  t j	  k�s@t‚d S )Nr   ©r   r   zÓb[n, 0]*Sum((c[_i_1, 0] + Sum(X[_i_1, _i_3]*b[_i_3, 0], (_i_3, 0, k - 1)))*D[_i_1, m], (_i_1, 0, k - 1)) + Sum((c[_i_2, 0] + Sum(X[_i_2, _i_4]*b[_i_4, 0], (_i_4, 0, k - 1)))*D[m, _i_2]*b[n, 0], (_i_2, 0, k - 1))r4   )r"   r6   r   r-   r8   r.   ÚmÚdoitÚKDeltar=   r)   r!   r*   r+   r&   r'   r(   r,   ÚstrÚnr   ©r9   rC   r0   r0   r1   Ú*test_matrix_derivative_vectors_and_scalars�   s@    ,
*
,>"6>ÿ
rP   c                  C   sÚ  t tƒt } ttƒ}|  t¡tt|tƒttt tƒ| |ƒtdƒddƒƒƒksPt	‚| t
tf  tttf ¡ ¡ tt
tƒtttƒ t tƒ tttƒtt
tf   ks¤t	‚t tƒ} |  t¡ttƒksÂt	‚|  t¡ tttf ¡ ¡ tttƒksìt	‚t tt ƒ} |  t¡tjk�st	‚|  t¡ tttf ¡ ¡ tttf k�s<t	‚t tt t ƒ} |  t¡tjtj k�sht	‚|  t¡ tttf ¡ ¡  tjtj ttf ¡�s t	‚t ttj t ƒ} |  t¡tt k�sÊt	‚t tjt ƒ} |  t¡tk�sìt	‚t ttj ƒ} |  t¡tk�st	‚t td ƒ} |  t¡dtj k�s4t	‚t td t ƒ} |  t¡tt tt  jk�sft	‚t ttttƒƒ} |  t¡tt tt  jk�s˜t	‚t tjt t ƒ} |  t¡tt tjt  k�sÌt	‚t tt tj ƒ} |  t¡tt tjt  k�s t	‚t ttj t ƒ} |  t¡tt tjt  k�s4t	‚t tt tj ƒ} |  t¡ttj tt  k�sht	‚t ttj t ƒ} |  t¡ttj tt  k�sœt	‚t tjt t ƒ} |  t¡ttj tt  k�sÐt	‚t tt t t ƒ} |  t¡tjtj tj tjtj tj  k�st	‚t tjt ƒ} |  t¡dt k�s>t	‚t ttj ƒ} |  t¡dt k�sdt	‚t tjtj t t t ƒ} |  t¡tjt t tj tt t tj  k�s¶t	‚t tjt t t ƒ} |  t¡tt t tjt tj  k�søt	‚t tt t tj t ƒ} |  t¡tjtj t tj tt t t  k�sHt	‚t tt t t tt t t j ƒ} |  t¡dtj tt t t  tj k�sžt	‚t tt ƒ} t ttt  ƒ} t tjtj t t tj t t t ƒ} |  t¡tt tj t t t tj tjt t tj tj tj t  tt t tj tj t t  tjt tj tj t t tj  k�s|t	‚t ttd  t ƒ} |  t¡ttƒj tj tj ttƒj k�sÂt	‚t ttjt t ƒt ƒ} |  t¡t ¡ j tj t ¡  t ¡ j t ¡ j t ¡ jt t ¡  t ¡  t ¡ j  k�sBt	‚t tjt t  ¡ tjt t  ƒ} |  t¡dt t tjt t  ¡  tj t t tjt t  ¡  dt t tjt t  ¡   k�sÒt	‚t ttjt t   ¡ tjt t  ƒ} |  t¡tt tttjt t  ƒ tt tttjt t  ƒ tj t t tttjt t  ƒ  tjt ttjtt jt  ƒ tj tj t ttjtt jt  ƒ  tjt ttjtt jt  ƒ  k�sÖt	‚d S )NrB   r#   r4   rF   éþÿÿÿ)r   r%   r   r-   r6   r   r   r    r   r8   r.   r/   rJ   rN   rK   rL   r!   Zrewriter   r=   r&   r>   r   r'   r   ÚinvrO   r0   r0   r1   Ú!test_matrix_derivatives_of_traces¹   s†    <ÿÿ*.8
""""""""46,6&0*˜2f$l(rS   c               	   C   s  t jtt tjt tt   tjtj t tj tt tj ttjt tt   t t  tjtj t   t tttj tt t tj  dt t     t  dt t tj tj ttj    t } ttt t tj dt t  ttj   t tj ttt tjt   t t tt tj  tjtj t   t  t t t j tj td t t j tj tj t  tj t t  dt t tj tj t  tj  tt td  t t j tj tj t  tj t  tt t j t t  t tj dt dtj   t t tj  tt j t t t  tj tjd  t tj  tt j t t t  tj tjd  tj tjt tjtj    dt t j t t tj tj  tjdt dtj   t t j t t  tjtjd  t t t  tj tj t  tjt  tj tjtj tjt    tjtj t t j t t t  tj tjd  tj  tjt t t  tj tj t  dtj t t t  tj tj tj  tjt td  t t j tj tj t  tj  tjtj t  tj tj  }|  t¡|k�st	‚d S )NrB   é*   r4   )
r)   r=   r%   r!   r&   r*   r(   r'   r6   r8   )r9   Úresultr0   r0   r1   Ú+test_derivatives_of_complicated_matrix_exprL  s    Ìÿ ÿ ÿ 3rV   c                  C   sJ  dt tƒ } |  t¡dttƒ ks&t‚t} |  t¡}t|tƒsBt‚|tttƒksTt‚t tƒd } |  t¡dt tƒ ttƒ ks‚t‚t tƒt } ttƒ}|  t¡tt	|tƒt
t	t tƒ| |ƒtdƒddƒƒƒksÒt‚t t tƒt ƒ} |  t¡dt tƒ ttƒ k�st‚t t t tƒt ƒt ƒ} |  t¡dt tƒd  ttƒ k�sFt‚d S )NrB   r4   r#   )r   r%   r6   r   r-   r8   Ú
isinstancer   r   r   r    r   )r9   ZderivrC   r0   r0   r1   Ú"test_mixed_deriv_mixed_expressionsR  s    
"<$rX   c                  C   s  t jt } |  t ¡tkst‚| d  t tdf ¡ ¡ ttdf ksFt‚t jt tj } |  t ¡tdt	t jt ƒ  kszt‚t jt  tj } |  t ¡t t jt  t
ddƒ  ks°t‚tjt t j t tj } |  t ¡ttj t t	tjt t j t ƒ d k�st‚tjt t j t t
ddƒ } |  t ¡ttj t tjt t j t t
ddƒ  d k�sbt‚tjt t tj } |  t¡tdt	tjt t ƒ  tj k�s¦t‚tjt  tjt t tj  tj t } |  t¡tdt	tjt t ƒ  t j t tj t tj k�st‚d S )NrI   r   r4   rF   r#   rB   rQ   )r"   r=   r$   r6   r8   rJ   rK   r   ÚHalfr
   r   r+   r)   r*   r!   r,   rG   r0   r0   r1   Útest_derivatives_matrix_normsj  s    
*$&:@0(rZ   c                  C   sè  t  t¡} |  t ¡ tt  dd„ ¡ƒ¡s,t‚| tdf  t tdf ¡ 	¡ tt tdf ƒd d t
ttƒ kspt‚t| t |  t ¡ƒ td t   t¡} |  t¡ tdt t  td t   t¡ƒ¡sÄt‚| tdf  t¡ 	¡ dt t tdf  ttd t tdf  ƒ k�st‚t| t|  t¡ƒ ttƒt t  t¡} |  t¡ ttt t ttƒt t  t¡ƒ¡�sjt‚t| t|  t¡ƒ tt  t¡ } t| t |  t ¡ƒ t jt t  tt t¡j t   } |  t ¡ tjt  tt   tt t¡  ¡�sðt‚t| t |  t ¡ƒ t  t¡jt } t| t |  t ¡ƒ tjt t  t¡} |  t¡ ttjt t  t¡ tj ¡�sht‚t| t|  t¡ƒ tjt t¡ t } |  t¡ ttƒt t¡ ttƒ ¡�sºt‚t| t|  t¡ƒ tjtt t  t¡ t } |  t¡ tjttƒ tt t  t¡ ttƒ tj ¡�s(t‚t| t|  t¡ƒ tjtt t  t¡ tj } tjt t t¡ t t } |  t¡ ttjt tj tj t t¡ƒ¡�s¨t‚tjtt t¡ t  t¡ t } tjt t¡ t¡ t } d S )Nc                 S   s   t | ƒd d S )Nr4   r#   )r   )r"   r0   r0   r1   r2   ‡  r3   z8test_derivatives_elementwise_applyfunc.<locals>.<lambda>r   r4   r#   )r"   r?   r   r6   r>   r   r8   r.   rJ   rK   rL   r;   r   r   r   r	   r%   r&   r   r=   r-   r$   r)   r!   r*   rG   r0   r0   r1   Ú&test_derivatives_elementwise_applyfuncƒ  sX    

ÿD
ÿH
"ÿ
"20
ÿ

,ÿ

 ÿ
"r[   c                  C   sn  t tttƒ} |  t¡tt ttƒƒks(t‚tjt tt	t
ƒ t } |  t	¡tttj tt
ƒks^t‚ttdƒ} |  t¡ ¡ dttƒ ks†t‚ttjdƒ} |  t¡ ¡ dttƒ ks°t‚tttjƒ} |  t¡tjttttddƒƒƒ ksät‚ttjt	 t dƒ} |  t	¡dt tj t	 t tj k�s$t‚ttjt	 t tjƒ} |  t	¡tdttjt	 t ƒ  tj k�sjt‚d S )Nr4   rF   )r   r)   r"   r*   r6   r   r8   r=   r%   r!   r&   r   r   rK   r   rY   r   r
   rG   r0   r0   r1   Ú(test_derivatives_of_hadamard_expressionsÄ  s     
(,r\   N)r4   )TÚ__doc__Zsympyr   Zsympy.combinatoricsr   Zsympy.concrete.summationsr   Zsympy.core.numbersr   Zsympy.core.singletonr   Zsympy.core.symbolr   Z&sympy.functions.elementary.exponentialr   r	   Z(sympy.functions.elementary.miscellaneousr
   Z(sympy.functions.elementary.trigonometricr   r   r   Z(sympy.functions.special.tensor_functionsr   Z&sympy.matrices.expressions.determinantr   Z#sympy.matrices.expressions.diagonalr   Z#sympy.matrices.expressions.hadamardr   r   r   Z"sympy.matrices.expressions.inverser   Z"sympy.matrices.expressions.matexprr   Z"sympy.matrices.expressions.specialr   Z sympy.matrices.expressions.tracer   Z!sympy.matrices.expressions.mataddr   Z!sympy.matrices.expressions.matmulr   r   r   Z$sympy.tensor.array.array_derivativesr   Zsympy.matrices.expressionsr   Z0sympy.tensor.array.expressions.array_expressionsr   r   r    r.   r/   r-   rJ   rN   r!   r"   r$   r%   r&   r'   r(   r)   r*   r+   r,   rL   r;   r@   rA   rD   rE   rH   rP   rS   rV   rX   rZ   r[   r\   r0   r0   r0   r1   Ú<module>   sf   
8 A