a
    kº”hw>  ã                   @   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   ú_/var/www/auris/lib/python3.9/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)Úexprr"   ZdiffexprZdimr0   r0   r1   Ú&_check_derivative_with_explicit_matrix3   s          r9   c                  C   s  t  t¡tttƒksJ ‚t tt  t  t¡ttdƒks<J ‚t t¡ttdƒksTJ ‚tj	t
  t¡tddƒksrJ ‚ttj	  t¡tttƒksJ ‚tt
  t¡ttdƒks¬J ‚ttdƒ t¡ttdƒksÊJ ‚tttƒ t¡ tt t¡tttƒƒ¡söJ ‚ttt
ƒ t¡ttdƒksJ ‚ttttdƒ tt
ƒ t¡ttt
ƒksBJ ‚tt  t¡tksZJ ‚ttƒt  t t  t¡ttƒt  t t ksŽJ ‚t t¡ t¡ttdƒks®J ‚ttd t ƒ t¡dt ttƒ ksÚJ ‚tdƒ} d|  t }| t¡d|  ttƒ ksJ ‚d S )Nr#   r4   Úmu)r%   r6   r.   r   r-   r!   r&   r+   r"   ÚTr$   r   Údummy_eqr   Ú	applyfuncr	   r   r   r   r   r   r   r   r   )r:   r8   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&J ‚d S )Nr#   )r   r"   r;   r   r-   r6   r0   r0   r0   r1   Útest_one_matrixX   s    r?   c                  C   sÈ   t tƒ} tt| | ƒtdƒddƒƒ}t t¡|ks4J ‚tj t¡tt| | ƒtdƒdddƒƒks`J ‚dt  t¡ttd|  | ƒtdƒddƒƒksJ ‚tttƒ t¡t	||ƒks®J ‚tt
  t¡|ksÄJ ‚d S )Né   r#   r4   )r   r-   r    r   r   r%   r6   r;   r   r   r&   )ÚIZAdAr0   r0   r1   Ú(test_matrix_derivative_non_matrix_result\   s    ,0rB   c                   C   s   t  t¡tt tƒksJ ‚d S r5   )r!   r6   r%   r   r0   r0   r0   r1   Ú$test_matrix_derivative_trivial_casesg   s    rC   c                  C   sÀ   t jttƒ t } |  t¡ttƒj t  tj ttƒj ks@J ‚tttƒƒ} ttttƒ t	 ƒ} |  t¡td t	 t td  j ksŠJ ‚tttt ƒƒ} |  t¡ttt ƒjd  ks¼J ‚d S )Néÿÿÿÿr4   )
r)   r;   r   r!   r*   r6   r   r   r%   r&   ©r8   r0   r0   r1   Ú#test_matrix_derivative_with_inversem   s    .*rF   c                  C   sD  t  t ¡ttƒksJ ‚t tdf  t tdf ¡ ¡ tttƒksBJ ‚t j t ¡ttƒksZJ ‚t jt	 } |  t ¡t	ksvJ ‚| d  t tdf ¡ ¡ t	tdf ks J ‚t	jt  } |  t ¡t	ks¼J ‚t	jt
 t } |  t
¡t	tj ksâJ ‚t	jt
j t } |  t
¡tt	j ksJ ‚t	jt
 t	 } |  t
¡t	t	j ks4J ‚t	jt
j t	 } |  t
¡t	t	j ks^J ‚tjt
j t
 t } |  t
¡t
t tj t
t tj  ksžJ ‚tt  t jt tt  t  } |  t ¡tjt tt  t  tjtj tt  t   ksúJ ‚t jt t  } |  t ¡tt  tjt   ks*J ‚tjt
j t t
 t } |  t
¡tjt
 t tj tt
 t tj  ksxJ ‚t
