U
    Ý@·f=@  ã                   @   sÐ  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mZmZmZmZ d dlmZ d d	lmZ d d
lmZmZmZ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+Z+d dl,m-Z-m.Z. edƒ\Z/Z0Z1Z2edƒZ3dd„ Z4dd„ Z5dd„ Z6dd„ Z7dd„ Z8dd „ Z9d!d"„ Z:d#d$„ Z;d%d&„ Z<d'd(„ Z=d)d*„ Z>d+d,„ Z?d-d.„ Z@d/d0„ ZAd1d2„ ZBd3d4„ ZCed5d6„ ƒZDd7d8„ ZEd9d:„ ZFed;d<„ ƒZGdS )=é    )Úslow)Údiff)Úexpand)ÚEÚIÚRationalÚpi)ÚS)ÚSymbolÚsymbols)ÚAbsÚ	conjugateÚimÚreÚsign)Úlog)Úsqrt)ÚacosÚasinÚcosÚsinÚatan2Úatan)Ú	integrate)ÚMatrix)Úsimplify)Útrigsimp)Ú
Quaternion)ÚraisesN)ÚpermutationsÚproductzw:zÚphic               
      s<  t ttttƒ} | |  t dt dt dt dt ƒks8t‚t  tdƒd tdƒd tdƒd ftt	ddƒ ¡}|t t
jt
jt
jt
jƒksŠt‚tttƒttƒ dgttƒttƒdgdddggƒ}tt  |¡ƒ}|t tdƒtttƒd ƒ d ddtddttƒ  ƒtttƒƒ d ƒkst‚tddd‰ tt‡ fdd	„ƒ d S )
Né   é   r   é   ÚncF©Zcommutativec                      s   t ttˆ tƒS ©N)r   ÚwÚxÚz© ©r%   r+   úH/tmp/pip-unpacked-wheel-6uje5nh9/sympy/algebras/tests/test_quaternion.pyÚ<lambda>&   ó    z.test_quaternion_construction.<locals>.<lambda>)r   r(   r)   Úyr*   ÚAssertionErrorÚfrom_axis_angler   r   r   r	   ÚHalfr   r   r!   r   r   Zfrom_rotation_matrixr   r
   r   Ú
ValueError)ÚqÚq2ÚMÚq3r+   r,   r-   Útest_quaternion_construction   s&    *$ÿ ÿ
2   "ÿr9   c                  C   s|   t tdƒŽ } t ttttƒ}t| |  ¡ d |  ¡ d | ¡ d   ƒdksNt‚t ttttdd}| |  ¡ |  ¡ ksxt‚d S )Núa:dr"   r   r$   )Únorm)	r   r   r(   r)   r0   r*   r   r;   r1   )Úq1r6   r8   r+   r+   r-   Ú!test_quaternion_construction_norm)   s
    4r=   c                  C   sP   t ddddƒ} t  ddtj d ¡}| ¡ }||  | }||   ¡ dk sLt‚d S )Nr$   r   ©r$   r$   r$   r#   é   g»½×Ùß|Û=)r   r2   Úmathr   Úinverser;   r1   )Úpr5   ZqiÚtestr+   r+   r-   Útest_issue_252543   s
    rD   c                  C   sT   t ttttƒ} t  |  ¡ ¡}t  |  d¡¡}| |  ¡ s<t‚|  	¡ |  ¡ sPt‚d S )NT)
r   r(   r)   r0   r*   Zfrom_MatrixÚ	to_MatrixÚis_zero_quaternionr1   Úvector_part)r5   Zq_fullZq_vectr+   r+   r-   Útest_to_and_from_Matrix=   s
    rH   c                  C   sœ   t ttttƒ} t tdƒŽ }| |  ¡ | j| ¡  ks8t‚| |  ¡ |j	|  ¡  ksVt‚| j| j	j
 dd …dd …f }t|  ¡ |  ¡ d  ƒ}||ks˜t‚d S )Nr:   r$   r"   )r   r(   r)   r0   r*   r   rE   Zproduct_matrix_leftr1   Zproduct_matrix_rightÚTr   Úto_rotation_matrixr;   )r<   r6   ÚR1ÚR2r+   r+   r-   Útest_product_matricesE   s    rM   c                  C   s  ddt d tdƒd tdƒd ddffdt d tdƒd dtdƒd dffdt d tdƒd ddtdƒd ffdt dfdt dfdt d	fd
