def test_jscode_constants_other(): assert jscode( 2 * GoldenRatio) == "var GoldenRatio = 1.61803398874989;\n2*GoldenRatio" assert jscode(2 * Catalan) == "var Catalan = 0.915965594177219;\n2*Catalan" assert jscode( 2 * EulerGamma) == "var EulerGamma = 0.577215664901533;\n2*EulerGamma"
def test_jscode_Pow(): g = implemented_function('g', Lambda(x, 2*x)) assert jscode(x**3) == "Math.pow(x, 3)" assert jscode(x**(y**3)) == "Math.pow(x, Math.pow(y, 3))" assert jscode(1/(g(x)*3.5)**(x - y**x)/(x**2 + y)) == \ "Math.pow(3.5*2*x, -x + Math.pow(y, x))/(Math.pow(x, 2) + y)" assert jscode(x**-1.0) == '1/x'
def test_jscode_Pow(): g = implemented_function('g', Lambda(x, 2 * x)) assert jscode(x**3) == "Math.pow(x, 3)" assert jscode(x**(y**3)) == "Math.pow(x, Math.pow(y, 3))" assert jscode(1/(g(x)*3.5)**(x - y**x)/(x**2 + y)) == \ "Math.pow(3.5*2*x, -x + Math.pow(y, x))/(Math.pow(x, 2) + y)" assert jscode(x**-1.0) == '1/x'
def test_jscode_Pow(): assert jscode(x ** 3) == "Math.pow(x, 3)" assert jscode(x ** (y ** 3)) == "Math.pow(x, Math.pow(y, 3))" assert ( jscode(1 / (g(x) * 3.5) ** (x - y ** x) / (x ** 2 + y)) == "Math.pow(3.5*g(x), -x + Math.pow(y, x))/(Math.pow(x, 2) + y)" ) assert jscode(x ** -1.0) == "1/x"
def test_jscode_constants_other(): assert jscode( 2 * GoldenRatio ) == "var GoldenRatio = %s;\n2*GoldenRatio" % GoldenRatio.evalf(17) assert jscode( 2 * Catalan) == "var Catalan = %s;\n2*Catalan" % Catalan.evalf(17) assert jscode( 2 * EulerGamma ) == "var EulerGamma = %s;\n2*EulerGamma" % EulerGamma.evalf(17)
def test_MatrixElement_printing(): # test cases for issue #11821 A = MatrixSymbol("A", 1, 3) B = MatrixSymbol("B", 1, 3) C = MatrixSymbol("C", 1, 3) assert (jscode(A[0, 0]) == "A[0]") assert (jscode(3 * A[0, 0]) == "3*A[0]") F = C[0, 0].subs(C, A - B) assert (jscode(F) == "((-1)*B + A)[0]")
def test_MatrixElement_printing(): # test cases for issue #11821 A = MatrixSymbol("A", 1, 3) B = MatrixSymbol("B", 1, 3) C = MatrixSymbol("C", 1, 3) assert(jscode(A[0, 0]) == "A[0]") assert(jscode(3 * A[0, 0]) == "3*A[0]") F = C[0, 0].subs(C, A - B) assert(jscode(F) == "((-1)*B + A)[0]")
def test_jscode_inline_function(): x = symbols("x") g = implemented_function("g", Lambda(x, 2 * x)) assert jscode(g(x)) == "2*x" g = implemented_function("g", Lambda(x, 2 * x / Catalan)) assert jscode(g(x)) == "var Catalan = %s;\n2*x/Catalan" % Catalan.n() A = IndexedBase("A") i = Idx("i", symbols("n", integer=True)) g = implemented_function("g", Lambda(x, x * (1 + x) * (2 + x))) assert jscode(g(A[i]), assign_to=A[i]) == ( "for (var i=0; i<n; i++){\n" " A[i] = A[i]*(1 + A[i])*(2 + A[i]);\n" "}" )
def test_jscode_inline_function(): x = symbols('x') g = implemented_function('g', Lambda(x, 2 * x)) assert jscode(g(x)) == "2*x" g = implemented_function('g', Lambda(x, 2 * x / Catalan)) assert jscode(g(x)) == "var Catalan = %s;\n2*x/Catalan" % Catalan.n() A = IndexedBase('A') i = Idx('i', symbols('n', integer=True)) g = implemented_function('g', Lambda(x, x * (1 + x) * (2 + x))) assert jscode(g(A[i]), assign_to=A[i]) == ("for (var i=0; i<n; i++){\n" " A[i] = (A[i] + 1)*(A[i] + 2)*A[i];\n" "}")
def test_jscode_inline_function(): x = symbols("x") g = implemented_function("g", Lambda(x, 2 * x)) assert jscode(g(x)) == "2*x" g = implemented_function("g", Lambda(x, 2 * x / Catalan)) assert jscode(g(x)) == "var Catalan = %s;\n2*x/Catalan" % Catalan.evalf(17) A = IndexedBase("A") i = Idx("i", symbols("n", integer=True)) g = implemented_function("g", Lambda(x, x * (1 + x) * (2 + x))) assert jscode(g(A[i]), assign_to=A[i]) == ("for (var i=0; i<n; i++){\n" " A[i] = (A[i] + 1)*(A[i] + 2)*A[i];\n" "}")
def test_jscode_inline_function(): x = symbols('x') g = implemented_function('g', Lambda(x, 2*x)) assert jscode(g(x)) == "2*x" g = implemented_function('g', Lambda(x, 2*x/Catalan)) assert jscode(g(x)) == "var Catalan = %s;\n2*x/Catalan" % Catalan.n() A = IndexedBase('A') i = Idx('i', symbols('n', integer=True)) g = implemented_function('g', Lambda(x, x*(1 + x)*(2 + x))) assert jscode(g(A[i]), assign_to=A[i]) == ( "for (var i=0; i<n; i++){\n" " A[i] = (A[i] + 1)*(A[i] + 2)*A[i];\n" "}" )
def test_jscode_loops_addfactor(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols("n m o p", integer=True) a = IndexedBase("a") b = IndexedBase("b") c = IndexedBase("c") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) k = Idx("k", o) l = Idx("l", p) s = ("for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " for (var k=0; k<o; k++){\n" " for (var l=0; l<p; l++){\n" " y[i] = (a[%s] + b[%s])*c[%s] + y[i];\n" % ( i * n * o * p + j * o * p + k * p + l, i * n * o * p + j * o * p + k * p + l, j * o * p + k * p + l, ) + " }\n" " }\n" " }\n" "}") c = jscode((a[i, j, k, l] + b[i, j, k, l]) * c[j, k, l], assign_to=y[i]) assert c == s
def test_jscode_loops_addfactor(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') c = IndexedBase('c') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) l = Idx('l', p) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' for (var l=0; l<p; l++){\n' ' y[i] = (a[%s] + b[%s])*c[%s] + y[i];\n' % (i*n*o*p + j*o*p + k*p + l, i*n*o*p + j*o*p + k*p + l, j*o*p + k*p + l) +\ ' }\n' ' }\n' ' }\n' '}' ) c = jscode((a[i, j, k, l] + b[i, j, k, l])*c[j, k, l], assign_to=y[i]) assert c == s
def test_jscode_loops_addfactor(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols("n m o p", integer=True) a = IndexedBase("a") b = IndexedBase("b") c = IndexedBase("c") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) k = Idx("k", o) l = Idx("l", p) s = ( "for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " for (var k=0; k<o; k++){\n" " for (var l=0; l<p; l++){\n" " y[i] = (a[i*n*o*p + j*o*p + k*p + l] + b[i*n*o*p + j*o*p + k*p + l])*c[j*o*p + k*p + l] + y[i];\n" " }\n" " }\n" " }\n" "}" ) c = jscode((a[i, j, k, l] + b[i, j, k, l]) * c[j, k, l], assign_to=y[i]) assert c == s
def test_jscode_loops_multiple_terms(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') c = IndexedBase('c') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) s0 = ('for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n') s1 = ('for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' y[i] = b[j]*b[k]*c[i*n*o + j*o + k] + y[i];\n' ' }\n' ' }\n' '}\n') s2 = ('for (var i=0; i<m; i++){\n' ' for (var k=0; k<o; k++){\n' ' y[i] = b[k]*a[i*o + k] + y[i];\n' ' }\n' '}\n') s3 = ('for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = b[j]*a[i*n + j] + y[i];\n' ' }\n' '}\n') c = jscode(b[j] * a[i, j] + b[k] * a[i, k] + b[j] * b[k] * c[i, j, k], assign_to=y[i]) assert (c == s0 + s1 + s2 + s3[:-1] or c == s0 + s1 + s3 + s2[:-1] or c == s0 + s2 + s1 + s3[:-1] or c == s0 + s2 + s3 + s1[:-1] or c == s0 + s3 + s1 + s2[:-1] or c == s0 + s3 + s2 + s1[:-1])
def test_jscode_loops_multiple_contractions(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) l = Idx('l', p) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' for (var l=0; l<p; l++){\n' ' y[i] = y[i] + b[j*o*p + k*p + l]*a[i*n*o*p + j*o*p + k*p + l];\n' ' }\n' ' }\n' ' }\n' '}') c = jscode(b[j, k, l] * a[i, j, k, l], assign_to=y[i]) assert c == s
def test_jscode_loops_multiple_terms(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols("n m o p", integer=True) a = IndexedBase("a") b = IndexedBase("b") c = IndexedBase("c") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) k = Idx("k", o) s0 = "for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" s1 = ("for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " for (var k=0; k<o; k++){\n" " y[i] = b[j]*b[k]*c[%s] + y[i];\n" % (i * n * o + j * o + k) + " }\n" " }\n" "}\n") s2 = ("for (var i=0; i<m; i++){\n" " for (var k=0; k<o; k++){\n" " y[i] = a[%s]*b[k] + y[i];\n" % (i * o + k) + " }\n" "}\n") s3 = ("for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = a[%s]*b[j] + y[i];\n" % (i * n + j) + " }\n" "}\n") c = jscode(b[j] * a[i, j] + b[k] * a[i, k] + b[j] * b[k] * c[i, j, k], assign_to=y[i]) assert (c == s0 + s1 + s2 + s3[:-1] or c == s0 + s1 + s3 + s2[:-1] or c == s0 + s2 + s1 + s3[:-1] or c == s0 + s2 + s3 + s1[:-1] or c == s0 + s3 + s1 + s2[:-1] or c == s0 + s3 + s2 + s1[:-1])
def test_jscode_loops_addfactor(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') c = IndexedBase('c') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) l = Idx('l', p) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' for (var l=0; l<p; l++){\n' ' y[i] = (a[%s] + b[%s])*c[%s] + y[i];\n' % (i*n*o*p + j*o*p + k*p + l, i*n*o*p + j*o*p + k*p + l, j*o*p + k*p + l) +\ ' }\n' ' }\n' ' }\n' '}' ) c = jscode((a[i, j, k, l] + b[i, j, k, l]) * c[j, k, l], assign_to=y[i]) assert c == s
def jsify_expr(expr): clamp = Function("clamp") bottom_clamp = Function("bottom") x = Wild("x") # Prevent NaNs on inverse trig functions expr = expr.replace(asin, lambda x: asin(clamp(x, -1, 1))) expr = expr.replace(acos, lambda x: acos(clamp(x, -1, 1))) # Prevent NaNs on sqrts expr = expr.replace(sqrt(x + 1), sqrt(bottom_clamp(x + 1, 0))) js_expr = jscode(expr, user_functions = { "clamp": "THREE.Math.clamp", "bottom": "THREE.Math.clampBottom" }) # Convert all matrix references for compatibility with # three.js atoms = expr.atoms(Symbol) matrices = set([]) for atom in atoms: matrix_name = re.findall("([a-zA-Z]+)_\d,\d", atom.name) if len(matrix_name) > 0: matrices.add(matrix_name[0]) for matrix in matrices: js_expr = subs_matrix_elements(js_expr, matrix) return js_expr
def test_jscode_loops_multiple_contractions(): n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) l = Idx('l', p) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' for (var l=0; l<p; l++){\n' ' y[i] = a[%s]*b[%s] + y[i];\n' % (i*n*o*p + j*o*p + k*p + l, j*o*p + k*p + l) +\ ' }\n' ' }\n' ' }\n' '}' ) c = jscode(b[j, k, l] * a[i, j, k, l], assign_to=y[i]) assert c == s
def test_jscode_loops_multiple_contractions(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) l = Idx('l', p) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' for (var l=0; l<p; l++){\n' ' y[i] = y[i] + b[j*o*p + k*p + l]*a[i*n*o*p + j*o*p + k*p + l];\n' ' }\n' ' }\n' ' }\n' '}' ) c = jscode(b[j, k, l]*a[i, j, k, l], assign_to=y[i]) assert c == s
def eval_graph(evaluator, variable): from sympy.plotting.plot import LineOver1DRangeSeries func = evaluator.eval("input_evaluated") free_symbols = sympy.sympify(func).free_symbols if len(free_symbols) != 1 or variable not in free_symbols: raise ValueError("Cannot graph function of multiple variables") try: series = LineOver1DRangeSeries(func, (variable, -10, 10), nb_of_points=200) # returns a list of [[x,y], [next_x, next_y]] pairs series = series.get_segments() except TypeError: raise ValueError("Cannot graph function") xvalues = [] yvalues = [] for point in series: xvalues.append(point[0][0]) yvalues.append(point[0][1]) xvalues.append(series[-1][1][0]) yvalues.append(series[-1][1][1]) return { 'function': sympy.jscode(sympy.sympify(func)), 'variable': repr(variable), 'xvalues': json.dumps(xvalues), 'yvalues': json.dumps(yvalues) }
def task_to_json(dotx, doty): # %% rename; it is not really _to_json, just returns dictionary k_img, ps = get_points(dotx, doty) # dot_x = sympy.simplify(dotx) # dot_y = sympy.simplify(doty) for p in ps: latexify_point(p) d = { 'dot_x_code': sympy.jscode(from_string(dotx)), 'dot_y_code': sympy.jscode(from_string(doty)), 'dot_x_tex': sympy.latex(sympy.simplify(dotx)), 'dot_y_tex': sympy.latex(sympy.simplify(doty)), 'k_img': k_img, 'k_real': len(ps), 'points': ps } # return json.dumps(d) return d
def test_jscode_boolean(): assert jscode(x & y) == "x && y" assert jscode(x | y) == "x || y" assert jscode(~x) == "!x" assert jscode(x & y & z) == "x && y && z" assert jscode(x | y | z) == "x || y || z" assert jscode((x & y) | z) == "z || x && y" assert jscode((x | y) & z) == "z && (x || y)"
def test_Mod(): assert jscode(Mod(x, y)) == '((x % y) + y) % y' assert jscode(Mod(x, x + y)) == '((x % (x + y)) + (x + y)) % (x + y)' p1, p2 = symbols('p1 p2', positive=True) assert jscode(Mod(p1, p2)) == 'p1 % p2' assert jscode(Mod(p1, p2 + 3)) == 'p1 % (p2 + 3)' assert jscode(Mod(-3, -7, evaluate=False)) == '(-3) % (-7)' assert jscode(-Mod(p1, p2)) == '-(p1 % p2)' assert jscode(x * Mod(p1, p2)) == 'x*(p1 % p2)'
def eval_graph(evaluator, variable): from sympy.plotting.plot import LineOver1DRangeSeries func = evaluator.eval("input_evaluated") series = LineOver1DRangeSeries(func, (variable, -10, 10), nb_of_points=200) series = series.get_points() return { 'function': sympy.jscode(sympy.sympify(func)), 'variable': repr(variable), 'xvalues': json.dumps(series[0].tolist()), 'yvalues': json.dumps(series[1].tolist()) }
def test_jscode_Piecewise_deep(): p = jscode(2 * Piecewise((x, x < 1), (x**2, True))) s = """\ 2*((x < 1) ? ( x ) : ( Math.pow(x, 2) ))\ """ assert p == s
def test_jscode_Piecewise(): p = jscode(Piecewise((x, x < 1), (x ** 2, True))) s = """\ if (x < 1) { x } else { Math.pow(x, 2) }\ """ assert p == s
def test_jscode_Piecewise_deep(): p = jscode(2*Piecewise((x, x < 1), (x**2, True))) s = \ """\ 2*if (x < 1) { x } else { Math.pow(x, 2) }\ """ assert p == s
def test_jscode_Piecewise(): p = jscode(Piecewise((x, x < 1), (x**2, True))) s = \ """\ if (x < 1) { x } else { Math.pow(x, 2) }\ """ assert p == s
def test_jscode_Piecewise(): expr = Piecewise((x, x < 1), (x**2, True)) p = jscode(expr) s = """\ ((x < 1) ? ( x ) : ( Math.pow(x, 2) ))\ """ assert p == s assert jscode(expr, assign_to="c") == ("if (x < 1) {\n" " c = x;\n" "}\n" "else {\n" " c = Math.pow(x, 2);\n" "}") # Check that Piecewise without a True (default) condition error expr = Piecewise((x, x < 1), (x**2, x > 1), (sin(x), x > 0)) raises(ValueError, lambda: jscode(expr))
def test_jscode_Piecewise_deep(): p = jscode(2*Piecewise((x, x < 1), (x**2, True))) s = \ """\ 2*((x < 1) ? ( x ) : ( Math.pow(x, 2) ))\ """ assert p == s
def test_Relational(): assert jscode(Eq(x, y)) == "x == y" assert jscode(Ne(x, y)) == "x != y" assert jscode(Le(x, y)) == "x <= y" assert jscode(Lt(x, y)) == "x < y" assert jscode(Gt(x, y)) == "x > y" assert jscode(Ge(x, y)) == "x >= y"
def test_dummy_loops(): i, m = symbols('i m', integer=True, cls=Dummy) x = IndexedBase('x') y = IndexedBase('y') i = Idx(i, m) expected = ( 'for (var i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){\n' ' y[i_%(icount)i] = x[i_%(icount)i];\n' '}' ) % {'icount': i.label.dummy_index, 'mcount': m.dummy_index} code = jscode(x[i], assign_to=y[i]) assert code == expected
def test_Matrix_printing(): # Test returning a Matrix mat = Matrix([x * y, Piecewise((2 + x, y > 0), (y, True)), sin(z)]) A = MatrixSymbol("A", 3, 1) assert jscode(mat, A) == ("A[0] = x*y;\n" "if (y > 0) {\n" " A[1] = x + 2;\n" "}\n" "else {\n" " A[1] = y;\n" "}\n" "A[2] = Math.sin(z);") # Test using MatrixElements in expressions expr = Piecewise((2 * A[2, 0], x > 0), (A[2, 0], True)) + sin(A[1, 0]) + A[0, 0] assert jscode(expr) == ("((x > 0) ? (\n" " 2*A[2]\n" ")\n" ": (\n" " A[2]\n" ")) + Math.sin(A[1]) + A[0]") # Test using MatrixElements in a Matrix q = MatrixSymbol("q", 5, 1) M = MatrixSymbol("M", 3, 3) m = Matrix([ [sin(q[1, 0]), 0, cos(q[2, 0])], [q[1, 0] + q[2, 0], q[3, 0], 5], [2 * q[4, 0] / q[1, 0], sqrt(q[0, 0]) + 4, 0], ]) assert jscode(m, M) == ("M[0] = Math.sin(q[1]);\n" "M[1] = 0;\n" "M[2] = Math.cos(q[2]);\n" "M[3] = q[1] + q[2];\n" "M[4] = q[3];\n" "M[5] = 5;\n" "M[6] = 2*q[4]/q[1];\n" "M[7] = Math.sqrt(q[0]) + 4;\n" "M[8] = 0;")
def test_Matrix_printing(): # Test returning a Matrix mat = Matrix([x*y, Piecewise((2 + x, y>0), (y, True)), sin(z)]) A = MatrixSymbol('A', 3, 1) assert jscode(mat, A) == ( "A[0] = x*y;\n" "if (y > 0) {\n" " A[1] = x + 2;\n" "}\n" "else {\n" " A[1] = y;\n" "}\n" "A[2] = Math.sin(z);") # Test using MatrixElements in expressions expr = Piecewise((2*A[2, 0], x > 0), (A[2, 0], True)) + sin(A[1, 0]) + A[0, 0] assert jscode(expr) == ( "((x > 0) ? (\n" " 2*A[2]\n" ")\n" ": (\n" " A[2]\n" ")) + Math.sin(A[1]) + A[0]") # Test using MatrixElements in a Matrix q = MatrixSymbol('q', 5, 1) M = MatrixSymbol('M', 3, 3) m = Matrix([[sin(q[1,0]), 0, cos(q[2,0])], [q[1,0] + q[2,0], q[3, 0], 5], [2*q[4, 0]/q[1,0], sqrt(q[0,0]) + 4, 0]]) assert jscode(m, M) == ( "M[0] = Math.sin(q[1]);\n" "M[1] = 0;\n" "M[2] = Math.cos(q[2]);\n" "M[3] = q[1] + q[2];\n" "M[4] = q[3];\n" "M[5] = 5;\n" "M[6] = 2*q[4]/q[1];\n" "M[7] = Math.sqrt(q[0]) + 4;\n" "M[8] = 0;")
def test_jscode_Piecewise(): expr = Piecewise((x, x < 1), (x**2, True)) p = jscode(expr) s = \ """\ ((x < 1) ? ( x ) : ( Math.pow(x, 2) ))\ """ assert p == s assert jscode(expr, assign_to="c") == ( "if (x < 1) {\n" " c = x;\n" "}\n" "else {\n" " c = Math.pow(x, 2);\n" "}") # Check that Piecewise without a True (default) condition error expr = Piecewise((x, x < 1), (x**2, x > 1), (sin(x), x > 0)) raises(ValueError, lambda: jscode(expr))
def latexify_point(d): for k in 'l1', 'l2', 'x', 'y': d[k + '_tex'] = sympy.latex(d[k]) for k in 'ab', 'cd': d[k + '_tex'] = sympy.latex(d[k]) d[k + '_code'] = sympy.jscode(d[k].subs({u: x, v: y})) d[k] = '' for k in 'l1', 'l2': d[k] = '' for k in 'x', 'y': d[k] = float(d[k]) for k in 'ev1', 'ev2': if k in d: d[k + '_tex'] = map(sympy.latex, d[k]) d[k] = map(float, d[k])
def test_dummy_loops(): i, m = symbols("i m", integer=True, cls=Dummy) x = IndexedBase("x") y = IndexedBase("y") i = Idx(i, m) expected = ( "for (var i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){\n" " y[i_%(icount)i] = x[i_%(icount)i];\n" "}") % { "icount": i.label.dummy_index, "mcount": m.dummy_index } code = jscode(x[i], assign_to=y[i]) assert code == expected
def test_jscode_loops_multiple_terms(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols('n m o p', integer=True) a = IndexedBase('a') b = IndexedBase('b') c = IndexedBase('c') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) k = Idx('k', o) s0 = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' ) s1 = ( 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' for (var k=0; k<o; k++){\n' ' y[i] = b[j]*b[k]*c[%s] + y[i];\n' % (i*n*o + j*o + k) +\ ' }\n' ' }\n' '}\n' ) s2 = ( 'for (var i=0; i<m; i++){\n' ' for (var k=0; k<o; k++){\n' ' y[i] = a[%s]*b[k] + y[i];\n' % (i*o + k) +\ ' }\n' '}\n' ) s3 = ( 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = a[%s]*b[j] + y[i];\n' % (i*n + j) +\ ' }\n' '}\n' ) c = jscode( b[j]*a[i, j] + b[k]*a[i, k] + b[j]*b[k]*c[i, j, k], assign_to=y[i]) assert (c == s0 + s1 + s2 + s3[:-1] or c == s0 + s1 + s3 + s2[:-1] or c == s0 + s2 + s1 + s3[:-1] or c == s0 + s2 + s3 + s1[:-1] or c == s0 + s3 + s1 + s2[:-1] or c == s0 + s3 + s2 + s1[:-1])
def test_dummy_loops(): # the following line could also be # [Dummy(s, integer=True) for s in 'im'] # or [Dummy(integer=True) for s in 'im'] i, m = symbols("i m", integer=True, cls=Dummy) x = IndexedBase("x") y = IndexedBase("y") i = Idx(i, m) expected = ( "for (var i_%(icount)i=0; i_%(icount)i<m_%(mcount)i; i_%(icount)i++){\n" " y[i_%(icount)i] = x[i_%(icount)i];\n" "}" ) % {"icount": i.label.dummy_index, "mcount": m.dummy_index} code = jscode(x[i], assign_to=y[i]) assert code == expected
def eval_graph(evaluator, components, parameters=None): if parameters is None: parameters = {} variable = components['variable'] xmin, xmax = parameters.get('xmin', -10), parameters.get('xmax', 10) from sympy.plotting.plot import LineOver1DRangeSeries func = evaluator.get("input_evaluated") free_symbols = func.free_symbols if len(free_symbols) != 1 or variable not in free_symbols: raise ValueError("Cannot graph function of multiple variables") try: series = LineOver1DRangeSeries( func, (variable, xmin, xmax), nb_of_points=150) # returns a list of [[x,y], [next_x, next_y]] pairs series = series.get_segments() except TypeError: raise ValueError("Cannot graph function") xvalues = [] yvalues = [] def limit_y(y): CEILING = 1e8 if y > CEILING: y = CEILING if y < -CEILING: y = -CEILING return y for point in series: xvalues.append(point[0][0]) yvalues.append(limit_y(point[0][1])) xvalues.append(series[-1][1][0]) yvalues.append(limit_y(series[-1][1][1])) return { 'function': sympy.jscode(sympy.sympify(func)), 'variable': repr(variable), 'xvalues': json.dumps(xvalues), 'yvalues': json.dumps(yvalues) }
def test_jscode_loops_multiple_terms(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m, o, p = symbols("n m o p", integer=True) a = IndexedBase("a") b = IndexedBase("b") c = IndexedBase("c") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) k = Idx("k", o) s0 = "for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" s1 = ( "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " for (var k=0; k<o; k++){\n" " y[i] = b[j]*b[k]*c[i*n*o + j*o + k] + y[i];\n" " }\n" " }\n" "}\n" ) s2 = ( "for (var i=0; i<m; i++){\n" " for (var k=0; k<o; k++){\n" " y[i] = b[k]*a[i*o + k] + y[i];\n" " }\n" "}\n" ) s3 = ( "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = b[j]*a[i*n + j] + y[i];\n" " }\n" "}\n" ) c = jscode(b[j] * a[i, j] + b[k] * a[i, k] + b[j] * b[k] * c[i, j, k], assign_to=y[i]) assert ( c == s0 + s1 + s2 + s3[:-1] or c == s0 + s1 + s3 + s2[:-1] or c == s0 + s2 + s1 + s3[:-1] or c == s0 + s2 + s3 + s1[:-1] or c == s0 + s3 + s1 + s2[:-1] or c == s0 + s3 + s2 + s1[:-1] )
def test_jscode_loops_matrix_vector(): n, m = symbols('n m', integer=True) A = IndexedBase('A') x = IndexedBase('x') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) s = ('for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = A[n*i + j]*x[j] + y[i];\n' ' }\n' '}') c = jscode(A[i, j] * x[j], assign_to=y[i]) assert c == s
def test_jscode_loops_matrix_vector(): n, m = symbols("n m", integer=True) A = IndexedBase("A") x = IndexedBase("x") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) s = ("for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = A[n*i + j]*x[j] + y[i];\n" " }\n" "}") c = jscode(A[i, j] * x[j], assign_to=y[i]) assert c == s
def expressionToCode(expression, language): '''Converts a SymPy Expression to a line of code in the target language''' if (language == "python"): return sympy.pycode(expression) elif (language == "javascript" or language == "typescript"): return sympy.jscode(expression) elif (language == "c"): return sympy.ccode(expression) elif (language == "cpp"): return sympy.cxxcode(expression) elif (language == "r"): return sympy.rcode(expression) elif (language == "fortran"): return sympy.fcode(expression) elif (language == "mathematica"): return sympy.mathematica_code(expression) elif (language == "matlab" or language == "octave"): return sympy.octave_code(expression) elif (language == "rust"): return sympy.rust_code(expression)
def test_jscode_loops_matrix_vector(): n, m = symbols('n m', integer=True) A = IndexedBase('A') x = IndexedBase('x') y = IndexedBase('y') i = Idx('i', m) j = Idx('j', n) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = 0;\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = A[n*i + j]*x[j] + y[i];\n' ' }\n' '}' ) c = jscode(A[i, j]*x[j], assign_to=y[i]) assert c == s
def test_jscode_loops_matrix_vector(): n, m = symbols("n m", integer=True) A = IndexedBase("A") x = IndexedBase("x") y = IndexedBase("y") i = Idx("i", m) j = Idx("j", n) s = ( "for (var i=0; i<m; i++){\n" " y[i] = 0;\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = y[i] + A[i*n + j]*x[j];\n" " }\n" "}" ) c = jscode(A[i, j] * x[j], assign_to=y[i]) assert c == s
def test_jscode_loops_add(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m = symbols('n m', integer=True) A = IndexedBase('A') x = IndexedBase('x') y = IndexedBase('y') z = IndexedBase('z') i = Idx('i', m) j = Idx('j', n) s = ('for (var i=0; i<m; i++){\n' ' y[i] = x[i] + z[i];\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = A[n*i + j]*x[j] + y[i];\n' ' }\n' '}') c = jscode(A[i, j] * x[j] + x[i] + z[i], assign_to=y[i]) assert c == s
def test_jscode_loops_add(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m = symbols("n m", integer=True) A = IndexedBase("A") x = IndexedBase("x") y = IndexedBase("y") z = IndexedBase("z") i = Idx("i", m) j = Idx("j", n) s = ("for (var i=0; i<m; i++){\n" " y[i] = x[i] + z[i];\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = A[n*i + j]*x[j] + y[i];\n" " }\n" "}") c = jscode(A[i, j] * x[j] + x[i] + z[i], assign_to=y[i]) assert c == s
def test_jscode_loops_add(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m = symbols('n m', integer=True) A = IndexedBase('A') x = IndexedBase('x') y = IndexedBase('y') z = IndexedBase('z') i = Idx('i', m) j = Idx('j', n) s = ( 'for (var i=0; i<m; i++){\n' ' y[i] = x[i] + z[i];\n' '}\n' 'for (var i=0; i<m; i++){\n' ' for (var j=0; j<n; j++){\n' ' y[i] = A[n*i + j]*x[j] + y[i];\n' ' }\n' '}' ) c = jscode(A[i, j]*x[j] + x[i] + z[i], assign_to=y[i]) assert c == s
def test_jscode_loops_add(): from sympy.tensor import IndexedBase, Idx from sympy import symbols n, m = symbols("n m", integer=True) A = IndexedBase("A") x = IndexedBase("x") y = IndexedBase("y") z = IndexedBase("z") i = Idx("i", m) j = Idx("j", n) s = ( "for (var i=0; i<m; i++){\n" " y[i] = x[i] + z[i];\n" "}\n" "for (var i=0; i<m; i++){\n" " for (var j=0; j<n; j++){\n" " y[i] = y[i] + A[i*n + j]*x[j];\n" " }\n" "}" ) c = jscode(A[i, j] * x[j] + x[i] + z[i], assign_to=y[i]) assert c == s
def eval_plot(evaluator, components, parameters=None): if parameters is None: parameters = {} xmin, xmax = parameters.get('xmin', -10), parameters.get('xmax', 10) pmin, pmax = parameters.get('tmin', 0), parameters.get('tmax', 2 * sympy.pi) tmin, tmax = parameters.get('tmin', 0), parameters.get('tmax', 10) from sympy.plotting.plot import LineOver1DRangeSeries, Parametric2DLineSeries functions = evaluator.get("input_evaluated") if isinstance(functions, sympy.Basic): functions = [(functions, 'xy')] elif isinstance(functions, list): functions = [(f, 'xy') for f in functions] elif isinstance(functions, dict): functions = [(f, determine_graph_type(key)) for key, f in functions.items()] graphs = [] for func, graph_type in functions: if graph_type == 'parametric': x_func, y_func = func x_vars, y_vars = x_func.free_symbols, y_func.free_symbols variables = x_vars.union(y_vars) if x_vars != y_vars: raise ValueError( "Both functions in a parametric plot must have the same variable" ) else: variables = func.free_symbols if len(variables) > 1: raise ValueError("Cannot plot multivariate function") elif len(variables) == 0: variable = sympy.Symbol('x') else: variable = list(variables)[0] try: if graph_type == 'xy': graph_range = (variable, xmin, xmax) elif graph_type == 'polar': graph_range = (variable, pmin, pmax) elif graph_type == 'parametric': graph_range = (variable, tmin, tmax) if graph_type in ('xy', 'polar'): series = LineOver1DRangeSeries(func, graph_range, nb_of_points=150) elif graph_type == 'parametric': series = Parametric2DLineSeries(x_func, y_func, graph_range, nb_of_points=150) # returns a list of [[x,y], [next_x, next_y]] pairs series = series.get_segments() except TypeError: raise ValueError("Cannot plot function") xvalues = [] yvalues = [] def limit_y(y): CEILING = 1e8 if y > CEILING: y = CEILING if y < -CEILING: y = -CEILING return y x_transform, y_transform = GRAPH_TYPES[graph_type] series.append([series[-1][1], None]) for point in series: if point[0][1] is None: continue x = point[0][0] y = limit_y(point[0][1]) xvalues.append(x_transform(x, y)) yvalues.append(y_transform(x, y)) graphs.append({ 'type': graph_type, 'function': sympy.jscode(sympy.sympify(func)), 'points': { 'x': xvalues, 'y': yvalues }, 'data': None }) return {'variable': repr(variable), 'graphs': json.dumps(graphs)}
def test_jscode_Rational(): assert jscode(Rational(3, 7)) == "3/7" assert jscode(Rational(18, 9)) == "2" assert jscode(Rational(3, -7)) == "-3/7" assert jscode(Rational(-3, -7)) == "3/7"
def test_jscode_exceptions(): assert jscode(ceiling(x)) == "Math.ceil(x)" assert jscode(Abs(x)) == "Math.abs(x)"
def test_jscode_Integer(): assert jscode(Integer(67)) == "67" assert jscode(Integer(-1)) == "-1"
def test_jscode_functions(): assert jscode(sin(x) ** cos(x)) == "Math.pow(Math.sin(x), Math.cos(x))"