t t jt t
t t  } |  t
¡tt
t t  tj tjt
t t  tj  ksÔJ ‚t| d  t
ttf ¡ ¡ ƒdksüJ ‚t t j t  } ttƒ}|  t ¡t|t jt  ƒdt  t j  ks@J ‚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-   r.   ÚmÚdoitÚKDeltar;   r)   r!   r*   r+   r&   r'   r(   r,   ÚstrÚnr   ©r8   rA   r0   r0   r1   Ú*test_matrix_derivative_vectors_and_scalars   s@    ,
*
,>"6>ÿ
rN   c                  C   sÚ  t tƒt } ttƒ}|  t¡tt|tƒttt tƒ| |ƒtdƒddƒƒƒksPJ ‚| t	t
f  tttf ¡ ¡ tt	tƒtt
tƒ t tƒ tttƒtt	t
f   ks¤J ‚t tƒ} |  t¡ttƒksÂJ ‚|  t¡ tttf ¡ ¡ tttƒksìJ ‚t tt ƒ} |  t¡tjksJ ‚|  t¡ tttf ¡ ¡ tttf ks<J ‚t tt t ƒ} |  t¡tjtj kshJ ‚|  t¡ tttf ¡ ¡  tjtj ttf ¡s J ‚t ttj t ƒ} |  t¡tt ksÊJ ‚t tjt ƒ} |  t¡tksìJ ‚t ttj ƒ} |  t¡tksJ ‚t td ƒ} |  t¡dtj ks4J ‚t td t ƒ} |  t¡tt tt  jksfJ ‚t ttttƒƒ} |  t¡tt tt  jks˜J ‚t tjt t ƒ} |  t¡tt tjt  ksÌJ ‚t tt tj ƒ} |  t¡tt tjt  ks J ‚t ttj t ƒ} |  t¡tt tjt  ks4J ‚t tt tj ƒ} |  t¡ttj tt  kshJ ‚t ttj t ƒ} |  t¡ttj tt  ksœJ ‚t tjt t ƒ} |  t¡ttj tt  ksÐJ ‚t tt t t ƒ} |  t¡tjtj tj tjtj tj  ksJ ‚t tjt ƒ} |  t¡dt ks>J ‚t ttj ƒ} |  t¡dt ksdJ ‚t tjtj t t t ƒ} |  t¡tjt t tj tt t tj  ks¶J ‚t tjt t t ƒ} |  t¡tt t tjt tj  ksøJ ‚t tt t tj t ƒ} |  t¡tjtj t tj tt t t  ksHJ ‚t tt t t tt t t j ƒ} |  t¡dtj tt t t  tj ksžJ ‚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|J ‚t ttd  t ƒ} |  t¡ttƒj tj tj ttƒj ksÂJ ‚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sBJ ‚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ÒJ ‚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ÖJ ‚d S )Nr@   r#   r4   rD   éþÿÿÿ)r   r%   r   r-   r6   r   r   r    r   r.   r/   rH   rL   rI   rJ   r!   Zrewriter   r;   r&   r<   r   r'   r   ÚinvrM   r0   r0   r1   Ú!test_matrix_derivatives_of_traces¹   s†    <ÿÿ*.8
""""""""46,6&0*˜2f$l(rQ   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J ‚d S )Nr@   é*   r4   )	r)   r;   r%   r!   r&   r*   r(   r'   r6   )r8   Úresultr0   r0   r1   Ú+test_derivatives_of_complicated_matrix_exprL  s    Ìÿ ÿ ÿ 3rT   c                  C   sJ  dt tƒ } |  t¡dttƒ ks&J ‚t} |  t¡}t|tƒsBJ ‚|tttƒksTJ ‚t tƒd } |  t¡dt tƒ ttƒ ks‚J ‚t tƒt } ttƒ}|  t¡tt|tƒt	tt tƒ| |ƒt
dƒddƒƒƒksÒJ ‚t t tƒt ƒ} |  t¡dt tƒ ttƒ ksJ ‚t t t tƒt ƒt ƒ} |  t¡dt tƒd  ttƒ ksFJ ‚d S )Nr@   r4   r#   )r   r%   r6   r   r-   Ú
isinstancer   r   r   r    r   )r8   ZderivrA   r0   r0   r1   Ú"test_mixed_deriv_mixed_expressionsR  s    
"<$rV   c                  C   s  t jt } |  t ¡tksJ ‚| d  t tdf ¡ ¡ ttdf ksFJ ‚t jt tj } |  t ¡tdtt jt ƒ  kszJ ‚t jt  tj } |  t ¡t t jt  t	ddƒ  ks°J ‚t
jt t j t tj } |  t ¡ttj t
 tt
jt t j t ƒ d ksJ ‚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sbJ ‚tjt t tj } |  t¡tdttjt t ƒ  tj ks¦J ‚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J ‚d S )NrG   r   r4   rD   r#   r@   rO   )r"   r;   r$   r6   rH   rI   r   ÚHalfr
   r   r+   r)   r*   r!   r,   rE   r0   r0   r1   Útest_derivatives_matrix_normsj  s    
*$&:@0(rX   c                  C   sè  t  t¡} |  t ¡ tt  dd„ ¡ƒ¡s,J ‚| tdf  t tdf ¡ ¡ tt tdf ƒd d t	ttƒ kspJ ‚t
| t |  t ¡ƒ td t   t¡} |  t¡ tdt t  td t   t¡ƒ¡sÄJ ‚| tdf  t¡ ¡ dt t tdf  ttd t tdf  ƒ ksJ ‚t
| t|  t¡ƒ ttƒt t  t¡} |  t¡ ttt t ttƒt t  t¡ƒ¡sjJ ‚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ðJ ‚t
| t |  t ¡ƒ t  t¡jt } t
| t |  t ¡ƒ tjt t  t¡} |  t¡ ttjt t  t¡ tj ¡shJ ‚t
| t|  t¡ƒ tjt t¡ t } |  t¡ ttƒt t¡ ttƒ ¡sºJ ‚t
| t|  t¡ƒ tjtt t  t¡ t } |  t¡ tjttƒ tt t  t¡ ttƒ tj ¡s(J ‚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¨J ‚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   r.   rH   rI   rJ   r9   r   r   r   r	   r%   r&   r   r;   r-   r$   r)   r!   r*   rE   r0   r0   r1   Ú&test_derivatives_elementwise_applyfuncƒ  sX    

ÿD
ÿH
"ÿ
"20
ÿ

,ÿ

 ÿ
"rY   c                  C   sn  t tttƒ} |  t¡tt ttƒƒks(J ‚tjt ttt	ƒ t } |  t¡t
ttj tt	ƒks^J ‚ttdƒ} |  t¡ ¡ dttƒ ks†J ‚ttjdƒ} |  t¡ ¡ dttƒ ks°J ‚tttjƒ} |  t¡tjttttddƒƒƒ ksäJ ‚ttjt t dƒ} |  t¡dt tj t t tj ks$J ‚ttjt t tjƒ} |  t¡tdttjt t ƒ  tj ksjJ ‚d S )Nr4   rD   )r   r)   r"   r*   r6   r   r;   r%   r!   r&   r   r   rI   r   rW   r   r
   rE   r0   r0   r1   Ú(test_derivatives_of_hadamard_expressionsÄ  s     
(,rZ   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-   rH   rL   r!   r"   r$   r%   r&   r'   r(   r)   r*   r+   r,   rJ   r9   r>   r?   rB   rC   rF   rN   rQ   rT   rV   rX   rY   rZ   r0   r0   r0   r1   Ú<module>   sf   
8 A