t ddtdƒ dtdƒ dtdƒ fftdƒd tdƒd tdƒd ft d d tjtjtjtjffg	} | D ]"\}}}t ||¡t|Ž ksôt‚qôd S )N)©r$   r   r   r   )r$   r   r   r   rN   r"   r   )r   r$   r   ©r   r   r$   )r   r$   r   r   )r   r   r$   r   )r   r   r   r$   r>   r$   r#   )r   r   r	   r3   r   r2   r1   )Z	test_dataÚaxisÚangleÚexpectedr+   r+   r-   Útest_quaternion_axis_angleP   s    $$$(>÷rS   c                  C   s¤   t  dtdƒ¡} | jttdƒd ƒks*t‚| jtdƒttdƒd ƒ d ksPt‚| j	tdƒttdƒd ƒ d ksvt‚| j
dtdƒ ttdƒd ƒ d ks t‚d S )N)r$   r"   r#   r?   r"   é   é   r#   )r   r2   r   Úar   r1   Úbr   r   ÚcÚd)Úresultr+   r+   r-   Ú)test_quaternion_axis_angle_simplificationb   s
    &&r[   c               	      s†  t ddd} t ddd}t ddd‰ tttttƒ‰| ˆ ttt| ƒ tt| ƒ ttƒks\t‚d	ˆ td	t tttƒkszt‚t	ˆ ttd	t ttƒks˜t‚|ˆ tt| tttƒks¶t‚t
