U
    ZÊ¹jo  ã                   @   s  d dl mZmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZmZmZmZmZm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"m#Z# d dl$m%Z%m&Z& d d	l m'Z' d d
lm(Z( d dl)Z)edƒ\Z*Z+Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dd„ Z2d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/d0„ Z>d1d2„ Z?d3d4„ Z@d5d6„ ZAd7d8„ ZBd9d:„ ZCd;d<„ ZDd=d>„ ZEd?d@„ ZFdAdB„ ZGdCdD„ ZHdEdF„ ZIdGdH„ ZJdIdJ„ ZKdKdL„ ZLdMdN„ ZMdOdP„ ZNdQdR„ ZOdSdT„ ZPdUdV„ ZQdS )Wé    )ÚpiÚsymbolsÚRationalÚIntegerÚGoldenRatioÚ
EulerGammaÚCatalanÚLambdaÚDummyÚEqÚNeÚLeÚLtÚGtÚGe)Ú	PiecewiseÚsinÚcosÚAbsÚexpÚceilingÚsqrt)ÚraisesÚwarns_deprecated_sympy)ÚGLSLPrinter)Ú
StrPrinter)Úimplemented_function)ÚIndexedBaseÚIdx)ÚMatrixÚMatrixSymbol)ÚTuple©Ú	glsl_codeNzx,y,zc                   C   s   t ttƒƒdkst‚d S )Núabs(x))r#   r   ÚxÚAssertionError© r'   r'   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/tests/test_glsl.pyÚtest_printmethod   s    r)   c                   C   sÊ   t tt dd�dkst‚t tt t dd�dks4t‚t ttt  dd�dksPt‚t ttt  dd�dkslt‚t ttttd    dd�dks�t‚t t t ddd	�d
ks¬t‚t t t dd�dksÆt‚d S )NF)Úuse_operatorsz	mul(x, y)zadd(pow(x, y), z)zmul(x, add(y, z))ç      à?zmul(x, add(y, pow(z, sqrt(y))))zzero())r*   Úzerozsub(zero(), add(x, y))zsub(0.0, add(x, y))©r#   r%   Úyr&   Úzr'   r'   r'   r(   Útest_print_without_operators   s    $r0   c                   C   s@   t ttƒƒdkst‚t td ƒdks(t‚t ttƒƒdks<t‚d S )Nzsqrt(x)r+   )r#   r   r%   r&   r'   r'   r'   r(   Útest_glsl_code_sqrt   s    r1   c                  C   sŒ   t dttdt ƒƒ} ttd ƒdks(t‚tttd  ƒdks@t‚td| tƒd ttt    td t  ƒdkstt‚ttd	 ƒd
ksˆt‚d S )NÚgé   é   zpow(x, 3.0)zpow(x, pow(y, 3.0))é   g      @z.pow(3.5*2*x, -x + pow(y, x))/(pow(x, 2.0) + y)g      ð¿z1.0/x)r   r	   r%   r#   r&   r.   )r2   r'   r'   r(   Útest_glsl_code_Pow#   s    *ÿr6   c                   C   sˆ   t tttƒƒdkst‚t tttƒƒdks,t‚t tttƒƒdksBt‚t tttƒƒdksXt‚t tttƒƒdksnt‚t t	ttƒƒdks„t‚d S )Nzx == yzx != yzx <= yzx < yzx > yzx >= y)
r#   r   r%   r.   r&   r   r   r   r   r   r'   r'   r'   r(   Útest_glsl_code_Relational,   s    r7   c                   C   s(   t tdƒƒdkst‚t tƒdks$t‚d S )Nr5   zfloat E = 2.71828183;
Ezfloat pi = 3.14159265;
pi)r#   r   r&   r   r'   r'   r'   r(   Útest_glsl_code_constants_mathh5   s    r8   c                   C   s@   t dt ƒdkst‚t dt ƒdks(t‚t dt ƒdks<t‚d S )Nr3   z-float GoldenRatio = 1.61803399;
2*GoldenRatioz&float Catalan = 0.915965594;
2*Catalanz,float EulerGamma = 0.577215665;
2*EulerGamma)r#   r   r&   r   r   r'   r'   r'   r(   Útest_glsl_code_constants_other<   s    r9   c                   C   s\   t tddƒƒdkst‚t tddƒƒdks,t‚t tddƒƒdksBt‚t td	dƒƒdksXt‚d S )
Nr4   é   z3.0/7.0é   é	   Ú2iùÿÿÿz-3.0/7.0éýÿÿÿ)r#   r   r&   r'   r'   r'   r(   Útest_glsl_code_RationalB   s    r?   c                   C   s,   t tdƒƒdkst‚t tdƒƒdks(t‚d S )NéC   Z67éÿÿÿÿz-1)r#   r   r&   r'   r'   r'   r(   Útest_glsl_code_IntegerI   s    rB   c                   C   s    t ttƒttƒ ƒdkst‚d S )Nzpow(sin(x), cos(x)))r#   r   r%   r   r&   r'   r'   r'   r(   Útest_glsl_code_functionsN   s    rC   c                  C   sº   t dƒ} tdt| d|  ƒƒ}t|| ƒƒdks0t‚tdt| d|  t ƒƒ}t|| ƒƒdks\t‚tdƒ}tdt dd	d
�ƒ}tdt| | d|   d|   ƒƒ}t||| ƒ|| d�dks¶t‚d S )Nr%   r2   r3   z2*xz(float Catalan = 0.915965594;
2*x/CatalanÚAÚiÚnT©Úintegerr5   ©Ú	assign_toz@for (int i=0; i<n; i++){
   A[i] = (A[i] + 1)*(A[i] + 2)*A[i];
})r   r   r	   r#   r&   r   r   r   )r%   r2   rD   rE   r'   r'   r(   Útest_glsl_code_inline_functionR   s     ÿrK   c                   C   s,   t ttƒƒdkst‚t ttƒƒdks(t‚d S )Nzceil(x)r$   )r#   r   r%   r&   r   r'   r'   r'   r(   Útest_glsl_code_exceptionsb   s    rL   c                   C   sž   t tt@ ƒdkst‚t ttB ƒdks(t‚t t ƒdks:t‚t tt@ t@ ƒdksRt‚t ttB tB ƒdksjt‚t tt@ tB ƒdks‚t‚t ttB t@ ƒdksšt‚d S )Nzx && yzx || yz!xzx && y && zzx || y || zzz || x && yzz && (x || y)r-   r'   r'   r'   r(   Útest_glsl_code_booleang   s    rM   c                     sˆ   t ttdk ftd dfƒ‰ tˆ ƒ} d}| |ks2t‚tˆ dd�dksFt‚t ttdk ftd tdkfttƒtdkfƒ‰ tt‡ fd	d
„ƒ d S )Nr5   r3   Tz)((x < 1) ? (
   x
)
: (
   pow(x, 2.0)
))ÚcrI   z5if (x < 1) {
   c = x;
}
else {
   c = pow(x, 2.0);
}r   c                      s   t ˆ ƒS ©Nr"   r'   ©Úexprr'   r(   Ú<lambda>‡   ó    z*test_glsl_code_Piecewise.<locals>.<lambda>)r   r%   r#   r&   r   r   Ú
ValueError©ÚpÚsr'   rP   r(   Útest_glsl_code_Piecewiseq   s    ÿ	
ÿ,rX   c                  C   s6   t dtttdk ftd dfƒ ƒ} d}| |ks2t‚d S )Nr3   r5   Tz+2*((x < 1) ? (
   x
)
: (
   pow(x, 2.0)
)))r#   r   r%   r&   rU   r'   r'   r(   Útest_glsl_code_Piecewise_deepŠ   s    "ÿ	rY   c                   C   s   t tdd„ ƒ d S )Nc                   S   s   t ttƒdd�S )NÚgarbage)Úmethod)r#   r   r%   r'   r'   r'   r(   rR   ™   rS   z)test_glsl_code_settings.<locals>.<lambda>)r   Ú	TypeErrorr'   r'   r'   r(   Útest_glsl_code_settings˜   s    r]   c            
      C   sÞ   t ddd�\} }}td| ƒtd|ƒtd|ƒ  }}}tƒ }tƒ |_tdƒ| }| |¡dks`t‚td	ƒ||f }| |¡d
|| |  ksŽt‚tdƒ|||f }	| |	¡d|| | ||  |  ksÊt‚|jtƒ ksÚt‚d S )Nzn m oTrG   rE   ÚjÚkr%   zx[j]rD   zA[%s]ÚBzB[%s])r   r   r   ÚsetZ_not_cr   Z_print_Indexedr&   )
rF   ÚmÚorE   r^   r_   rV   r%   rD   r`   r'   r'   r(   Útest_glsl_code_Indexedœ   s    "*rd   c                  C   s–   t ddddgƒdkst‚t dddgdd�dks2t‚t dddgƒt d	ƒksLt‚t dddgƒt tdddƒƒksnt‚td
ddƒ} t | d | d gƒs’t‚d S )Nr5   r3   r4   é   zvec4(1, 2, 3, 4)F)Ú
glsl_typeszfloat[3](1, 2, 3)©r5   r3   r4   rD   r   )r#   r&   r!   r    )rb   r'   r'   r(   Útest_glsl_code_list_tuple_Tuple«   s    "rh   c            	      C   sp   t ddd�\} }tdƒ}tdƒ}tdƒ}td|ƒ}td| ƒ}d	}t|||f ||  || d
�}||kslt‚d S )Nún mTrG   rD   r%   r.   rE   r^   zŠfor (int i=0; i<m; i++){
   y[i] = 0.0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = A[n*i + j]*x[j] + y[i];
   }
}rI   ©r   r   r   r#   r&   )	rF   rb   rD   r%   r.   rE   r^   rW   rN   r'   r'   r(   Ú"test_glsl_code_loops_matrix_vector´   s    

