U
    9%ew>  ć                   @   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/Darija-Ai-API/env/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