o
    *Î®c0  ã                   @   s<  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& edƒ\Z'Z(Z)Z*edƒZ+dd„ Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dd„ Z2dd„ Z3d d!„ Z4d"d#„ Z5d$S )%é    )Údiff)ÚEÚIÚRationalÚpi)ÚS)ÚSymbolÚsymbols)ÚAbsÚ	conjugateÚimÚreÚsign)Úlog)Úsqrt)ÚacosÚasinÚcosÚsinÚatan2Úatan)Ú	integrate)ÚMatrix)Útrigsimp)Ú
Quaternion)Úraiseszw:zÚphic               
      s8  t ttttƒ} | |  t dt dt dt dt ƒksJ ‚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sEJ ‚tttƒttƒ dgttƒttƒdgg d¢gƒ}tt  |¡ƒ}|t tdƒtttƒd ƒ d ddtddttƒ  ƒtttƒƒ d ƒks‹J ‚tddd‰ tt‡ fd	d
„ƒ d S )Né   é   r   ©r   r   é   r    ÚncF©Úcommutativec                      s   t ttˆ tƒS ©N)r   ÚwÚxÚz© ©r!   r(   úK/tmp/pip-target-vg8gfxp4/lib/python/sympy/algebras/tests/test_quaternion.pyÚ<lambda>    s    z.test_quaternion_construction.<locals>.<lambda>)r   r%   r&   Úyr'   Úfrom_axis_angler   r   r   r   ÚHalfr   r   r   r   r   Úfrom_rotation_matrixr   r   r   Ú
ValueError)ÚqÚq2ÚMÚq3r(   r)   r*   Útest_quaternion_construction   s   *$ÿ
ÿ0Nr5   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‹J ‚qzd S )N)©r    r   r   r   )r    r   r   r   r6   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   r.   r   r-   )Ú	test_dataÚaxisÚangleÚexpectedr(   r(   r*   Útest_quaternion_axis_angle#   s   $$$(>÷ÿr>   c                  C   s¤   t  dtdƒ¡} | jttdƒd ƒksJ ‚| jtdƒttdƒd ƒ d ks(J ‚| jtdƒttdƒd ƒ d ks;J ‚| j	dtdƒ ttdƒd ƒ d ksPJ ‚d S )N)r    r   r   é   r   é   é   r   )
r   r-   r   Úar   Úbr   r   ÚcÚd)Úresultr(   r(   r*   Ú)test_quaternion_axis_angle_simplification5   s
   &&.rG   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.J ‚d	ˆ td	t tttƒks=J ‚tˆ ttd	t ttƒksLJ ‚|ˆ tt| tttƒks[J ‚t	t
‡ ‡fd
d„ƒ t	t
‡ ‡fdd„ƒ t	t
‡ ‡fdd„ƒ ˆ tt t t t ƒks‰J ‚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ÂJ ‚|ddt   tddddƒksÓJ ‚|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J ‚|ddt   tddddƒksJ ‚td	dddƒ}tddddƒ}|| |ks,J ‚|| |ks5J ‚|| |ks>J ‚d S )NrB   T©ÚcomplexrC   ©ÚrealrD   Fr"   r    c                      s   ˆ ˆ S r$   r(   r(   ©rD   r1   r(   r*   r+   G   ó    z7test_quaternion_complex_real_addition.<locals>.<lambda>c                      s   ˆˆ  S r$   r(   r(   rL   r(   r*   r+   H   rM   c                      s   ˆ ˆ S r$   r(   r(   rL   r(   r*   r+   I   rM   r   r?   r   é   r   rA   é   ©Ú
real_fieldiöÿÿÿé   é&   éûÿÿÿ)r	   r   r%   r&   r,   r'   r   r   r   r   r0   )rB   rC   Úq1r2   Úq0r(   rL   r*   Ú%test_quaternion_complex_real_addition<   s2   * *:"H
ÿ$rW   c                   C   sŒ   t tdƒddtdƒƒ ¡ t tdƒ ¡ ddtdƒ ¡ ƒksJ ‚t dtdƒ dddtdƒ ƒ ¡ t dtdƒ  ¡ dddtdƒ  ¡ ƒksDJ ‚d S )Nr   r   r   r    )r   r   Úevalfr(   r(   r(   r*   Útest_quaternion_evalf]   s   <PrY   c                     sÐ
  t ttttƒ} t ddddƒ‰t ddddƒ‰t| ƒt tt t t ƒks%J ‚|  ¡ ttd td  td  td  ƒks=J ‚|  ¡ t ttttƒttd td  td  td  ƒ ks\J ‚|  	¡ t tt t t ƒtd td  td  td   ks|J ‚|  	¡ |  
d¡ks‡J ‚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s¸J ‚| d t td td  td  td  dt t dt t dt t ƒksßJ ‚ˆ 
d	¡t td
dƒtddƒtddƒtd	dƒƒksùJ ‚ˆd	 t td
dƒtddƒtddƒtd	dƒƒksJ ‚ˆ 
d¡tksJ ‚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sdJ ‚ˆ ¡ 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s J ‚ˆ 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ñJ ‚tt ttttƒtƒt ddddƒksJ ‚tt ttttƒtƒt td d td d td d td d ƒks)J ‚t  dˆ¡tjd dtdƒd fks>J ‚tdƒ‰ tt‡ ‡fdd„ƒ tddd‰ tt‡ ‡fdd„ƒ t ddddƒ ¡ dksjJ ‚t ttttƒ ¡ tksxJ ‚t ddddƒ ¡ t ddddƒks‹J ‚t ttttƒ ¡ t dtttƒksžJ ‚ˆ  ¡ t ddtdƒ d dtdƒ d dtdƒ d ƒks¾J ‚ˆ  ¡  
d¡t ddddƒksÏJ ‚ˆ  ¡  ¡ dksÚJ ‚|   ¡ 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J ‚ˆ !¡ dksJ ‚ˆ !¡ d ks$J ‚t ddddƒ !¡ dks2J ‚t ddd!dƒ !¡ dks@J ‚t tdd!dƒ !¡ d ksNJ ‚ˆ "¡ t#tdƒƒks[J ‚|  "¡ t$ttd td  td  ƒtƒkssJ ‚t  %ˆt ddd"dƒ¡dksƒJ ‚t  %ˆt dd	d#d$ƒ¡dks“J ‚t  %ˆt ddd%d&ƒ¡dks£J ‚t  %ˆt ddddƒ¡dks³J ‚t  %ˆt tdd"dƒ¡dksÃJ ‚t  %ˆt ddddƒ¡d ksÓJ ‚t  %ˆt ttttƒ¡d ksãJ ‚tt‡‡fd'd„ƒ t  &t ddd%d&ƒt ddd"dƒt ddddƒ¡dksJ ‚t  &t ddddƒt ddd"dƒt ddddƒ¡dks#J ‚t  &t dddd"ƒt ddd"d"ƒt ddddƒ¡d ks>J ‚t  &t ddddƒt ddtd"ƒt dd"ddƒ¡d ksYJ ‚tt‡‡fd(d„ƒ t ddddƒ 't dddd"ƒ¡dkswJ ‚t ddddƒ 't dddd"ƒ¡d ks‹J ‚t ddddƒ 't tttd"ƒ¡d ksŸJ ‚tt‡‡fd)d„ƒ t ddddƒ (t dd	ddƒ¡dks½J ‚t ddddƒ (t dddd"ƒ¡d ksÑJ ‚t ddddƒ (t tttd"ƒ¡d ksåJ ‚tt‡‡fd*d„ƒ ˆ )¡ t ddtd+ƒ d dtd+ƒ d dtd+ƒ d ƒksJ ‚t ddd,dƒ )¡ t ddd,dƒks"J ‚t ddd,dƒ *¡ ttd-ƒƒks4J ‚t ddddƒ *¡ ttdƒƒksFJ ‚ˆ +¡ dksOJ ‚ˆ +¡ d ksXJ ‚t tdddƒ +¡ d ksfJ ‚d S ).Nr    r   r   r?   r   éÿÿÿÿc                      s   ˆ   ¡ S r$   )Úinverser(   ©rV   r(   r*   r+   l   rM   z+test_quaternion_functions.<locals>.<lambda>éþÿÿÿiùÿÿÿéá   é–   ç      à¿c                      s   ˆ d S )Nr`   r(   r(   )rU   r(   r*   r+   r   rM   é   é   é<   éZ   éx   r9   rN   rA   Únc                      ó   ˆˆ  S r$   r(   r(   ©rf   rU   r(   r*   r+   Œ   rM   T)Úintegerc                      rg   r$   r(   r(   rh   r(   r*   r+   Ž   rM   é   é   é7   rO   Fé
   é   éýÿÿÿéüÿÿÿé   é   c                      s   t  ˆˆ ¡S r$   )r   Úarc_coplanarr(   ©rV   rU   r(   r*   r+   «   s    c                      s   t  ˆ t ddddƒˆ¡S )Nr   r?   rn   rO   )r   Úvector_coplanarr(   rt   r(   r*   r+   ±   s    c                      ó
   ˆ   ˆ¡S r$   )Úparallelr(   rt   r(   r*   r+   ¶   ó   
 c                      rv   r$   )Ú
orthogonalr(   rt   r(   r*   r+   »   rx   if  é	   éz   ),r   r%   r&   r,   r'   r   Únormr   Ú	normalizer[   Úpowr   r0   r   ÚNotImplementedÚ	TypeErrorÚexpr   r   r   Ú_lnr   r   Úpow_cos_sinr   r   Úrotate_pointr   ÚOner   Úscalar_partÚvector_partr;   Úis_purer<   r   r   rs   ru   rw   ry   Úindex_vectorÚmensorÚis_zero_quaternion©r1   r(   )rf   rV   rU   r*   Útest_quaternion_functionsb   s°    0>@PN44ý
ÿý
ÿ&&&ý
ÿ(,
ÿ*&&@"p0       6666((((((@&$$ r   c               
   C   sh  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.J ‚|  ¡ 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_J ‚|  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s¤J ‚t
ddd}t t|d ƒddt|d ƒƒ}t| ¡ ƒtt|ƒt|ƒ dgt|ƒt|ƒdgg d¢gƒksÙJ ‚| ¡ ddt|d ƒtt|d ƒƒ fdtt|d ƒƒ fksúJ ‚t| d¡ƒtt|ƒt|ƒ dt|ƒt|ƒ d gt|ƒt|ƒdt|ƒ t|ƒ d gg d¢g d¢gƒks2J ‚d S )Nr    r   r   r?   ra   rb   r]   é   rR   rZ   r@   r9   rN   ÚthetaTrJ   r   r   r7   r8   )r   Úto_axis_angler   r   Úto_rotation_matrixr   r   r   ÚZeror…   r	   r   r   r   r
   )rU   r   r2   r(   r(   r*   Útest_quaternion_conversionsÇ   s@   þ
ý"þ,"ýý&
ÿ$$ür“   c                  C   sb   t ttd ƒttd ƒddƒ} t|  ¡ ƒtg d¢dttƒttƒ gdttƒttƒggƒks/J ‚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   r6   N)r   r   r   r   r   r‘   r   rŒ   r(   r(   r*   Ú test_quaternion_rotation_iss1593ê   s   	ýr”   c                  C   sb  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s0J ‚t  tdƒ| ¡t ddt  ddt  dddt  ƒksMJ ‚| d¡t ddddƒks[J ‚| |¡t dt d dt d ddt  td ƒkswJ ‚| |¡|| ks‚J ‚tddd}t t|ƒt	|ƒddƒ}t tdddŽ }|| || ks¥J ‚|| || ks¯J ‚d S )Nr   r?   r   rN   r   rA   rO   FrP   r    rq   rr   é   é   é    rn   rm   rT   rz   r'   TrH   zq:4rJ   )
r   r   r,   Ú_generic_mulr   r…   Úmulr	   r   r   )rU   r2   r4   r'   Úz_quatr1   r(   r(   r*   Útest_quaternion_multiplicationú   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s3J ‚t ddddƒ} tdƒ d tdƒ d tdƒ d f}dt d }||f|  ¡ ks^J ‚d S )Nr   c                      s   dˆ  S )Nr    r(   r(   r\   r(   r*   r+     rM   z"test_issue_16318.<locals>.<lambda>r    r   r   r?   r9   rN   rA   rZ   )	r   r   r0   r   r„   r   r…   r   r   )r1   r;   r<   r(   r\   r*   Útest_issue_16318  s   ,(rœ   N)6Úsympy.core.functionr   Úsympy.core.numbersr   r   r   r   Úsympy.core.singletonr   Úsympy.core.symbolr   r	   Ú$sympy.functions.elementary.complexesr
   r   r   r   r   Ú&sympy.functions.elementary.exponentialr   Ú(sympy.functions.elementary.miscellaneousr   Ú(sympy.functions.elementary.trigonometricr   r   r   r   r   r   Úsympy.integrals.integralsr   Úsympy.matrices.denser   Úsympy.simplify.trigsimpr   Úsympy.algebras.quaternionr   Úsympy.testing.pytestr   r%   r&   r,   r'   r   r5   r>   rG   rW   rY   r   r“   r”   r›   rœ   r(   r(   r(   r*   Ú<module>   s2     !e#