
    \h.                        S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJrJr  0 SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S)_S*S+S,S-S..Er " S/ S0\
5      rS4S2 jrS3 rg1)5z
Javascript code printer

The JavascriptCodePrinter converts single SymPy expressions into single
Javascript expressions, using the functions defined in the Javascript
Math object where possible.

    )annotations)Any)S)equal_valued)CodePrinter)
precedence
PRECEDENCEAbszMath.absacosz	Math.acosacoshz
Math.acoshasinz	Math.asinasinhz
Math.asinhatanz	Math.atanatan2z
Math.atan2atanhz
Math.atanhceilingz	Math.ceilcoszMath.coscoshz	Math.coshexpzMath.expfloorz
Math.floorlogzMath.logMaxzMath.maxMinzMath.minsignz	Math.signzMath.sinz	Math.sinhzMath.tanz	Math.tanh)sinsinhtantanhc                      \ rS rSr% SrSrSr\" \R                  40 S0 SS.D6r	S\
S	'   0 4S
 jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg) JavascriptCodePrinter.   zK"A Printer to convert Python expressions to strings of JavaScript code
    _javascript
JavaScript   T)	precisionuser_functionscontractzdict[str, Any]_default_settingsc                    [         R                  " X5        [        [        5      U l        UR	                  S0 5      nU R                  R                  U5        g )Nr&   )r   __init__dictknown_functionsgetupdate)selfsettings	userfuncss      M/var/www/auris/envauris/lib/python3.13/site-packages/sympy/printing/jscode.pyr*   JavascriptCodePrinter.__init__:   sB    T,#O4LL!126	##I.    c                    US-  $ )N    )r/   ps     r2   _rate_index_position*JavascriptCodePrinter._rate_index_position@   s    s
r4   c                    SU-  $ )Nz%s;r7   )r/   
codestrings     r2   _get_statement$JavascriptCodePrinter._get_statementC   s    z!!r4   c                $    SR                  U5      $ )Nz// {})format)r/   texts     r2   _get_comment"JavascriptCodePrinter._get_commentF   s    ~~d##r4   c                \    SR                  XR                  U R                  S   5      5      $ )Nzvar {} = {};r%   )r@   evalf	_settings)r/   namevalues      r2   _declare_number_const+JavascriptCodePrinter._declare_number_constI   s%    $$T;;t~~k7R+STTr4   c                $    U R                  U5      $ N)indent_code)r/   liness     r2   _format_code"JavascriptCodePrinter._format_codeL   s    &&r4   c                L   ^ UR                   u  nmU4S j[        U5       5       $ )Nc              3  P   >#    U  H  n[        T5        H  o!U4v   M
     M     g 7frL   )range).0ijcolss      r2   	<genexpr>AJavascriptCodePrinter._traverse_matrix_indices.<locals>.<genexpr>Q   s     A1U4[A[s   #&)shaperS   )r/   matrowsrW   s      @r2   _traverse_matrix_indices.JavascriptCodePrinter._traverse_matrix_indicesO   s    YY
dAdAAr4   c           
        / n/ nSnU Hz  nUR                  UU R                  UR                  5      U R                  UR                  5      U R                  UR                  S-   5      S.-  5        UR                  S5        M|     X#4$ )NzAfor (var %(varble)s=%(start)s; %(varble)s<%(end)s; %(varble)s++){   )varblestartend})append_printlabellowerupper)r/   indices
open_linesclose_lines	loopstartrU   s         r2   _get_loop_opening_ending.JavascriptCodePrinter._get_loop_opening_endingS   s    
W	Ai++agg.QWW-{{177Q;/+1 1 2 s#  &&r4   c                   [        U5      n[        UR                  S5      (       a  SU R                  UR                  U5      -  $ [        UR                  S5      (       a  SU R                  UR                  5      -  $ UR                  [        R                  S-  :X  a  SU R                  UR                  5      -  $ SU R                  UR                  5      < SU R                  UR                  5      < S	3$ )
Nz1/%sg      ?zMath.sqrt(%s)   zMath.cbrt(%s)z	Math.pow(z, ))r   r   r   parenthesizebaserf   r   One)r/   exprPRECs      r2   
_print_Pow JavascriptCodePrinter._print_Pow`   s    $"%%T..tyy$?@@$((C(("T[[%;;;XXq "T[[%;;; ! *.TYY)?!%TXX!68 8r4   c                `    [        UR                  5      [        UR                  5      p2SX#4-  $ )Nz%d/%d)intr8   q)r/   rw   r8   r}   s       r2   _print_Rational%JavascriptCodePrinter._print_Rationall   s&    466{CK1!r4   c                J   UR                   u  p#[        U5      nUR                    Vs/ s H  oPR                  XT5      PM     snu  pgUR                  (       a  UR                  (       d"  UR                  (       a  UR                  (       a  U SU 3$ SU SU SU SU 3$ s  snf )Nz % ((z) + z) % )argsr   rt   is_nonnegativeis_nonpositive)r/   rw   numdenrx   argsnumsdens           r2   
_print_Mod JavascriptCodePrinter._print_Modp   s    99$>BiiHis''2iH
 3#5#53#5#5V3tf%%D6TF$tfD77 Is   B c                    U R                  UR                  5      nU R                  UR                  5      nUR                  nSR	                  X$U5      $ )Nz{} {} {})rf   lhsrhsrel_opr@   )r/   rw   lhs_coderhs_codeops        r2   _print_Relational'JavascriptCodePrinter._print_Relational|   sB    ;;txx(;;txx([[  x88r4   c                R   UR                   n[        R                  n[        R                  n[	        [        UR                  5      5       H  nX1R                  U   U-  -  nXBU   -  nM      U R                  UR                  R                  5      < SU R                  U5      < S3$ )N[])rZ   r   Zerorv   reversedrS   rankrj   rf   ru   rg   )r/   rw   dimselemoffsetrU   s         r2   _print_Indexed$JavascriptCodePrinter._print_Indexed   s}    zzvv%		*+ALLOF**D1gF ,  ;;tyy7T9JKKr4   c                    g)NzMath.Er7   r/   rw   s     r2   _print_Exp1!JavascriptCodePrinter._print_Exp1   s    r4   c                    g)NzMath.PIr7   r   s     r2   	_print_PiJavascriptCodePrinter._print_Pi   s    r4   c                    g)NzNumber.POSITIVE_INFINITYr7   r   s     r2   _print_Infinity%JavascriptCodePrinter._print_Infinity       )r4   c                    g)NzNumber.NEGATIVE_INFINITYr7   r   s     r2   _print_NegativeInfinity-JavascriptCodePrinter._print_NegativeInfinity   r   r4   c           
        SSK Jn  UR                  S   R                  S:w  a  [	        S5      e/ nUR                  U5      (       a  [        UR                  5       H  u  nu  pVUS:X  a$  UR                  SU R                  U5      -  5        OWU[        UR                  5      S-
  :X  a  US:X  a  UR                  S5        O#UR                  S	U R                  U5      -  5        U R                  U5      nUR                  U5        UR                  S
5        M     SR                  U5      $ UR                  S S  VVs/ s H.  u  pVSU R                  U5      < SU R                  U5      < S3PM0     nnnSU R                  UR                  S   R                  5      -  n	SR                  U5      U	-   SR                  S[        U5      -  /5      -   $ s  snnf )Nr   )
Assignmentrq   TzAll 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.z	if (%s) {r`   zelse {zelse if (%s) {rd   
r   z) ? (
z
)
z: (
%s
)z:  rs   )sympy.codegen.astr   r   cond
ValueErrorhas	enumeratere   rf   lenjoinrw   )
r/   rw   r   rN   rU   eccode0ecpairs	last_lines
             r2   _print_Piecewise&JavascriptCodePrinter._print_Piecewise   s   099R=%  / 0 0
 88J&tyy1	6A6LLt{{1~!=>#dii.1,,dLL*LL!1DKKN!BCAU#S! 2 99U## !%		#20 .1 04{{1~t{{1~N .  0$t{{499R=3E3E'FFI99W%	1CHHc#g,>N=O4PPP0s   ?5Gc                    SR                  U R                  UR                  [        S   SS9UR                  UR
                  UR                  R                  S   -  -   5      $ )Nz{}[{}]AtomT)strictr`   )r@   rt   parentr	   rV   rU   rZ   r   s     r2   _print_MatrixElement*JavascriptCodePrinter._print_MatrixElement   sY    t00vt  1  -FFTVVDKK--a0002 	2r4   c                   [        U[        5      (       a1  U R                  UR                  S5      5      nSR	                  U5      $ SnSnSnU Vs/ s H  ofR                  S5      PM     nnU Vs/ s H+  n[        [        [        UR                  U5      5      5      PM-     nnU Vs/ s H+  n[        [        [        UR                  U5      5      5      PM-     nn/ n	Sn
[        U5       HE  u  pUS;   a  U	R                  U5        M  XU   -  n
U	R                  X:-  < U< 35        XU   -  n
MG     U	$ s  snf s  snf s  snf )	z0Accepts a string of code or a list of code linesT z   ){(z{
z(
)rd   rs   z 	r   )r   r   )
isinstancestrrM   
splitlinesr   lstripr|   anymapendswith
startswithr   re   )r/   code
code_linestab	inc_token	dec_tokenlineincreasedecreaseprettylevelns               r2   rM   !JavascriptCodePrinter.indent_code   s3    dC  ))$//$*?@J77:&&,		046U#6IMOSS	:;<O!%(!% S)<=>!% 	 (  GAz!d#a[ EMMCIt45a[ E '  7O(s   D712D<)2E)r,   N) __name__
__module____qualname____firstlineno____doc__printmethodlanguager+   r   r(   __annotations__r*   r9   r=   rB   rI   rO   r]   rn   ry   r~   r   r   r   r   r   r   r   r   r   rM   __static_attributes__r7   r4   r2   r    r    .   s    KH(,[-J-J )O )~  !# /"$U'B'
8 
89L**QB2
r4   r    Nc                6    [        U5      R                  X5      $ )a`  Converts an expr to a string of javascript code

Parameters
==========

expr : Expr
    A SymPy expression to be converted.
assign_to : optional
    When given, the argument is used as the name of the variable to which
    the expression is assigned. Can be a string, ``Symbol``,
    ``MatrixSymbol``, or ``Indexed`` type. This is helpful in case of
    line-wrapping, or for expressions that generate multi-line statements.
precision : integer, optional
    The precision for numbers such as pi [default=15].
user_functions : dict, optional
    A dictionary where keys are ``FunctionClass`` instances and values are
    their string representations. Alternatively, the dictionary value can
    be a list of tuples i.e. [(argument_test, js_function_string)]. See
    below for examples.
human : bool, optional
    If True, the result is a single string that may contain some constant
    declarations for the number symbols. If False, the same information is
    returned in a tuple of (symbols_to_declare, not_supported_functions,
    code_text). [default=True].
contract: bool, optional
    If True, ``Indexed`` instances are assumed to obey tensor contraction
    rules and the corresponding nested loops over indices are generated.
    Setting contract=False will not generate loops, instead the user is
    responsible to provide values for the indices in the code.
    [default=True].

Examples
========

>>> from sympy import jscode, symbols, Rational, sin, ceiling, Abs
>>> x, tau = symbols("x, tau")
>>> jscode((2*tau)**Rational(7, 2))
'8*Math.sqrt(2)*Math.pow(tau, 7/2)'
>>> jscode(sin(x), assign_to="s")
's = Math.sin(x);'

Custom printing can be defined for certain types by passing a dictionary of
"type" : "function" to the ``user_functions`` kwarg. Alternatively, the
dictionary value can be a list of tuples i.e. [(argument_test,
js_function_string)].

>>> custom_functions = {
...   "ceiling": "CEIL",
...   "Abs": [(lambda x: not x.is_integer, "fabs"),
...           (lambda x: x.is_integer, "ABS")]
... }
>>> jscode(Abs(x) + ceiling(x), user_functions=custom_functions)
'fabs(x) + CEIL(x)'

``Piecewise`` expressions are converted into conditionals. If an
``assign_to`` variable is provided an if statement is created, otherwise
the ternary operator is used. Note that if the ``Piecewise`` lacks a
default term, represented by ``(expr, True)`` then an error will be thrown.
This is to prevent generating an expression that may not evaluate to
anything.

>>> from sympy import Piecewise
>>> expr = Piecewise((x + 1, x > 0), (x, True))
>>> print(jscode(expr, tau))
if (x > 0) {
   tau = x + 1;
}
else {
   tau = x;
}

Support for loops is provided through ``Indexed`` types. With
``contract=True`` these expressions will be turned into loops, whereas
``contract=False`` will just print the assignment expression that should be
looped over:

>>> from sympy import Eq, IndexedBase, Idx
>>> len_y = 5
>>> y = IndexedBase('y', shape=(len_y,))
>>> t = IndexedBase('t', shape=(len_y,))
>>> Dy = IndexedBase('Dy', shape=(len_y-1,))
>>> i = Idx('i', len_y-1)
>>> e=Eq(Dy[i], (y[i+1]-y[i])/(t[i+1]-t[i]))
>>> jscode(e.rhs, assign_to=e.lhs, contract=False)
'Dy[i] = (y[i + 1] - y[i])/(t[i + 1] - t[i]);'

Matrices are also supported, but a ``MatrixSymbol`` of the same dimensions
must be provided to ``assign_to``. Note that any expression that can be
generated normally can also exist inside a Matrix:

>>> from sympy import Matrix, MatrixSymbol
>>> mat = Matrix([x**2, Piecewise((x + 1, x > 0), (x, True)), sin(x)])
>>> A = MatrixSymbol('A', 3, 1)
>>> print(jscode(mat, A))
A[0] = Math.pow(x, 2);
if (x > 0) {
   A[1] = x + 1;
}
else {
   A[1] = x;
}
A[2] = Math.sin(x);
)r    doprint)rw   	assign_tor0   s      r2   jscoder      s    R !*224CCr4   c                .    [        [        U 40 UD65        g)zuPrints the Javascript representation of the given expression.

See jscode for the meaning of the optional arguments.
N)printr   )rw   r0   s     r2   print_jscoder   G  s    
 
&
"
"#r4   rL   )r   
__future__r   typingr   
sympy.corer   sympy.core.numbersr   sympy.printing.codeprinterr   sympy.printing.precedencer   r	   r,   r    r   r   r7   r4   r2   <module>r      s   #   + 2 <
	:
K \ K	
 \ K \ \ { 
: K 
: \ 
: 
:  
:!" K#$ +2jK jZiDX$r4   