Ë
    7^(h_Q  ã                  óè  — d Z ddlmZ ddlmZ ddl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mZmZ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  G d„ de«      Z G d„ de«      Z eefee fdœZ!i dd“dd“dd“dd„ ddfd„ ddfd„ ddfd„ ddfd „ d!d"fd#„ d$d%fd&„ d'd%fg“d(d)„ d(dfg“d*d+“d,d-“d.d/“d0d0“d1d1“d2d2“d3d3“d4d4“d5d5“d6d6“d7d7“d8d8“d9d:d;d<dd=œ¥Z"g d>¢Z# G d?„ d@e«      Z$ G dA„ dBe«      Z%y)Ca  
Rust code printer

The `RustCodePrinter` converts SymPy expressions into Rust expressions.

A complete code generator, which uses `rust_code` extensively, can be found
in `sympy.utilities.codegen`. The `codegen` module can be used to generate
complete source code files.

é    )Úannotations)ÚreduceN)ÚAny)Úfloat32Úfloat64Úint32ÚrealÚintegerÚbool_)ÚSÚRationalÚFloatÚLambda)ÚExpr©Úequal_valued)ÚceilingÚfloor)ÚCodePrinter)Ú
PRECEDENCEc                  ó   — e Zd ZdZd„ Zy)Úfloat_floorzi
    Same as `sympy.floor`, but mimics the Rust behavior of returning a float rather than an integer
    c                 ó   — y©NF© ©Úselfs    úQ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/printing/rust.pyÚ_eval_is_integerzfloat_floor._eval_is_integerE   ó   € Øó    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r   r   r   A   ó   „ ñór!   r   c                  ó   — e Zd ZdZd„ Zy)Úfloat_ceilingzk
    Same as `sympy.ceiling`, but mimics the Rust behavior of returning a float rather than an integer
    c                 ó   — yr   r   r   s    r   r   zfloat_ceiling._eval_is_integerL   r    r!   Nr"   r   r!   r   r)   r)   H   r'   r!   r)   )r   r   r   ÚceilÚAbsÚabsÚPowc                ó   — t        |d«      S )Néÿÿÿÿr   ©ÚbaseÚexps     r   ú<lambda>r4   f   s   € œ|¨C°Ó4€ r!   Úrecipé   c                ó   — t        |d«      S )Ng      à?r   r1   s     r   r4   r4   g   s   € œ|¨C°Ó5€ r!   Úsqrtc                ó   — t        |d«      S )Ng      à¿r   r1   s     r   r4   r4   h   s   € œ|¨C°Ó6€ r!   zsqrt().recipc                ó    — |t        dd«      k(  S )Né   é   )r   r1   s     r   r4   r4   i   s   € ˜s¤h¨q°!£nÑ4€ r!   Úcbrtc                ó   — t        | d«      S )Nr6   r   r1   s     r   r4   r4   j   s   € œ|¨D°!Ó4€ r!   Úexp2r<   c                ó   — |j                   S ©N©Ú
is_integerr1   s     r   r4   r4   k   s
   € ˜sŸ~™~€ r!   Úpowir;   c                ó   — |j                    S rA   rB   r1   s     r   r4   r4   l   s   €  3§>¡>Ð1€ r!   Úpowfr3   c                 ó   — y)NTr   )r3   s    r   r4   r4   m   s   � r!   ÚlogÚlnÚMaxÚmaxÚMinÚminÚsinÚcosÚtanÚasinÚacosÚatanÚatan2ÚsinhÚcoshÚtanhÚasinhÚacoshÚatanh)rW   rX   rY   rZ   r8   )4ÚabstractÚasÚasyncÚawaitÚbecomeÚboxÚbreakÚconstÚcontinueÚcrateÚdoÚdynÚelseÚenumÚexternÚfalseÚfinalÚfnÚforÚgenÚifÚimplÚinÚletÚloopÚmacroÚmatchÚmodÚmoveÚmutÚoverrideÚprivÚpubÚrefÚreturnÚSelfr   ÚstaticÚstructÚsuperÚtraitÚtrueÚtryÚtypeÚtypeofÚunsafeÚunsizedÚuseÚvirtualÚwhereÚwhileÚyieldc                  óL   ‡ — e Zd ZdZdˆ fd„Zed„ «       Zed„ «       Zdd„Zˆ xZ	S )ÚTypeCastz9
    The type casting operator of the Rust language.
    c                óÂ   •— t         ‰| �  «        |j                  xr |t        u| _        |j
                  | _        | j                  rt        | dt        d   dz   «       y y )NÚ
