§
    OŠtj_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%dS )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dS )Úfloat_floorzi
    Same as `sympy.floor`, but mimics the Rust behavior of returning a float rather than an integer
    c                ó   — dS ©NF© ©Úselfs    úQ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/printing/rust.pyÚ_eval_is_integerzfloat_floor._eval_is_integerE   ó   € Øˆuó    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r   r   r   A   ó-   € € € € € ðð ðð ð ð ð r!   r   c                  ó   — e Zd ZdZd„ ZdS )Úfloat_ceilingzk
    Same as `sympy.ceiling`, but mimics the Rust behavior of returning a float rather than an integer
    c                ó   — dS 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Ô4€ r!   Úrecipé   c                ó"   — t          |d¦  «        S )Ng      à?r   r1   s     r   r4   r4   g   s   € �|¨C°Ñ5Ô5€ r!   Úsqrtc                ó"   — t          |d¦  «        S )Ng      à¿r   r1   s     r   r4   r4   h   s   € �|¨C°Ñ6Ô6€ r!   zsqrt().recipc                ó*   — |t          dd¦  «        k    S )Né   é   )r   r1   s     r   r4   r4   i   s   € ˜s¥h¨q°!¡n¤nÒ4€ r!   Úcbrtc                ó"   — t          | d¦  «        S )Nr6   r   r1   s     r   r4   r4   j   s   € �|¨D°!Ñ4Ô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                ó   — dS )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                  óX   ‡ — 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.
    r}   ÚNonec                óÚ   •— t          ¦   «                              ¦   «          |j        o|t          u| _        |j        | _        | j        r!t          | dt          d         dz   ¦  «         d S d S )NÚ
precedenceÚFuncé
   )r�   Ú__init__rC   r
   ÚexplicitÚ_assumptionsÚsetattrr   )r   ÚexprÚtype_Ú	__class__s      €r   r•   zTypeCast.__init__ý   sp   ø€ Ý‰Œ×ÒÑÔÐØœÐ@¨E½Ð,@ˆŒØ Ô-ˆÔØŒ=ð 	AÝ�D˜,­