ÿ rk   c                  C   sd   t ddtd�\} }tdƒ}tdƒ}t| |ƒ} d| jj|jdœ }t||  ||  d�}||ks`t‚d S )	Nzi mT)rH   Úclsr%   r.   zlfor (int i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){
   y[i_%(icount)i] = x[i_%(icount)i];
})ZicountZmcountrI   )r   r
   r   r   ÚlabelZdummy_indexr#   r&   )rE   rb   r%   r.   ÚexpectedÚcoder'   r'   r(   Útest_dummy_loopsË   s    
ürp   c            
      C   sˆ   t ddd�\} }tdƒ}tdƒ}tdƒ}tdƒ}td|ƒ}td	| ƒ}d
}t|||f ||  ||  ||  || d�}	|	|ks„t‚d S )Nri   TrG   rD   r%   r.   r/   rE   r^   z’for (int i=0; i<m; i++){
   y[i] = x[i] + z[i];
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = A[n*i + j]*x[j] + y[i];
   }
}rI   rj   )
rF   rb   rD   r%   r.   r/   rE   r^   rW   rN   r'   r'   r(   Útest_glsl_code_loops_addÚ   s    

ÿ
0rq   c                  C   sÖ   t ddd�\} }}}tdƒ}tdƒ}tdƒ}td|ƒ}td| ƒ}td	|ƒ}	td
|ƒ}
d||  | | || |  |	|  |
 || | |	|  |
 f d }t|||	|
f ||||	|
f  || d�}||ksÒt‚d S )Nún m o pTrG   ÚaÚbr.   rE   r^   r_   ÚlzÇfor (int i=0; i<m; i++){
   y[i] = 0.0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         for (int l=0; l<p; l++){
            y[i] = a[%s]*b[%s] + y[i];
ú         }
      }
   }
}rI   rj   )rF   rb   rc   rV   rs   rt   r.   rE   r^   r_   ru   rW   rN   r'   r'   r(   Ú*test_glsl_code_loops_multiple_contractionsñ   s     



>ùøÿ*rw   c                  C   s  t ddd�\} }}}tdƒ}tdƒ}tdƒ}tdƒ}td|ƒ}td	| ƒ}	td
|ƒ}
td|ƒ}d||  | | |	| |  |
|  | ||  | | |	| |  |
|  | |	| | |
|  | f d }t|||	|
|f |||	|
|f  ||	|
|f  || d�}||k�st‚d S )Nrr   TrG   rs   rt   rN   r.   rE   r^   r_   ru   zÑfor (int i=0; i<m; i++){
   y[i] = 0.0;
}
for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         for (int l=0; l<p; l++){
            y[i] = (a[%s] + b[%s])*c[%s] + y[i];
rv   rI   rj   )rF   rb   rc   rV   rs   rt   rN   r.   rE   r^   r_   ru   rW   r'   r'   r(   Útest_glsl_code_loops_addfactor  s"    



dùøÿ:rx   c                  C   s¬  t ddd�\} }}}tdƒ}tdƒ}tdƒ}tdƒ}td|ƒ}td	| ƒ}	td
|ƒ}
d}d||  | |	|  |
  d }d|| |
  d }d||  |	  d }t||	 |||	f  ||
 |||
f   ||	 ||
  |||	|
f   || d�}||| | |d d…  k�s¨||| | |d d…  k�s¨||| | |d d…  k�s¨||| | |d d…  k�s¨||| | |d d…  k�s¨||| | |d d…  k�s¨t‚d S )Nrr   TrG   rs   rt   rN   r.   rE   r^   r_   z*for (int i=0; i<m; i++){
   y[i] = 0.0;
}
z|for (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      for (int k=0; k<o; k++){
         y[i] = b[j]*b[k]*c[%s] + y[i];
z      }
   }
}
zUfor (int i=0; i<m; i++){
   for (int k=0; k<o; k++){
      y[i] = a[%s]*b[k] + y[i];
z   }
}
zUfor (int i=0; i<m; i++){
   for (int j=0; j<n; j++){
      y[i] = a[%s]*b[j] + y[i];
rI   rA   rj   )rF   rb   rc   rV   rs   rt   rN   r.   rE   r^   r_   Ús0Ús1Ús2Zs3r'   r'   r(   Ú#test_glsl_code_loops_multiple_terms*  sV    


ÿýüÿ

þýÿ
þýÿD ÿÿþýüûr|   c                  C   s:  t tt tdt tdkftdfƒttƒgƒ} tdddƒ}t| |d�dksLt‚tt |d |d gƒƒsht‚td|d	  tdkf|d	 dfƒt|d
 ƒ |d  }t|ƒdks®t‚tdddƒ}tdddƒ}t t|d
 ƒdt	|d	 ƒg|d
 |d	  |d dgd|d  |d
  t
|d ƒd dggƒ}t||ƒdk�s6t‚d S )Nr3   r   TrD   r4   r5   rI   z\A[0][0] = x*y;
if (y > 0) {
   A[1][0] = x + 2;
}
else {
   A[1][0] = y;
}
A[2][0] = sin(z);)r3   r   )r5   r   )r   r   zF((x > 0) ? (
   2*A[2][0]
)
: (
   A[2][0]
)) + sin(A[1][0]) + A[0][0]Úqé   ÚM)r4   r   )re   r   re   z¨M[0][0] = sin(q[1]);
M[0][1] = 0;
M[0][2] = cos(q[2]);
M[1][0] = q[1] + q[2];
M[1][1] = q[3];
M[1][2] = 5;
M[2][0] = 2*q[4]/q[1];
M[2][1] = sqrt(q[0]) + 4;
M[2][2] = 0;)r   r%   r.   r   r   r/   r    r#   r&   r   r   )ÚmatrD   rQ   r}   r   rb   r'   r'   r(   Útest_Matrix_printingZ  s&    ,
ÿ	6ÿ	$þÿr�   c                  C   sB   t } tdddddddgƒ}| |ƒdks*t‚| | ¡ ƒdks>t‚d S )	Nr5   r3   r4   re   r~   é   r:   zfloat[7](1, 2, 3, 4, 5, 6, 7))r#   r   r&   Ú	transpose©ÚglrD   r'   r'   r(   Útest_Matrices_1x7…  s    r†   c                  C   s2   t } tdddddddgƒ}| |dd	�d
ks.t‚d S )Nr5   r3   r4   re   r~   r‚   r:   Úint)Ú
array_typezint[7](1, 2, 3, 4, 5, 6, 7))r#   r   r&   r„   r'   r'   r(   Ú test_Matrices_1x7_array_type_int‹  s    r‰   c                  C   s&   t } tdƒ}| |ddd�dks"t‚d S )Núa b cZAbcTypeF)rˆ   rf   zAbcType[3](a, b, c))r#   r   r&   r„   r'   r'   r(   Útest_Tuple_array_type_custom�  s    r‹   c                  C   s@   t } tdddddddgƒ}tdƒ}| ||d	�t d
¡ks<t‚d S )Nr5   r3   r4   re   r~   r‚   r:   zx.a x.b x.c x.d x.e x.f x.grI   zv        x.a = 1;
        x.b = 2;
        x.c = 3;
        x.d = 4;
        x.e = 5;
        x.f = 6;
        x.g = 7;)r#   r   r   ÚtextwrapÚdedentr&   )r…   rD   rJ   r'   r'   r(   Ú*test_Matrices_1x7_spread_assign_to_symbols•  s    rŽ   c                  C   s6   t } d}tdƒtdƒf}| ||d�t d¡ks2t‚d S )N)rg   rg   rŠ   úx y zrI   úY        a = 1;
        b = 2;
        c = 3;
        x = 1;
        y = 2;
        z = 3;©r#   r   rŒ   r�   r&   ©r…   rQ   rJ   r'   r'   r(   Ú$test_spread_assign_to_nested_symbols£  s    r“   c            	      C   sR   t } tdƒ\}}}}}}d}||f|f||f|ff}| ||d�t d¡ksNt‚d S )Nza b c x y z)©©r5   r3   r4   r”   rI   r�   r‘   )	r…   rs   rt   rN   r%   r.   r/   rQ   rJ   r'   r'   r(   Ú+test_spread_assign_to_deeply_nested_symbols°  s
    r–   c               	   C   sb   t } tƒ � tddgddggƒ}W 5 Q R X tdƒtdƒtdƒtdƒf}| ||ƒt d	¡ks^t‚d S )
Nr•   )r4   re   )r~   r‚   )r:   é   za bzc dze fzg hzw        a = 1;
        b = 2;
        c = 3;
        d = 4;
        e = 5;
        f = 6;
        g = 7;
        h = 8;)r#   r   r   r   rŒ   r�   r&   r’   r'   r'   r(   Ú.test_matrix_of_tuples_spread_assign_to_symbols¾  s
    r˜   c                      s$   d‰t dƒ‰ tt‡ ‡fdd„ƒ d S )Nr•   r�   c                      s
   t ˆˆ ƒS rO   r"   r'   ©rJ   rQ   r'   r(   rR   Ñ  rS   z?test_cannot_assign_to_cause_mismatched_length.<locals>.<lambda>)r   r   rT   r'   r'   r™   r(   Ú-test_cannot_assign_to_cause_mismatched_lengthÎ  s    rš   c                  C   sR   t } tdddƒtdddƒ tdddƒ }tdddƒ}| ||d�t d¡ksNt‚d S )NrD   re   r`   ÚCÚXrI   a/          X[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0] + A[0][2]*B[2][0] + A[0][3]*B[3][0] + C[0][0];
        X[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1] + A[0][2]*B[2][1] + A[0][3]*B[3][1] + C[0][1];
        X[0][2] = A[0][0]*B[0][2] + A[0][1]*B[1][2] + A[0][2]*B[2][2] + A[0][3]*B[3][2] + C[0][2];
        X[0][3] = A[0][0]*B[0][3] + A[0][1]*B[1][3] + A[0][2]*B[2][3] + A[0][3]*B[3][3] + C[0][3];
        X[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0] + A[1][2]*B[2][0] + A[1][3]*B[3][0] + C[1][0];
        X[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1] + A[1][2]*B[2][1] + A[1][3]*B[3][1] + C[1][1];
        X[1][2] = A[1][0]*B[0][2] + A[1][1]*B[1][2] + A[1][2]*B[2][2] + A[1][3]*B[3][2] + C[1][2];
        X[1][3] = A[1][0]*B[0][3] + A[1][1]*B[1][3] + A[1][2]*B[2][3] + A[1][3]*B[3][3] + C[1][3];
        X[2][0] = A[2][0]*B[0][0] + A[2][1]*B[1][0] + A[2][2]*B[2][0] + A[2][3]*B[3][0] + C[2][0];
        X[2][1] = A[2][0]*B[0][1] + A[2][1]*B[1][1] + A[2][2]*B[2][1] + A[2][3]*B[3][1] + C[2][1];
        X[2][2] = A[2][0]*B[0][2] + A[2][1]*B[1][2] + A[2][2]*B[2][2] + A[2][3]*B[3][2] + C[2][2];
        X[2][3] = A[2][0]*B[0][3] + A[2][1]*B[1][3] + A[2][2]*B[2][3] + A[2][3]*B[3][3] + C[2][3];
        X[3][0] = A[3][0]*B[0][0] + A[3][1]*B[1][0] + A[3][2]*B[2][0] + A[3][3]*B[3][0] + C[3][0];
        X[3][1] = A[3][0]*B[0][1] + A[3][1]*B[1][1] + A[3][2]*B[2][1] + A[3][3]*B[3][1] + C[3][1];
        X[3][2] = A[3][0]*B[0][2] + A[3][1]*B[1][2] + A[3][2]*B[2][2] + A[3][3]*B[3][2] + C[3][2];
        X[3][3] = A[3][0]*B[0][3] + A[3][1]*B[1][3] + A[3][2]*B[2][3] + A[3][3]*B[3][3] + C[3][3];)r#   r    rŒ   r�   r&   r’   r'   r'   r(   Útest_matrix_4x4_assignÓ  s    $r�   c               	   C   s¾   t } tddƒD ]ª}tt|ƒƒ}| | ¡ ƒ| |ƒks6t‚| |dd�| |ƒksNt‚|dkr|dkrŒ| |ƒd|d dd	„ t|ƒD ƒ¡f ks¸t‚q| |ƒd