precedenceÚFuncé
   )r�   Ú__init__rC   r
   ÚexplicitÚ_assumptionsÚsetattrr   )r   ÚexprÚtype_Ú	__class__s      €r   r”   zTypeCast.__init__ý   sS   ø€ Ü‰ÑÔØŸ™Ò@¨E¼Ð,@ˆŒØ ×-Ñ-ˆÔØ�=Š=Ü�D˜,¬
°6Ñ(:¸RÑ(?Õ@ð r!   c                ó    — | j                   d   S )Nr   ©Úargsr   s    r   r˜   zTypeCast.expr  ó   € à�y‰y˜‰|Ðr!   c                ó    — | j                   d   S )Nr;   rœ   r   s    r   r™   zTypeCast.type_  rž   r!   c                ó@   — | j                   d   j                  |¬«      S )Nr   )Úorder)r�   Úsort_key)r   r¡   s     r   r¢   zTypeCast.sort_key  s   € Ø�y‰y˜‰|×$Ñ$¨5Ð$Ó1Ð1r!   )r}   ÚNonerA   )
r#   r$   r%   r&   r”   Úpropertyr˜   r™   r¢   Ú__classcell__©rš   s   @r   r�   r�   ø   s;   ø„ ñõAð ñó ðð ñó ð÷2r!   r�   c            	      ó°  ‡ — e Zd ZU dZdZdZeeee	iZ
edede	dediZ eej                   fi di d	 e«       d
œ¤ŽZded<   i fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zd7ˆ fd„	Zd„ Zd„ Z d8ˆ fd„	Z!d8ˆ fd„	Z"d„ Z#d„ Z$d„ Z%d „ Z&d!„ Z'd8d"„Z(d8d#„Z)d8d$„Z*d8d%„Z+d8d&„Z,d8d'„Z-d8d(„Z.d8d)„Z/d*„ Z0d+„ Z1d,„ Z2d-„ Z3d.„ Z4ˆ fd/„Z5d0„ Z6d1„ Z7d2„ Z8d3„ Z9d4„ Z:d5„ Z;d6„ Z<ˆ xZ=S )9ÚRustCodePrinterz>A printer to convert SymPy expressions to strings of Rust codeÚ
_rust_codeÚRustÚi32Úf32Úf64Úboolé   T)Ú	precisionÚuser_functionsÚcontractÚdereferencezdict[str, Any]Ú_default_settingsc                ó0  — t        j                  | |«       t        t        «      | _        |j	                  di «      }| j                  j                  |«       t        |j	                  dg «      «      | _        t        t        «      | _        t        | _	        y )Nr±   r³   )
r   r”   ÚdictÚknown_functionsÚgetÚupdateÚsetÚ_dereferenceÚreserved_wordsÚfunction_overrides)r   ÚsettingsÚ	userfuncss      r   r”   zRustCodePrinter.__init__(  sq   € Ü×Ñ˜T 8Ô,Ü#¤OÓ4ˆÔØ—L‘LÐ!1°2Ó6ˆ	Ø×Ñ×#Ñ# IÔ.Ü §¡¨]¸BÓ ?Ó@ˆÔÜ!¤.Ó1ˆÔÜ"4ˆÕr!   c                ó   — |dz  S )Né   r   )r   Úps     r   Ú_rate_index_positionz$RustCodePrinter._rate_index_position1  s   € Ø�‰sˆ
r!   c                ó   — d|z  S )Nz%s;r   )r   Ú
codestrings     r   Ú_get_statementzRustCodePrinter._get_statement4  s   € Ø�zÑ!Ð!r!   c                ó   — d|z  S )Nz// %sr   )r   Útexts     r   Ú_get_commentzRustCodePrinter._get_comment7  s   € Ø˜‰~Ðr!   c                óZ   — | j                   | j                  t              }d|›d|›d|›d�S )Nzconst z: ú = ú;)Útype_mappingsÚtype_aliasesr	   )r   ÚnameÚvaluer™   s       r   Ú_declare_number_constz%RustCodePrinter._declare_number_const:  s*   € Ø×"Ñ" 4×#4Ñ#4´TÑ#:Ñ;‰Ú'+ªU²EÐ:Ð:r!   c                ó$   — | j                  |«      S rA   )Úindent_code)r   Úliness     r   Ú_format_codezRustCodePrinter._format_code>  s   € Ø×Ñ Ó&Ð&r!   c                óJ   ‡— |j                   \  }Šˆfd„t        |«      D «       S )Nc              3  óF   •K  — | ]  }t        ‰«      D ]  }||f–— Œ
 Œ y ­wrA   )Úrange)Ú.0ÚiÚjÚcolss      €r   ú	<genexpr>z;RustCodePrinter._traverse_matrix_indices.<locals>.<genexpr>C  s%   øè ø€ ÒA˜1´U¸4³[ÒA°��A”ÐA�ÑAùs   ƒ!)ÚshaperØ   )r   ÚmatÚrowsrÜ   s      @r   Ú_traverse_matrix_indicesz(RustCodePrinter._traverse_matrix_indicesA  s   ø€ Ø—Y‘Y‰
ˆˆdÛA¤ d£ÔAÐAr!   c           
     óþ   — g }g }d}|D ]o  }|j                  || j                  |«      | j                  |j                  «      | j                  |j                  dz   «      dœz  «       |j                  d«       Œq ||fS )Nz#for %(var)s in %(start)s..%(end)s {r;   )ÚvarÚstartÚendú})ÚappendÚ_printÚlowerÚupper)r   ÚindicesÚ