°6Ô(:¸RÑ(?Ñ@Ô@Ð@Ð@Ð@ð	Að 	Ar!   c                ó   — | j         d         S )Nr   ©Úargsr   s    r   r™   zTypeCast.expr  ó   € àŒy˜Œ|Ðr!   c                ó   — | j         d         S )Nr;   r�   r   s    r   rš   zTypeCast.type_  rŸ   r!   Nc                óD   — | j         d                              |¬¦  «        S )Nr   )Úorder)rž   Úsort_key)r   r¢   s     r   r£   zTypeCast.sort_key  s   € ØŒy˜Œ|×$Ò$¨5Ð$Ñ1Ô1Ð1r!   )r}   r�   rA   )
r#   r$   r%   r&   r•   Úpropertyr™   rš   r£   Ú__classcell__©r›   s   @r   r�   r�   ø   s—   ø€ € € € € ðð ðAð Að Að Að Að Að ðð ñ „Xðð ðð ñ „Xðð2ð 2ð 2ð 2ð 2ð 2ð 2ð 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d9ˆ fd„	Zd„ Zd„ Z d:ˆ fd„	Z!d:ˆ fd„	Z"d„ Z#d „ Z$d!„ Z%d"„ Z&d#„ Z'd:d$„Z(d:d%„Z)d:d&„Z*d:d'„Z+d:d(„Z,d:d)„Z-d:d*„Z.d:d+„Z/d,„ Z0d-„ Z1d.„ Z2d/„ Z3d0„ Z4ˆ fd1„Z5d2„ Z6d3„ Z7d4„ Z8d5„ Z9d6„ Z:d7„ Z;d8„ Z<ˆ xZ=S );Ú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                ó\  — t          j        | |¦  «         t          t          ¦  «        | _        |                     di ¦  «        }| j                             |¦  «         t          |                     dg ¦  «        ¦  «        | _        t          t          ¦  «        | _        t          | _	        d S )Nr±   r³   )
r   r•   ÚdictÚknown_functionsÚgetÚupdateÚsetÚ_dereferenceÚreserved_wordsÚfunction_overrides)r   ÚsettingsÚ	userfuncss      r   r•   zRustCodePrinter.__init__(  sŒ   € ÝÔ˜T 8Ñ,Ô,Ð,Ý#¥OÑ4Ô4ˆÔØ—L’LÐ!1°2Ñ6Ô6ˆ	ØÔ×#Ò# IÑ.Ô.Ð.Ý §¢¨]¸BÑ ?Ô ?Ñ@Ô@ˆÔÝ!¥.Ñ1Ô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                óT   — | 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:  s2   € ØÔ" 4Ô#4µTÔ#:Ô;ˆˆØ'+ t t¨U¨U¨U°E°E°EÐ:Ð:r!   c                ó,   — |                       |¦  «        S rA   )Úindent_code)r   Úliness     r   Ú_format_codezRustCodePrinter._format_code>  s   € Ø×Ò Ñ&Ô&Ð&r!   c                óN   ‡— |j         \  }Šˆfd„t          |¦  «        D ¦   «         S )Nc              3  óD   •K  — | ]}t          ‰¦  «        D ]}||fV — Œ	Œd S rA   )Úrange)Ú.0ÚiÚjÚcolss      €r   ú	<genexpr>z;RustCodePrinter._traverse_matrix_indices.<locals>.<genexpr>C  s:   øè è € ÐAÐA˜1µU¸4±[´[ÐAÐA°��A�ÐAÐAÐAÐAÐAÐAÐAr!   )ÚshaperØ   )r   ÚmatÚrowsrÜ   s      @r   Ú_traverse_matrix_indicesz(RustCodePrinter._traverse_matrix_indicesA  s.   ø€ Ø”Y‰
ˆˆdØAÐAÐAÐA¥ d¡¤ÐAÑAÔAÐAr!   c           
     ó  — g }g }d}|D ]y}|                      ||                      |¦  «        |                      |j        ¦  «        |                      |j        dz   ¦  «        dœz  ¦  «         |                      d¦  «         Œz||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Ñ-Ô-Ø—{’{ 1¤7¨Q¡;Ñ/Ô/ð+1ð +1ñ 1ñ 2ô 2ð 2ð ×Ò˜sÑ#Ô#Ð#Ð#Ø˜;Ð&Ð&r!   c                óÎ   — t          |j        ¦  «        dk    rd|                      |¦  «        z   dz   S |j        r|                      |d¬¦  «        S |                      |¦  «        S )Nr;   ú(ú)T)Ú_type)Úlenrž   rè   Ú	is_number©r   r™   s     r   Ú_print_caller_varz!RustCodePrinter._print_caller_varR  se   € ÝˆtŒy‰>Œ>˜AÒÐð ˜Ÿš TÑ*Ô*Ñ*¨SÑ0Ð0ØŒ^ð 	%Ø—;’;˜t¨4�;Ñ0Ô0Ð0à—;’;˜tÑ$Ô$Ð$r!   c                óP  — |j         j        | j        v �r2| j        |j         j                 }d}d}t          |t          ¦  «        r|}n|D ]\  }}} ||j        Ž r nŒ|�æ|dk    rcd|                      |j        d         ¦  «        |t          |j        ¦  «        dk    r#|                      |j        dd…         d¦  «        nddœz  }n{|dk    r'd	|                      |j        d         ¦  «        |d
œz  }nN|dk    r'd	|                      |j        d         ¦  «        |d
œz  }n!d||                      |j        d¦  «        dœz  }|S dS t          |d¦  «        r<t          |j
        t          ¦  «        r"|                       |j
        |j        Ž ¦  «        S |                      |¦  «        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Ô Ô!5Ð5Ñ5ØÔ,¨T¬YÔ-?Ô@ˆIØˆDØˆEÝ˜)¥SÑ)Ô)ð Ø ��à)2ð ð Ñ%�D˜$ Ø�t˜TœYÐ'ð Ø˜ðàÐØ˜A’:�:Ø8Ø#×5Ò5°d´iÀ´lÑCÔCØ"&ÝGJÈ4Ì9Á~Ä~ÐXYÒGYÐGY §¢¨t¬y¸¸¸¬}¸dÑ CÔ CÐ CÐ_að<ð <ñ �C�Cð
 ˜a’Z�ZØ0Ø#×5Ò5°d´iÀ´lÑCÔCØ"&ð4ð 4ñ �C�Cð ˜a’Z�ZØ0Ø#×5Ò5°d´iÀ´lÑCÔCØ"&ð4ð 4ñ �C�Cð
 /Ø $Ø $§¢¨t¬y¸$Ñ ?Ô ?ð2ð 2ñ �Cð �
ð-  Ðõ. �T˜7Ñ#Ô#ð 	3­
°4´:½vÑ(FÔ(Fð 	3à—;’;˜z˜tœz¨4¬9Ð5Ñ6Ô6Ð6à×,Ò,¨TÑ2Ô2Ð2r!   c                óÞ   •‡ — t          d„ |j        D ¦   «         ¦  «        }|r+t          t          j        ˆ fd„|j        D ¦   «         ¦  «        }t          ¦   «                              |¦  «        S )Nc              3  ó4   K  — | ]}|j         o|j         V — Œd S rA   ©Úis_realrC   ©rÙ   Úargs     r   rÝ   z-RustCodePrinter._print_Mul.<locals>.<genexpr>‘  ó.   è è € ÐVÐVÀS˜cœkÐ@°#´.Ð.@ÐVÐVÐVÐVÐVÐVr!   c              3  óR   •K  — | ]!}|d k    r‰                      |¦  «        n|V — Œ"dS )r0   N©Ú_cast_to_float©rÙ   r  r   s     €r   rÝ   z-RustCodePrinter._print_Mul.<locals>.<genexpr>“  s@   øè è € Ð'lÐ'lÐ[^ÀCÈ2ÂIÀI¨×(;Ò(;¸CÑ(@Ô(@Ð(@ÐSVÐ'lÐ'lÐ'lÐ'lÐ'lÐ'lr!   )Úanyrž   r   ÚoperatorÚmulr�   Ú
_print_Mul)r   r™   Úcontains_floatsr›   s   `  €r   r  zRustCodePrinter._print_Mul�  sm   øø€ ÝÐVÐVÈDÌIÐVÑVÔVÑVÔVˆØð 	nÝ�(œ,Ð'lÐ'lÐ'lÐ'lÐbfÔbkÐ'lÑ'lÔ'lÑmÔmˆDå‰wŒw×!Ò! $Ñ'Ô'Ð'r!   Nc                óà   •‡ — t          d„ |j        D ¦   «         ¦  «        }|r+t          t          j        ˆ fd„|j        D ¦   «         ¦  «        }t          ¦   «                              ||¦  «        S )Nc              3  ó4   K  — | ]}|j         o|j         V — Œd S rA   r
  r  s     r   rÝ   z-RustCodePrinter._print_Add.<locals>.<genexpr>˜  r  r!   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rA   r  r  s     €r   rÝ   z-RustCodePrinter._print_Add.<locals>.<genexpr>š  s1   øè è € Ð(WÐ(WÀc¨×)<Ò)<¸SÑ)AÔ)AÐ(WÐ(WÐ(WÐ(WÐ(WÐ(Wr!   )r  rž   r   r  Úaddr�   Ú
_print_Add)r   r™   r¢   r  r›   s   `   €r   r  zRustCodePrinter._print_Add—  sm   øø€ ÝÐVÐVÈDÌIÐVÑVÔVÑVÔVˆØð 	YÝ�(œ,Ð(WÐ(WÐ(WÐ(WÈTÌYÐ(WÑ(WÔ(WÑXÔXˆDå‰wŒw×!Ò! $¨Ñ.Ô.Ð.r!   c                óæ   — |j         j        rQ|j        j        sE t          |¦  «        t	          |j         ¦  «        |j        ¦  «        }|                      |¦  «        S |                      |¦  «        S rA   )r2   rC   r3   r…   r   rè   r  rö   s     r   Ú
_print_PowzRustCodePrinter._print_Powž  sd   € ØŒ9Ôð 	%¨¬Ô(;ð 	%Ø•4˜‘:”:�e D¤IÑ.Ô.°´Ñ9Ô9ˆDØ—;’;˜tÑ$Ô$Ð$Ø×#Ò# DÑ)Ô)Ð)r!   c                óº   — |j         s|                      |j        ¦  «        S |                      |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¤  sS   € ØŒ}ð 	iØ—;’;˜tœyÑ)Ô)Ð)à—;’;˜tœyÑ)Ô)¨H°tÔ7IÈ$ÔJ[Ð\`Ô\fÔJgÔ7hÑ,hÑhÐhr!   Fc                ó”   •— 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ª  sG   ø€ Ý‰gŒg×"Ò" 4Ñ(Ô(ˆØð 	Ø˜ Ô!3°DÔ4EÅdÔ4KÔ!LÑLÑLÐLàˆJr!   c                ó”   •— t          ¦   «                              |¦  «        }|r#|d| j        | j        t                            z  z   S |S r"  )r�   Ú_print_IntegerrÍ   rÎ   r
   r$  s       €r   r&  zRustCodePrinter._print_Integer±  sG   ø€ Ý‰gŒg×$Ò$ TÑ*Ô*ˆØð 	Ø˜ Ô!3°DÔ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¸  sB   € Ý�4”6‰{Œ{�C ¤™KœKˆ1ˆØÔ)¨$Ô*;½DÔ*AÔBˆØ˜q ,°Ð2Ñ2Ð2r!   c                óx  — |j         j        r|j        j        r|j        j        rA|j         j        s5|                      |j         ¦  «        }|                      |j        ¦  «        }n|j         }|j        }|                      |¦  «        }|                      |¦  «        }|j        }d                     |||¦  «        S )Nz{} {} {})ÚlhsrC   Úrhsr  rè   Úrel_opÚformat)r   r™   r-  r.  Úlhs_codeÚrhs_codeÚops          r   Ú_print_Relationalz!RustCodePrinter._print_Relational½  s°   € ØŒHÔð 	¨¬Ô(;ð 	ÀÄÔATð 	Ð]aÔ]eÔ]pð 	Ø×%Ò% d¤hÑ/Ô/ˆCØ×%Ò% d¤hÑ/Ô/ˆCˆCà”(ˆCØ”(ˆCØ—;’;˜sÑ#Ô#ˆØ—;’;˜sÑ#Ô#ˆØŒ[ˆØ× Ò  ¨2¨xÑ8Ô8Ð8r!   c                ó4  — |j         }t          j        }t          j        }t	          t          |j        ¦  «        ¦  «        D ] }||j        |         |z  z  }|||         z  }Œ!|                      |j	        j
        ¦  «        ›d|                      |¦  «        ›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ˆÝŒvˆÝ”ˆÝ�% ¤	Ñ*Ô*Ñ+Ô+ð 	ð 	ˆAØ�D”L ”O FÑ*Ñ*ˆDØ�d˜1”gÑˆFˆFØŸ;š; t¤y¤Ñ7Ô7Ð7Ð7¸¿ºÀTÑ9JÔ9JÐ9JÐ9JÐKÐKr!   c                ó   — |j         j        S rA   )r<  rÏ   rö   s     r   Ú
_print_IdxzRustCodePrinter._print_IdxÓ  s   € ØŒzŒÐr!   c                ó   — |j         S rA   )rÏ   rö   s     r   Ú_print_DummyzRustCodePrinter._print_DummyÖ  s
   € ØŒyÐr!   c                ó   — dS )NÚEr   ©r   r™   ró   s      r   Ú_print_Exp1zRustCodePrinter._print_Exp1Ù  s   € Øˆsr!   c                ó   — dS )NÚPIr   rG  s      r   Ú	_print_PizRustCodePrinter._print_PiÜ  s   € Øˆtr!   c                ó   — dS )NÚINFINITYr   rG  s      r   Ú_print_InfinityzRustCodePrinter._print_Infinityß  s   € Øˆzr!   c                ó   — dS )NÚNEG_INFINITYr   rG  s      r   Ú_print_NegativeInfinityz'RustCodePrinter._print_NegativeInfinityâ  s   € Øˆ~r!   c                ó   — dS )Nrƒ   r   rG  s      r   Ú_print_BooleanTruez"RustCodePrinter._print_BooleanTrueå  s   € Øˆvr!   c                ó   — dS )Nrj   r   rG  s      r   Ú_print_BooleanFalsez#RustCodePrinter._print_BooleanFalseè  s   € Øˆwr!   c                óD   — t          |¦  «                             ¦   «         S rA   )rÿ   ré   rG  s      r   Ú_print_boolzRustCodePrinter._print_boolë  s   € Ý�4‰yŒy�ŠÑ Ô Ð r!   c                ó   — dS )NÚNANr   rG  s      r   Ú
