a
    rĄ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   śm/var/www/html/assistant/venv/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diffexprŚdimr0   r0   r1   Ś&_check_derivative_with_explicit_matrix3   s          r:   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sJ 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sJ 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rC   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    rD   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    .*rG   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   rB   r0   r0   r1   Ś*test_matrix_derivative_vectors_and_scalars   s@    ,
*
,>"6>’
rO   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 )NrA   r#   r4   rE   éž’’’)r   r%   r   r-   r6   r   r   r    r   r.   r/   rI   rM   rJ   rK   r!   Zrewriter   r<   r&   r=   r   r'   r   ŚinvrN   r0   r0   r1   Ś!test_matrix_derivatives_of_traces¹   s    <’’*.8
""""""""46,6&0*2f$l(rR   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 )NrA   é*   r4   )	r)   r<   r%   r!   r&   r*   r(   r'   r6   )r8   Śresultr0   r0   r1   Ś+test_derivatives_of_complicated_matrix_exprL  s    Ģ’ ’ ’ 3rU   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 )NrA   r4   r#   )r   r%   r6   r   r-   Ś
isinstancer   r   r   r    r   )r8   ZderivrB   r0   r0   r1   Ś"test_mixed_deriv_mixed_expressionsR  s    
"<$rW   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 )NrH   r   r4   rE   r#   rA   rP   )r"   r<   r$   r6   rI   rJ   r   ŚHalfr
   r   r+   r)   r*   r!   r,   rF   r0   r0   r1   Śtest_derivatives_matrix_normsj  s    
*$&:@0(rY   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.   rI   rJ   rK   r:   r   r   r   r	   r%   r&   r   r<   r-   r$   r)   r!   r*   rF   r0   r0   r1   Ś&test_derivatives_elementwise_applyfunc  sX    

’D
’H
"’
"20
’

,’

 ’
"rZ   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   rE   )r   r)   r"   r*   r6   r   r<   r%   r!   r&   r   r   rJ   r   rX   r   r
   rF   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-   rI   rM   r!   r"   r$   r%   r&   r'   r(   r)   r*   r+   r,   rK   r:   r?   r@   rC   rD   rG   rO   rR   rU   rW   rY   rZ   r[   r0   r0   r0   r1   Ś<module>   sf   
8 A