UNPKG

algebrite

Version:

Computer Algebra System in Coffeescript

782 lines (639 loc) 38.9 kB
test_dependencies = -> do_clearall() testResult = findDependenciesInScript('1') if testResult[0] == "All local dependencies: . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: " and testResult[1] == "1" and testResult[2] == "" console.log "ok dependency test" else console.log "fail dependency test 1 expected: " + testResult do_clearall() # check that floats in code are expressed with maximum precision ------------------- testResult = findDependenciesInScript('a = float(1/3)') if testResult[0] == "All local dependencies: variable a depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: ; " and testResult[1] == "" and testResult[2] == "a = 0.3333333333333333;" console.log "ok dependency test" else console.log "fail dependency test 2 expected: " + testResult do_clearall() testResult = findDependenciesInScript('a = float(10^50)') if testResult[0] == "All local dependencies: variable a depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: ; " and testResult[1] == "" and testResult[2] == "a = 1e+50;" console.log "ok dependency test" else console.log "fail dependency test 3 expected: " + testResult do_clearall() testResult = findDependenciesInScript('f = x+1\n g = f\n h = g\n f = g') if testResult[0] == "All local dependencies: variable f depends on: x, g, ; variable g depends on: f, ; variable h depends on: g, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: x, ; f --> g --> ... then f again, variable g depends on: x, ; g --> f --> ... then g again, variable h depends on: x, ; h --> g --> f --> ... then g again, " and testResult[1] == "" and testResult[2] == "// f is part of a cyclic dependency, no code generated.\n// g is part of a cyclic dependency, no code generated.\n// h is part of a cyclic dependency, no code generated." else console.log "fail dependency test 4 expected: " + testResult do_clearall() if findDependenciesInScript('f = x+1\n g = f + y\n h = g')[0] == "All local dependencies: variable f depends on: x, ; variable g depends on: f, y, ; variable h depends on: g, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: x, ; variable g depends on: x, y, ; variable h depends on: x, y, ; " console.log "ok dependency test" else console.log "fail dependency test 5" do_clearall() if findDependenciesInScript('g = h(x,y)')[0] == "All local dependencies: variable g depends on: h, x, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable g depends on: h, x, y, ; " console.log "ok dependency test" else console.log "fail dependency test 6" do_clearall() if findDependenciesInScript('f(x,y) = k')[0] == "All local dependencies: variable f depends on: 'x, 'y, k, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: 'x, 'y, k, ; " console.log "ok dependency test" else console.log "fail dependency test 7" do_clearall() if findDependenciesInScript('x = z\n f(x,y) = k')[0] == "All local dependencies: variable x depends on: z, ; variable f depends on: 'x, 'y, k, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: z, ; variable f depends on: 'x, 'y, k, ; " console.log "ok dependency test" else console.log "fail dependency test 8" do_clearall() if findDependenciesInScript('x = z\n g = f(x,y)')[0] == "All local dependencies: variable x depends on: z, ; variable g depends on: f, x, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: z, ; variable g depends on: f, z, y, ; " console.log "ok dependency test" else console.log "fail dependency test 9" do_clearall() if findDependenciesInScript('x = 1\n x = y\n x = z')[0] == "All local dependencies: variable x depends on: y, z, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: y, z, ; " console.log "ok dependency test" else console.log "fail dependency test 10" do_clearall() testResult = findDependenciesInScript('x = y*y') if testResult[0] == "All local dependencies: variable x depends on: y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: y, ; " and testResult[1] == "" and testResult[2] == "x = function (y) { return ( Math.pow(y, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 11 expected: " + testResult do_clearall() testResult = findDependenciesInScript('x = e*e') if testResult[0] == "All local dependencies: variable x depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: ; " and testResult[1] == "" and testResult[2] == "x = Math.exp(2);" console.log "ok dependency test" else console.log "fail dependency test 12 expected: " + testResult testResult = findDependenciesInScript('x = e') if testResult[0] == "All local dependencies: variable x depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: ; " and testResult[1] == "" and testResult[2] == "x = Math.E;" console.log "ok dependency test" else console.log "fail dependency test 13 expected: " + testResult testResult = findDependenciesInScript('x = -sqrt(2)/2') if testResult[0] == "All local dependencies: variable x depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: ; " and testResult[1] == "" and testResult[2] == "x = -1/2*Math.SQRT2;" console.log "ok dependency test" else console.log "fail dependency test 14 expected: " + testResult do_clearall() testResult = findDependenciesInScript('x = 2^(1/2-a)*2^a/10') if testResult[0] == "All local dependencies: variable x depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: a, ; " and testResult[1] == "" and testResult[2] == "x = 1/10*Math.SQRT2;" console.log "ok dependency test" else console.log "fail dependency test 15 expected: " + testResult do_clearall() testResult = findDependenciesInScript('x = rationalize(t*y/(t+y)+2*t^2*y*(2*t+y)^(-2))') if testResult[0] == "All local dependencies: variable x depends on: t, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: t, y, ; " and testResult[1] == "" and testResult[2] == "x = function (t, y) { return ( t*y*(6*Math.pow(t, 2)+Math.pow(y, 2)+6*t*y)/((t+y)*Math.pow((2*t+y), 2)) ); }" console.log "ok dependency test" else console.log "fail dependency test 16 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('x = abs((a+i*b)/(c+i*d))') if testResult[0] == "All local dependencies: variable x depends on: a, b, c, d, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: a, b, c, d, ; " and testResult[1] == "" and testResult[2] == "x = function (a, b, c, d) { return ( Math.sqrt(Math.pow(a, 2)+Math.pow(b, 2))/(Math.sqrt(Math.pow(c, 2)+Math.pow(d, 2))) ); }" console.log "ok dependency test" else console.log "fail dependency test 17 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('x = sin(1/10)^2 + cos(1/10)^2 + y') if testResult[0] == "All local dependencies: variable x depends on: y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: y, ; " and testResult[1] == "" and testResult[2] == "x = function (y) { return ( 1+y ); }" console.log "ok dependency test" else console.log "fail dependency test 18 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('x = y + cos(1) + sin(1)') if testResult[0] == "All local dependencies: variable x depends on: y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: y, ; " and testResult[1] == "" and testResult[2] == "x = function (y) { return ( y+Math.cos(1)+Math.sin(1) ); }" console.log "ok dependency test" else console.log "fail dependency test 19 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('x = a + arccos(b) + arcsin(c)') if testResult[0] == "All local dependencies: variable x depends on: a, arccos, b, arcsin, c, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: a, arccos, b, arcsin, c, ; " and testResult[1] == "" and testResult[2] == "x = function (a, b, c) { return ( a+Math.acos(b)+Math.asin(c) ); }" console.log "ok dependency test" else console.log "fail dependency test 20 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('x = sin(1/10)^2 + cos(1/10)^2') if testResult[0] == "All local dependencies: variable x depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable x depends on: ; " and testResult[1] == "" and testResult[2] == "x = 1;" console.log "ok dependency test" else console.log "fail dependency test 21 expected: " + testResult do_clearall() testResult = findDependenciesInScript('a = unit(b) + c') if testResult[0] == "All local dependencies: variable a depends on: b, c, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: b, c, ; " and testResult[1] == "" and testResult[2] == "a = function (c, b) { return ( c+identity(b) ); }" console.log "ok dependency test" else console.log "fail dependency test 22 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f(x) = x * x') if testResult[0] == "All local dependencies: variable f depends on: 'x, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: 'x, ; " and testResult[1] == "" and testResult[2] == "f = function (x) { return ( x*x ); }" console.log "ok dependency test" else console.log "fail dependency test 23 expected: " + testResult do_clearall() testResult = findDependenciesInScript('f(x) = x * x + g(y)') if testResult[0] == "All local dependencies: variable f depends on: 'x, g, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: 'x, g, y, ; " and testResult[1] == "" and testResult[2] == "f = function (g, y, x) { return ( g(y)+Math.pow(x, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 24 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('y = 2\nf(x) = x * x + g(y)') if testResult[0] == "All local dependencies: variable y depends on: ; variable f depends on: 'x, g, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable y depends on: ; variable f depends on: 'x, g, ; " and testResult[1] == "" and testResult[2] == "y = 2;\nf = function (g, x) { return ( g(2)+Math.pow(x, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 25 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('g(x) = x + 2\ny = 2\nf(x) = x * x + g(y)') if testResult[0] == "All local dependencies: variable g depends on: 'x, ; variable y depends on: ; variable f depends on: 'x, g, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable g depends on: 'x, ; variable y depends on: ; variable f depends on: 'x, ; " and testResult[1] == "" and testResult[2] == "g = function (x) { return ( 2+x ); }\ny = 2;\nf = function (x) { return ( 4+Math.pow(x, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 26 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('g(x) = x + 2\nf(x) = x * x + g(y)') if testResult[0] == "All local dependencies: variable g depends on: 'x, ; variable f depends on: 'x, g, y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable g depends on: 'x, ; variable f depends on: 'x, y, ; " and testResult[1] == "" and testResult[2] == "g = function (x) { return ( 2+x ); }\nf = function (y, x) { return ( 2+y+Math.pow(x, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 27 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() ### testResult = findDependenciesInScript('g(x) = f(x)\nf(x)=g(x)') if testResult[0] == "All local dependencies: variable g depends on: 'x, f, x, ; variable f depends on: 'x, g, x, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable g depends on: 'x, ; g --> f --> ... then g again, variable f depends on: 'x, x, ; f --> g --> ... then f again, " and testResult[1] == "" and testResult[2] == "// g is part of a cyclic dependency, no code generated.\n// f is part of a cyclic dependency, no code generated." console.log "ok dependency test" else console.log "fail dependency test 28 expected: " + testResult do_clearall() ### testResult = findDependenciesInScript('piApprox = sum((-1)^k * (1/(2*k + 1)),k,0,iterations)*4') if testResult[0] == "All local dependencies: variable piApprox depends on: iterations, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable piApprox depends on: iterations, ; " and testResult[1] == "" and testResult[2] == "piApprox = function (iterations) { return ( 4*(function(){ var k; var holderSum = 0; var lowerlimit = 0; var upperlimit = iterations; for (k = lowerlimit; k < upperlimit; k++) { holderSum += Math.pow((-1), k)/(2*k+1); } return holderSum;})() ); }" and testResult[3] == "piApprox(iterations) = 4\\sum_{k=0}^{iterations}{\\frac{(-1)^k}{(2k+1)}}" console.log "ok dependency test" else console.log "fail dependency test 29 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] console.log "testResult[3]: " + testResult[3] do_clearall() testResult = findDependenciesInScript('piApprox = 2*product(4*k^2/(4*k^2-1),k,1,iterations)') if testResult[0] == "All local dependencies: variable piApprox depends on: iterations, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable piApprox depends on: iterations, ; " and testResult[1] == "" and testResult[2] == "piApprox = function (iterations) { return ( 2*(function(){ var k; var holderProduct = 1; var lowerlimit = 1; var upperlimit = iterations; for (k = lowerlimit; k < upperlimit; k++) { holderProduct *= 4*Math.pow(k, 2)/(4*Math.pow(k, 2)-1); } return holderProduct;})() ); }" and testResult[3] == "piApprox(iterations) = 2\\prod_{k=1}^{iterations}{\\frac{4k^2}{(4k^2-1)}}" console.log "ok dependency test" else console.log "fail dependency test 30 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] console.log "testResult[3]: " + testResult[3] do_clearall() testResult = findDependenciesInScript('f = roots(a*x^2 + b*x + c, x)') if testResult[0] == "All local dependencies: variable f depends on: a, b, c, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: a, b, c, ; " and testResult[1] == "" and testResult[2] == "f = function (a, b, c) { return ( [-1/2*(Math.sqrt(Math.pow(b, 2)/(Math.pow(a, 2))-4*c/a)+b/a),1/2*(Math.sqrt(Math.pow(b, 2)/(Math.pow(a, 2))-4*c/a)-b/a)] ); }" console.log "ok dependency test" else console.log "fail dependency test 31 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = roots(a*x^2 + b*x + c)') if testResult[0] == "All local dependencies: variable f depends on: a, b, c, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: a, b, c, ; " and testResult[1] == "" and testResult[2] == "f = function (a, b, c) { return ( [-1/2*(Math.sqrt(Math.pow(b, 2)/(Math.pow(a, 2))-4*c/a)+b/a),1/2*(Math.sqrt(Math.pow(b, 2)/(Math.pow(a, 2))-4*c/a)-b/a)] ); }" console.log "ok dependency test" else console.log "fail dependency test 32 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = roots(integral(a*x + b))') if testResult[0] == "All local dependencies: variable f depends on: a, b, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: a, b, ; " and testResult[1] == "" and testResult[2] == "f = function (a, b) { return ( [0,-2*b/a] ); }" console.log "ok dependency test" else console.log "fail dependency test 33 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = roots(defint(a*x + y,y,0,1))') if testResult[0] == "All local dependencies: variable f depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: a, ; " and testResult[1] == "" and testResult[2] == "f = function (a) { return ( -1/(2*a) ); }" console.log "ok dependency test" else console.log "fail dependency test 34 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = roots(defint(a*x + y + z,y,0,1, z, 0, 1))') if testResult[0] == "All local dependencies: variable f depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: a, ; " and testResult[1] == "" and testResult[2] == "f = function (a) { return ( -1/a ); }" console.log "ok dependency test" else console.log "fail dependency test 35 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = defint(2*x - 3*y,x,0,2*y)') if testResult[0] == "All local dependencies: variable f depends on: y, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: y, ; " and testResult[1] == "" and testResult[2] == "f = function (y) { return ( -2*Math.pow(y, 2) ); }" console.log "ok dependency test" else console.log "fail dependency test 36 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('f = defint(12 - x^2 - (y^2)/2,x,0,2,y,0,3)') if testResult[0] == "All local dependencies: variable f depends on: ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable f depends on: ; " and testResult[1] == "" and testResult[2] == "f = 55;" console.log "ok dependency test" else console.log "fail dependency test 37 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() # this example checks that functions are not meddled with, # in particular that in the function body, the variables # bound by the parameters remain "separate" from previous # variables with the same name. testResult = findDependenciesInScript('a = 2\nf(a) = a+1+b') if testResult[0] == "All local dependencies: variable a depends on: ; variable f depends on: 'a, b, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: ; variable f depends on: 'a, b, ; " and testResult[1] == "" and testResult[2] == "a = 2;\nf = function (a, b) { return ( 1+a+b ); }" console.log "ok dependency test" else console.log "fail dependency test 38 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() # similar as test above but this time we are not # defining a function, so things are a bit different. testResult = findDependenciesInScript('a = 2\nf = a+1') if testResult[0] == "All local dependencies: variable a depends on: ; variable f depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: ; variable f depends on: ; " and testResult[1] == "" and testResult[2] == "a = 2;\nf = 3;" console.log "ok dependency test" else console.log "fail dependency test 39 expected: " + testResult do_clearall() # similar as test above but this time we do a # trick with the quote to see whether we # get confused with the indirection testResult = findDependenciesInScript('a := b\nf = a+1') if testResult[0] == "All local dependencies: variable a depends on: b, ; variable f depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: b, ; variable f depends on: b, ; " and testResult[1] == "" and testResult[2] == "a = function (b) { return ( b ); }\nf = function (b) { return ( 1+b ); }" console.log "ok dependency test" else console.log "fail dependency test 40 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() # another tricky case of indirection through quote testResult = findDependenciesInScript('a := b\nf(a) = a+1') if testResult[0] == "All local dependencies: variable a depends on: b, ; variable f depends on: 'a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: b, ; variable f depends on: 'a, ; " and testResult[1] == "" and testResult[2] == "a = function (b) { return ( b ); }\nf = function (a) { return ( 1+a ); }" console.log "ok dependency test" else console.log "fail dependency test 41 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() # reassignment testResult = findDependenciesInScript('b = 1\nb=a+b+c') if testResult[0] == "All local dependencies: variable b depends on: a, c, ; . Symbols with reassignments: b, . Symbols in expressions without assignments: . All dependencies recursively: variable b depends on: a, c, ; " and testResult[1] == "" and testResult[2] == "b = function (a, c) { return ( 1+a+c ); }" console.log "ok dependency test" else console.log "fail dependency test 42 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() # reassignment testResult = findDependenciesInScript('a = a+1') if testResult[0] == "All local dependencies: variable a depends on: ; . Symbols with reassignments: a, . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: ; " and testResult[1] == "" and testResult[2] == "" and testResult[5] == "Error: Stop: recursive evaluation of symbols: a -> a" console.log "ok dependency test" else console.log "fail dependency test 43 expected: " + testResult do_clearall() # reassignment testResult = computeDependenciesFromAlgebra('pattern(a,b)\nc= d\na=a+1') if testResult.affectsVariables.length is 3 and testResult.affectsVariables.indexOf("c") != -1 and testResult.affectsVariables.indexOf("a") != -1 and testResult.affectsVariables.indexOf("PATTERN_DEPENDENCY") != -1 and testResult.affectedBy.length is 3 and testResult.affectedBy.indexOf("d") != -1 and testResult.affectedBy.indexOf("a") != -1 and testResult.affectedBy.indexOf("PATTERN_DEPENDENCY") != -1 console.log "ok dependency test" else console.log "fail dependency test 44 expected: " + testResult do_clearall() testResult = computeDependenciesFromAlgebra('PCA(M) = eig(Mᵀ⋅M)') if testResult.affectsVariables.length is 1 and testResult.affectsVariables.indexOf("PCA") != -1 and testResult.affectsVariables.indexOf("PATTERN_DEPENDENCY") == -1 and testResult.affectedBy.length is 1 and testResult.affectedBy.indexOf("PATTERN_DEPENDENCY") != -1 console.log "ok dependency test" else console.log "fail dependency test 45 expected: " + testResult do_clearall() testResult = computeDependenciesFromAlgebra('pattern(a_ᵀ⋅a_, cov(a_))') if testResult.affectsVariables.length is 1 and testResult.affectsVariables.indexOf("PATTERN_DEPENDENCY") != -1 and testResult.affectedBy.length is 1 and testResult.affectedBy.indexOf("PATTERN_DEPENDENCY") != -1 console.log "ok dependency test" else console.log "fail dependency test 46 expected: " + testResult do_clearall() testResult = findDependenciesInScript('a = b\nf = a+1') if testResult[0] == "All local dependencies: variable a depends on: b, ; variable f depends on: a, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable a depends on: b, ; variable f depends on: b, ; " and testResult[1] == "" and testResult[2] == "a = function (b) { return ( b ); }\nf = function (b) { return ( 1+b ); }" console.log "ok dependency test" else console.log "fail dependency test 47 obtained: " console.log "testResult[0]: " + testResult[0] console.log "testResult[1]: " + testResult[1] console.log "testResult[2]: " + testResult[2] do_clearall() testResult = findDependenciesInScript('PCA(M) = eig(cov(M))') if testResult[0] == "All local dependencies: variable PCA depends on: 'M, ; . Symbols with reassignments: . Symbols in expressions without assignments: . All dependencies recursively: variable PCA depends on: 'M, ; " and testResult[1] == "" and testResult[2] == "PCA = function (M) { return ( eig(cov(M)) ); }" console.log "ok dependency test" else console.log "fail dependency test 48 expected: " + testResult do_clearall() computeResultsAndJavaScriptFromAlgebra('PCA(M) = eig(Mᵀ⋅M)') testResult = run('symbolsinfo') if testResult.indexOf('AVOID_BINDING_TO_EXTERNAL_SCOPE_VALUE') != -1 console.log "fail dependency tests 49 found AVOID_BINDING_TO_EXTERNAL_SCOPE_VALUE" else console.log "ok dependency test" do_clearall() # this checks error handling in case of pattern and syntax error # picked up during scanning. computeResultsAndJavaScriptFromAlgebra('pattern(a_ᵀ⋅a_, cov(a_))') computeResultsAndJavaScriptFromAlgebra('simplify(') testResult = computeResultsAndJavaScriptFromAlgebra('PCA = Mᵀ·M') if testResult.code == "PCA = function (M) { return ( cov(M) ); }" and testResult.latexResult == "$$PCA(M) = cov(M)$$" and testResult.result == "$$PCA(M) = cov(M)$$" and testResult.dependencyInfo.affectedBy[0] == "M" and testResult.dependencyInfo.affectedBy[1] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 1 and testResult.dependencyInfo.affectsVariables[0] == "PCA" console.log "ok dependency test" else console.log "fail dependency tests 50 Error handling 1" console.log testResult return do_clearall() testResult = computeResultsAndJavaScriptFromAlgebra('x + x + x') if testResult.code == "" and testResult.latexResult == "$$3x$$" and testResult.result == "$$3x$$" and testResult.dependencyInfo.affectedBy.length == 2 and testResult.dependencyInfo.affectedBy[0] == "x" and testResult.dependencyInfo.affectedBy[1] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 0 console.log "ok dependency test" else console.log "fail dependency tests 51" do_clearall() computeResultsAndJavaScriptFromAlgebra('x = y + 2') testResult = computeResultsAndJavaScriptFromAlgebra('x + x + x') if testResult.code == "" and testResult.latexResult == "$$3y+6$$" and testResult.result == "$$3y+6$$" and testResult.dependencyInfo.affectedBy.length == 2 and testResult.dependencyInfo.affectedBy[0] == "x" and testResult.dependencyInfo.affectedBy[1] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 0 console.log "ok dependency test" else console.log "fail dependency tests 52" do_clearall() testResult = computeResultsAndJavaScriptFromAlgebra('[[0,1],[1,0]]') if testResult.latexResult == "$$\\begin{bmatrix} 0 & 1 \\\\ 1 & 0 \\end{bmatrix}$$" and testResult.result == "$$\\begin{bmatrix} 0 & 1 \\\\ 1 & 0 \\end{bmatrix}$$" and testResult.dependencyInfo.affectsVariables.length == 0 console.log "ok dependency test" else console.log "fail dependency tests 53" do_clearall() testResult = computeResultsAndJavaScriptFromAlgebra('x = [[0,1],[1,0]]') if testResult.code == "x = [[0,1],[1,0]];" and testResult.latexResult == "$$x = \\begin{bmatrix} 0 & 1 \\\\ 1 & 0 \\end{bmatrix}$$" and testResult.result == "$$x = \\begin{bmatrix} 0 & 1 \\\\ 1 & 0 \\end{bmatrix}$$" and testResult.dependencyInfo.affectedBy.length == 1 and testResult.dependencyInfo.affectedBy[0] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 1 and testResult.dependencyInfo.affectsVariables[0] == "x" console.log "ok dependency test" else console.log "fail dependency tests 54" do_clearall() # a simple array lookup like this is turned into # a function, which is slighly silly but # it's orthogonal, this works also if instead of # b we have an arbitrary non-trivial function # on b, maybe even symbolic e.g. the round # of the root of by = 6, i.e. round(root(by-6,y)) testResult = computeResultsAndJavaScriptFromAlgebra('x = a[b]') if testResult.code == "x = function (a, b) { return ( a[b] ); }" and testResult.latexResult == "$$x(a, b) = a[b]$$" and testResult.result == "$$x(a, b) = a[b]$$" and testResult.dependencyInfo.affectedBy.length == 3 and testResult.dependencyInfo.affectedBy[0] == "a" and testResult.dependencyInfo.affectedBy[1] == "b" and testResult.dependencyInfo.affectedBy[2] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 1 and testResult.dependencyInfo.affectsVariables[0] == "x" console.log "ok dependency test" else console.log "fail dependency tests 55" do_clearall() testResult = computeResultsAndJavaScriptFromAlgebra('x = a ⋅ b') if testResult.code == "x = function (a, b) { return ( dot(a, b) ); }" and testResult.latexResult == "$$x(a, b) = a \\cdot b$$" and testResult.result == "$$x(a, b) = a \\cdot b$$" and testResult.dependencyInfo.affectedBy.length == 3 and testResult.dependencyInfo.affectedBy[0] == "a" and testResult.dependencyInfo.affectedBy[1] == "b" and testResult.dependencyInfo.affectedBy[2] == "PATTERN_DEPENDENCY" and testResult.dependencyInfo.affectsVariables.length == 1 and testResult.dependencyInfo.affectsVariables[0] == "x" console.log "ok dependency test" else console.log "fail dependency tests 56" do_clearall() # Here we test an actual sequence of invokations form the # notebook. code1 = 'pattern(a_ᵀ⋅a_, cov(a_))' code2 = 'PCA = Mᵀ·M' # invokation sequence, we check that the # full evaluation of the last piece of code # gives the correct result. computeDependenciesFromAlgebra code1 computeDependenciesFromAlgebra code2 computeResultsAndJavaScriptFromAlgebra code1 computeDependenciesFromAlgebra code1 computeDependenciesFromAlgebra code2 res = computeResultsAndJavaScriptFromAlgebra code2 if res.code == 'PCA = function (M) { return ( cov(M) ); }' and res.latexResult == '$$PCA(M) = cov(M)$$' and res.dependencyInfo.affectsVariables.length == 1 and res.dependencyInfo.affectsVariables[0] == 'PCA' and res.dependencyInfo.affectedBy.length == 2 and res.dependencyInfo.affectedBy[0] == 'M' and res.dependencyInfo.affectedBy[1] == 'PATTERN_DEPENDENCY' console.log "ok dependency test" else console.log "fail dependency tests 57" do_clearall() # overwriting a pattern, as seen from the notebook code1 = 'pattern(a_ + a_, 42 * a_)' code2 = 'pattern(a_ + a_, 21 * a_)' code3 = 'f = x + x' computeResultsAndJavaScriptFromAlgebra code1 computeResultsAndJavaScriptFromAlgebra code2 res = computeResultsAndJavaScriptFromAlgebra code3 if res.code == 'f = function (x) { return ( 21*x ); }' and res.latexResult == '$$f(x) = 21x$$' and res.dependencyInfo.affectsVariables.length == 1 and res.dependencyInfo.affectsVariables[0] == 'f' and res.dependencyInfo.affectedBy.length == 2 and res.dependencyInfo.affectedBy[0] == 'x' and res.dependencyInfo.affectedBy[1] == 'PATTERN_DEPENDENCY' console.log "ok dependency test" else console.log "fail dependency tests 58" do_clearall() # tests res = computeResultsAndJavaScriptFromAlgebra "f=test(x<1,-x-4,3<=x,x*x+7,120/x+5)" if res.code == 'f = function (x) { return ( (function(){if (((x) < (1))){return (-x-4);} else if (((3) <= (x))){return (x*x+7);}else {return (120/x+5);}})() ); }' and res.latexResult == '$$f(x) = \\left\\{ \\begin{array}{ll}{-x-4} & if & {x} < {1} \\\\\\\\{xx+7} & if & {3} \\leq {x} \\\\\\\\{\\frac{120}{x}+5} & otherwise \\end{array} \\right.$$' and res.dependencyInfo.affectsVariables.length == 1 and res.dependencyInfo.affectsVariables[0] == 'f' and res.dependencyInfo.affectedBy.length == 2 and res.dependencyInfo.affectedBy[0] == 'x' and res.dependencyInfo.affectedBy[1] == 'PATTERN_DEPENDENCY' console.log "ok dependency test" else console.log "fail dependency tests 59" do_clearall() # tests res = computeResultsAndJavaScriptFromAlgebra "f=floor(x) + ceiling(x) + round(x)" if res.code == 'f = function (x) { return ( ceiling(x)+floor(x)+round(x) ); }' and res.latexResult == '$$f(x) = \\lceil {x} \\rceil + \\lfloor {x} \\rfloor +round(x)$$' and res.dependencyInfo.affectsVariables.length == 1 and res.dependencyInfo.affectsVariables[0] == 'f' and res.dependencyInfo.affectedBy.length == 2 and res.dependencyInfo.affectedBy[0] == 'x' and res.dependencyInfo.affectedBy[1] == 'PATTERN_DEPENDENCY' console.log "ok dependency test" else console.log "fail dependency tests 60" do_clearall() console.log "-- done dependency tests"