a
    lhk                     @   s  d Z ddlZddl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mZ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$ edZ%edZ&edZ'edZ(ed\Z)Z*Z+ede&e'Z,ede,e(Z-edZ.edZ/edZ0edZ1ej23de.ge&gfe/ge&gfe0ge&gfe1ge&gfe&ge&gfe'ge&gfe&e' ge&gfe&e' ge&gfe&d ge&gfe&e' ge&gfee&ge&gfee&ge&gfe e&ge&gfe.e/e&e'e&e' e&e' ge&e'gfe&e' ee&e'  ee' e&e' ee'  ge&e'gfe%e e'e(  e&e e'e(   e%e& e e'e(  e&e e'e(   ge%e&e'e(gfe)d e* e*d e+ e+d e) ge)e*e+gfe-e
e-e& e, de&  ge&gfgdd Z4dd Z5d d! Z6d"d# Z7d$d% Z8d&d' Z9d(d) Z:d*d+ Z;d,d- Z<dS ).z5Tests for the ``sympy.simplify._cse_diff.py`` module.    N)Symbolsymbols)Integer)Function)
Derivative)exp)ImmutableDenseMatrix)dynamicsymbols)_forward_jacobian_remove_cse_from_derivative_forward_jacobian_cse!_forward_jacobian_norm_in_cse_out)simplify)Matrixeye)raises)cossintan)trigsimp)csewxyzzq1 q2 q3kf      z	expr, wrtc                 C   sL   t | gj} t |gj}t| |}t j|j }t|| | |ksHJ d S N)r   Tr
   zerosshaper   jacobian)exprwrtr$   r"    r'   P/var/www/auris/lib/python3.9/site-packages/sympy/simplify/tests/test_cse_diff.pytest_forward_jacobian+   s
    
r)   c                  C   s  t d\} }}td}td}t||| ||t||| |||  || | d|   g}t|\}}t||\}}	t d}
t d}|
|| |f|||
|fgtd|  |
 | t||| |||  ggf}||d ksJ d|d  d	| |	|d
 ksJ d|d
  d	|	 d S )Nx y zr   r   r   x0x1r   z	Expected z
, but got r   )r   r   r   r   r   r   )r   r   r   r   r   r%   replZreducedZp_replZ	p_reducedr+   r,   Zexpected_outputr'   r'   r(   test_process_cseL   s    >,$r.   c                  C   s   t d\} }}t| | ||  | | |  | d |d  |d  | | | |  ||  g}t| ||g}t|\}}t|||\}}}	t|d t|d sJ dt||\}
}}t|d t|d sJ dt||}t|t|sJ dd S )Nr*   r   r   z9Jacobian should be a Matrix of the same type as the input)r   r   r   r   
isinstancetyper   r
   )r   r   r   r%   r&   replacementsreduced_exprreplacements_corejacobian_coreprecomputed_fs_corereplacements_normjacobian_normprecomputed_fs_normr$   r'   r'   r(   test_io_matrix_type`   s     

r9   c                  C   s  t d\} }}t| | ||  | | |  | d |d  |d  | | | |  ||  g}t| ||g}t|\}}t|||\}}}	t|t|sJ dt|t|sJ dt|	tsJ dt|t|ksJ dt|dksJ dt|	t|ksJ d	t||\}
}}t|
t|s4J dt|t|sLJ dt|ts`J dt|
t|kszJ dt|dksJ dt|t|ksJ d	d S )
Nr*   r   zReplacements should be a listzJacobian should be a listz)Precomputed free symbols should be a listz%Length of replacements does not matchr   z Jacobian should have one elementz1Length of precomputed free symbols does not match)	r   r   r   r   r/   r0   listlenr   )r   r   r   r%   r&   r1   r2   r3   r4   r5   r6   r7   r8   r'   r'   r(   "test_forward_jacobian_input_outputy   s,    r<   c                  C   s   t ddtd t dtd  tt  g} ttg}t| |t dt t td gtdt t ggksfJ t ddttd td  g} t| |t ddgdt td  td d td  ggksJ d S )Nr   r         r   )r   r   r   r
   )LZsymsr'   r'   r(   test_jacobian_hessian   s
    (6r@   c                  C   s   t d\} }t| t| | t| g}t| |g}t||}|||jksRJ ||j|ksfJ ||j|jks|J |jt|jd  | }|	t
}|tddgd| d ggksJ d S )Nrho,phir   r   r   )r   r   r   r   r
   r$   r!   r   r#   Z	applyfuncr   )rhophiXYJgr'   r'   r(   test_jacobian_metrics   s    

rH   c                  C   s   t d\} }t| t| | t| | d g}t| |g}tt||  t| gt|| t| gd|  dgg}t|||ksJ d S )NrA   r   r   )r   r   r   r   r
   )rB   rC   rD   rE   rF   r'   r'   r(   test_jacobian2   s    "
rI   c                  C   s   t ttt t ttt t ttt t g} t tttg}tddD ]}tddD ]x}| d |d d f }|d |d d f }t||}|j|ksJ |j|ksJ t|D ]}|d d |f |ksJ qqXqJd S )Nr   r>   )	r   r   r   r   r   ranger
   rowscols)rD   rE   ijZX_sliceZY_slicerF   r   r'   r'   r(   test_issue_4564   s    2
rO   c                      s   t ttt t ttt t gttt t ttt t gg tt fdd  dd d f  t ttgttggtt fdd tt fdd d S )Nc                      s   t  ttttgS r    r
   r   r   r   r   r'   rD   r'   r(   <lambda>       z(test_nonvectorJacobian.<locals>.<lambda>r   c                      s
   t  S r    )r
   r'   rD   rE   r'   r(   rR      rS   c                      s   t  tttgttggS r    rP   r'   rQ   r'   r(   rR      rS   )r   r   r   r   r   r   	TypeErrorr'   r'   rT   r(   test_nonvectorJacobian   s     rV   )=__doc__ZpytestZsympy.core.symbolr   r   Zsympy.core.numbersr   Zsympy.core.functionr   Z
sympy.corer   Z&sympy.functions.elementary.exponentialr   Zsympy.matrices.immutabler   Zsympy.physics.mechanicsr	   Zsympy.simplify._cse_diffr
   r   r   r   Zsympy.simplify.simplifyr   Zsympy.matricesr   r   Zsympy.testing.pytestr   Z(sympy.functions.elementary.trigonometricr   r   r   Zsympy.simplify.trigsimpr   Zsympyr   r   r   r   r   Zq1Zq2Zq3r   r   ZzeroZoneZtwoZneg_onemarkZparametrizer)   r.   r9   r<   r@   rH   rI   rO   rV   r'   r'   r'   r(   <module>   sr   





4N* 
	