open_linesÚclose_linesÚ	loopstartrÚ   s         r   Ú_get_loop_opening_endingz(RustCodePrinter._get_loop_opening_endingE  s†   € Øˆ
ØˆØ9ˆ	Øò 	$ˆAà×Ñ˜iØ—{‘{ 1“~ØŸ™ Q§W¡WÓ-Ø—{‘{ 1§7¡7¨Q¡;Ó/ñ+1ñ 1ô 2ð ×Ñ˜sÕ#ð	$ð ˜;Ð&Ð&r!   c                óÀ   — t        |j                  «      dkD  rd| j                  |«      z   dz   S |j                  r| j                  |d¬«      S | j                  |«      S )Nr;   ú(ú)T)Ú_type)Úlenr�   rè   Ú	is_number©r   r˜   s     r   Ú_print_caller_varz!RustCodePrinter._print_caller_varR  sV   € Üˆt�y‰y‹>˜AÒð ˜Ÿ™ TÓ*Ñ*¨SÑ0Ð0Ø�^Š^Ø—;‘;˜t¨4�;Ó0Ð0à—;‘;˜tÓ$Ð$r!   c                ór  — |j                   j                  | j                  v �r6| j                  |j                   j                     }d}d}t        |t        «      r|}n|D ]  \  }}} ||j
                  Ž sŒ n |�Ý|dk(  r^d| j                  |j
                  d   «      |t        |j
                  «      dkD  r| j                  |j
                  dd d«      nddœz  }|S |dk(  r&d	| j                  |j
                  d   «      |d
œz  }|S |dk(  r&d	| j                  |j
                  d   «      |d
œz  }|S d|| j                  |j
                  d«      dœz  }|S yt        |d«      rBt        |j                  t        «      r(| j                   |j                  |j
                  Ž «      S | j                  |«      S )a<  
        basic function for printing `Function`

        Function Style :

        1. args[0].func(args[1:]), method with arguments
        2. args[0].func(), method without arguments
        3. args[1].func(), method without arguments (e.g. (e, x) => x.exp())
        4. func(args), function with arguments
        Nr;   z%(var)s.%(method)s(%(args)s)r   ú, Ú )rã   Úmethodr�   r6   z%(var)s.%(method)s())rã   rû   r<   z%(func)s(%(args)s))Úfuncr�   Ú_imp_)rü   r#   r·   Ú