t‡ ‡fd
d„ƒ t
t‡ ‡fdd„ƒ t
t‡ ‡fdd„ƒ ˆ tt t t t ƒkst‚tddt	  ddt	  dddt	  dd}td	dddƒ}|ddt	   tddt	  ddt	  dddt	  ƒksˆt‚|ddt	   tddddƒks¬t‚|ddt	   tddt	  ddt	   ddt	  ddt	   dddt	  ddt	   ƒkst‚|ddt	   tddddƒks0t‚td	dddƒ}tddddƒ}|| |ks^t‚|| |kspt‚|| |ks‚t‚d S )NrV   T©ÚcomplexrW   ©ÚrealrX   Fr&   r$   c                      s   ˆ ˆ S r'   r+   r+   ©rX   r5   r+   r-   r.   t   r/   z7test_quaternion_complex_real_addition.<locals>.<lambda>c                      s   ˆˆ  S r'   r+   r+   r`   r+   r-   r.   u   r/   c                      s   ˆ ˆ S r'   r+   r+   r`   r+   r-   r.   v   r/   r#   r?   r"   é   r   rU   é   ©Z
real_fieldiöÿÿÿé   é&   éûÿÿÿ)r   r   r(   r)   r0   r*   r   r   r1   r   r   r4   )rV   rW   r<   r6   Úq0r+   r`   r-   Ú%test_quaternion_complex_real_additioni   s2    *"*<$Hÿ
$rh   c                  C   s.   t  dt¡} |  td¡t ddddƒks*t‚d S )NrO   r   r$   )r   r2   r!   Úsubsr1   ©r5   r+   r+   r-   Útest_quaternion_subsŠ   s    rk   c                   C   sŒ   t tdƒddtdƒƒ ¡ t tdƒ ¡ ddtdƒ ¡ ƒks<t‚t dtdƒ dddtdƒ ƒ ¡ t dtdƒ  ¡ dddtdƒ  ¡ ƒksˆt‚d S )Nr"   r   r#   r$   )r   r   Úevalfr1   r+   r+   r+   r-   Útest_quaternion_evalf   s    ÿ $ÿrm   c                     sà
  t ttttƒ} t ddddƒ‰t ddddƒ‰t| ƒt tt t t ƒksJt‚|  ¡ ttd td  td  td  ƒkszt‚|  	¡ t ttttƒttd td  td  td  ƒ ks¸t‚|  
¡ t tt t t ƒtd td  td  td   ksøt‚|  
¡ |  d¡kst‚tt‡fdd„ƒ |  d¡t td td  td  td  dt t dt t dt t ƒkstt‚| d t td td  td  td  dt t dt t dt t ƒksÄt‚ˆ d	¡t td
dƒtddƒtddƒtd	dƒƒksút‚ˆd	 t td
dƒtddƒtddƒtd	dƒƒks.t‚ˆ d¡tksBt‚tt‡fdd„ƒ ˆ ¡ t tttdƒƒ dtdƒ t ttdƒƒ d dtdƒ t ttdƒƒ d dtdƒ t ttdƒƒ d ƒksÐt‚ˆ ¡ t ttdƒƒdtdƒ ttdƒd ƒ d dtdƒ ttdƒd ƒ d dtdƒ ttdƒd ƒ d ƒksHt‚ˆ d¡t dtdttdƒd ƒ ƒ dtdƒ tdttdƒd ƒ ƒ d dtdƒ tdttdƒd ƒ ƒ d dtdƒ tdttdƒd ƒ ƒ d ƒksêt‚tt ttttƒtƒt ddddƒkst‚tt ttttƒtƒt td d td d td d td d ƒksZt‚t  dˆ¡tjd dtdƒd fks„t‚tdƒ‰ tt‡ ‡fdd„ƒ tddd‰ tt‡ ‡fdd„ƒ t ddddƒ ¡ dksÜt‚t ttttƒ ¡ tksøt‚t ddddƒ ¡ t ddddƒkst‚t ttttƒ ¡ t dtttƒksDt‚ˆ  ¡ t ddtdƒ d dtdƒ d dtdƒ d ƒks„t‚ˆ  ¡  d¡t ddddƒks¦t‚ˆ  ¡  ¡ dks¼t‚|   ¡ t dtttd td  td  ƒ tttd td  td  ƒ tttd td  td  ƒ ƒks,t‚ˆ !¡ dks>t‚ˆ !¡ d ksPt‚t ddddƒ !¡ dkslt‚t ddd!dƒ !¡ dksˆt‚t tdd!dƒ !¡ d ks¤t‚ˆ "¡ dt#tdƒƒ ksÂt‚|  "¡ dt$ttd td  td  ƒtƒ ksöt‚t  %ˆt ddd"dƒ¡dkst‚t  %ˆt dd	d#d$ƒ¡dks6t‚t  %ˆt ddd%d&ƒ¡dksVt‚t  %ˆt ddddƒ¡dksvt‚t  %ˆt tdd"dƒ¡dks–t‚t  %ˆt ddddƒ¡d ks¶t‚t  %ˆt ttttƒ¡d ksÖt‚tt‡‡fd'd„ƒ t  &t ddd%d&ƒt ddd"dƒt ddddƒ¡dks t‚t  &t ddddƒt ddd"dƒt ddddƒ¡dksVt‚t  &t dddd"ƒt ddd"d"ƒt ddddƒ¡d ksŒt‚t  &t ddddƒt ddtd"ƒt dd"ddƒ¡d ksÂt‚tt‡‡fd(d„ƒ t ddddƒ 't dddd"ƒ¡dksþt‚t ddddƒ 't dddd"ƒ¡d k	s&t‚t ddddƒ 't tttd"ƒ¡d k	sNt‚tt‡‡fd)d„ƒ t ddddƒ (t dd	ddƒ¡dk	sŠt‚t ddddƒ (t dddd"ƒ¡d k	s²t‚t ddddƒ (t tttd"ƒ¡d k	sÚt‚tt‡‡fd*d„ƒ ˆ )¡ t ddtd+ƒ d dtd+ƒ d dtd+ƒ d ƒk
s.t‚t ddd,dƒ )¡ t ddd,dƒk
sTt‚t ddd,dƒ *¡ ttd-ƒƒk
sxt‚t ddddƒ *¡ ttdƒƒk
sœt‚ˆ +¡ dk
s®t‚ˆ +¡ d k
sÀt‚t tdddƒ +¡ d k
sÜt‚d S ).Nr$   r"   r#   r?   r   éÿÿÿÿc                      s   ˆ   ¡ S r'   ©rA   r+   ©rg   r+   r-   r.       r/   z+test_quaternion_functions.<locals>.<lambda>éþÿÿÿiùÿÿÿéá   é–   ç      à¿c                      s   ˆ d S )Nrt   r+   r+   )r<   r+   r-   r.   ¨   r/   é   é   é<   éZ   éx   r>   ra   rU   Únc                      s   ˆˆ  S r'   r+   r+   ©rz   r<   r+   r-   r.   Â   r/   T)Úintegerc                      s   ˆˆ  S r'   r+   r+   r{   r+   r-   r.   Ä   r/   é   é   é7   rb   Fé
   é   éýÿÿÿéüÿÿÿé   é   c                      s   t  ˆˆ ¡S r'   )r   Úarc_coplanarr+   ©rg   r<   r+   r-   r.   ä   r/   c                      s   t  ˆ t ddddƒˆ¡S )Nr   r?   r   rb   )r   Úvector_coplanarr+   r‡   r+   r-   r.   ò   s    c                      s
   ˆ   ˆ¡S r'   )Úparallelr+   r‡   r+   r-   r.   ø   r/   c                      s
   ˆ   ˆ¡S r'   )Ú
orthogonalr+   r‡   r+   r-   r.   ý   r/   if  é	   éz   ),r   r(   r)   r0   r*   r   r1   r;   r   Ú	normalizerA   Úpowr   r4   r   ÚNotImplementedÚ	TypeErrorÚexpr   r   r   r   r   Zpow_cos_sinr   r   Úrotate_pointr	   ÚOner
   Zscalar_partrG   rP   Úis_purerQ   r   r   r†   rˆ   r‰   rŠ   Zindex_vectorZmensorrF   rj   r+   )rz   rg   r<   r-   Útest_quaternion_functions–   s    0>@RP
   ÿ   ÿýÿ
ýÿ
&&&ýÿ
(,ÿ
*&&@"
ý4       ýý
  ÿÿ
  ÿÿ
ýý
(((((( ý&$$r•   c               
   C   sx  t ddddƒ} |  ¡ dtdƒ d dtdƒ d dtdƒ d fdttdƒd ƒ fks\t‚|  ¡ ttddƒtddƒtd	dƒgtddƒtd
dƒtddƒgtddƒtddƒtddƒggƒks¾t‚|  d¡ttddƒtddƒtd	dƒtddƒgtddƒtd
dƒtddƒtj	gtddƒtddƒtddƒtddƒgtj	tj	tj	tj
ggƒksJt‚tddd}t t|d ƒddt|d ƒƒ}t| ¡ ƒtt|ƒt|ƒ dgt|ƒt|ƒdgdddggƒks¸t‚| ¡ ddt|d ƒtt|d ƒƒ fdtt|d ƒƒ fksüt‚t| d¡ƒtt|ƒt|ƒ dt|ƒt|ƒ d gt|ƒt|ƒdt|ƒ t|ƒ d gddddgddddggƒkstt‚d S )Nr$   r"   r#   r?   ru   rv   rq   é   rd   rn   rT   r>   ra   ÚthetaTr^   r   )r   Úto_axis_angler   r   r1   rJ   r   r   r	   ZZeror“   r   r   r   r   r   )r<   r—   r6   r+   r+   r-   Útest_quaternion_conversions  sJ    þý
þÿ""üÿ
ý&ÿ$$

ür™   c                  C   sR   t ttttƒ} | jdd|  ¡ d  }t| jdd|  ¡ d  ƒ}||ksNt‚d S )NT)Zhomogeneousr"   F)	r   r(   r)   r0   r*   rJ   r;   r   r1   )r5   rK   rL   r+   r+   r-   Ú test_rotation_matrix_homogeneous2  s    rš   c                  C   sd   t ttd ƒttd ƒddƒ} t|  ¡ ƒtdddgdttƒttƒ gdttƒttƒggƒks`t‚dS )a3  
    There was a sign mistake in the definition,
    of the rotation matrix. This tests that particular sign mistake.
    See issue 1593 for reference.
    See wikipedia
    https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Quaternion-derived_rotation_matrix
    for the correct definition
    r"   r   r$   N)r   r   r!   r   r   rJ   r   r1   rj   r+   r+   r-   Ú test_quaternion_rotation_iss15939  s    	ýr›   c                  C   sh  t ddt  ddt  dddt  dd	} t d