|d dd	„ t|ƒD ƒ¡f kst‚qd S )Nr5   é
   T©Úmat_transposere   z	vec%s(%s)z, c                 s   s   | ]}t |ƒV  qd S rO   ©Ústr©Ú.0rW   r'   r'   r(   Ú	<genexpr>ò  s     z test_1xN_vecs.<locals>.<genexpr>zfloat[%s](%s)c                 s   s   | ]}t |ƒV  qd S rO   r¡   r£   r'   r'   r(   r¥   ô  s     )r#   Úranger   rƒ   r&   Újoin)r…   rE   rD   r'   r'   r(   Útest_1xN_vecsê  s    .r¨   c            	         s¤  d} t ddƒD �]h}t ddƒD �]V‰ t‡ fdd„t |ƒD ƒƒ}t|ƒ}t|dd�}| dtƒ  |¡ d	 7 } | d
| d 7 } | d| d 7 } | d7 } | d7 } |dkr¸ˆ dkr¸|dks¶t‚q|dk�rˆ dk�r|dk�rˆ dk�r| dˆ  ¡sòt‚| d| ¡�svt‚q|dk�r.ˆ dk�r.| d¡�svt‚qˆ dk�rT|dk�rT| d¡�svt‚q|dk�r�| dˆ  | ¡�svt‚| dˆ  | ¡�svt‚qˆ dk�rÌ| d| ˆ  ¡�s²t‚| d| ˆ  ¡�svt‚q| d|ˆ   ¡�sät‚| d|ˆ   ¡�süt‚t|dd�}t|ddd�}| d|ˆ f ¡�s.t‚| dˆ |f ¡�sFt‚| d| d 7 } | d| d 7 } | d7 } | d7 } qqd}|�r tddƒ}| | ¡ | 	¡  d S )Nzdef test_misc_mats():
r5   r‚   c                    s$   g | ]‰ ‡‡ fd d„t ˆƒD ƒ‘qS )c                    s   g | ]}|ˆˆ   ‘qS r'   r'   )r¤   r%   )r^   r.   r'   r(   Ú
<listcomp>ú  s     z,test_MxN_mats.<locals>.<listcomp>.<listcomp>)r¦   )r¤   ©r^   )r.   r(   r©   ú  s     z!test_MxN_mats.<locals>.<listcomp>TrŸ   z
    mat = z

z    gl = '''z'''
z    glTransposed = '''z'''

z     assert glsl_code(mat) == gl
z=    assert glsl_code(mat,mat_transpose=True) == glTransposed
Ú0re   zmat%sZvecz
float[%s](©Ú
mat_nested)r    r­   zfloat[%s][%s]z    glNested = '''z    glNestedTransposed = '''z6    assert glsl_code(mat,mat_nested=True) == glNested
zT    assert glsl_code(mat,mat_nested=True,mat_transpose=True) == glNestedTransposed

Fztest_glsl_generated_matrices.pyÚw)
r¦   r   r#   r   Z_printr&   Ú
startswithÚopenÚwriteÚclose)	ZgeneratedAssertionsrE   rD   r…   ÚglTransposedÚglNestedÚglNestedTransposedZgenerateAssertionsÚgenr'   rª   r(   Útest_MxN_matsö  sR    (