isinstanceÚstrr�   r÷   rô   Ú	stringifyÚhasattrrý   r   rè   Ú_print_not_supported)r   r˜   Ú	cond_funcrü   ÚstyleÚcondÚrets          r   Ú_print_FunctionzRustCodePrinter._print_Function]  sÇ  € ð �9‰9×Ñ ×!5Ñ!5Ò5Ø×,Ñ,¨T¯Y©Y×-?Ñ-?Ñ@ˆIØˆDØˆEÜ˜)¤SÔ)Ø ‘à)2ò Ñ%�D˜$ Ù˜TŸY™YÒ'Ùðð ÐØ˜A’:Ø8Ø#×5Ñ5°d·i±iÀ±lÓCØ"&ÜGJÈ4Ï9É9Ã~ÐXYÒGY §¡¨t¯y©y¸¸¨}¸dÔ CÐ_añ<ñ �Cð( �
ð ˜a’ZØ0Ø#×5Ñ5°d·i±iÀ±lÓCØ"&ñ4ñ �Cð �
ð ˜a’ZØ0Ø#×5Ñ5°d·i±iÀ±lÓCØ"&ñ4ñ �Cð �
ð	 /Ø $Ø $§¡¨t¯y©y¸$Ó ?ñ2ñ �Cð �
ð-  ô. �T˜7Ô#¬
°4·:±:¼vÔ(Fà—;‘;˜z˜tŸz™z¨4¯9©9Ð5Ó6Ð6à×,Ñ,¨TÓ2Ð2r!   c                óº   •‡ — t        d„ |j                  D «       «      }|r-t        t        j                  ˆ fd„|j                  D «       «      }t
        ‰‰ �  |«      S )Nc              3  óR   K  — | ]  }|j                   xr |j                   –— Œ! y ­wrA   ©Úis_realrC   ©rÙ   Úargs     r   rÝ   z-RustCodePrinter._print_Mul.<locals>.<genexpr>‘  ó#   è ø€ ÒVÀS˜cŸk™kÒ@°#·.±.Ð.@Ó@ÑVùó   ‚%'c              3  óN   •K  — | ]  }|d k7  r‰j                  |«      n|–— Œ y­w)r0   N©Ú_cast_to_float©rÙ   r  r   s     €r   rÝ   z-RustCodePrinter._print_Mul.<locals>.<genexpr>“  s)   øè ø€ Ò'lÐ[^ÀCÈ2ÂI¨×(;Ñ(;¸CÔ(@ÐSVÓ(VÑ'lùs   ƒ"%)Úanyr�   r   ÚoperatorÚmulr�   Ú