_print_NaNzRustCodePrinter._print_NaNî  r    r!   c                óŠ  — |j         d         j        dk    rt          d¦  «        ‚g }t          |j         ¦  «        D ]Ñ\  }\  }}|dk    r,|                     d|                      |¦  «        z  ¦  «         nX|t          |j         ¦  «        dz
  k    r|dk    r|dxx         dz  cc<   n&|dxx         d|                      |¦  «        z  z  cc<   |                      |¦  «        }|                     |¦  «         |                     d	¦  «         ŒÒ| j        d
         rd                     |¦  «        S d                     |¦  «        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ñ  sI  € ØŒ9�RŒ=Ô Ò%Ð%õ ð /ñ 0ô 0ð 0ð
 ˆå" 4¤9Ñ-Ô-ð 		ð 		‰IˆA‰v��1Ø�AŠvˆvØ—’˜[¨4¯;ª;°q©>¬>Ñ9Ñ:Ô:Ð:Ð:Ø•c˜$œ)‘n”n qÑ(Ò(Ð(¨Q°$ªY¨YØ�b�	�	”	˜YÑ&�	�	‘	�	à�b�	�	”	Ð.°·²¸Q±´Ñ?Ñ?�	�	‘	Ø—K’K ‘N”NˆEØ�LŠL˜ÑÔÐØ�LŠL˜ÑÔÐÐàŒ>˜(Ô#ð 	$Ø—8’8˜E‘?”?Ð"à—9’9˜UÑ#Ô#Ð#r!   c                ób   — ddl m} |                      |                     |d¬¦  «        ¦  «        S )Nr   )Ú	PiecewiseF)Údeep)Úsympy.functionsrh  rè   Úrewrite)r   r™   rh  s      r   Ú