r·   c               
   C   s>	  t dggƒ} d}d}t| ƒ|ks$t‚t| dd�|ks8t‚t ddggƒ} d}d}t| ƒ|ks^t‚t| dd�|ksrt‚t dddggƒ} d}d}t| ƒ|ksšt‚t| dd�|ks®t‚t dddd	ggƒ} d
}d
}t| ƒ|ksØt‚t| dd�|ksìt‚t dddd	dggƒ} d}d}t| ƒ|k�st‚t| dd�|k�s0t‚t dgdggƒ} d}d}t| ƒ|k�sZt‚t| dd�|k�spt‚t ddgdd	ggƒ} d}d}t| ƒ|k�sžt‚t| dd�|k�s´t‚t dddgd	ddggƒ} d}d}t| ƒ|k�sæt‚t| dd�|k�süt‚t dddd	gddddggƒ} d}d}t| ƒ|k�s2t‚t| dd�|k�sHt‚t dddd	dgdddddggƒ} d}d}t| ƒ|k�s‚t‚t| dd�|k�s˜t‚d}d}t| dd�|k�s¶t‚t| ddd�|k�sÎt‚t dgdgdggƒ} d}d}t| ƒ|k�süt‚t| dd�|k�st‚t ddgdd	gddggƒ} d}d}t| ƒ|k�sFt‚t| dd�|k�s\t‚t dddgd	ddgdddggƒ} d }d!}t| ƒ|k�s–t‚t| dd�|k�s¬t‚t dddd	gddddgddd"d#ggƒ} d$}d%}t| ƒ|k�sìt‚t| dd�|k�st‚t dddd	dgdddddgd"d#d&d'd(ggƒ} d)}d*}t| ƒ|k�sHt‚t| dd�|k�s^t‚d+}d,}t| dd�|k�s|t‚t| ddd�|k�s”t‚t dgdgdgd	ggƒ} d
}d
}t| ƒ|k�sÆt‚t| dd�|k�sÜt‚t ddgdd	gddgddggƒ} d-}d.}t| ƒ|k�st‚t| dd�|k�s,t‚t dddgd	ddgdddgdd"d#ggƒ} d/}d0}t| ƒ|k�snt‚t| dd�|k�s„t‚t dddd	gddddgddd"d#gd&d'd(d1ggƒ} d2}d3}t| ƒ|k�sÎt‚t| dd�|k�sät‚t dddd	dgdddddgd"d#d&d'd(gd1d4d5d6d7ggƒ} d8}d9}t| ƒ|k�s6t‚t| dd�|k�sLt‚d:}d;}t| dd�|k�sjt‚t| ddd�|k�s‚t‚t dgdgdgd	gdggƒ} d}d}t| ƒ|k�s¸t‚t| dd�|k�sÎt‚t ddgdd	gddgddgddggƒ} d<}d=}t| ƒ|k�st‚t| dd�|k�s$t‚d>}d?}t| dd�|k�sBt‚t| ddd�|k�sZt‚t dddgd	ddgdddgdd"d#gd&d'd(ggƒ} d@}dA}t| ƒ|k�s¤t‚t| dd�|k�sºt‚dB}dC}t| dd�|k�sØt‚t| ddd�|k�sðt‚t dddd	gddddgddd"d#gd&d'd(d1gd4d5d6d7ggƒ} dD}dE}t| ƒ|k�sDt‚t| dd�|k�sZt‚dF}dG}t| dd�|k�sxt‚t| ddd�|k�s�t‚t dddd	dgdddddgd"d#d&d'd(gd1d4d5d6d7gdHdIdJdKdLggƒ} dM}dN}t| ƒ|k�sît‚t| dd�|k�	st‚dO}dP}t| dd�|k�	s"t‚t| ddd�|k�	s:t‚d S )QNr   r«   TrŸ   r5   z
vec2(0, 1)r3   zvec3(0, 1, 2)r4   zvec4(0, 1, 2, 3)re   zfloat[5](0, 1, 2, 3, 4)zmat2(0, 1, 2, 3)zmat2(0, 2, 1, 3)r~   zmat3x2(0, 1, 2, 3, 4, 5)zmat2x3(0, 3, 1, 4, 2, 5)r‚   r:   zmat4x2(0, 1, 2, 3, 4, 5, 6, 7)zmat2x4(0, 4, 1, 5, 2, 6, 3, 7)r—   r<   zBfloat[10](
   0, 1, 2, 3, 4,
   5, 6, 7, 8, 9
) /* a 2x5 matrix */zKfloat[10](
   0, 5,
   1, 6,
   2, 7,
   3, 8,
   4, 9
) /* a 5x2 matrix */zCfloat[2][5](
   float[](0, 1, 2, 3, 4),
   float[](5, 6, 7, 8, 9)
)zgfloat[5][2](
   float[](0, 5),
   float[](1, 6),
   float[](2, 7),
   float[](3, 8),
   float[](4, 9)
)r¬   )r­   r    zmat2x3(0, 1, 2, 3, 4, 5)zmat3x2(0, 2, 4, 1, 3, 5)zmat3(0, 1, 2, 3, 4, 5, 6, 7, 8)zmat3(0, 3, 6, 1, 4, 7, 2, 5, 8)rž   é   z0mat4x3(0, 1,  2,  3, 4, 5,  6,  7, 8, 9, 10, 11)z.mat3x4(0, 4,  8, 1, 5,  9, 2, 6, 10, 3, 7, 11)é   é   é   zafloat[15](
   0,  1,  2,  3,  4,
   5,  6,  7,  8,  9,
   10, 11, 12, 13, 14
) /* a 3x5 matrix */z_float[15](
   0, 5, 10,
   1, 6, 11,
   2, 7, 12,
   3, 8, 13,
   4, 9, 14
) /* a 5x3 matrix */zmfloat[3][5](
   float[]( 0,  1,  2,  3,  4),
   float[]( 5,  6,  7,  8,  9),
   float[](10, 11, 12, 13, 14)
)z{float[5][3](
   float[](0, 5, 10),
   float[](1, 6, 11),
   float[](2, 7, 12),
   float[](3, 8, 13),
   float[](4, 9, 14)
)zmat2x4(0, 1, 2, 3, 4, 5, 6, 7)zmat4x2(0, 2, 4, 6, 1, 3, 5, 7)z2mat3x4(0,  1,  2, 3,  4,  5, 6,  7,  8, 9, 10, 11)z-mat4x3(0, 3, 6,  9, 1, 4, 7, 10, 2, 5, 8, 11)é   zDmat4( 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15)z<mat4(0, 4,  8, 12, 1, 5,  9, 13, 2, 6, 10, 14, 3, 7, 11, 15)é   é   r;   é   zxfloat[20](
   0,  1,  2,  3,  4,
   5,  6,  7,  8,  9,
   10, 11, 12, 13, 14,
   15, 16, 17, 18, 19
) /* a 4x5 matrix */zsfloat[20](
   0, 5, 10, 15,
   1, 6, 11, 16,
   2, 7, 12, 17,
   3, 8, 13, 18,
   4, 9, 14, 19
) /* a 5x4 matrix */z�float[4][5](
   float[]( 0,  1,  2,  3,  4),
   float[]( 5,  6,  7,  8,  9),
   float[](10, 11, 12, 13, 14),
   float[](15, 16, 17, 18, 19)
)z�float[5][4](
   float[](0, 5, 10, 15),
   float[](1, 6, 11, 16),
   float[](2, 7, 12, 17),
   float[](3, 8, 13, 18),
   float[](4, 9, 14, 19)
)zKfloat[10](
   0, 1,
   2, 3,
   4, 5,
   6, 7,
   8, 9
) /* a 5x2 matrix */zBfloat[10](
   0, 2, 4, 6, 8,
   1, 3, 5, 7, 9
) /* a 2x5 matrix */zgfloat[5][2](
   float[](0, 1),
   float[](2, 3),
   float[](4, 5),
   float[](6, 7),
   float[](8, 9)
)zCfloat[2][5](
   float[](0, 2, 4, 6, 8),
   float[](1, 3, 5, 7, 9)
)zefloat[15](
   0,  1,  2,
   3,  4,  5,
   6,  7,  8,
   9, 10, 11,
   12, 13, 14
) /* a 5x3 matrix */zZfloat[15](
   0, 3, 6,  9, 12,
   1, 4, 7, 10, 13,
   2, 5, 8, 11, 14
) /* a 3x5 matrix */z…float[5][3](
   float[]( 0,  1,  2),
   float[]( 3,  4,  5),
   float[]( 6,  7,  8),
   float[]( 9, 10, 11),
   float[](12, 13, 14)
)zdfloat[3][5](
   float[](0, 3, 6,  9, 12),
   float[](1, 4, 7, 10, 13),
   float[](2, 5, 8, 11, 14)
)zzfloat[20](
   0,  1,  2,  3,
   4,  5,  6,  7,
   8,  9, 10, 11,
   12, 13, 14, 15,
   16, 17, 18, 19
) /* a 5x4 matrix */zrfloat[20](
   0, 4,  8, 12, 16,
   1, 5,  9, 13, 17,
   2, 6, 10, 14, 18,
   3, 7, 11, 15, 19
) /* a 4x5 matrix */z™float[5][4](
   float[]( 0,  1,  2,  3),
   float[]( 4,  5,  6,  7),
   float[]( 8,  9, 10, 11),
   float[](12, 13, 14, 15),
   float[](16, 17, 18, 19)
)z…float[4][5](
   float[](0, 4,  8, 12, 16),
   float[](1, 5,  9, 13, 17),
   float[](2, 6, 10, 14, 18),
   float[](3, 7, 11, 15, 19)
)é   é   é   é   é   z�float[25](
   0,  1,  2,  3,  4,
   5,  6,  7,  8,  9,
   10, 11, 12, 13, 14,
   15, 16, 17, 18, 19,
   20, 21, 22, 23, 24
) /* a 5x5 matrix */z‡float[25](
   0, 5, 10, 15, 20,
   1, 6, 11, 16, 21,
   2, 7, 12, 17, 22,
   3, 8, 13, 18, 23,
   4, 9, 14, 19, 24
) /* a 5x5 matrix */z­float[5][5](
   float[]( 0,  1,  2,  3,  4),
   float[]( 5,  6,  7,  8,  9),
   float[](10, 11, 12, 13, 14),
   float[](15, 16, 17, 18, 19),
   float[](20, 21, 22, 23, 24)
)z£float[5][5](
   float[](0, 5, 10, 15, 20),
   float[](1, 6, 11, 16, 21),
   float[](2, 7, 12, 17, 22),
   float[](3, 8, 13, 18, 23),
   float[](4, 9, 14, 19, 24)
))r   r#   r&   )r€   r…   r³   r´   rµ   r'   r'   r(   Útest_misc_mats%  sæ   þþþ

þþýýý


ýýüüü



üüûûû




ûûrÅ   )RZ
sympy.corer   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Zsympy.functionsr   r   r   r   r   r   r   Zsympy.testing.pytestr   r   Zsympy.printing.glslr   Zsympy.printing.strr   Zsympy.utilities.lambdifyr   Zsympy.tensorr   r   Zsympy.matricesr   r    r!   r#   rŒ   r%   r.   r/   r)   r0   r1   r6   r7   r8   r9   r?   rB   rC   rK   rL   rM   rX   rY   r]   rd   rh   rk   rp   rq   rw   rx   r|   r�   r†   r‰   r‹   rŽ   r“   r–   r˜   rš   r�   r¨   r·   rÅ   r'   r'   r'   r(   Ú<module>   s`   D$			
	0+/