_print_Mul)r   r˜   Úcontains_floatsrš   s   `  €r   r  zRustCodePrinter._print_Mul�  sG   ù€ ÜÑVÈDÏIÉIÔVÓVˆÙÜœ(Ÿ,™,Ó'lÐbf×bkÑbkÔ'lÓmˆDä‰wÑ! $Ó'Ð'r!   c                ó¼   •‡ — t        d„ |j                  D «       «      }|r-t        t        j                  ˆ fd„|j                  D «       «      }t
        ‰‰ �  ||«      S )Nc              3  óR   K  — | ]  }|j                   xr |j                   –— Œ! y ­wrA   r
  r  s     r   rÝ   z-RustCodePrinter._print_Add.<locals>.<genexpr>˜  r  r  c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrA   r  r  s     €r   rÝ   z-RustCodePrinter._print_Add.<locals>.<genexpr>š  s   øè ø€ Ò(WÀc¨×)<Ñ)<¸S×)AÑ(Wùó   ƒ)r  r�   r   r  Úaddr�   Ú
_print_Add)r   r˜   r¡   r  rš   s   `   €r   r  zRustCodePrinter._print_Add—  sF   ù€ ÜÑVÈDÏIÉIÔVÓVˆÙÜœ(Ÿ,™,Ó(WÈTÏYÉYÔ(WÓXˆDä‰wÑ! $¨Ó.Ð.r!   c                óü   — |j                   j                  rV|j                  j                  s@ t        |«      t	        |j                   «      |j                  «      }| j                  |«      S | j                  |«      S rA   )r2   rC   r3   r…   r   rè   r  rö   s     r   Ú
_print_PowzRustCodePrinter._print_Powž  sZ   € Ø�9‰9×Ò¨¯©×(;Ò(;Ø”4˜“:œe D§I¡IÓ.°·±Ó9ˆDØ—;‘;˜tÓ$Ð$Ø×#Ñ# DÓ)Ð)r!   c                óÚ   — |j                   s| j                  |j                  «      S | j                  |j                  «      d| j                  | j                  |j
                        z  z   S )Nz as %s)r•   rè   r˜   rÍ   rÎ   r™   rö   s     r   Ú_print_TypeCastzRustCodePrinter._print_TypeCast¤  sV   € Ø�}Š}Ø—;‘;˜tŸy™yÓ)Ð)à—;‘;˜tŸy™yÓ)¨H°t×7IÑ7IÈ$×J[ÑJ[Ð\`×\fÑ\fÑJgÑ7hÑ,hÑhÐhr!   c                óv   •— t         ‰| �  |«      }|r&|d| j                  | j                  t              z  z   S |S ©Nz_%s)r�   Ú_print_FloatrÍ   rÎ   r	   ©r   r˜   ró   r  rš   s       €r   r%  zRustCodePrinter._print_Floatª  s@   ø€ Ü‰gÑ" 4Ó(ˆÙØ˜ ×!3Ñ!3°D×4EÑ4EÄdÑ4KÑ!LÑLÑLÐLàˆJr!   c                óv   •— t         ‰| �  |«      }|r&|d| j                  | j                  t              z  z   S |S r$  )r�   Ú_print_IntegerrÍ   rÎ   r
   r&  s       €r   r(  zRustCodePrinter._print_Integer±  s@   ø€ Ü‰gÑ$ TÓ*ˆÙØ˜ ×!3Ñ!3°D×4EÑ4EÄgÑ4NÑ!OÑOÑOÐOàˆJr!   c                ó¦   — t        |j                  «      t        |j                  «      }}| j                  | j                  t
              }d|||fz  S )Nz
%d_%s/%d.0)ÚintrÂ   ÚqrÍ   rÎ   r	   )r   r˜   rÂ   r+  Úfloat_suffixs        r   Ú_print_RationalzRustCodePrinter._print_Rational¸  sH   € Ü�4—6‘6‹{œC §¡›Kˆ1ˆØ×)Ñ)¨$×*;Ñ*;¼DÑ*AÑBˆØ˜q ,°Ð2Ñ2Ð2r!   c                óÒ  — |j                   j                  r|j                  j                  r,|j                  j                  rM|j                   j                  s7| j                  |j                   «      }| j                  |j                  «      }n|j                   }|j                  }| j	                  |«      }| j	                  |«      }|j
                  }dj                  |||«      S )Nz{} {} {})ÚlhsrC   Úrhsr  rè   Úrel_opÚformat)r   r˜   r/  r0  Úlhs_codeÚrhs_codeÚops          r   Ú_print_Relationalz!RustCodePrinter._print_Relational½  sª   € Ø�H‰H×Ò¨¯©×(;Ò(;ÀÇÁ×ATÒATÐ]a×]eÑ]e×]pÒ]pØ×%Ñ% d§h¡hÓ/ˆCØ×%Ñ% d§h¡hÓ/‰Cà—(‘(ˆCØ—(‘(ˆCØ—;‘;˜sÓ#ˆØ—;‘;˜sÓ#ˆØ�[‰[ˆØ× Ñ  ¨2¨xÓ8Ð8r!   c                óN  — |j                   }t        j                  }t        j                  }t	        t        |j                  «      «      D ]  }||j                  |   |z  z  }|||   z  }Œ! | j                  |j                  j                  «      ›d| j                  |«      ›d�S )Nú[ú])rÞ   r   ÚZeroÚOneÚreversedrØ   Úrankrë   rè   r2   Úlabel)r   r˜   ÚdimsÚelemÚoffsetrÚ   s         r   Ú_print_IndexedzRustCodePrinter._print_IndexedÉ  s†   € à�z‰zˆÜ�v‰vˆÜ—‘ˆÜœ% §	¡	Ó*Ó+ò 	ˆAØ�D—L‘L ‘O FÑ*Ñ*ˆDØ�d˜1‘gÑ‰Fð	ð  Ÿ;™; t§y¡y§¡Õ7¸¿¹ÀTÕ9JÐKÐKr!   c                ó.   — |j                   j                  S rA   )r>  rÏ   rö   s     r   Ú
_print_IdxzRustCodePrinter._print_IdxÓ  s   € Ø�z‰z�‰Ðr!   c                ó   — |j                   S rA   )rÏ   rö   s     r   Ú_print_DummyzRustCodePrinter._print_DummyÖ  s   € Ø�y‰yÐr!   c                 ó   — y)NÚEr   ©r   r˜   ró   s      r   Ú_print_Exp1zRustCodePrinter._print_Exp1Ù  s   € Ør!   c                 ó   — y)NÚPIr   rI  s      r   Ú	_print_PizRustCodePrinter._print_PiÜ  s   € Ør!   c                 ó   — y)NÚINFINITYr   rI  s      r   Ú_print_InfinityzRustCodePrinter._print_Infinityß  s   € Ør!   c                 ó   — y)NÚNEG_INFINITYr   rI  s      r   Ú_print_NegativeInfinityz'RustCodePrinter._print_NegativeInfinityâ  s   € Ør!   c                 ó   — y)Nrƒ   r   rI  s      r   Ú_print_BooleanTruez"RustCodePrinter._print_BooleanTrueå  s   € Ør!   c                 ó   — y)Nrj   r   rI  s      r   Ú_print_BooleanFalsez#RustCodePrinter._print_BooleanFalseè  s   € Ør!   c                ó4   — t        |«      j                  «       S rA   )rÿ   ré   rI  s      r   Ú_print_boolzRustCodePrinter._print_boolë  s   € Ü�4‹y�‰Ó Ð r!   c                 ó   — y)NÚNANr   rI  s      r   Ú
_print_NaNzRustCodePrinter._print_NaNî  r    r!   c                óH  — |j                   d   j                  dk7  rt        d«      ‚g }t        |j                   «      D ]±  \  }\  }}|dk(  r$|j	                  d| j                  |«      z  «       nM|t        |j                   «      dz
  k(  r|dk(  r|dxx   dz  cc<   n|dxx   d| j                  |«      z  z  cc<   | j                  |«      }|j	                  |«       |j	                  d	«       Œ³ | j                  d
   rdj                  |«      S dj                  |«      S )Nr0   Tz¼All Piecewise expressions must contain an (expr, True) statement to be used as a default condition. Without one, the generated expression may not evaluate to anything under some condition.r   z	if (%s) {r;   z else {z else if (%s) {ræ   Úinlineú ú
)	r�   r  Ú
ValueErrorÚ	enumeraterç   rè   rô   Ú	_settingsÚjoin)r   r˜   rÔ   rÚ   ÚeÚcÚcode0s          r   Ú_print_Piecewisez RustCodePrinter._print_Piecewiseñ  s  € Ø�9‰9�R‰=×Ñ Ò%ô ð /ó 0ð 0ð
 ˆä" 4§9¡9Ó-ò 		‰IˆA‰v��1Ø�AŠvØ—‘˜[¨4¯;©;°q«>Ñ9Õ:Ø”c˜$Ÿ)™)“n qÑ(Ò(¨Q°$ªYØ�b“	˜YÑ&”	à�b“	Ð.°·±¸Q³Ñ?Ñ?“	Ø—K‘K “NˆEØ�L‰L˜ÔØ�L‰L˜Õð		ð �>‰>˜(Ò#Ø—8‘8˜E“?Ð"à—9‘9˜UÓ#Ð#r!   c                óR   — ddl m} | j                  |j                  |d¬«      «      S )Nr   )Ú	PiecewiseF)Údeep)Úsympy.functionsrj  rè   Úrewrite)r   r˜   rj  s      r   Ú
_print_ITEzRustCodePrinter._print_ITE  s!   € Ý-Ø�{‰{˜4Ÿ<™<¨	¸˜<Ó>Ó?Ð?r!   c                ór   ‡ — |j                   dk(  rddj                  ˆ fd„|D «       «      z  S t        d«      ‚)Nr;   z[%s]rù   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrA   )rè   )rÙ   Úar   s     €r   rÝ   z4RustCodePrinter._print_MatrixBase.<locals>.<genexpr>  s   øè ø€ Ò%@¸ d§k¡k°!§nÑ%@ùr  zLFull Matrix Support in Rust need Crates (https://crates.io/keywords/matrix).)rÜ   rd  ra  )r   ÚAs   ` r   Ú_print_MatrixBasez!RustCodePrinter._print_MatrixBase  s4   ø€ Ø�6‰6�QŠ;Ø˜DŸI™IÓ%@¸aÔ%@Ó@Ñ@Ð@äÐkÓlÐlr!   c                ó$   — | j                  |«      S rA   )r  )r   rß   s     r   Ú_print_SparseRepMatrixz&RustCodePrinter._print_SparseRepMatrix  s   € à×(Ñ(¨Ó-Ð-r!   c                óˆ   — |j                   ›d|j                  |j                  |j                   j                  d   z  z   ›d�S )Nr8  r;   r9  )ÚparentrÛ   rÚ   rÞ   rö   s     r   Ú_print_MatrixElementz$RustCodePrinter._print_MatrixElement  s9   € ØŸ;›;ØŸ6™6 D§F¡F¨4¯;©;×+<Ñ+<¸QÑ+?Ñ$?Ó?ðAð 	Ar!   c                óL   •— t         ‰| �  |«      }|| j                  v rd|z  S |S )Nz(*%s))r�   Ú_print_Symbolr»   )r   r˜   rÏ   rš   s      €r   rz  zRustCodePrinter._print_Symbol  s/   ø€ ä‰wÑ$ TÓ*ˆà�4×$Ñ$Ñ$Ø˜T‘>Ð!àˆKr!   c                ó4  — ddl m} |j                  }|j                  }| j                  d   r4|j                  |«      s|j                  |«      r| j                  ||«      S | j                  |«      }| j                  |«      }| j                  |›d|›�«      S )Nr   )ÚIndexedBaser²   rË   )	Úsympy.tensor.indexedr|  r/  r0  rc  ÚhasÚ_doprint_loopsrè   rÆ   )r   r˜   r|  r/  r0  r3  r4  s          r   Ú_print_Assignmentz!RustCodePrinter._print_Assignment'  s�   € Ý4Ø�h‰hˆØ�h‰hˆØ�>‰>˜*Ò%¨3¯7©7°;Ô+?Ø—‘˜Ô$ð ×&Ñ& s¨CÓ0Ð0à—{‘{ 3Ó'ˆHØ—{‘{ 3Ó'ˆHØ×&Ñ&²H¹hÐ'GÓHÐHr!   c                óP   — | j                  |j                  d   «      }d|›d|›d�S )Nr   z(if (z == 0.0) { 0.0 } else { (z).signum() }))rè   r�   )r   r˜   r  s      r   Ú_print_signzRustCodePrinter._print_sign5  s#   € Ø�k‰k˜$Ÿ)™) A™,Ó'‰ÚDGÊÐMÐMr!   c                ól   — |j                   st        |t        «      S |j                  rt	        |«      S |S rA   )rõ   r�   r	   rC   r   rö   s     r   r  zRustCodePrinter._cast_to_float9  s,   € Ø�~Š~Ü˜D¤$Ó'Ð'Ø�_Š_Ü˜“;ÐØˆr!   c                ón   — || j                   v xs& |t        v xs t        | dj                  |«      d«      S )zŠ Check if function ``name`` is either a known function or has its own
            printing method. Used to check if rewriting is possible.z	_print_{}F)r·   r½   Úgetattrr2  )r   rÏ   s     r   Ú