_print_ITEzRustCodePrinter._print_ITE  s6   € Ø-Ð-Ð-Ð-Ð-Ð-Ø�{Š{˜4Ÿ<š<¨	¸˜<Ñ>Ô>Ñ?Ô?Ð?r!   c                ó€   ‡ — |j         dk    r$dd                     ˆ fd„|D ¦   «         ¦  «        z  S t          d¦  «        ‚)Nr;   z[%s]rù   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rA   )rè   )rÙ   Úar   s     €r   rÝ   z4RustCodePrinter._print_MatrixBase.<locals>.<genexpr>  s-   øè è € Ð%@Ð%@¸ d§k¢k°!¡n¤nÐ%@Ð%@Ð%@Ð%@Ð%@Ð%@r!   zLFull Matrix Support in Rust need Crates (https://crates.io/keywords/matrix).)rÜ   rb  r_  )r   ÚAs   ` r   Ú_print_MatrixBasez!RustCodePrinter._print_MatrixBase  sI   ø€ ØŒ6�QŠ;ˆ;Ø˜DŸIšIÐ%@Ð%@Ð%@Ð%@¸aÐ%@Ñ%@Ô%@Ñ@Ô@Ñ@Ð@åÐkÑlÔlÐlr!   c                ó,   — |                       |¦  «        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 )Nr6  r;   r7  )ÚparentrÛ   rÚ   rÞ   rö   s     r   Ú_print_MatrixElementz$RustCodePrinter._print_MatrixElement  s8   € Øœ;˜;˜;Øœ6 D¤F¨4¬;Ô+<¸QÔ+?Ñ$?Ñ?Ð?Ð?ðAð 	Ar!   c                óf   •— t          ¦   «                              |¦  «        }|| j        v rd|z  S |S )Nz(*%s))r�   Ú_print_Symbolr»   )r   r™   rÏ   r›   s      €r   rx  zRustCodePrinter._print_Symbol  s7   ø€ å‰wŒw×$Ò$ TÑ*Ô*ˆà�4Ô$Ð$Ð$Ø˜T‘>Ð!àˆKr!   c                óL  — ddl m} |j        }|j        }| j        d         r@|                     |¦  «        s|                     |¦  «        r|                      ||¦  «        S |                      |¦  «        }|                      |¦  «        }|                      |›d|›�¦  «        S )Nr   )ÚIndexedBaser²   rË   )	Úsympy.tensor.indexedrz  r-  r.  ra  ÚhasÚ_doprint_loopsrè   rÆ   )r   r™   rz  r-  r.  r1  r2  s          r   Ú_print_Assignmentz!RustCodePrinter._print_Assignment'  s´   € Ø4Ð4Ð4Ð4Ð4Ð4ØŒhˆØŒhˆØŒ>˜*Ô%ð 	I¨3¯7ª7°;Ñ+?Ô+?ð 	IØ—’˜Ñ$Ô$ð	Ið ×&Ò& s¨CÑ0Ô0Ð0à—{’{ 3Ñ'Ô'ˆHØ—{’{ 3Ñ'Ô'ˆHØ×&Ò&°H°H°H¸h¸hÐ'GÑHÔHÐHr!   c                óT   — |                       |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ÀCÀCÈÈÈÐMÐMr!   c                ój   — |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  s7   € ØŒ~ð 	Ý˜D¥$Ñ'Ô'Ð'ØŒ_ð 	Ý˜‘;”;ÐØˆr!   c                ón   — || j         v p,|t          v p#t          | d                     |¦  «        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½   Úgetattrr0  )r   rÏ   s     r   Ú
_can_printzRustCodePrinter._can_print@  s@   € ð �tÔ+Ð+Ð{¨tÕ7IÐ/IÐ{ÍWÐUYÐ[f×[mÒ[mÐnrÑ[sÔ[sÐuzÑM{ÔM{Ð{r!   c                óò   — t          ¦   «         }t          |t          ¦  «        rS|j        r|                     |j        ¦  «         |j        D ]*}|                     |                      |¦  «        ¦  «        }Œ+|S rA   )	rº   rþ   r   Úis_Functionr  rü   rž   ÚunionÚ_collect_functions)r   r™   Ú	functionsr  s       r   rˆ  z"RustCodePrinter._collect_functionsI  sw   € Ý‘E”Eˆ	Ý�d�DÑ!Ô!ð 	JØÔð )Ø—’˜dœiÑ(Ô(Ð(Ø”yð Jð J�Ø%ŸOšO¨D×,CÒ,CÀCÑ,HÔ,HÑIÔI�	�	ØÐr!   c                ó  ‡ — t          |t          ¦  «        s|S ‰                      |¦  «        }ˆ fd„‰ j                             ¦   «         D ¦   «         }|D ]7}|                     |j        d¦  «        \  }}|r|                     |¦  «        }Œ8|S )Nc                ó†   •— i | ]=\  }\  }}‰                      |¦  «        ¯t          ˆfd „|D ¦   «         ¦  «        ¯8|||f“Œ>S )c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rA   )r„  )rÙ   Úfr   s     €r   rÝ   zFRustCodePrinter._rewrite_known_functions.<locals>.<dictcomp>.<genexpr>[  s/   øè è € Ð<Ð<¨1�D—O’O AÑ&Ô&Ð<Ð<Ð<Ð<Ð<Ð<r!   )r„  Úall)rÙ   rÏ   Útarget_fÚrequired_fsr   s       €r   ú
<dictcomp>z<RustCodePrinter._rewrite_known_functions.<locals>.<dictcomp>W  sr   ø€ ð !
ð !
ð !
á-�Ñ-�x Ø�Š˜xÑ(Ô(ð!
õ Ð<Ð<Ð<Ð<°Ð<Ñ<Ô<Ñ<Ô<ð	!
Ø�8˜[Ð)ð!
ð !
ð !
r!   )NN)rþ   r   rˆ  Ú_rewriteable_functionsÚitemsr¸   r#   rk  )r   r™   Úexpression_functionsÚrewriteable_functionsrü   r�  Ú_s   `      r   Ú_rewrite_known_functionsz(RustCodePrinter._rewrite_known_functionsR  s±   ø€ Ý˜$¥Ñ%Ô%ð 	ØˆKà#×6Ò6°tÑ<Ô<Ðð!
ð !
ð !
ð !
à15Ô1L×1RÒ1RÑ1TÔ1Tð!
ñ !
ô !
Ðð )ð 	.ð 	.ˆDØ/×3Ò3°D´MÀ<ÑPÔP‰KˆH�aØð .Ø—|’| HÑ-Ô-�øØˆr!   c                óÔ  ‡
‡— t          |t          ¦  «        r=|                      |                     d¦  «        ¦  «        }d                     |¦  «        S d}dŠdŠ
d„ |D ¦   «         }ˆfd„|D ¦   «         }ˆ
fd„|D ¦   «         }g }d	}t          |¦  «        D ]Q\  }}	|	d
v r|                     |	¦  «         Œ|||         z  }|                     ||z  ›|	›�¦  «         |||         z  }ŒR|S )z0Accepts a string of code or a list of code linesTrú   z    )Ú{rñ   z{
z(
)ræ   rò   c                ó8   — g | ]}|                      d ¦  «        ‘ŒS )z 	)Úlstrip)rÙ   Úlines     r   ú
<listcomp>z/RustCodePrinter.indent_code.<locals>.<listcomp>n  s$   € Ð6Ð6Ð6¨�—’˜UÑ#Ô#Ð6Ð6Ð6r!   c           
     ón   •— g | ]1}t          t          t          |j        ‰¦  «        ¦  «        ¦  «        ‘Œ2S r   )r(  r  ÚmapÚendswith)rÙ   rœ  Ú	inc_tokens     €r   r�  z/RustCodePrinter.indent_code.<locals>.<listcomp>p  s5   ø€ ÐOÐOÐOÀ•S��S ¤°	Ñ:Ô:Ñ;Ô;Ñ<Ô<ÐOÐOÐOr!   c           
     ón   •— g | ]1}t          t          t          |j        ‰¦  «        ¦  «        ¦  «        ‘Œ2S r   )r(  r  rŸ  Ú
startswith)rÙ   rœ  Ú	dec_tokens     €r   r�  z/RustCodePrinter.indent_code.<locals>.<listcomp>q  sE   ø€ ð (ð (ð (Øõ ��S ¤°)Ñ<Ô<Ñ=Ô=Ñ>Ô>ð (ð (ð (r!   r   )rú   r^  )rþ   rÿ   rÓ   Ú
splitlinesrb  r`  rç   )r   ÚcodeÚ
code_linesÚtabÚincreaseÚdecreaseÚprettyÚlevelÚnrœ  r¤  r¡  s             @@r   rÓ   zRustCodePrinter.indent_codec  s3  øø€ õ �d�CÑ Ô ð 	'Ø×)Ò)¨$¯/ª/¸$Ñ*?Ô*?Ñ@Ô@ˆJØ—7’7˜:Ñ&Ô&Ð&àˆØ,ˆ	Øˆ	à6Ð6°Ð6Ñ6Ô6ˆàOÐOÐOÐOÈÐOÑOÔOˆð(ð (ð (ð (Ø!%ð(ñ (ô (ˆð ˆØˆÝ  ‘”ð 	!ð 	!‰GˆAˆtØ�zÐ!Ð!Ø—’˜dÑ#Ô#Ð#ØØ�X˜a”[Ñ ˆEØ�MŠM C¨¡I I¨t¨tÐ4Ñ5Ô5Ð5Ø�X˜a”[Ñ ˆEˆEØˆr!   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+  r4  r@  rB  rD  rH  rK  rN  rQ  rS  rU  rW  rZ  rf  rl  rq  rs  rv  rx  r~  r€  r  r„  rˆ  r—  rÓ   r¥   r¦   s   @r   r¨   r¨     s»  ø€ € € € € € ØHÐHØ€KØ€Hð 	�Øˆgð€Lð 	ˆuØ�Ø�Øˆvð	€Mð )-¨¨[Ô-Jð )ð )ØØØØ�s‘u”uð	Oð Oð )ð )Ðð ð ð ñ ð !#ð 5ð 5ð 5ð 5ðð ð ð"ð "ð "ðð ð ð;ð ;ð ;ð'ð 'ð 'ðBð Bð Bð'ð 'ð 'ð	%ð 	%ð 	%ð13ð 13ð 13ðf(ð (ð (ð (ð (ð/ð /ð /ð /ð /ð /ð*ð *ð *ðið ið iðð ð ð ð ð ðð ð ð ð ð ð3ð 3ð 3ð

9ð 
9ð 
9ðLð Lð Lðð ð ðð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð!ð !ð !ð !ðð ð ð ð$ð $ð $ð6@ð @ð @ðmð mð mð.ð .ð .ðAð Að Aðð ð ð ð ðIð Ið IðNð Nð 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Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø  Ð  Ð  Ð  Ð  Ð  Ø +Ð +Ð +Ð +Ð +Ð +Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð"ð ð ð ð �%ñ ô ð ðð ð ð ð �Gñ ô ð ð �[Ð!Ø˜Ð'ðð Ð ð2ð �7ð2ð �Vð2ð 
ˆ5ð2ð  
Ð4Ð4°g¸qÐAØ5Ð5°v¸qÐAØ6Ð6¸ÈÐJØ4Ð4°f¸aÐ@Ø4Ð4°f¸aÐ@Ø-Ð-¨v°qÐ9Ø1Ð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ð 2ð 2€ðX3ð 3ð 3€ðl2ð 2ð 2ð 2ð 2ˆtñ 2ô 2ð 2ð0mð mð mð mð m�kñ mô mð mð mð mr!   