dddƒ}t d
d
d
tƒ}t  tdƒtj¡dks`t‚t  tdƒ| ¡t ddt  ddt  dddt  ƒksšt‚| d¡t ddddƒks¶t‚| |¡t dt d dt d ddt  td ƒksît‚| |¡|| kst‚tddd}t t	|ƒt
|ƒddƒ}t tdddŽ }|| || ksNt‚|| || ksdt‚d S )Nr#   r?   r"   ra   r   rU   rb   Frc   r$   r„   r…   é   é   é    r   r€   rf   r‹   r*   Tr\   zq:4r^   )r   r   r0   Z_generic_mulr	   r“   r1   Úmulr   r   r   )r<   r6   r8   r*   Zz_quatr5   r+   r+   r-   Útest_quaternion_multiplicationI  s    *$ÿ8r    c                     sÀ   t ddddƒ‰ tt‡ fdd„ƒ t ddddƒ} |  ¡ \}}t  d||f¡tjd	 dtd
ƒd	 fksft‚t ddddƒ} tdƒ d tdƒ d tdƒ d f}dt	 d }||f|  ¡ ks¼t‚d S )Nr   c                      s   dˆ  S )Nr$   r+   r+   rp   r+   r-   r.   `  r/   z"test_issue_16318.<locals>.<lambda>r$   r"   r#   r?   r>   ra   rU   rn   )
r   r   r4   r˜   r’   r	   r“   r1   r   r   )r5   rP   rQ   r+   rp   r-   Útest_issue_16318]  s    ,(r¡   c                  C   sh   t ttttƒ} |  ¡ }ddddg}|dd„ |D ƒ7 }|D ]*}|  |¡}tt  ||¡ƒ}||ks8t	‚q8d S )NZzxyÚzyxÚzyzZzxzc                 S   s   g | ]}|  ¡ ‘qS r+   )Úupper)Ú.0Úseqr+   r+   r-   Ú
<listcomp>r  s     z!test_to_euler.<locals>.<listcomp>)
r   r(   r)   r0   r*   r   Úto_eulerr   Ú
from_eulerr1   )r5   Zq_normalizedZseqsr¦   Zeuler_from_qZq_backr+   r+   r-   Útest_to_eulerl  s    
rª   c                  C   s6   t  tddfd¡} t|  d¡ddtddfks2t‚dS )z_
    There was a mistake in the degenerate case testing
    See issue 24504 for reference.
    r   r£   Tro   N)r   r©   r!   r   r¨   r1   rj   r+   r+   r-   Útest_to_euler_iss24504z  s    r«   c                  C   sÀ   dd„ } | t d ddfdƒ | t d ddfdƒ | t d t dfdƒ | t d t dfdƒ | t d t d dfdƒ | t d t  d dfdƒ | t d t d dfdƒ | t d t  d dfdƒ d S )	Nc                 S   s"   t  | |¡}| |¡| kst‚d S r'   )r   r©   r¨   r1   )Zanglesr¦   r5   r+   r+   r-   Útest_one_case…  s    z<test_to_euler_numerical_singilarities.<locals>.test_one_caser"   r   r£   ZZYZr¢   ZZYX)r   )r¬   r+   r+   r-   Ú%test_to_euler_numerical_singilaritiesƒ  s    r­   c               	      sŽ   ‡ fdd„} dD ]x}t |ƒD ]j}dD ]`}|rJd |d |d |d g¡‰ n
d |¡‰ tdddgd	d
D ]}t|Ž }| ¡ sf| |ƒ qfq$qqd S )Nc                    sb   t |  ˆ dd¡ƒ}t |  ˆ dd¡ƒ}t|| ƒ ¡ }|D ]$}|t dt  t }|dk s8t‚q8d S )NTFr"   gíµ ÷Æ°>)r   r¨   r   rl   r   r1   )r5   Zangles1Zangles2Zangle_errorsZangle_error©r¦   r+   r-   r¬   ˜  s    z,test_to_euler_options.<locals>.test_one_case)ÚxyzZXYZ)TFÚ r   r$   rn   r?   )Úrepeat)r   Újoinr    r   rF   )r¬   r¯   Z	seq_tupleZ	symmetricÚelementsr5   r+   r®   r-   Útest_to_euler_options–  s    	
r´   )HZsympy.testing.pytestr   Zsympy.core.functionr   r   Zsympy.core.numbersr   r   r   r   Zsympy.core.singletonr	   Zsympy.core.symbolr
   r   Z$sympy.functions.elementary.complexesr   r   r   r   r   Z&sympy.functions.elementary.exponentialr   Z(sympy.functions.elementary.miscellaneousr   Z(sympy.functions.elementary.trigonometricr   r   r   r   r   r   Zsympy.integrals.integralsr   Zsympy.matrices.denser   Zsympy.simplifyr   Zsympy.simplify.trigsimpr   Zsympy.algebras.quaternionr   r   r@   Ú	itertoolsr   r    r(   r)   r0   r*   r!   r9   r=   rD   rH   rM   rS   r[   rh   rk   rm   r•   r™   rš   r›   r    r¡   rª   r«   r­   r´   r+   r+   r+   r-   Ú<module>   sR    

!v&
	