_can_printzRustCodePrinter._can_print@  s=   € ð �t×+Ñ+Ð+Ò{¨tÔ7IÐ/IÒ{ÌWÐUYÐ[f×[mÑ[mÐnrÓ[sÐuzÓM{Ð{r!   c                óê   — t        «       }t        |t        «      rX|j                  r|j	                  |j
                  «       |j                  D ]"  }|j                  | j                  |«      «      }Œ$ |S rA   )	rº   rþ   r   Úis_Functionr  rü   r�   ÚunionÚ_collect_functions)r   r˜   Ú	functionsr  s       r   rŠ  z"RustCodePrinter._collect_functionsI  s`   € Ü“Eˆ	Ü�dœDÔ!Ø×ÒØ—‘˜dŸi™iÔ(Ø—y‘yò J�Ø%ŸO™O¨D×,CÑ,CÀCÓ,HÓI‘	ðJàÐr!   c           	     ó‚  ‡ — t        |t        «      s|S ‰ j                  |«      }‰ j                  j	                  «       D ���ci c]2  \  }\  }}‰ j                  |«      rt        ˆ fd„|D «       «      r|||f“Œ4 }}}}|D ]5  }|j                  |j                  d«      \  }}|sŒ%|j                  |«      }Œ7 |S c c}}}w )Nc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrA   )r†  )rÙ   Úfr   s     €r   rÝ   z;RustCodePrinter._rewrite_known_functions.<locals>.<genexpr>[  s   øè ø€ Ò<¨1�D—O‘O A×&Ñ<ùr  )NN)
rþ   r   rŠ  Ú_rewriteable_functionsÚitemsr†  Úallr¸   r#   rm  )	r   r˜   Úexpression_functionsrÏ   Útarget_fÚrequired_fsÚrewriteable_functionsrü   Ú_s	   `        r   Ú_rewrite_known_functionsz(RustCodePrinter._rewrite_known_functionsR  sÌ   ø€ Ü˜$¤Ô%ØˆKà#×6Ñ6°tÓ<Ðð 26×1LÑ1L×1RÑ1RÓ1T÷!
ð !
á-�Ñ-�x Ø�‰˜xÔ(ÜÓ<°Ô<Ô<ð �8˜[Ð)Ñ)ð!
Ðò !
ð )ò 	.ˆDØ/×3Ñ3°D·M±MÀ<ÓP‰KˆH�aÚØ—|‘| HÓ-‘ð	.ð ˆùô!
s   Á7B:c                ól  — t        |t        «      r1| j                  |j                  d«      «      }dj	                  |«      S d}d}d}|D �cg c]  }|j                  d«      ‘Œ }}|D �cg c]*  }t        t        t        |j                  |«      «      «      ‘Œ, }}|D �cg c]*  }t        t        t        |j                  |«      «      «      ‘Œ, }}g }	d}
t        |«      D ]C  \  }}|dv r|	j                  |«       Œ|
||   z  }
|	j                  ||
z  ›|›�«       |
||   z  }
ŒE |	S c c}w c c}w c c}w )	z0Accepts a string of code or a list of code linesTrú   z    )ú{rñ   z{
z(
)ræ   rò   z 	r   )rú   r`  )rþ   rÿ   rÓ   Ú
splitlinesrd  Úlstripr*  r  ÚmapÚendswithÚ
startswithrb  rç   )r   ÚcodeÚ
code_linesÚtabÚ	inc_tokenÚ	dec_tokenÚlineÚincreaseÚdecreaseÚprettyÚlevelÚns               r   rÓ   zRustCodePrinter.indent_codec  s:  € ô �dœCÔ Ø×)Ñ)¨$¯/©/¸$Ó*?Ó@ˆJØ—7‘7˜:Ó&Ð&àˆØ,ˆ	Øˆ	à04Ö6¨�—‘˜UÕ#Ð6ˆÐ6àIMÖOÀ”SœœS §¡°	Ó:Ó;Õ<ÐOˆÐOà!%ö(Øô œœS §¡°)Ó<Ó=Õ>ð (ˆð (ð ˆØˆÜ  “ò 	!‰GˆAˆtØ�zÑ!Ø—‘˜dÔ#ØØ�X˜a‘[Ñ ˆEØ�M‰M C¨¢I©tÐ4Ô5Ø�X˜a‘[Ñ ‰Eð	!ð ˆùò 7ùâOùò(s   ÁD'Á*/D,Â/D1rA   )F)>r#   r$   r%   r&   ÚprintmethodÚlanguager
   r   r	   r   rÎ   r   r   rÍ   r¶   r   r´   rº   Ú__annotations__r”   rÃ   rÆ   rÉ   rÑ   rÕ   rá   rï   r÷   r  r  r  r   r"  r%  r(  r-  r6  rB  rD  rF  rJ  rM  rP  rS  rU  rW  rY  r\  rh  rn  rs  ru  rx  rz  r€  r‚  r  r†  rŠ  r—  rÓ   r¥   r¦   s   @r   r¨   r¨     sV  ø… ÙHØ€KØ€Hð 	�Øˆgð€Lð 	ˆuØ�Ø�Øˆvð	€Mñ )-¨[×-JÑ-Jñ )ØØØÙ“uñ	Oñ )Ð�~ó ð !#ó 5òò"òò;ò'òBò'ò	%ò13ôf(õ/ò*òiõõò3ò

9òLòòóóóóóóó!óò$ò6@òmò.òAôòIòNòò|òòö"r!   r¨   )&r&   Ú
__future__r   Ú	functoolsr   r  Útypingr   Úsympy.codegen.astr   r   r   r	   r
   r   Ú
sympy.corer   r   r   r   Úsympy.core.exprr   Úsympy.core.numbersr   Ú#sympy.functions.elementary.integersr   r   Úsympy.printing.codeprinterr   Úsympy.printing.precedencer   r   r)   r½   r·   r¼   r�   r¨   r   r!   r   ú<module>r·     sà  ðñ	õB #Ý Û Ý ÷÷ ÷ 2Ó 1Ý  Ý +ß >Ý 2Ý 0ô"�%ô ô�Gô ð �[Ð!Ø˜Ð'ñÐ ð2ð �7ð2ð �Vð2ð 
ˆ5ð2ð  
Ñ4°g¸qÐAÙ5°v¸qÐAÙ6¸ÈÐJÙ4°f¸aÐ@Ù4°f¸aÐ@Ù-¨v°qÐ9Ù1°6¸1Ð=ð?ð!2ð. 
Ñ˜u aÐ(Ð)ð/2ð0 
ˆ4ð12ð< 
ˆ5ð=2ð> 
ˆ5ð?2ðB 
ˆ5ðC2ðD 
ˆ5ðE2ðF 
ˆ5ðG2ðH ˆFðI2ðJ ˆFðK2ðL ˆFðM2ðN ˆWðO2ðV ˆFðW2ðX ˆFðY2ðZ ØØØØòc2€òX3€ôl2ˆtô 2ô0m�kõ mr!   