UNPKG

algebrite

Version:

Computer Algebra System in Coffeescript

2,372 lines (1,799 loc) 345 kB
// Generated by CoffeeScript 1.9.0 (function() { var $, ABS, ADD, ADJ, AND, ARCCOS, ARCCOSH, ARCSIN, ARCSINH, ARCTAN, ARCTANH, ARG, ATOMIZE, AUTOEXPAND, BAKE, BESSELJ, BESSELY, BINDING, BINOMIAL, BINOM_check_args, BUF, C1, C2, C3, C4, C5, C6, CEILING, CHECK, CHOOSE, CIRCEXP, CLEAR, CLOCK, COEFF, COFACTOR, CONDENSE, CONJ, CONS, CONTRACT, COS, COSH, Condense, DEBUG, DECOMP, DEFINT, DEGREE, DENOMINATOR, DERIVATIVE, DET, DET_check_arg, DIM, DIRAC, DISPLAY, DIVISORS, DO, DOT, DOUBLE, DRAW, DRAWX, DSOLVE, E, EIGEN, EIGENVAL, EIGENVEC, EIG_N, EIG_check_arg, EIG_yydd, EIG_yyqq, ERF, ERFC, EVAL, EXP, EXPAND, EXPCOS, EXPSIN, Eval, Eval_Eval, Eval_abs, Eval_add, Eval_adj, Eval_and, Eval_arccos, Eval_arccosh, Eval_arcsin, Eval_arcsinh, Eval_arctan, Eval_arctanh, Eval_arg, Eval_besselj, Eval_bessely, Eval_binding, Eval_binomial, Eval_ceiling, Eval_check, Eval_choose, Eval_circexp, Eval_clear, Eval_clock, Eval_coeff, Eval_cofactor, Eval_condense, Eval_conj, Eval_cons, Eval_contract, Eval_cos, Eval_cosh, Eval_decomp, Eval_defint, Eval_degree, Eval_denominator, Eval_derivative, Eval_det, Eval_dim, Eval_dirac, Eval_divisors, Eval_do, Eval_dsolve, Eval_eigen, Eval_eigenval, Eval_eigenvec, Eval_erf, Eval_erfc, Eval_exp, Eval_expand, Eval_expcos, Eval_expsin, Eval_factor, Eval_factorial, Eval_factorpoly, Eval_filter, Eval_float, Eval_floor, Eval_for, Eval_gamma, Eval_gcd, Eval_hermite, Eval_hilbert, Eval_imag, Eval_index, Eval_inner, Eval_integral, Eval_inv, Eval_invg, Eval_isinteger, Eval_isprime, Eval_laguerre, Eval_lcm, Eval_leading, Eval_legendre, Eval_log, Eval_mag, Eval_mod, Eval_multiply, Eval_noexpand, Eval_not, Eval_nroots, Eval_number, Eval_numerator, Eval_operator, Eval_or, Eval_outer, Eval_polar, Eval_power, Eval_predicate, Eval_prime, Eval_print, Eval_product, Eval_quote, Eval_quotient, Eval_rank, Eval_rationalize, Eval_real, Eval_rect, Eval_roots, Eval_setq, Eval_sgn, Eval_simfac, Eval_simplify, Eval_sin, Eval_sinh, Eval_sqrt, Eval_stop, Eval_subst, Eval_sym, Eval_tan, Eval_tanh, Eval_taylor, Eval_tensor, Eval_test, Eval_testeq, Eval_testge, Eval_testgt, Eval_testle, Eval_testlt, Eval_transpose, Eval_unit, Eval_user_function, Eval_zero, Evalpoly, FACTOR, FACTORIAL, FACTORPOLY, FILTER, FLOATF, FLOOR, FOR, Find, GAMMA, GCD, HERMITE, HILBERT, IMAG, INDEX, INNER, INTEGRAL, INV, INVG, INV_check_arg, INV_decomp, ISINTEGER, ISPRIME, LAGUERRE, LAST, LCM, LEADING, LEGENDRE, LOG, M, MAG, MAXDIM, MAXPRIMETAB, MAX_PROGRAM_SIZE, MEQUAL, METAA, METAB, METAX, MLENGTH, MOD, MP_MAX_FREE, MP_MIN_SIZE, MSIGN, MULTIPLY, MZERO, N, NIL, NOT, NROOTS, NROOTS_ABS, NROOTS_DELTA, NROOTS_EPSILON, NROOTS_RANDOM, NROOTS_YMAX, NROOTS_divpoly, NSYM, NUM, NUMBER, NUMERATOR, OPERATOR, OR, OUTER, PI, POLAR, POWER, PRIME, PRINT, PRINTOUTRESULT, PRODUCT, QUOTE, QUOTIENT, RANK, RATIONALIZE, REAL, ROOTS, SECRETX, SELFTEST, SETQ, SGN, SIMPLIFY, SIN, SINH, SPACE_BETWEEN_COLUMNS, SPACE_BETWEEN_ROWS, SQRT, STOP, STR, SUBST, SUM, SYM, SYMBOL_A, SYMBOL_B, SYMBOL_C, SYMBOL_D, SYMBOL_I, SYMBOL_J, SYMBOL_N, SYMBOL_R, SYMBOL_S, SYMBOL_T, SYMBOL_X, SYMBOL_Y, SYMBOL_Z, TAN, TANH, TAYLOR, TENSOR, TEST, TESTEQ, TESTGE, TESTGT, TESTLE, TESTLT, TOS, TRACE, TRANSPOSE, TTY, T_DOUBLE, T_EQ, T_FUNCTION, T_GTEQ, T_INTEGER, T_LTEQ, T_NEWLINE, T_STRING, T_SYMBOL, U, UNIT, USR_SYMBOLS, YMAX, YYE, YYRECT, ZERO, absval, absval_tensor, add, add_all, add_numbers, add_terms, addf, adj, alloc_tensor, allocatedId, any_denominators, arccos, arccosh, arcsin, arcsinh, arctan, arctanh, arg, arglist, bake, bake_poly, bake_poly_term, besselj, bessely, bigInt, bignum_factorial, bignum_float, bignum_power_number, bignum_scan_float, bignum_scan_integer, bignum_truncate, binding, binomial, buffer, build_tensor, caaddr, caadr, caar, cadaddr, cadadr, cadar, caddaddr, caddadr, caddar, caddddr, cadddr, caddr, cadr, car, cdaddr, cdadr, cdar, cddaddr, cddar, cdddaddr, cddddr, cdddr, cddr, cdr, ceil, ceiling, charTabIndex, chartab, check_esc_flag, check_stack, choose, choose_check_args, circexp, clear, clear_symbols, clear_term, clockform, cmpGlyphs, cmp_args, cmp_expr, cmp_terms, cmp_terms_count, coeff, cofactor, collectResultLine, combine_factors, combine_gammas, combine_terms, compare_numbers, compare_rationals, compare_tensors, compatible, compute_fa, conjugate, cons, consCount, contract, convert_bignum_to_double, convert_rational_to_double, copy_tensor, cosine, cosine_of_angle, cosine_of_angle_sum, count, count_denominators, counter, d_scalar_scalar, d_scalar_scalar_1, d_scalar_tensor, d_tensor_scalar, d_tensor_tensor, dabs, darccos, darccosh, darcsin, darcsinh, darctan, darctanh, dbesselj0, dbesseljn, dbessely0, dbesselyn, dcos, dcosh, dd, decomp, decomp_product, decomp_sum, define_user_function, defn, defn_str, degree, denominator, derf, derfc, derivative, derivative_of_integral, det, determinant, detg, dfunction, dhermite, dirac, display, display_flag, displaychar, divide, divide_numbers, divisors, divisors_onstack, divpoly, dlog, doubleToReasonableString, dpow, dpower, dproduct, draw_flag, draw_stop_return, dsgn, dsin, dsinh, dsum, dtan, dtanh, dupl, echo_input, eigen, elelmIndex, elem, emit_denominator, emit_denominators, emit_expr, emit_factor, emit_factorial_function, emit_flat_tensor, emit_fraction, emit_function, emit_index_function, emit_multiply, emit_number, emit_numerators, emit_numerical_fraction, emit_power, emit_string, emit_subexpr, emit_symbol, emit_tensor, emit_tensor_inner, emit_term, emit_top_expr, emit_unsigned_expr, emit_x, equal, equaln, equalq, erfc, error, errorMessage, esc_flag, expand, expand_get_A, expand_get_AF, expand_get_B, expand_get_C, expand_get_CF, expand_tensor, expanding, expcos, exponential, expr_level, expsin, f1, f2, f3, f4, f5, f9, f_equals_a, factor, factor_a, factor_again, factor_b, factor_number, factor_small_number, factor_term, factorial, factorpoly, factors, factpoly_expo, fill_buf, filter, filter_main, filter_sum, filter_tensor, findroot, fixup_fraction, fixup_power, flag, fmt_index, fmt_level, fmt_x, frame, free_stack, gamma, gamma_of_sum, gammaf, gcd, gcd_expr, gcd_expr_expr, gcd_factor_term, gcd_main, gcd_numbers, gcd_term_factor, gcd_term_term, gen, get_arglist, get_binding, get_factor, get_next_token, get_printname, get_size, get_token, getdisplaystr, glyph, gp, guess, hermite, hilbert, i, imag, imaginaryunit, index_function, init, initNRoots, inited, inner, inner_f, input_str, integral, integral_of_form, integral_of_product, integral_of_sum, inv, inverse, invert_number, invg, is_denominator, is_factor, is_small_integer, is_square_matrix, isadd, isalnum, isalpha, iscomplexnumber, iscons, isdenominator, isdigit, isdouble, iseveninteger, isfactor, isfactorial, isfloating, isfraction, isimaginarynumber, isimaginaryunit, isinteger, isintegerfactor, iskeyword, isminusone, isminusoneoversqrttwo, isnegative, isnegativenumber, isnegativeterm, isnonnegativeinteger, isnpi, isnum, isoneover, isoneoversqrttwo, isplusone, ispoly, ispoly_expr, ispoly_factor, ispoly_term, isposint, ispower, isquarterturn, isrational, isspace, isstr, issymbol, issymbolic, istensor, iszero, itab, j, laguerre, laguerre2, lcm, leading, legendre, length, lessp, level, list, logarithm, logbuf, lookupsTotal, lu_decomp, madd, mag, makePositive, makeSignSameAs, mask, mcmp, mcmpint, mdiv, mdivrem, meta_mode, mgcd, mini_solve, mint, mmod, mmul, mod, monic, move, mp_clr_bit, mp_denominator, mp_numerator, mp_set_bit, mpow, mprime, mroot, mshiftright, msub, mtotal, multinomial_sum, multiply, multiply_all, multiply_all_noexpand, multiply_denominators, multiply_denominators_factor, multiply_denominators_term, multiply_noexpand, multiply_numbers, n_factor_number, negate, negate_expand, negate_noexpand, negate_number, new_string, newline_flag, nil_symbols, normalize_angle, nroots_a, nroots_b, nroots_c, nroots_df, nroots_dx, nroots_fa, nroots_fb, nroots_x, nroots_y, nterms, numerator, numericRootOfPolynomial, one, oneElement, out_buf, out_count, out_of_memory, outer, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, parse_p1, parse_p2, partition, peek, peek2, polar, polycoeff, polyform, pop, pop_double, pop_frame, pop_integer, power, power_str, power_sum, power_tensor, prime, primetab, print1, print_a_over_b, print_char, print_denom, print_double, print_expr, print_factor, print_factorial_function, print_it, print_multiply_sign, print_number, print_str, print_subexpr, print_tensor, print_tensor_inner, print_term, printchar, printchar_nowrap, printline, program_buf, promote_tensor, push, push_cars, push_double, push_factor, push_frame, push_identity_matrix, push_integer, push_rational, push_symbol, push_term_factors, push_terms, push_zero_matrix, qadd, qdiv, qmul, qpow, qpowf, quickfactor, quickpower, rational, rationalize, rationalize_coefficients, real, reciprocate, rect, remove_negative_exponents, restore, rewrite_args, rewrite_args_tensor, roots, roots2, roots3, run, save, scalar_times_tensor, scan, scan_expression, scan_factor, scan_function_call, scan_meta, scan_power, scan_relation, scan_stmt, scan_str, scan_string, scan_subexpr, scan_symbol, scan_term, scanned, setM, setSignTo, set_binding, set_binding_and_arglist, set_component, setq_indexed, sfac_product, sfac_product_f, sgn, sign, sign_of_term, simfac, simfac_term, simplify, simplify_main, simplify_polar, simplify_tensor, simplify_trig, simplifyfactorials, sine, sine_of_angle, sine_of_angle_sum, sort_stack, square, ssqrt, stack, stackAddsCount, std_symbol, step, step2, stop, strcmp, stringToBePrinted, subf, subst, subtract, subtract_numbers, swap, symbol, symnum, symtab, tangent, taylor, tensor, tensor_plus_tensor, tensor_times_scalar, test_flag, text_metric, theRandom, token, token_buf, token_str, top_level_eval, tos, transform, transpose, trigmode, trivial_divide, try_kth_prime, ucmp, unique, unique_f, update_token_buf, usr_symbol, verbosing, will_be_displayed_as_fraction, ybinomial, ycosh, ydirac, yerf, yerfc, yfloor, yindex, ysinh, yyarg, yybesselj, yybessely, yyceiling, yycondense, yycontract, yycosh, yydegree, yydetg, yydivpoly, yyerf, yyerfc, yyexpand, yyfactorpoly, yyfloat, yyfloor, yyhermite, yyhermite2, yyinvg, yylcm, yylog, yymag, yymultiply, yyouter, yypower, yyrationalize, yysgn, yysimfac, yysinh, yytangent, zero, __emit_char, __emit_str, __factor_add, __factorial, __is_negative, __is_radical_number, __legendre, __legendre2, __legendre3, __normalize_radical_factors, __rationalize_tensor, _i, _j, _k; bigInt = require('big-integer'); SELFTEST = 1; NSYM = 1000; DEBUG = false; PRINTOUTRESULT = false; rational = (function() { function rational() {} rational.prototype.a = null; rational.prototype.b = null; return rational; })(); U = (function() { U.prototype.cons = null; U.prototype.printname = ""; U.prototype.str = ""; U.prototype.tensor = null; U.prototype.q = null; U.prototype.d = 0.0; U.prototype.k = 0; U.prototype.tag = 0; function U() { this.cons = {}; this.cons.car = null; this.cons.cdr = null; this.q = new rational(); } return U; })(); errorMessage = ""; CONS = 0; NUM = 1; DOUBLE = 2; STR = 3; TENSOR = 4; SYM = 5; counter = 0; ABS = counter++; ADD = counter++; ADJ = counter++; AND = counter++; ARCCOS = counter++; ARCCOSH = counter++; ARCSIN = counter++; ARCSINH = counter++; ARCTAN = counter++; ARCTANH = counter++; ARG = counter++; ATOMIZE = counter++; BESSELJ = counter++; BESSELY = counter++; BINDING = counter++; BINOMIAL = counter++; CEILING = counter++; CHECK = counter++; CHOOSE = counter++; CIRCEXP = counter++; CLEAR = counter++; CLOCK = counter++; COEFF = counter++; COFACTOR = counter++; CONDENSE = counter++; CONJ = counter++; CONTRACT = counter++; COS = counter++; COSH = counter++; DECOMP = counter++; DEFINT = counter++; DEGREE = counter++; DENOMINATOR = counter++; DERIVATIVE = counter++; DET = counter++; DIM = counter++; DIRAC = counter++; DISPLAY = counter++; DIVISORS = counter++; DO = counter++; DOT = counter++; DRAW = counter++; DSOLVE = counter++; EIGEN = counter++; EIGENVAL = counter++; EIGENVEC = counter++; ERF = counter++; ERFC = counter++; EVAL = counter++; EXP = counter++; EXPAND = counter++; EXPCOS = counter++; EXPSIN = counter++; FACTOR = counter++; FACTORIAL = counter++; FACTORPOLY = counter++; FILTER = counter++; FLOATF = counter++; FLOOR = counter++; FOR = counter++; GAMMA = counter++; GCD = counter++; HERMITE = counter++; HILBERT = counter++; IMAG = counter++; INDEX = counter++; INNER = counter++; INTEGRAL = counter++; INV = counter++; INVG = counter++; ISINTEGER = counter++; ISPRIME = counter++; LAGUERRE = counter++; LCM = counter++; LEADING = counter++; LEGENDRE = counter++; LOG = counter++; MAG = counter++; MOD = counter++; MULTIPLY = counter++; NOT = counter++; NROOTS = counter++; NUMBER = counter++; NUMERATOR = counter++; OPERATOR = counter++; OR = counter++; OUTER = counter++; POLAR = counter++; POWER = counter++; PRIME = counter++; PRINT = counter++; PRODUCT = counter++; QUOTE = counter++; QUOTIENT = counter++; RANK = counter++; RATIONALIZE = counter++; REAL = counter++; YYRECT = counter++; ROOTS = counter++; SETQ = counter++; SGN = counter++; SIMPLIFY = counter++; SIN = counter++; SINH = counter++; SQRT = counter++; STOP = counter++; SUBST = counter++; SUM = counter++; TAN = counter++; TANH = counter++; TAYLOR = counter++; TEST = counter++; TESTEQ = counter++; TESTGE = counter++; TESTGT = counter++; TESTLE = counter++; TESTLT = counter++; TRANSPOSE = counter++; UNIT = counter++; ZERO = counter++; NIL = counter++; AUTOEXPAND = counter++; BAKE = counter++; LAST = counter++; TRACE = counter++; TTY = counter++; YYE = counter++; DRAWX = counter++; METAA = counter++; METAB = counter++; METAX = counter++; SECRETX = counter++; PI = counter++; SYMBOL_A = counter++; SYMBOL_B = counter++; SYMBOL_C = counter++; SYMBOL_D = counter++; SYMBOL_I = counter++; SYMBOL_J = counter++; SYMBOL_N = counter++; SYMBOL_R = counter++; SYMBOL_S = counter++; SYMBOL_T = counter++; SYMBOL_X = counter++; SYMBOL_Y = counter++; SYMBOL_Z = counter++; C1 = counter++; C2 = counter++; C3 = counter++; C4 = counter++; C5 = counter++; C6 = counter++; USR_SYMBOLS = counter++; E = YYE; TOS = 100000; BUF = 10000; MAX_PROGRAM_SIZE = 100001; MAXPRIMETAB = 10000; primetab = [2]; i = 3; while (primetab.length < MAXPRIMETAB) { j = 0; ceil = Math.sqrt(i); while (j < primetab.length && primetab[j] <= ceil) { if (i % primetab[j] === 0) { j = -1; break; } j++; } if (j !== -1) { primetab.push(i); } i += 2; } MAXDIM = 24; tensor = (function() { tensor.prototype.ndim = 0; tensor.prototype.dim = null; tensor.prototype.nelem = 0; tensor.prototype.elem = null; function tensor() { this.dim = (function() { var _i, _results; _results = []; for (_i = 0; 0 <= MAXDIM ? _i <= MAXDIM : _i >= MAXDIM; 0 <= MAXDIM ? _i++ : _i--) { _results.push(0); } return _results; })(); this.elem = []; } return tensor; })(); display = (function() { function display() {} display.prototype.h = 0; display.prototype.w = 0; display.prototype.n = 0; display.prototype.a = []; return display; })(); text_metric = (function() { function text_metric() {} text_metric.prototype.ascent = 0; text_metric.prototype.descent = 0; text_metric.prototype.width = 0; return text_metric; })(); tos = 0; expanding = 0; fmt_x = 0; fmt_index = 0; fmt_level = 0; verbosing = 0; primetab = []; primetab[MAXPRIMETAB] = 0; esc_flag = 0; draw_flag = 0; mtotal = 0; trigmode = 0; logbuf = ""; program_buf = ""; symtab = []; binding = []; arglist = []; stack = []; frame = 0; p0 = null; p1 = null; p2 = null; p3 = null; p4 = null; p5 = null; p6 = null; p7 = null; p8 = null; p9 = null; zero = null; one = null; imaginaryunit = null; symtab = []; out_buf = ""; out_count = 0; test_flag = 0; draw_stop_return = null; symbol = function(x) { return symtab[x]; }; iscons = function(p) { return p.k === CONS; }; isrational = function(p) { return p.k === NUM; }; isdouble = function(p) { return p.k === DOUBLE; }; isnum = function(p) { return isrational(p) || isdouble(p); }; isstr = function(p) { return p.k === STR; }; istensor = function(p) { if (p == null) { debugger; } else { return p.k === TENSOR; } }; issymbol = function(p) { return p.k === SYM; }; iskeyword = function(p) { return issymbol(p) && symnum(p) < NIL; }; car = function(p) { if (iscons(p)) { return p.cons.car; } else { return symbol(NIL); } }; cdr = function(p) { if (iscons(p)) { return p.cons.cdr; } else { return symbol(NIL); } }; caar = function(p) { return car(car(p)); }; cadr = function(p) { return car(cdr(p)); }; cdar = function(p) { return cdr(car(p)); }; cddr = function(p) { return cdr(cdr(p)); }; caadr = function(p) { return car(car(cdr(p))); }; caddr = function(p) { return car(cdr(cdr(p))); }; cadar = function(p) { return car(cdr(car(p))); }; cdadr = function(p) { return cdr(car(cdr(p))); }; cddar = function(p) { return cdr(cdr(car(p))); }; cdddr = function(p) { return cdr(cdr(cdr(p))); }; caaddr = function(p) { return car(car(cdr(cdr(p)))); }; cadadr = function(p) { return car(cdr(car(cdr(p)))); }; caddar = function(p) { return car(cdr(cdr(car(p)))); }; cdaddr = function(p) { return cdr(car(cdr(cdr(p)))); }; cadddr = function(p) { return car(cdr(cdr(cdr(p)))); }; cddddr = function(p) { return cdr(cdr(cdr(cdr(p)))); }; caddddr = function(p) { return car(cdr(cdr(cdr(cdr(p))))); }; cadaddr = function(p) { return car(cdr(car(cdr(cdr(p))))); }; cddaddr = function(p) { return cdr(cdr(car(cdr(cdr(p))))); }; caddadr = function(p) { return car(cdr(cdr(car(cdr(p))))); }; cdddaddr = function(p) { return cdr(cdr(cdr(car(cdr(cdr(p)))))); }; caddaddr = function(p) { return car(cdr(cdr(car(cdr(cdr(p)))))); }; isadd = function(p) { return car(p) === symbol(ADD); }; ispower = function(p) { return car(p) === symbol(POWER); }; isfactorial = function(p) { return car(p) === symbol(FACTORIAL); }; MSIGN = function(p) { if (p.isPositive()) { return 1; } else if (p.isZero()) { return 0; } else { return -1; } }; MLENGTH = function(p) { return p.toString.length; }; MZERO = function(p) { return p.isZero(); }; MEQUAL = function(p, n) { if (p == null) { debugger; } return p.equals(n); }; $ = typeof exports !== "undefined" && exports !== null ? exports : this; $.car = car; $.cdr = cdr; $.symbol = symbol; $.iscons = iscons; $.isrational = isrational; $.isdouble = isdouble; $.isnum = isnum; $.isstr = isstr; $.istensor = istensor; $.issymbol = issymbol; $.iskeyword = iskeyword; $.CONS = CONS; $.NUM = NUM; $.DOUBLE = DOUBLE; $.STR = STR; $.TENSOR = TENSOR; $.SYM = SYM; $.ABS = ABS; $.ADD = ADD; $.ADJ = ADJ; $.AND = AND; $.ARCCOS = ARCCOS; $.ARCCOSH = ARCCOSH; $.ARCSIN = ARCSIN; $.ARCSINH = ARCSINH; $.ARCTAN = ARCTAN; $.ARCTANH = ARCTANH; $.ARG = ARG; $.ATOMIZE = ATOMIZE; $.BESSELJ = BESSELJ; $.BESSELY = BESSELY; $.BINDING = BINDING; $.BINOMIAL = BINOMIAL; $.CEILING = CEILING; $.CHECK = CHECK; $.CHOOSE = CHOOSE; $.CIRCEXP = CIRCEXP; $.CLEAR = CLEAR; $.CLOCK = CLOCK; $.COEFF = COEFF; $.COFACTOR = COFACTOR; $.CONDENSE = CONDENSE; $.CONJ = CONJ; $.CONTRACT = CONTRACT; $.COS = COS; $.COSH = COSH; $.DECOMP = DECOMP; $.DEFINT = DEFINT; $.DEGREE = DEGREE; $.DENOMINATOR = DENOMINATOR; $.DERIVATIVE = DERIVATIVE; $.DET = DET; $.DIM = DIM; $.DIRAC = DIRAC; $.DISPLAY = DISPLAY; $.DIVISORS = DIVISORS; $.DO = DO; $.DOT = DOT; $.DRAW = DRAW; $.DSOLVE = DSOLVE; $.EIGEN = EIGEN; $.EIGENVAL = EIGENVAL; $.EIGENVEC = EIGENVEC; $.ERF = ERF; $.ERFC = ERFC; $.EVAL = EVAL; $.EXP = EXP; $.EXPAND = EXPAND; $.EXPCOS = EXPCOS; $.EXPSIN = EXPSIN; $.FACTOR = FACTOR; $.FACTORIAL = FACTORIAL; $.FACTORPOLY = FACTORPOLY; $.FILTER = FILTER; $.FLOATF = FLOATF; $.FLOOR = FLOOR; $.FOR = FOR; $.GAMMA = GAMMA; $.GCD = GCD; $.HERMITE = HERMITE; $.HILBERT = HILBERT; $.IMAG = IMAG; $.INDEX = INDEX; $.INNER = INNER; $.INTEGRAL = INTEGRAL; $.INV = INV; $.INVG = INVG; $.ISINTEGER = ISINTEGER; $.ISPRIME = ISPRIME; $.LAGUERRE = LAGUERRE; $.LCM = LCM; $.LEADING = LEADING; $.LEGENDRE = LEGENDRE; $.LOG = LOG; $.MAG = MAG; $.MOD = MOD; $.MULTIPLY = MULTIPLY; $.NOT = NOT; $.NROOTS = NROOTS; $.NUMBER = NUMBER; $.NUMERATOR = NUMERATOR; $.OPERATOR = OPERATOR; $.OR = OR; $.OUTER = OUTER; $.POLAR = POLAR; $.POWER = POWER; $.PRIME = PRIME; $.PRINT = PRINT; $.PRODUCT = PRODUCT; $.QUOTE = QUOTE; $.QUOTIENT = QUOTIENT; $.RANK = RANK; $.RATIONALIZE = RATIONALIZE; $.REAL = REAL; $.YYRECT = YYRECT; $.ROOTS = ROOTS; $.SETQ = SETQ; $.SGN = SGN; $.SIMPLIFY = SIMPLIFY; $.SIN = SIN; $.SINH = SINH; $.SQRT = SQRT; $.STOP = STOP; $.SUBST = SUBST; $.SUM = SUM; $.TAN = TAN; $.TANH = TANH; $.TAYLOR = TAYLOR; $.TEST = TEST; $.TESTEQ = TESTEQ; $.TESTGE = TESTGE; $.TESTGT = TESTGT; $.TESTLE = TESTLE; $.TESTLT = TESTLT; $.TRANSPOSE = TRANSPOSE; $.UNIT = UNIT; $.ZERO = ZERO; $.NIL = NIL; $.AUTOEXPAND = AUTOEXPAND; $.BAKE = BAKE; $.LAST = LAST; $.TRACE = TRACE; $.TTY = TTY; $.YYE = YYE; $.DRAWX = DRAWX; $.METAA = METAA; $.METAB = METAB; $.METAX = METAX; $.SECRETX = SECRETX; $.PI = PI; $.SYMBOL_A = SYMBOL_A; $.SYMBOL_B = SYMBOL_B; $.SYMBOL_C = SYMBOL_C; $.SYMBOL_D = SYMBOL_D; $.SYMBOL_I = SYMBOL_I; $.SYMBOL_J = SYMBOL_J; $.SYMBOL_N = SYMBOL_N; $.SYMBOL_R = SYMBOL_R; $.SYMBOL_S = SYMBOL_S; $.SYMBOL_T = SYMBOL_T; $.SYMBOL_X = SYMBOL_X; $.SYMBOL_Y = SYMBOL_Y; $.SYMBOL_Z = SYMBOL_Z; $.C1 = C1; $.C2 = C2; $.C3 = C3; $.C4 = C4; $.C5 = C5; $.C6 = C6; $.USR_SYMBOLS = USR_SYMBOLS; /* // up to 100 blocks of 100,000 atoms #define M 100 #define N 100000 U *mem[M] int mcount U *free_list int free_count U * alloc(void) { U *p if (free_count == 0) { if (mcount == 0) alloc_mem() else { gc() if (free_count < N * mcount / 2) alloc_mem() } if (free_count == 0) stop("atom space exhausted") } p = free_list free_list = free_list->u.cons.cdr free_count-- return p } */ allocatedId = 0; alloc_tensor = function(nelem) { var p, _i; i = 0; p = new U(); p.k = TENSOR; p.tensor = new tensor(); p.tensor.nelem = nelem; for (i = _i = 0; 0 <= nelem ? _i < nelem : _i > nelem; i = 0 <= nelem ? ++_i : --_i) { p.tensor.elem[i] = zero; } p.tensor.allocatedId = allocatedId; allocatedId++; if (p.tensor.nelem !== p.tensor.elem.length) { console.log("something wrong in tensor dimensions"); debugger; } return p; }; /* // garbage collector void gc(void) { int i, j U *p // tag everything for (i = 0; i < mcount; i++) { p = mem[i] for (j = 0; j < N; j++) p[j].tag = 1 } // untag what's used untag(p0) untag(p1) untag(p2) untag(p3) untag(p4) untag(p5) untag(p6) untag(p7) untag(p8) untag(p9) untag(one) untag(zero) untag(imaginaryunit) for (i = 0; i < NSYM; i++) { untag(binding[i]) untag(arglist[i]) } for (i = 0; i < tos; i++) untag(stack[i]) for (i = (int) (frame - stack); i < TOS; i++) untag(stack[i]) // collect everything that's still tagged free_count = 0 for (i = 0; i < mcount; i++) { p = mem[i] for (j = 0; j < N; j++) { if (p[j].tag == 0) continue // still tagged so it's unused, put on free list switch (p[j].k) { case TENSOR: free(p[j].u.tensor) break case STR: free(p[j].u.str) break case NUM: mfree(p[j].u.q.a) mfree(p[j].u.q.b) break } p[j].k = CONS; // so no double free occurs above p[j].u.cons.cdr = free_list free_list = p + j free_count++ } } } void untag(U *p) { int i if (iscons(p)) { do { if (p->tag == 0) return p->tag = 0 untag(p->u.cons.car) p = p->u.cons.cdr } while (iscons(p)) untag(p) return } if (p->tag) { p->tag = 0 if (istensor(p)) { for (i = 0; i < p->u.tensor->nelem; i++) untag(p->u.tensor->elem[i]) } } } // get memory for 100,000 atoms void alloc_mem(void) { int i U *p if (mcount == M) return p = (U *) malloc(N * sizeof (struct U)) if (p == NULL) return mem[mcount++] = p for (i = 0; i < N; i++) { p[i].k = CONS; // so no free in gc p[i].u.cons.cdr = p + i + 1 } p[N - 1].u.cons.cdr = free_list free_list = p free_count += N } void print_mem_info(void) { char buf[100] sprintf(buf, "%d blocks (%d bytes/block)\n", N * mcount, (int) sizeof (U)) printstr(buf) sprintf(buf, "%d free\n", free_count) printstr(buf) sprintf(buf, "%d used\n", N * mcount - free_count) printstr(buf) } */ YMAX = 10000; glyph = (function() { function glyph() {} glyph.prototype.c = 0; glyph.prototype.x = 0; glyph.prototype.y = 0; return glyph; })(); chartab = []; for (charTabIndex = _i = 0; 0 <= YMAX ? _i < YMAX : _i > YMAX; charTabIndex = 0 <= YMAX ? ++_i : --_i) { chartab[charTabIndex] = new glyph(); } yindex = 0; level = 0; emit_x = 0; expr_level = 0; display_flag = 0; printchar_nowrap = function(character, accumulator) { var topLevelCall; if (accumulator == null) { topLevelCall = true; accumulator = ""; } accumulator += character; return accumulator; }; printchar = function(character, accumulator) { return printchar_nowrap(character, accumulator); }; display = function(p) { var h, w, y, _ref; h = 0; w = 0; y = 0; save(); yindex = 0; level = 0; emit_x = 0; emit_top_expr(p); _ref = get_size(0, yindex), h = _ref[0], w = _ref[1], y = _ref[2]; if (w > 100) { printline(p); restore(); return; } print_it(); return restore(); }; emit_top_expr = function(p) { if (car(p) === symbol(SETQ)) { emit_expr(cadr(p)); __emit_str(" = "); emit_expr(caddr(p)); return; } if (istensor(p)) { return emit_tensor(p); } else { return emit_expr(p); } }; will_be_displayed_as_fraction = function(p) { if (level > 0) { return 0; } if (isfraction(p)) { return 1; } if (car(p) !== symbol(MULTIPLY)) { return 0; } if (isfraction(cadr(p))) { return 1; } while (iscons(p)) { if (isdenominator(car(p))) { return 1; } p = cdr(p); } return 0; }; emit_expr = function(p) { expr_level++; if (car(p) === symbol(ADD)) { p = cdr(p); if (__is_negative(car(p))) { __emit_char('-'); if (will_be_displayed_as_fraction(car(p))) { __emit_char(' '); } } emit_term(car(p)); p = cdr(p); while (iscons(p)) { if (__is_negative(car(p))) { __emit_char(' '); __emit_char('-'); __emit_char(' '); } else { __emit_char(' '); __emit_char('+'); __emit_char(' '); } emit_term(car(p)); p = cdr(p); } } else { if (__is_negative(p)) { __emit_char('-'); if (will_be_displayed_as_fraction(p)) { __emit_char(' '); } } emit_term(p); } return expr_level--; }; emit_unsigned_expr = function(p) { var _results; if (car(p) === symbol(ADD)) { p = cdr(p); emit_term(car(p)); p = cdr(p); _results = []; while (iscons(p)) { if (__is_negative(car(p))) { __emit_char(' '); __emit_char('-'); __emit_char(' '); } else { __emit_char(' '); __emit_char('+'); __emit_char(' '); } emit_term(car(p)); _results.push(p = cdr(p)); } return _results; } else { return emit_term(p); } }; __is_negative = function(p) { if (isnegativenumber(p)) { return 1; } if (car(p) === symbol(MULTIPLY) && isnegativenumber(cadr(p))) { return 1; } return 0; }; emit_term = function(p) { var n; if (car(p) === symbol(MULTIPLY)) { n = count_denominators(p); if (n && level === 0) { return emit_fraction(p, n); } else { return emit_multiply(p, n); } } else { return emit_factor(p); } }; isdenominator = function(p) { if (car(p) === symbol(POWER) && cadr(p) !== symbol(E) && __is_negative(caddr(p))) { return 1; } else { return 0; } }; count_denominators = function(p) { var count, q; count = 0; p = cdr(p); while (iscons(p)) { q = car(p); if (isdenominator(q)) { count++; } p = cdr(p); } return count; }; emit_multiply = function(p, n) { var _results; if (n === 0) { p = cdr(p); if (isplusone(car(p)) || isminusone(car(p))) { p = cdr(p); } emit_factor(car(p)); p = cdr(p); _results = []; while (iscons(p)) { __emit_char(' '); emit_factor(car(p)); _results.push(p = cdr(p)); } return _results; } else { emit_numerators(p); __emit_char('/'); if (n > 1 || isfraction(cadr(p))) { __emit_char('('); emit_denominators(p); return __emit_char(')'); } else { return emit_denominators(p); } } }; emit_fraction = function(p, d) { var count, doNothing, k1, k2, n, x; count = 0; k1 = 0; k2 = 0; n = 0; x = 0; save(); p3 = one; p4 = one; if (isrational(cadr(p))) { push(cadr(p)); mp_numerator(); absval(); p3 = pop(); push(cadr(p)); mp_denominator(); p4 = pop(); } if (isdouble(cadr(p))) { push(cadr(p)); absval(); p3 = pop(); } if (isplusone(p3)) { n = 0; } else { n = 1; } p1 = cdr(p); if (isnum(car(p1))) { p1 = cdr(p1); } while (iscons(p1)) { p2 = car(p1); if (isdenominator(p2)) { doNothing = 1; } else { n++; } p1 = cdr(p1); } x = emit_x; k1 = yindex; count = 0; if (!isplusone(p3)) { emit_number(p3, 0); count++; } p1 = cdr(p); if (isnum(car(p1))) { p1 = cdr(p1); } while (iscons(p1)) { p2 = car(p1); if (isdenominator(p2)) { doNothing = 1; } else { if (count > 0) { __emit_char(' '); } if (n === 1) { emit_expr(p2); } else { emit_factor(p2); } count++; } p1 = cdr(p1); } if (count === 0) { __emit_char('1'); } k2 = yindex; count = 0; if (!isplusone(p4)) { emit_number(p4, 0); count++; d++; } p1 = cdr(p); if (isrational(car(p1))) { p1 = cdr(p1); } while (iscons(p1)) { p2 = car(p1); if (isdenominator(p2)) { if (count > 0) { __emit_char(' '); } emit_denominator(p2, d); count++; } p1 = cdr(p1); } fixup_fraction(x, k1, k2); return restore(); }; emit_numerators = function(p) { var doNothing, n; int(n); save(); p1 = one; p = cdr(p); if (isrational(car(p))) { push(car(p)); mp_numerator(); absval(); p1 = pop(); p = cdr(p); } else if (isdouble(car(p))) { push(car(p)); absval(); p1 = pop(); p = cdr(p); } n = 0; if (!isplusone(p1)) { emit_number(p1, 0); n++; } while (iscons(p)) { if (isdenominator(car(p))) { doNothing = 1; } else { if (n > 0) { __emit_char(' '); } emit_factor(car(p)); n++; } p = cdr(p); } if (n === 0) { __emit_char('1'); } return restore(); }; emit_denominators = function(p) { var n; int(n); save(); n = 0; p = cdr(p); if (isfraction(car(p))) { push(car(p)); mp_denominator(); p1 = pop(); emit_number(p1, 0); n++; p = cdr(p); } while (iscons(p)) { if (isdenominator(car(p))) { if (n > 0) { __emit_char(' '); } emit_denominator(car(p), 0); n++; } p = cdr(p); } return restore(); }; emit_factor = function(p) { if (istensor(p)) { if (level === 0) { emit_flat_tensor(p); } else { emit_flat_tensor(p); } return; } if (isdouble(p)) { emit_number(p, 0); return; } if (car(p) === symbol(ADD) || car(p) === symbol(MULTIPLY)) { emit_subexpr(p); return; } if (car(p) === symbol(POWER)) { emit_power(p); return; } if (iscons(p)) { emit_function(p); return; } if (isnum(p)) { if (level === 0) { emit_numerical_fraction(p); } else { emit_number(p, 0); } return; } if (issymbol(p)) { emit_symbol(p); return; } if (isstr(p)) { emit_string(p); } }; emit_numerical_fraction = function(p) { var k1, k2, x; k1 = 0; k2 = 0; x = 0; save(); push(p); mp_numerator(); absval(); p3 = pop(); push(p); mp_denominator(); p4 = pop(); if (isplusone(p4)) { emit_number(p3, 0); restore(); return; } x = emit_x; k1 = yindex; emit_number(p3, 0); k2 = yindex; emit_number(p4, 0); fixup_fraction(x, k1, k2); return restore(); }; isfactor = function(p) { if (iscons(p) && car(p) !== symbol(ADD) && car(p) !== symbol(MULTIPLY) && car(p) !== symbol(POWER)) { return 1; } if (issymbol(p)) { return 1; } if (isfraction(p)) { return 0; } if (isnegativenumber(p)) { return 0; } if (isnum(p)) { return 1; } return 0; }; emit_power = function(p) { var k1, k2, x; k1 = 0; k2 = 0; x = 0; if (cadr(p) === symbol(E)) { __emit_str("exp("); emit_expr(caddr(p)); __emit_char(')'); return; } if (level > 0) { if (isminusone(caddr(p))) { __emit_char('1'); __emit_char('/'); if (isfactor(cadr(p))) { emit_factor(cadr(p)); } else { emit_subexpr(cadr(p)); } } else { if (isfactor(cadr(p))) { emit_factor(cadr(p)); } else { emit_subexpr(cadr(p)); } __emit_char('^'); if (isfactor(caddr(p))) { emit_factor(caddr(p)); } else { emit_subexpr(caddr(p)); } } return; } if (__is_negative(caddr(p))) { x = emit_x; k1 = yindex; __emit_char('1'); k2 = yindex; emit_denominator(p, 1); fixup_fraction(x, k1, k2); return; } k1 = yindex; if (isfactor(cadr(p))) { emit_factor(cadr(p)); } else { emit_subexpr(cadr(p)); } k2 = yindex; level++; emit_expr(caddr(p)); level--; return fixup_power(k1, k2); }; emit_denominator = function(p, n) { var k1, k2; k1 = 0; k2 = 0; if (isminusone(caddr(p))) { if (n === 1) { emit_expr(cadr(p)); } else { emit_factor(cadr(p)); } return; } k1 = yindex; if (isfactor(cadr(p))) { emit_factor(cadr(p)); } else { emit_subexpr(cadr(p)); } k2 = yindex; level++; emit_unsigned_expr(caddr(p)); level--; return fixup_power(k1, k2); }; emit_function = function(p) { if (car(p) === symbol(INDEX) && issymbol(cadr(p))) { emit_index_function(p); return; } if (car(p) === symbol(FACTORIAL)) { emit_factorial_function(p); return; } if (car(p) === symbol(DERIVATIVE)) { __emit_char('d'); } else { emit_symbol(car(p)); } __emit_char('('); p = cdr(p); if (iscons(p)) { emit_expr(car(p)); p = cdr(p); while (iscons(p)) { __emit_char(','); emit_expr(car(p)); p = cdr(p); } } return __emit_char(')'); }; emit_index_function = function(p) { p = cdr(p); if (caar(p) === symbol(ADD) || caar(p) === symbol(MULTIPLY) || caar(p) === symbol(POWER) || caar(p) === symbol(FACTORIAL)) { emit_subexpr(car(p)); } else { emit_expr(car(p)); } __emit_char('['); p = cdr(p); if (iscons(p)) { emit_expr(car(p)); p = cdr(p); while (iscons(p)) { __emit_char(','); emit_expr(car(p)); p = cdr(p); } } return __emit_char(']'); }; emit_factorial_function = function(p) { p = cadr(p); if (car(p) === symbol(ADD) || car(p) === symbol(MULTIPLY) || car(p) === symbol(POWER) || car(p) === symbol(FACTORIAL)) { emit_subexpr(p); } else { emit_expr(p); } return __emit_char('!'); }; emit_subexpr = function(p) { __emit_char('('); emit_expr(p); return __emit_char(')'); }; emit_symbol = function(p) { var pPrintName, _j, _ref, _results; i = 0; if (p === symbol(E)) { __emit_str("exp(1)"); return; } pPrintName = get_printname(p); _results = []; for (i = _j = 0, _ref = pPrintName.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) { _results.push(__emit_char(pPrintName[i])); } return _results; }; emit_string = function(p) { var pString, _j, _ref, _results; i = 0; pString = p.str; _results = []; for (i = _j = 0, _ref = pString.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) { _results.push(__emit_char(pString[i])); } return _results; }; fixup_fraction = function(x, k1, k2) { var dx, dy, h1, h2, w, w1, w2, y, y1, y2, _j, _ref, _ref1, _results; dx = 0; dy = 0; i = 0; w = 0; y = 0; h1 = 0; w1 = 0; y1 = 0; h2 = 0; w2 = 0; y2 = 0; _ref = get_size(k1, k2), h1 = _ref[0], w1 = _ref[1], y1 = _ref[2]; _ref1 = get_size(k2, yindex), h2 = _ref1[0], w2 = _ref1[1], y2 = _ref1[2]; if (w2 > w1) { dx = (w2 - w1) / 2; } else { dx = 0; } dx++; y = y1 + h1 - 1; dy = -y - 1; move(k1, k2, dx, dy); if (w2 > w1) { dx = -w1; } else { dx = -w1 + (w1 - w2) / 2; } dx++; dy = -y2 + 1; move(k2, yindex, dx, dy); if (w2 > w1) { w = w2; } else { w = w1; } w += 2; emit_x = x; _results = []; for (i = _j = 0; 0 <= w ? _j < w : _j > w; i = 0 <= w ? ++_j : --_j) { _results.push(__emit_char('-')); } return _results; }; fixup_power = function(k1, k2) { var dy, h1, h2, w1, w2, y1, y2, _ref, _ref1; dy = 0; h1 = 0; w1 = 0; y1 = 0; h2 = 0; w2 = 0; y2 = 0; _ref = get_size(k1, k2), h1 = _ref[0], w1 = _ref[1], y1 = _ref[2]; _ref1 = get_size(k2, yindex), h2 = _ref1[0], w2 = _ref1[1], y2 = _ref1[2]; dy = -y2 - h2 + 1; dy += y1 - 1; return move(k2, yindex, 0, dy); }; move = function(j, k, dx, dy) { var _j, _results; i = 0; _results = []; for (i = _j = j; j <= k ? _j < k : _j > k; i = j <= k ? ++_j : --_j) { chartab[i].x += dx; _results.push(chartab[i].y += dy); } return _results; }; get_size = function(j, k) { var h, max_x, max_y, min_x, min_y, w, y, _j, _ref; i = 0; min_x = chartab[j].x; max_x = chartab[j].x; min_y = chartab[j].y; max_y = chartab[j].y; for (i = _j = _ref = j + 1; _ref <= k ? _j < k : _j > k; i = _ref <= k ? ++_j : --_j) { if (chartab[i].x < min_x) { min_x = chartab[i].x; } if (chartab[i].x > max_x) { max_x = chartab[i].x; } if (chartab[i].y < min_y) { min_y = chartab[i].y; } if (chartab[i].y > max_y) { max_y = chartab[i].y; } } h = max_y - min_y + 1; w = max_x - min_x + 1; y = min_y; return [h, w, y]; }; displaychar = function(c) { return __emit_char(c); }; __emit_char = function(c) { if (yindex === YMAX) { return; } if (chartab[yindex] == null) { debugger; } chartab[yindex].c = c; chartab[yindex].x = emit_x; chartab[yindex].y = 0; yindex++; return emit_x++; }; __emit_str = function(s) { var _j, _ref, _results; i = 0; _results = []; for (i = _j = 0, _ref = s.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) { _results.push(__emit_char(s[i])); } return _results; }; emit_number = function(p, emit_sign) { var tmpString, _j, _k, _l, _ref, _ref1, _ref2, _results, _results1; tmpString = ""; i = 0; switch (p.k) { case NUM: tmpString = p.q.a.toString(); if (tmpString[0] === '-' && emit_sign === 0) { tmpString = tmpString.substring(1); } for (i = _j = 0, _ref = tmpString.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) { __emit_char(tmpString[i]); } tmpString = p.q.b.toString(); if (tmpString === "1") { break; } __emit_char('/'); _results = []; for (i = _k = 0, _ref1 = tmpString.length; 0 <= _ref1 ? _k < _ref1 : _k > _ref1; i = 0 <= _ref1 ? ++_k : --_k) { _results.push(__emit_char(tmpString[i])); } return _results; break; case DOUBLE: tmpString = doubleToReasonableString(p.d); if (tmpString[0] === '-' && emit_sign === 0) { tmpString = tmpString.substring(1); } _results1 = []; for (i = _l = 0, _ref2 = tmpString.length; 0 <= _ref2 ? _l < _ref2 : _l > _ref2; i = 0 <= _ref2 ? ++_l : --_l) { _results1.push(__emit_char(tmpString[i])); } return _results1; } }; cmpGlyphs = function(a, b) { if (a.y < b.y) { return -1; } if (a.y > b.y) { return 1; } if (a.x < b.x) { return -1; } if (a.x > b.x) { return 1; } return 0; }; print_it = function() { var accumulatedPrint, subsetOfStack, x, y, _j; i = 0; accumulatedPrint = ""; subsetOfStack = chartab.slice(0, yindex); subsetOfStack.sort(cmpGlyphs); chartab = [].concat(subsetOfStack).concat(chartab.slice(yindex)); x = 0; y = chartab[0].y; for (i = _j = 0; 0 <= yindex ? _j < yindex : _j > yindex; i = 0 <= yindex ? ++_j : --_j) { while (chartab[i].y > y) { accumulatedPrint = printchar('\n', accumulatedPrint); x = 0; y++; } while (chartab[i].x > x) { accumulatedPrint = printchar_nowrap(' ', accumulatedPrint); x++; } accumulatedPrint = printchar_nowrap(chartab[i].c, accumulatedPrint); x++; } if (PRINTOUTRESULT) { return console.log(accumulatedPrint); } }; buffer = ""; getdisplaystr = function() { yindex = 0; level = 0; emit_x = 0; emit_expr(pop()); fill_buf(); return buffer; }; fill_buf = function() { var sIndex, subsetOfStack, tmpBuffer, x, y, _j; tmpBuffer = buffer; sIndex = 0; i = 0; subsetOfStack = chartab.slice(0, yindex); subsetOfStack.sort(cmpGlyphs); chartab = [].concat(subsetOfStack).concat(chartab.slice(yindex)); x = 0; y = chartab[0].y; for (i = _j = 0; 0 <= yindex ? _j < yindex : _j > yindex; i = 0 <= yindex ? ++_j : --_j) { while (chartab[i].y > y) { tmpBuffer[sIndex++] = '\n'; x = 0; y++; } while (chartab[i].x > x) { tmpBuffer[sIndex++] = ' '; x++; } tmpBuffer[sIndex++] = chartab[i].c; x++; } return tmpBuffer[sIndex++] = '\n'; }; N = 100; oneElement = (function() { function oneElement() {} oneElement.prototype.x = 0; oneElement.prototype.y = 0; oneElement.prototype.h = 0; oneElement.prototype.w = 0; oneElement.prototype.index = 0; oneElement.prototype.count = 0; return oneElement; })(); elem = []; for (elelmIndex = _j = 0; _j < 10000; elelmIndex = ++_j) { elem[elelmIndex] = new oneElement; } SPACE_BETWEEN_COLUMNS = 3; SPACE_BETWEEN_ROWS = 1; emit_tensor = function(p) { var col, dx, dy, eh, ew, h, n, ncol, nrow, row, w, x, y, _k, _l, _m, _n, _ref; i = 0; n = 0; nrow = 0; ncol = 0; x = 0; y = 0; h = 0; w = 0; dx = 0; dy = 0; eh = 0; ew = 0; row = 0; col = 0; if (p.tensor.ndim > 2) { emit_flat_tensor(p); return; } nrow = p.tensor.dim[0]; if (p.tensor.ndim === 2) { ncol = p.tensor.dim[1]; } else { ncol = 1; } n = nrow * ncol; if (n > N) { emit_flat_tensor(p); return; } x = emit_x; for (i = _k = 0; 0 <= n ? _k < n : _k > n; i = 0 <= n ? ++_k : --_k) { elem[i].index = yindex; elem[i].x = emit_x; emit_expr(p.tensor.elem[i]); elem[i].count = yindex - elem[i].index; _ref = get_size(elem[i].index, yindex), elem[i].h = _ref[0], elem[i].w = _ref[1], elem[i].y = _ref[2]; } eh = 0; ew = 0; for (i = _l = 0; 0 <= n ? _l < n : _l > n; i = 0 <= n ? ++_l : --_l) { if (elem[i].h > eh) { eh = elem[i].h; } if (elem[i].w > ew) { ew = elem[i].w; } } h = nrow * eh + (nrow - 1) * SPACE_BETWEEN_ROWS; w = ncol * ew + (ncol - 1) * SPACE_BETWEEN_COLUMNS; y = -(h / 2); for (row = _m = 0; 0 <= nrow ? _m < nrow : _m > nrow; row = 0 <= nrow ? ++_m : --_m) { for (col = _n = 0; 0 <= ncol ? _n < ncol : _n > ncol; col = 0 <= ncol ? ++_n : --_n) { i = row * ncol + col; dx = x - elem[i].x; dy = y - elem[i].y; move(elem[i].index, elem[i].index + elem[i].count, dx, dy); dx = 0; if (col > 0) { dx = col * (ew + SPACE_BETWEEN_COLUMNS); } dy = 0; if (row > 0) { dy = row * (eh + SPACE_BETWEEN_ROWS); } dx += (ew - elem[i].w) / 2; dy += (eh - elem[i].h) / 2; move(elem[i].index, elem[i].index + elem[i].count, dx, dy); } } return emit_x = x + w; /* if 0 * left brace for (i = 0; i < h; i++) { if (yindex == YMAX) break chartab[yindex].c = '|' chartab[yindex].x = x - 2 chartab[yindex].y = y + i yindex++ } * right brace emit_x++ for (i = 0; i < h; i++) { if (yindex == YMAX) break chartab[yindex].c = '|' chartab[yindex].x = emit_x chartab[yindex].y = y + i yindex++ } emit_x++ endif */ }; emit_flat_tensor = function(p) { return emit_tensor_inner(p, 0, 0); }; emit_tensor_inner = function(p, j, k) { var _k, _ref; i = 0; __emit_char('('); for (i = _k = 0, _ref = p.tensor.dim[j]; 0 <= _ref ? _k < _ref : _k > _ref; i = 0 <= _ref ? ++_k : --_k) { if (j + 1 === p.tensor.ndim) { emit_expr(p.tensor.elem[k]); k = k + 1; } else { k = emit_tensor_inner(p, j + 1, k); } if (i + 1 < p.tensor.dim[j]) { __emit_char(','); } } __emit_char(')'); return k; }; /* void test_display(void) { test(__FILE__, s, sizeof s / sizeof (char *)) } #endif */ Find = function(p, q) { var _k, _ref; i = 0; if (equal(p, q)) { return 1; } if (istensor(p)) { for (i = _k = 0, _ref = p.tensor.nelem; 0 <= _ref ? _k < _ref : _k > _ref; i = 0 <= _ref ? ++_k : --_k) { if (Find(p.tensor.elem[i], q)) { return 1; } } return 0; } while (iscons(p)) { if (Find(car(p), q)) { return 1; } p = cdr(p); } return 0; }; init = function() { var flag, _k, _l; i = 0; flag = 0; tos = 0; esc_flag = 0; draw_flag = 0; frame = TOS; if (flag) { return; } flag = 1; for (i = _k = 0; 0 <= NSYM ? _k < NSYM : _k > NSYM; i = 0 <=