o
    GZ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.10/site-packages/sympy/matrices/expressions/tests/test_derivatives.pyŚ<lambda>0   s    r2   é   c                 C   s   d S ©N)Zxreplacer-   Zas_explicitŚdiffZreshapeŚshapeZtomatrix)Śexprr"   ZdiffexprŚ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s*J tj	t
  t”tddks9J ttj	  t”tttksHJ tt
  t”ttdksVJ ttd t”ttdkseJ 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sJ tt  t”tksŖJ 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#   r3   Śmu)r%   r5   r.   r   r-   r!   r&   r+   r"   ŚTr$   r   Śdummy_eqr   Ś	applyfuncr	   r   r   r   r   r   r   r   r   )r:   r7   r0   r0   r1   Ś test_matrix_derivative_by_scalarB   s&   $’*2*$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-   r5   r0   r0   r0   r1   Śtest_one_matrixX   s   *r?   c                  C   sČ   t t} tt| | tddd}t t”|ksJ tj t”tt| | tddddks0J dt  t”ttd|  | tdddksHJ ttt t”t	||ksWJ tt
  t”|ksbJ d S )Né   r#   r3   )r   r-   r    r   r   r%   r5   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 r4   )r!   r5   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sEJ tttt } |  t”ttt jd  ks^J d S )Né’’’’r3   )
r)   r;   r   r!   r*   r5   r   r   r%   r&   ©r7   r0   r0   r1   Ś#test_matrix_derivative_with_inversem   s   .*&rF   c                  C   s:  t  t ”ttksJ t tdf  t tdf ” ” tttks!J t j t ”ttks-J t jt	 } |  t ”t	ks;J | d  t tdf ” ” t	tdf ksPJ t	jt  } |  t ”t	ks^J t	jt
 t } |  t
”t	tj ksqJ t	jt
j t } |  t
”tt	j 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
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s7J t
t t jt t
t t  } |  t
”tt
t t  tj tjt
t t  tj  kseJ t| d  t
ttf ” ” dksyJ 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))r3   )r"   r5   r   r-   r.   ŚmŚdoitŚKDeltar;   r)   r!   r*   r+   r&   r'   r(   r,   ŚstrŚnr   ©r7   rA   r0   r0   r1   Ś*test_matrix_derivative_vectors_and_scalars   s@   ,
*
*<"6>
’2rN   c                  C   sĪ  t tt } tt}|  t”tt|tttt t| |tdddks(J | t	t
f  tttf ” ” tt	ttt
t t t ttttt	t
f   ksRJ t t} |  t”ttksaJ |  t” tttf ” ” tttksvJ 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s±J |  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sJ t td t } |  t”tt tt  jks-J t tttt} |  t”tt tt  jksFJ 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szJ t ttj t } |  t”tt tjt  ksJ t tt tj } |  t”ttj tt  ks®J 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s,J t tjtj t t t } |  t”tjt t tj tt t tj  ksUJ t tjt t t } |  t”tt t tjt tj  ksvJ t tt t tj t } |  t”tjtj t tj tt t t  ksJ 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s8J 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sJ 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seJ d S )Nr@   r#   r3   rD   éž’’’)r   r%   r   r-   r5   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   <’’*,6
""""""""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@   é*   r3   )	r)   r;   r%   r!   r&   r*   r(   r'   r5   )r7   Śresultr0   r0   r1   Ś+test_derivatives_of_complicated_matrix_exprL  s   Ģžž ž 6 rT   c                  C   sF  dt t } |  t”dtt ksJ t} |  t”}t|ts!J |tttks*J t td } |  t”dt t tt ksAJ t tt } tt}|  t”tt|tt	tt t| |t
dddksiJ 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s”J d S )Nr@   r3   r#   )r   r%   r5   r   r-   Ś
isinstancer   r   r   r    r   )r7   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s#J t jt tj } |  t ”tdtt jt   ks=J t jt  tj } |  t ”t t jt  t	dd  ksXJ 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sÆJ 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   r3   rD   r#   r@   rO   )r"   r;   r$   r5   rH   rI   r   ŚHalfr
   r   r+   r)   r*   r!   r,   rE   r0   r0   r1   Śtest_derivatives_matrix_normsj  s   
*$&8>.(H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s8J t
| t |  t ” td t   t”} |  t” tdt t  td t   t””sbJ | 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””s³J 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 ”s1J t
| t|  t” tjt t” t } |  t” ttt t” tt ”sZJ 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 )Nr3   r#   )r   )r"   r0   r0   r1   r2     s    z8test_derivatives_elementwise_applyfunc.<locals>.<lambda>r   r3   r#   )r"   r=   r   r5   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
’F
"’"00

’
,
’
 
’"rY   c                  C   sj  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sCJ ttjd} |  t” ” dtt ksXJ tttj} |  t”tjttttdd ksrJ 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s³J d S )Nr3   rD   )r   r)   r"   r*   r5   r   r;   r%   r!   r&   r   r   rI   r   rW   r   r
   rE   r0   r0   r1   Ś(test_derivatives_of_hadamard_expressionsÄ  s    
(*2rZ   N)r3   )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>   sh    
8 A