From 89992f11a58fdd713b23bfdb0cb3611cc5e36070 Mon Sep 17 00:00:00 2001 From: josdejong Date: Sun, 9 Feb 2014 22:04:27 +0100 Subject: [PATCH] Some changes in gulpfile.js --- dist/math.js | 36743 +++++++++++++++++++++++---------------------- dist/math.map | 1 + dist/math.map.js | 1 - dist/math.min.js | 15 +- gulpfile.js | 9 +- 5 files changed, 18900 insertions(+), 17869 deletions(-) create mode 100644 dist/math.map delete mode 100644 dist/math.map.js diff --git a/dist/math.js b/dist/math.js index b315d30a6..567b8ccae 100644 --- a/dist/math.js +++ b/dist/math.js @@ -6,8 +6,8 @@ * It features real and complex numbers, units, matrices, a large set of * mathematical functions, and a flexible expression parser. * - * @version 0.18.0 - * @date 2014-01-18 + * @version 0.19.0-SNAPSHOT + * @date 2014-02-09 * * @license * Copyright (C) 2013-2014 Jos de Jong @@ -24,17899 +24,18930 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.mathjs=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o y', - 'larger(x, y)' - ], - 'description': - 'Check if value x is larger than y. Returns 1 if x is larger than y, and 0 if not.', - 'examples': [ - '2 > 3', - '5 > 2*2', - 'a = 3.3', - 'b = 6-2.8', - '(a > b)', - '(b < a)', - '5 cm > 2 inch' - ], - 'seealso': [ - 'equal', 'unequal', 'smaller', 'smallereq', 'largereq' - ] -}; - -},{}],33:[function(require,module,exports){ -module.exports = { - 'name': 'largereq', - 'category': 'Operators', - 'syntax': [ - 'x >= y', - 'largereq(x, y)' - ], - 'description': - 'Check if value x is larger or equal to y. Returns 1 if x is larger or equal to y, and 0 if not.', - 'examples': [ - '2 > 1+1', - '2 >= 1+1', - 'a = 3.2', - 'b = 6-2.8', - '(a > b)' - ], - 'seealso': [ - 'equal', 'unequal', 'smallereq', 'smaller', 'largereq' - ] -}; - -},{}],34:[function(require,module,exports){ -module.exports = { - 'name': 'lcm', - 'category': 'Arithmetic', - 'syntax': [ - 'lcm(x, y)' - ], - 'description': 'Compute the least common multiple.', - 'examples': [ - 'lcm(4, 6)', - 'lcm(6, 21)', - 'lcm(6, 21, 5)' - ], - 'seealso': [ 'gcd' ] -}; - -},{}],35:[function(require,module,exports){ -module.exports = { - 'name': 'log', - 'category': 'Arithmetic', - 'syntax': [ - 'log(x)', - 'log(x, base)' - ], - 'description': 'Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).', - 'examples': [ - 'log(3.5)', - 'a = log(2.4)', - 'exp(a)', - '10 ^ 3', - 'log(1000, 10)', - 'log(1000) / log(10)', - 'b = logb(1024, 2)', - '2 ^ b' - ], - 'seealso': [ - 'exp', - 'log10' - ] -}; -},{}],36:[function(require,module,exports){ -module.exports = { - 'name': 'log10', - 'category': 'Arithmetic', - 'syntax': [ - 'log10(x)' - ], - 'description': 'Compute the 10-base logarithm of a value.', - 'examples': [ - 'log10(1000)', - '10 ^ 3', - 'log10(0.01)', - 'log(1000) / log(10)', - 'log(1000, 10)' - ], - 'seealso': [ - 'exp', - 'log' - ] -}; - -},{}],37:[function(require,module,exports){ -module.exports = { - 'name': 'mod', - 'category': 'Operators', - 'syntax': [ - 'x % y', - 'x mod y', - 'mod(x, y)' - ], - 'description': - 'Calculates the modulus, the remainder of an integer division.', - 'examples': [ - '7 % 3', - '11 % 2', - '10 mod 4', - 'function isOdd(x) = x % 2', - 'isOdd(2)', - 'isOdd(3)' - ], - 'seealso': [] -}; - -},{}],38:[function(require,module,exports){ -module.exports = { - 'name': 'multiply', - 'category': 'Operators', - 'syntax': [ - 'x * y', - 'multiply(x, y)' - ], - 'description': 'multiply two values.', - 'examples': [ - '2.1 * 3.6', - 'ans / 3.6', - '2 * 3 + 4', - '2 * (3 + 4)', - '3 * 2.1 km' - ], - 'seealso': [ - 'divide' - ] -}; - -},{}],39:[function(require,module,exports){ -module.exports = { - 'name': 'pow', - 'category': 'Operators', - 'syntax': [ - 'x ^ y', - 'pow(x, y)' - ], - 'description': - 'Calculates the power of x to y, x^y.', - 'examples': [ - '2^3 = 8', - '2*2*2', - '1 + e ^ (pi * i)' - ], - 'seealso': [ - 'unequal', 'smaller', 'larger', 'smallereq', 'largereq' - ] -}; - -},{}],40:[function(require,module,exports){ -module.exports = { - 'name': 'round', - 'category': 'Arithmetic', - 'syntax': [ - 'round(x)', - 'round(x, n)' - ], - 'description': - 'round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.', - 'examples': [ - 'round(3.2)', - 'round(3.8)', - 'round(-4.2)', - 'round(-4.8)', - 'round(pi, 3)', - 'round(123.45678, 2)' - ], - 'seealso': ['ceil', 'floor', 'fix'] -}; - -},{}],41:[function(require,module,exports){ -module.exports = { - 'name': 'sign', - 'category': 'Arithmetic', - 'syntax': [ - 'sign(x)' - ], - 'description': - 'Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.', - 'examples': [ - 'sign(3.5)', - 'sign(-4.2)', - 'sign(0)' - ], - 'seealso': [ - 'abs' - ] -}; - -},{}],42:[function(require,module,exports){ -module.exports = { - 'name': 'smaller', - 'category': 'Operators', - 'syntax': [ - 'x < y', - 'smaller(x, y)' - ], - 'description': - 'Check if value x is smaller than value y. Returns 1 if x is smaller than y, and 0 if not.', - 'examples': [ - '2 < 3', - '5 < 2*2', - 'a = 3.3', - 'b = 6-2.8', - '(a < b)', - '5 cm < 2 inch' - ], - 'seealso': [ - 'equal', 'unequal', 'larger', 'smallereq', 'largereq' - ] -}; - -},{}],43:[function(require,module,exports){ -module.exports = { - 'name': 'smallereq', - 'category': 'Operators', - 'syntax': [ - 'x <= y', - 'smallereq(x, y)' - ], - 'description': - 'Check if value x is smaller or equal to value y. Returns 1 if x is smaller than y, and 0 if not.', - 'examples': [ - '2 < 1+1', - '2 <= 1+1', - 'a = 3.2', - 'b = 6-2.8', - '(a < b)' - ], - 'seealso': [ - 'equal', 'unequal', 'larger', 'smaller', 'largereq' - ] -}; - -},{}],44:[function(require,module,exports){ -module.exports = { - 'name': 'sqrt', - 'category': 'Arithmetic', - 'syntax': [ - 'sqrt(x)' - ], - 'description': - 'Compute the square root value. If x = y * y, then y is the square root of x.', - 'examples': [ - 'sqrt(25)', - '5 * 5', - 'sqrt(-1)' - ], - 'seealso': [ - 'square', - 'multiply' - ] -}; - -},{}],45:[function(require,module,exports){ -module.exports = { - 'name': 'square', - 'category': 'Arithmetic', - 'syntax': [ - 'square(x)' - ], - 'description': - 'Compute the square of a value. The square of x is x * x.', - 'examples': [ - 'square(3)', - 'sqrt(9)', - '3^2', - '3 * 3' - ], - 'seealso': [ - 'multiply', - 'pow', - 'sqrt', - 'cube' - ] -}; - -},{}],46:[function(require,module,exports){ -module.exports = { - 'name': 'subtract', - 'category': 'Operators', - 'syntax': [ - 'x - y', - 'subtract(x, y)' - ], - 'description': 'subtract two values.', - 'examples': [ - '5.3 - 2', - 'ans + 2', - '2/3 - 1/6', - '2 * 3 - 3', - '2.1 km - 500m' - ], - 'seealso': [ - 'add' - ] -}; - -},{}],47:[function(require,module,exports){ -module.exports = { - 'name': 'unary', - 'category': 'Operators', - 'syntax': [ - '-x', - 'unary(x)' - ], - 'description': - 'Inverse the sign of a value.', - 'examples': [ - '-4.5', - '-(-5.6)' - ], - 'seealso': [ - 'add', 'subtract' - ] -}; - -},{}],48:[function(require,module,exports){ -module.exports = { - 'name': 'unequal', - 'category': 'Operators', - 'syntax': [ - 'x != y', - 'unequal(x, y)' - ], - 'description': - 'Check unequality of two values. Returns 1 if the values are unequal, and 0 if they are equal.', - 'examples': [ - '2+2 != 3', - '2+2 != 4', - 'a = 3.2', - 'b = 6-2.8', - 'a != b', - '50cm != 0.5m', - '5 cm != 2 inch' - ], - 'seealso': [ - 'equal', 'smaller', 'larger', 'smallereq', 'largereq' - ] -}; - -},{}],49:[function(require,module,exports){ -module.exports = { - 'name': 'xgcd', - 'category': 'Arithmetic', - 'syntax': [ - 'xgcd(a, b)' - ], - 'description': 'Calculate the extended greatest common divisor for two values', - 'examples': [ - 'xgcd(8, 12)', - 'gcd(8, 12)', - 'xgcd(36163, 21199)' - ], - 'seealso': [ 'gcd', 'lcm' ] -}; - -},{}],50:[function(require,module,exports){ -module.exports = { - 'name': 'arg', - 'category': 'Complex', - 'syntax': [ - 'arg(x)' - ], - 'description': - 'Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).', - 'examples': [ - 'arg(2 + 2i)', - 'atan2(3, 2)', - 'arg(2 - 3i)' - ], - 'seealso': [ - 're', - 'im', - 'conj', - 'abs' - ] -}; - -},{}],51:[function(require,module,exports){ -module.exports = { - 'name': 'conj', - 'category': 'Complex', - 'syntax': [ - 'conj(x)' - ], - 'description': - 'Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.', - 'examples': [ - 'conj(2 + 3i)', - 'conj(2 - 3i)', - 'conj(-5.2i)' - ], - 'seealso': [ - 're', - 'im', - 'abs', - 'arg' - ] -}; - -},{}],52:[function(require,module,exports){ -module.exports = { - 'name': 'im', - 'category': 'Complex', - 'syntax': [ - 'im(x)' - ], - 'description': 'Get the imaginary part of a complex number.', - 'examples': [ - 'im(2 + 3i)', - 're(2 + 3i)', - 'im(-5.2i)', - 'im(2.4)' - ], - 'seealso': [ - 're', - 'conj', - 'abs', - 'arg' - ] -}; - -},{}],53:[function(require,module,exports){ -module.exports = { - 'name': 're', - 'category': 'Complex', - 'syntax': [ - 're(x)' - ], - 'description': 'Get the real part of a complex number.', - 'examples': [ - 're(2 + 3i)', - 'im(2 + 3i)', - 're(-5.2i)', - 're(2.4)' - ], - 'seealso': [ - 'im', - 'conj', - 'abs', - 'arg' - ] -}; - -},{}],54:[function(require,module,exports){ -module.exports = { - 'name': 'bignumber', - 'category': 'Type', - 'syntax': [ - 'bignumber(x)' - ], - 'description': - 'Create a big number from a number or string.', - 'examples': [ - '0.1 + 0.2', - 'bignumber(0.1) + bignumber(0.2)', - 'bignumber("7.2")', - 'bignumber("7.2e500")', - 'bignumber([0.1, 0.2, 0.3])' - ], - 'seealso': [ - 'boolean', 'complex', 'index', 'matrix', 'string', 'unit' - ] -}; - -},{}],55:[function(require,module,exports){ -module.exports = { - 'name': 'boolean', - 'category': 'Type', - 'syntax': [ - 'x', - 'boolean(x)' - ], - 'description': - 'Convert a string or number into a boolean.', - 'examples': [ - 'boolean(0)', - 'boolean(1)', - 'boolean(3)', - 'boolean("true")', - 'boolean("false")', - 'boolean([1, 0, 1, 1])' - ], - 'seealso': [ - 'bignumber', 'complex', 'index', 'matrix', 'number', 'string', 'unit' - ] -}; - -},{}],56:[function(require,module,exports){ -module.exports = { - 'name': 'complex', - 'category': 'Type', - 'syntax': [ - 'complex()', - 'complex(re, im)', - 'complex(string)' - ], - 'description': - 'Create a complex number.', - 'examples': [ - 'complex()', - 'complex(2, 3)', - 'complex("7 - 2i")' - ], - 'seealso': [ - 'bignumber', 'boolean', 'index', 'matrix', 'number', 'string', 'unit' - ] -}; - -},{}],57:[function(require,module,exports){ -module.exports = { - 'name': 'index', - 'category': 'Type', - 'syntax': [ - '[start]', - '[start:end]', - '[start:step:end]', - '[start1, start 2, ...]', - '[start1:end1, start2:end2, ...]', - '[start1:step1:end1, start2:step2:end2, ...]' - ], - 'description': - 'Create an index to get or replace a subset of a matrix', - 'examples': [ - '[]', - '[1, 2, 3]', - 'A = [1, 2, 3; 4, 5, 6]', - 'A[1, :]', - 'A[1, 2] = 50', - 'A[0:2, 0:2] = ones(2, 2)' - ], - 'seealso': [ - 'bignumber', 'boolean', 'complex', 'matrix,', 'number', 'range', 'string', 'unit' - ] -}; - -},{}],58:[function(require,module,exports){ -module.exports = { - 'name': 'matrix', - 'category': 'Type', - 'syntax': [ - '[]', - '[a1, b1, ...; a2, b2, ...]', - 'matrix()', - 'matrix([...])' - ], - 'description': - 'Create a matrix.', - 'examples': [ - '[]', - '[1, 2, 3]', - '[1, 2, 3; 4, 5, 6]', - 'matrix()', - 'matrix([3, 4])' - ], - 'seealso': [ - 'bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit' - ] -}; - -},{}],59:[function(require,module,exports){ -module.exports = { - 'name': 'number', - 'category': 'Type', - 'syntax': [ - 'x', - 'number(x)' - ], - 'description': - 'Create a number or convert a string or boolean into a number.', - 'examples': [ - '2', - '2e3', - '4.05', - 'number(2)', - 'number("7.2")', - 'number(true)', - 'number([true, false, true, true])' - ], - 'seealso': [ - 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'string', 'unit' - ] -}; - -},{}],60:[function(require,module,exports){ -module.exports = { - 'name': 'string', - 'category': 'Type', - 'syntax': [ - '"text"', - 'string(x)' - ], - 'description': - 'Create a string or convert a value to a string', - 'examples': [ - '"Hello World!"', - 'string(4.2)', - 'string(3 + 2i)' - ], - 'seealso': [ - 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'unit' - ] -}; - -},{}],61:[function(require,module,exports){ -module.exports = { - 'name': 'unit', - 'category': 'Type', - 'syntax': [ - 'value unit', - 'unit(value, unit)', - 'unit(string)' - ], - 'description': - 'Create a unit.', - 'examples': [ - '5.5 mm', - '3 inch', - 'unit(7.1, "kilogram")', - 'unit("23 deg")' - ], - 'seealso': [ - 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'string' - ] -}; - -},{}],62:[function(require,module,exports){ -module.exports = { - 'name': 'eval', - 'category': 'Expression', - 'syntax': [ - 'eval(expression)', - 'eval([expr1, expr2, expr3, ...])' - ], - 'description': 'Evaluate an expression or an array with expressions.', - 'examples': [ - 'eval("2 + 3")', - 'eval("sqrt(" + 4 + ")")' - ], - 'seealso': [] -}; - -},{}],63:[function(require,module,exports){ -module.exports = { - 'name': 'help', - 'category': 'Expression', - 'syntax': [ - 'help(object)', - 'help(string)' - ], - 'description': 'Display documentation on a function or data type.', - 'examples': [ - 'help(sqrt)', - 'help("complex")' - ], - 'seealso': [] -}; - -},{}],64:[function(require,module,exports){ -module.exports = { - 'name': 'concat', - 'category': 'Matrix', - 'syntax': [ - 'concat(a, b, c, ...)', - 'concat(a, b, c, ..., dim)' - ], - 'description': 'Concatenate matrices. By default, the matrices are concatenated by the first dimension. The dimension on which to concatenate can be provided as last argument.', - 'examples': [ - 'a = [1, 2; 5, 6]', - 'b = [3, 4; 7, 8]', - 'concat(a, b)', - '[a, b]', - 'concat(a, b, 2)', - '[a; b]' - ], - 'seealso': [ - 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],65:[function(require,module,exports){ -module.exports = { - 'name': 'det', - 'category': 'Matrix', - 'syntax': [ - 'det(x)' - ], - 'description': 'Calculate the determinant of a matrix', - 'examples': [ - 'det([1, 2; 3, 4])', - 'det([-2, 2, 3; -1, 1, 3; 2, 0, -1])' - ], - 'seealso': [ - 'concat', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],66:[function(require,module,exports){ -module.exports = { - 'name': 'diag', - 'category': 'Matrix', - 'syntax': [ - 'diag(x)', - 'diag(x, k)' - ], - 'description': 'Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned.When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.', - 'examples': [ - 'diag(1:3)', - 'diag(1:3, 1)', - 'a = [1, 2, 3; 4, 5, 6; 7, 8, 9]', - 'diag(a)' - ], - 'seealso': [ - 'concat', 'det', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],67:[function(require,module,exports){ -module.exports = { - 'name': 'eye', - 'category': 'Matrix', - 'syntax': [ - 'eye(n)', - 'eye(m, n)', - 'eye([m, n])', - 'eye' - ], - 'description': 'Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.', - 'examples': [ - 'eye(3)', - 'eye(3, 5)', - 'a = [1, 2, 3; 4, 5, 6]', - 'eye(size(a))' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],68:[function(require,module,exports){ -module.exports = { - 'name': 'inv', - 'category': 'Matrix', - 'syntax': [ - 'inv(x)' - ], - 'description': 'Calculate the inverse of a matrix', - 'examples': [ - 'inv([1, 2; 3, 4])', - 'inv(4)', - '1 / 4' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],69:[function(require,module,exports){ -module.exports = { - 'name': 'ones', - 'category': 'Matrix', - 'syntax': [ - 'ones(m)', - 'ones(m, n)', - 'ones(m, n, p, ...)', - 'ones([m])', - 'ones([m, n])', - 'ones([m, n, p, ...])', - 'ones' - ], - 'description': 'Create a matrix containing ones.', - 'examples': [ - 'ones(3)', - 'ones(3, 5)', - 'ones([2,3]) * 4.5', - 'a = [1, 2, 3; 4, 5, 6]', - 'ones(size(a))' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],70:[function(require,module,exports){ -module.exports = { - 'name': 'range', - 'category': 'Type', - 'syntax': [ - 'start:end', - 'start:step:end', - 'range(start, end)', - 'range(start, end, step)', - 'range(string)' - ], - 'description': - 'Create a range. Lower bound of the range is included, upper bound is excluded.', - 'examples': [ - '1:5', - '3:-1:-3', - 'range(3, 7)', - 'range(0, 12, 2)', - 'range("4:10")', - 'a = [1, 2, 3, 4; 5, 6, 7, 8]', - 'a[1:2, 1:2]' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'size', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],71:[function(require,module,exports){ -module.exports = { - 'name': 'resize', - 'category': 'Matrix', - 'syntax': [ - 'resize(x, size)', - 'resize(x, size, defaultValue)' - ], - 'description': 'Resize a matrix.', - 'examples': [ - 'resize([1,2,3,4,5], [3])', - 'resize([1,2,3], [5], 0)', - 'resize(2, [2, 3], 0)', - 'resize("hello", [8], "!")' - ], - 'seealso': [ - 'size', 'subset', 'squeeze' - ] -}; - -},{}],72:[function(require,module,exports){ -module.exports = { - 'name': 'size', - 'category': 'Matrix', - 'syntax': [ - 'size(x)' - ], - 'description': 'Calculate the size of a matrix.', - 'examples': [ - 'size(2.3)', - 'size("hello world")', - 'a = [1, 2; 3, 4; 5, 6]', - 'size(a)', - 'size(1:6)' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'squeeze', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],73:[function(require,module,exports){ -module.exports = { - 'name': 'squeeze', - 'category': 'Matrix', - 'syntax': [ - 'squeeze(x)' - ], - 'description': 'Remove singleton dimensions from a matrix.', - 'examples': [ - 'a = zeros(1,3,2)', - 'size(squeeze(a))', - 'b = zeros(3,1,1)', - 'size(squeeze(b))' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'subset', 'transpose', 'zeros' - ] -}; - -},{}],74:[function(require,module,exports){ -module.exports = { - 'name': 'subset', - 'category': 'Matrix', - 'syntax': [ - 'value(index)', - 'value(index) = replacement', - 'subset(value, [index])', - 'subset(value, [index], replacement)' - ], - 'description': 'Get or set a subset of a matrix or string. ' + - 'Indexes are one-based. ' + - 'Both the ranges lower-bound and upper-bound are included.', - 'examples': [ - 'd = [1, 2; 3, 4]', - 'e = []', - 'e[1, 1:2] = [5, 6]', - 'e[2, :] = [7, 8]', - 'f = d * e', - 'f[2, 1]', - 'f[:, 1]' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros' - ] -}; - -},{}],75:[function(require,module,exports){ -module.exports = { - 'name': 'transpose', - 'category': 'Matrix', - 'syntax': [ - 'x\'', - 'transpose(x)' - ], - 'description': 'Transpose a matrix', - 'examples': [ - 'a = [1, 2, 3; 4, 5, 6]', - 'a\'', - 'transpose(a)' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'zeros' - ] -}; - -},{}],76:[function(require,module,exports){ -module.exports = { - 'name': 'zeros', - 'category': 'Matrix', - 'syntax': [ - 'zeros(m)', - 'zeros(m, n)', - 'zeros(m, n, p, ...)', - 'zeros([m])', - 'zeros([m, n])', - 'zeros([m, n, p, ...])', - 'zeros' - ], - 'description': 'Create a matrix containing zeros.', - 'examples': [ - 'zeros(3)', - 'zeros(3, 5)', - 'a = [1, 2, 3; 4, 5, 6]', - 'zeros(size(a))' - ], - 'seealso': [ - 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose' - ] -}; - -},{}],77:[function(require,module,exports){ -module.exports = { - 'name': 'combinations', - 'category': 'Probability', - 'syntax': [ - 'combinations(n, k)' - ], - 'description': 'Compute the number of combinations of n items taken k at a time', - 'examples': [ - 'combinations(7, 5)' - ], - 'seealso': ['permutations', 'factorial'] -}; - -},{}],78:[function(require,module,exports){ -module.exports = { - 'name': 'distribution', - 'category': 'Probability', - 'syntax': [ - 'distribution(name)', - 'distribution(name, arg1, arg2, ...)' - ], - 'description': - 'Create a distribution object of a specific type. ' + - 'A distribution object contains functions `random([size,] [min,] [max])`, ' + - '`randomInt([size,] [min,] [max])`, and `pickRandom(array)`. ' + - 'Available types of distributions: "uniform", "normal". ' + - 'Note that the function distribution is currently not available via the expression parser.', - 'examples': [ - ], - 'seealso': ['random', 'randomInt'] -}; - -},{}],79:[function(require,module,exports){ -module.exports = { - 'name': 'factorial', - 'category': 'Probability', - 'syntax': [ - 'n!', - 'factorial(n)' - ], - 'description': 'Compute the factorial of a value', - 'examples': [ - '5!', - '5*4*3*2*1', - '3!' - ], - 'seealso': [] -}; - -},{}],80:[function(require,module,exports){ -module.exports = { - 'name': 'permutations', - 'category': 'Probability', - 'syntax': [ - 'permutations(n)', - 'permutations(n, k)' - ], - 'description': 'Compute the number of permutations of n items taken k at a time', - 'examples': [ - 'permutations(5)', - 'permutations(5, 4)' - ], - 'seealso': ['combinations', 'factorial'] -}; - -},{}],81:[function(require,module,exports){ -module.exports = { - 'name': 'pickRandom', - 'category': 'Probability', - 'syntax': [ - 'pickRandom(array)' - ], - 'description': - 'Pick a random entry from a given array.', - 'examples': [ - 'pickRandom(0:10)', - 'pickRandom([1, 3, 1, 6])' - ], - 'seealso': ['distribution', 'random', 'randomInt'] -}; - -},{}],82:[function(require,module,exports){ -module.exports = { - 'name': 'random', - 'category': 'Probability', - 'syntax': [ - 'random()', - 'random(max)', - 'random(min, max)', - 'random(size)', - 'random(size, max)', - 'random(size, min, max)' - ], - 'description': - 'Return a random number.', - 'examples': [ - 'random()', - 'random(10, 20)', - 'random([2, 3])' - ], - 'seealso': ['distribution', 'pickRandom', 'randomInt'] -}; - -},{}],83:[function(require,module,exports){ -module.exports = { - 'name': 'randInt', - 'category': 'Probability', - 'syntax': [ - 'randInt()', - 'randInt(max)', - 'randInt(min, max)', - 'randInt(size)', - 'randInt(size, max)', - 'randInt(size, min, max)' - ], - 'description': - 'Return a random integer number', - 'examples': [ - 'randInt()', - 'randInt(10, 20)', - 'randInt([2, 3], 10)' - ], - 'seealso': ['distribution', 'pickRandom', 'random'] -}; -},{}],84:[function(require,module,exports){ -module.exports = { - 'name': 'max', - 'category': 'Statistics', - 'syntax': [ - 'max(a, b, c, ...)', - 'max(A)', - 'max(A, dim)' - ], - 'description': 'Compute the maximum value of a list of values.', - 'examples': [ - 'max(2, 3, 4, 1)', - 'max([2, 3, 4, 1])', - 'max([2, 5; 4, 3], 0)', - 'max([2, 5; 4, 3], 1)', - 'max(2.7, 7.1, -4.5, 2.0, 4.1)', - 'min(2.7, 7.1, -4.5, 2.0, 4.1)' - ], - 'seealso': [ - //'sum', - //'prod', - //'avg', - //'var', - //'std', - 'mean', - //'median', - 'min' - ] -}; - -},{}],85:[function(require,module,exports){ -module.exports = { - 'name': 'mean', - 'category': 'Statistics', - 'syntax': [ - 'mean(a, b, c, ...)', - 'mean(A)', - 'mean(A, dim)' - ], - 'description': 'Compute the arithmetic mean of a list of values.', - 'examples': [ - 'mean(2, 3, 4, 1)', - 'mean([2, 3, 4, 1])', - 'mean([2, 5; 4, 3], 0)', - 'mean([2, 5; 4, 3], 1)', - 'mean([1.0, 2.7, 3.2, 4.0])' - ], - 'seealso': [ - //'sum', - //'prod', - //'avg', - //'var', - //'std', - 'max', - 'min' - //'median' - ] -}; - -},{}],86:[function(require,module,exports){ -module.exports = { - 'name': 'min', - 'category': 'Statistics', - 'syntax': [ - 'min(a, b, c, ...)', - 'min(A)', - 'min(A, dim)' - ], - 'description': 'Compute the minimum value of a list of values.', - 'examples': [ - 'min(2, 3, 4, 1)', - 'min([2, 3, 4, 1])', - 'min([2, 5; 4, 3], 0)', - 'min([2, 5; 4, 3], 1)', - 'min(2.7, 7.1, -4.5, 2.0, 4.1)', - 'max(2.7, 7.1, -4.5, 2.0, 4.1)' - ], - 'seealso': [ - //'sum', - //'prod', - //'avg', - //'var', - //'std', - 'max', - 'mean', - //'median', - 'min' - ] -}; - -},{}],87:[function(require,module,exports){ -module.exports = { - 'name': 'acos', - 'category': 'Trigonometry', - 'syntax': [ - 'acos(x)' - ], - 'description': 'Compute the inverse cosine of a value in radians.', - 'examples': [ - 'acos(0.5)', - 'acos(cos(2.3))' - ], - 'seealso': [ - 'cos', - 'acos', - 'asin' - ] -}; - -},{}],88:[function(require,module,exports){ -module.exports = { - 'name': 'asin', - 'category': 'Trigonometry', - 'syntax': [ - 'asin(x)' - ], - 'description': 'Compute the inverse sine of a value in radians.', - 'examples': [ - 'asin(0.5)', - 'asin(sin(2.3))' - ], - 'seealso': [ - 'sin', - 'acos', - 'asin' - ] -}; - -},{}],89:[function(require,module,exports){ -module.exports = { - 'name': 'atan', - 'category': 'Trigonometry', - 'syntax': [ - 'atan(x)' - ], - 'description': 'Compute the inverse tangent of a value in radians.', - 'examples': [ - 'atan(0.5)', - 'atan(tan(2.3))' - ], - 'seealso': [ - 'tan', - 'acos', - 'asin' - ] -}; - -},{}],90:[function(require,module,exports){ -module.exports = { - 'name': 'atan2', - 'category': 'Trigonometry', - 'syntax': [ - 'atan2(y, x)' - ], - 'description': - 'Computes the principal value of the arc tangent of y/x in radians.', - 'examples': [ - 'atan2(2, 2) / pi', - 'angle = 60 deg in rad', - 'x = cos(angle)', - 'y = sin(angle)', - 'atan2(y, x)' - ], - 'seealso': [ - 'sin', - 'cos', - 'tan' - ] -}; - -},{}],91:[function(require,module,exports){ -module.exports = { - 'name': 'cos', - 'category': 'Trigonometry', - 'syntax': [ - 'cos(x)' - ], - 'description': 'Compute the cosine of x in radians.', - 'examples': [ - 'cos(2)', - 'cos(pi / 4) ^ 2', - 'cos(180 deg)', - 'cos(60 deg)', - 'sin(0.2)^2 + cos(0.2)^2' - ], - 'seealso': [ - 'acos', - 'sin', - 'tan' - ] -}; - -},{}],92:[function(require,module,exports){ -module.exports = { - 'name': 'cot', - 'category': 'Trigonometry', - 'syntax': [ - 'cot(x)' - ], - 'description': 'Compute the cotangent of x in radians. Defined as 1/tan(x)', - 'examples': [ - 'cot(2)', - '1 / tan(2)' - ], - 'seealso': [ - 'sec', - 'csc', - 'tan' - ] -}; - -},{}],93:[function(require,module,exports){ -module.exports = { - 'name': 'csc', - 'category': 'Trigonometry', - 'syntax': [ - 'csc(x)' - ], - 'description': 'Compute the cosecant of x in radians. Defined as 1/sin(x)', - 'examples': [ - 'csc(2)', - '1 / sin(2)' - ], - 'seealso': [ - 'sec', - 'cot', - 'sin' - ] -}; - -},{}],94:[function(require,module,exports){ -module.exports = { - 'name': 'sec', - 'category': 'Trigonometry', - 'syntax': [ - 'sec(x)' - ], - 'description': 'Compute the secant of x in radians. Defined as 1/cos(x)', - 'examples': [ - 'sec(2)', - '1 / cos(2)' - ], - 'seealso': [ - 'cot', - 'csc', - 'cos' - ] -}; - -},{}],95:[function(require,module,exports){ -module.exports = { - 'name': 'sin', - 'category': 'Trigonometry', - 'syntax': [ - 'sin(x)' - ], - 'description': 'Compute the sine of x in radians.', - 'examples': [ - 'sin(2)', - 'sin(pi / 4) ^ 2', - 'sin(90 deg)', - 'sin(30 deg)', - 'sin(0.2)^2 + cos(0.2)^2' - ], - 'seealso': [ - 'asin', - 'cos', - 'tan' - ] -}; - -},{}],96:[function(require,module,exports){ -module.exports = { - 'name': 'tan', - 'category': 'Trigonometry', - 'syntax': [ - 'tan(x)' - ], - 'description': 'Compute the tangent of x in radians.', - 'examples': [ - 'tan(0.5)', - 'sin(0.5) / cos(0.5)', - 'tan(pi / 4)', - 'tan(45 deg)' - ], - 'seealso': [ - 'atan', - 'sin', - 'cos' - ] -}; - -},{}],97:[function(require,module,exports){ -module.exports = { - 'name': 'to', - 'category': 'Units', - 'syntax': [ - 'x to unit', - 'to(x, unit)' - ], - 'description': 'Change the unit of a value.', - 'examples': [ - '5 inch in cm', - '3.2kg in g', - '16 bytes in bits' - ], - 'seealso': [] -}; - -},{}],98:[function(require,module,exports){ -module.exports = { - 'name': 'clone', - 'category': 'Utils', - 'syntax': [ - 'clone(x)' - ], - 'description': 'Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices', - 'examples': [ - 'clone(3.5)', - 'clone(2 - 4i)', - 'clone(45 deg)', - 'clone([1, 2; 3, 4])', - 'clone("hello world")' - ], - 'seealso': [] -}; - -},{}],99:[function(require,module,exports){ -module.exports = { - 'name': 'forEach', - 'category': 'Utils', - 'syntax': [ - 'forEach(x, callback)' - ], - 'description': 'Iterates over all elements of a matrix/array, and executes the given callback.', - 'examples': [ - 'forEach([1, 2, 3], function(val) { console.log(val) })' - ], - 'seealso': [] -}; - -},{}],100:[function(require,module,exports){ -module.exports = { - 'name': 'format', - 'category': 'Utils', - 'syntax': [ - 'format(value)', - 'format(value, precision)' - ], - 'description': 'Format a value of any type as string.', - 'examples': [ - 'format(2.3)', - 'format(3 - 4i)', - 'format([])', - 'format(pi, 3)' - ], - 'seealso': ['print'] -}; - -},{}],101:[function(require,module,exports){ -module.exports = { - 'name': 'import', - 'category': 'Utils', - 'syntax': [ - 'import(string)' - ], - 'description': 'Import functions from a file.', - 'examples': [ - 'import("numbers")', - 'import("./mylib.js")' - ], - 'seealso': [] -}; - -},{}],102:[function(require,module,exports){ -module.exports = { - 'name': 'map', - 'category': 'Utils', - 'syntax': [ - 'map(x, callback)' - ], - 'description': 'Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.', - 'examples': [ - 'map([1, 2, 3], function(val) { return math.max(val, 1.5) })' - ], - 'seealso': [] -}; - -},{}],103:[function(require,module,exports){ -module.exports = { - 'name': 'typeof', - 'category': 'Utils', - 'syntax': [ - 'typeof(x)' - ], - 'description': 'Get the type of a variable.', - 'examples': [ - 'typeof(3.5)', - 'typeof(2 - 4i)', - 'typeof(45 deg)', - 'typeof("hello world")' - ], - 'seealso': [] -}; - -},{}],104:[function(require,module,exports){ -// constants -exports.e = require('./constants/e'); -exports.E = require('./constants/e'); -exports['false'] = require('./constants/false'); -exports.i = require('./constants/i'); -exports['Infinity'] = require('./constants/Infinity'); -exports.LN2 = require('./constants/LN2'); -exports.LN10 = require('./constants/LN10'); -exports.LOG2E = require('./constants/LOG2E'); -exports.LOG10E = require('./constants/LOG10E'); -exports.NaN = require('./constants/NaN'); -exports.pi = require('./constants/pi'); -exports.PI = require('./constants/pi'); -exports.SQRT1_2 = require('./constants/SQRT1_2'); -exports.SQRT2 = require('./constants/SQRT2'); -exports.tau = require('./constants/tau'); -exports['true'] = require('./constants/true'); - -// functions - arithmetic -exports.abs = require('./function/arithmetic/abs'); -exports.add = require('./function/arithmetic/add'); -exports.ceil = require('./function/arithmetic/ceil'); -exports.cube = require('./function/arithmetic/cube'); -exports.divide = require('./function/arithmetic/divide'); -exports.edivide = require('./function/arithmetic/edivide'); -exports.emultiply = require('./function/arithmetic/emultiply'); -exports.epow = require('./function/arithmetic/epow'); -exports.equal = require('./function/arithmetic/equal'); -exports.exp = require('./function/arithmetic/exp'); -exports.fix = require('./function/arithmetic/fix'); -exports.floor = require('./function/arithmetic/floor'); -exports.gcd = require('./function/arithmetic/gcd'); -exports.larger = require('./function/arithmetic/larger'); -exports.largereq = require('./function/arithmetic/largereq'); -exports.lcm = require('./function/arithmetic/lcm'); -exports.log = require('./function/arithmetic/log'); -exports.log10 = require('./function/arithmetic/log10'); -exports.mod = require('./function/arithmetic/mod'); -exports.multiply = require('./function/arithmetic/multiply'); -exports.pow = require('./function/arithmetic/pow'); -exports.round = require('./function/arithmetic/round'); -exports.sign = require('./function/arithmetic/sign'); -exports.smaller = require('./function/arithmetic/smaller'); -exports.smallereq = require('./function/arithmetic/smallereq'); -exports.sqrt = require('./function/arithmetic/sqrt'); -exports.square = require('./function/arithmetic/square'); -exports.subtract = require('./function/arithmetic/subtract'); -exports.unary = require('./function/arithmetic/unary'); -exports.unequal = require('./function/arithmetic/unequal'); -exports.xgcd = require('./function/arithmetic/xgcd'); - -// functions - complex -exports.arg = require('./function/complex/arg'); -exports.conj = require('./function/complex/conj'); -exports.re = require('./function/complex/re'); -exports.im = require('./function/complex/im'); - -// functions - construction -exports.bignumber = require('./function/construction/bignumber'); -exports['boolean'] = require('./function/construction/boolean'); -exports.complex = require('./function/construction/complex'); -exports.index = require('./function/construction/index'); -exports.matrix = require('./function/construction/matrix'); -exports.number = require('./function/construction/number'); -exports.string = require('./function/construction/string'); -exports.unit = require('./function/construction/unit'); - -// functions - epxression -exports['eval'] = require('./function/expression/eval'); -exports.help = require('./function/expression/help'); - -// functions - matrix -exports.concat = require('./function/matrix/concat'); -exports.det = require('./function/matrix/det'); -exports.diag = require('./function/matrix/diag'); -exports.eye = require('./function/matrix/eye'); -exports.inv = require('./function/matrix/inv'); -exports.ones = require('./function/matrix/ones'); -exports.range = require('./function/matrix/range'); -exports.resize = require('./function/matrix/resize'); -exports.size = require('./function/matrix/size'); -exports.squeeze = require('./function/matrix/squeeze'); -exports.subset = require('./function/matrix/subset'); -exports.transpose = require('./function/matrix/transpose'); -exports.zeros = require('./function/matrix/zeros'); - -// functions - probability -exports.combinations = require('./function/probability/combinations'); -exports.distribution = require('./function/probability/distribution'); -exports.factorial = require('./function/probability/factorial'); -exports.permutations = require('./function/probability/permutations'); -exports.pickRandom = require('./function/probability/pickRandom'); -exports.random = require('./function/probability/random'); -exports.randomInt = require('./function/probability/randomInt'); - -// functions - statistics -exports.min = require('./function/statistics/min'); -exports.mean = require('./function/statistics/mean'); -exports.max = require('./function/statistics/max'); - -// functions - trigonometry -exports.acos = require('./function/trigonometry/acos'); -exports.asin = require('./function/trigonometry/asin'); -exports.atan = require('./function/trigonometry/atan'); -exports.atan2 = require('./function/trigonometry/atan2'); -exports.cos = require('./function/trigonometry/cos'); -exports.cot = require('./function/trigonometry/cot'); -exports.csc = require('./function/trigonometry/csc'); -exports.sec = require('./function/trigonometry/sec'); -exports.sin = require('./function/trigonometry/sin'); -exports.tan = require('./function/trigonometry/tan'); - -// functions - units -exports.to = require('./function/units/to'); - -// functions - utils -exports.clone = require('./function/utils/clone'); -exports.map = require('./function/utils/map'); -exports.forEach = require('./function/utils/forEach'); -exports.format = require('./function/utils/format'); -// exports.print = require('./function/utils/print'); // TODO: add documentation for print as soon as the parser supports objects. -exports['import'] = require('./function/utils/import'); -exports['typeof'] = require('./function/utils/typeof'); - -},{"./constants/Infinity":5,"./constants/LN10":6,"./constants/LN2":7,"./constants/LOG10E":8,"./constants/LOG2E":9,"./constants/NaN":10,"./constants/SQRT1_2":11,"./constants/SQRT2":12,"./constants/e":13,"./constants/false":14,"./constants/i":15,"./constants/pi":16,"./constants/tau":17,"./constants/true":18,"./function/arithmetic/abs":19,"./function/arithmetic/add":20,"./function/arithmetic/ceil":21,"./function/arithmetic/cube":22,"./function/arithmetic/divide":23,"./function/arithmetic/edivide":24,"./function/arithmetic/emultiply":25,"./function/arithmetic/epow":26,"./function/arithmetic/equal":27,"./function/arithmetic/exp":28,"./function/arithmetic/fix":29,"./function/arithmetic/floor":30,"./function/arithmetic/gcd":31,"./function/arithmetic/larger":32,"./function/arithmetic/largereq":33,"./function/arithmetic/lcm":34,"./function/arithmetic/log":35,"./function/arithmetic/log10":36,"./function/arithmetic/mod":37,"./function/arithmetic/multiply":38,"./function/arithmetic/pow":39,"./function/arithmetic/round":40,"./function/arithmetic/sign":41,"./function/arithmetic/smaller":42,"./function/arithmetic/smallereq":43,"./function/arithmetic/sqrt":44,"./function/arithmetic/square":45,"./function/arithmetic/subtract":46,"./function/arithmetic/unary":47,"./function/arithmetic/unequal":48,"./function/arithmetic/xgcd":49,"./function/complex/arg":50,"./function/complex/conj":51,"./function/complex/im":52,"./function/complex/re":53,"./function/construction/bignumber":54,"./function/construction/boolean":55,"./function/construction/complex":56,"./function/construction/index":57,"./function/construction/matrix":58,"./function/construction/number":59,"./function/construction/string":60,"./function/construction/unit":61,"./function/expression/eval":62,"./function/expression/help":63,"./function/matrix/concat":64,"./function/matrix/det":65,"./function/matrix/diag":66,"./function/matrix/eye":67,"./function/matrix/inv":68,"./function/matrix/ones":69,"./function/matrix/range":70,"./function/matrix/resize":71,"./function/matrix/size":72,"./function/matrix/squeeze":73,"./function/matrix/subset":74,"./function/matrix/transpose":75,"./function/matrix/zeros":76,"./function/probability/combinations":77,"./function/probability/distribution":78,"./function/probability/factorial":79,"./function/probability/permutations":80,"./function/probability/pickRandom":81,"./function/probability/random":82,"./function/probability/randomInt":83,"./function/statistics/max":84,"./function/statistics/mean":85,"./function/statistics/min":86,"./function/trigonometry/acos":87,"./function/trigonometry/asin":88,"./function/trigonometry/atan":89,"./function/trigonometry/atan2":90,"./function/trigonometry/cos":91,"./function/trigonometry/cot":92,"./function/trigonometry/csc":93,"./function/trigonometry/sec":94,"./function/trigonometry/sin":95,"./function/trigonometry/tan":96,"./function/units/to":97,"./function/utils/clone":98,"./function/utils/forEach":99,"./function/utils/format":100,"./function/utils/import":101,"./function/utils/map":102,"./function/utils/typeof":103}],105:[function(require,module,exports){ -var Node = require('./Node'), - object = require('../../util/object'), - string = require('../../util/string'), - collection = require('../../type/collection'), - Matrix = require('../../type/Matrix'); - -/** - * @constructor ArrayNode - * @extends {Node} - * Holds an 1-dimensional array with nodes - * @param {Array} nodes 1 dimensional array with nodes - */ -function ArrayNode(nodes) { - this.nodes = nodes || []; -} - -ArrayNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @private - */ -ArrayNode.prototype._compile = function (defs) { - var asMatrix = (defs.math.config().matrix !== 'array'); - - var nodes = this.nodes.map(function (node) { - return node._compile(defs); - }); - - return (asMatrix ? 'math.matrix([' : '[') + - nodes.join(',') + - (asMatrix ? '])' : ']'); -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -ArrayNode.prototype.find = function (filter) { - var results = []; - - // check itself - if (this.match(filter)) { - results.push(this); - } - - // search in all nodes - var nodes = this.nodes; - for (var r = 0, rows = nodes.length; r < rows; r++) { - var nodes_r = nodes[r]; - for (var c = 0, cols = nodes_r.length; c < cols; c++) { - results = results.concat(nodes_r[c].find(filter)); - } - } - - return results; -}; - -/** - * Get string representation - * @return {String} str - * @override - */ -ArrayNode.prototype.toString = function() { - return string.format(this.nodes); -}; - -module.exports = ArrayNode; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/object":220,"../../util/string":221,"./Node":111}],106:[function(require,module,exports){ -var Node = require('./Node'); - -/** - * @constructor AssignmentNode - * @extends {Node} - * Define a symbol, like "a = 3.2" - * - * @param {String} name Symbol name - * @param {Node} expr The expression defining the symbol - */ -function AssignmentNode(name, expr) { - this.name = name; - this.expr = expr; -} - -AssignmentNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @private - */ -AssignmentNode.prototype._compile = function (defs) { - return 'scope["' + this.name + '"] = ' + this.expr._compile(defs) + ''; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -AssignmentNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in expression - if (this.expr) { - nodes = nodes.concat(this.expr.find(filter)); - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} - */ -AssignmentNode.prototype.toString = function() { - return this.name + ' = ' + this.expr.toString(); -}; - -module.exports = AssignmentNode; -},{"./Node":111}],107:[function(require,module,exports){ -var Node = require('./Node'); - -/** - * @constructor BlockNode - * @extends {Node} - * Holds a set with nodes - */ -function BlockNode() { - this.params = []; -} - -BlockNode.prototype = new Node(); - -/** - * Add a parameter - * @param {Node} node - * @param {Boolean} [visible] true by default - */ -BlockNode.prototype.add = function (node, visible) { - var index = this.params.length; - this.params[index] = { - node: node, - visible: (visible != undefined) ? visible : true - }; -}; - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -BlockNode.prototype._compile = function (defs) { - var params = this.params.map(function (param) { - var js = param.node._compile(defs); - if (param.visible) { - return 'results.push(' + js + ');'; - } - else { - return js + ';'; - } - }); - - return '(function () {' + - 'var results = [];' + - params.join('') + - 'return results;' + - '})()'; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -BlockNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in parameters - var params = this.params; - if (params) { - for (var i = 0, len = params.length; i < len; i++) { - nodes = nodes.concat(params[i].node.find(filter)); - } - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} str - * @override - */ -BlockNode.prototype.toString = function() { - return this.params.map(function (param) { - return param.node.toString() + (param.visible ? '' : ';'); - }).join('\n'); -}; - -module.exports = BlockNode; - -},{"./Node":111}],108:[function(require,module,exports){ -var Node = require('./Node'), - Complex = require('../../type/Complex'), - BigNumber = require('bignumber.js'), - string = require('../../util/string'), - isString = string.isString; - -/** - * @constructor ConstantNode - * @extends {Node} - * @param {String} type Choose from 'number', 'string', 'complex', 'boolean', - * 'undefined', 'null' - * @param {String} value Value is an uninterpreted string containing the value - */ -function ConstantNode(type, value) { - if (!isString(type)) { - throw new TypeError('Constant type must be a string') - } - - if (!isString(value)) { - throw new TypeError('Constant value must be a string') - } - - this.type = type; - this.value = value; -} - -ConstantNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -ConstantNode.prototype._compile = function (defs) { - switch (this.type) { - case 'number': - if (defs.math.config().number === 'bignumber') { - return 'math.bignumber("' + this.value + '")'; - } - else { - // remove leading zeros like '003.2' - return this.value.replace(/^(0*)[0-9]/, function (match, zeros) { - return match.substring(zeros.length); - }); - } - - case 'string': - return '"' + this.value + '"'; - - case 'complex': - return 'math.complex(0, ' + this.value + ')'; - - case 'boolean': - return this.value; - - case 'undefined': - return this.value; - - case 'null': - return this.value; - - default: - throw new TypeError('Unsupported type of constant "' + this.type + '"'); - } -}; - -/** - * Get string representation - * @return {String} str - */ -ConstantNode.prototype.toString = function() { - switch (this.type) { - case 'string': - return '"' + this.value + '"'; - - case 'complex': - return this.value + 'i'; - - default: - return this.value; - } -}; - -module.exports = ConstantNode; - -},{"../../type/Complex":208,"../../util/string":221,"./Node":111,"bignumber.js":223}],109:[function(require,module,exports){ -var Node = require('./Node'); - -/** - * @constructor FunctionNode - * @extends {Node} - * Function assignment - * - * @param {String} name Function name - * @param {String[]} args Function arguments - * @param {Node} expr The function expression - */ -function FunctionNode(name, args, expr) { - this.name = name; - this.args = args; - this.expr = expr; -} - -FunctionNode.prototype = new Node(); - -/** - * Evaluate the function assignment - * @return {function} fn - */ -// TODO: cleanup -FunctionNode.prototype._eval = function() { - // put the definition in the scope - this.scope.set(this.name, this.fn); - - return this.fn; -}; - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -FunctionNode.prototype._compile = function (defs) { - - // TODO: validate whether name and all arguments are strings - - return 'scope["' + this.name + '"] = ' + - ' (function (scope) {' + - ' scope = Object.create(scope); ' + - ' var fn = function ' + this.name + '(' + this.args.join(',') + ') {' + - ' if (arguments.length != ' + this.args.length + ') {' + - ' throw new SyntaxError("Wrong number of arguments in function ' + this.name + ' (" + arguments.length + " provided, ' + this.args.length + ' expected)");' + - ' }' + - this.args.map(function (variable, index) { - return 'scope["' + variable + '"] = arguments[' + index + '];'; - }).join('') + - ' return ' + this.expr._compile(defs) + '' + - ' };' + - ' fn.syntax = "' + this.name + '(' + this.args.join(', ') + ')";' + - ' return fn;' + - ' })(scope);'; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -FunctionNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in expression - if (this.expr) { - nodes = nodes.concat(this.expr.find(filter)); - } - - return nodes; -}; - -/** - * get string representation - * @return {String} str - */ -FunctionNode.prototype.toString = function() { - return 'function ' + this.name + - '(' + this.args.join(', ') + ') = ' + - this.expr.toString(); -}; - -module.exports = FunctionNode; - -},{"./Node":111}],110:[function(require,module,exports){ -var number= require('../../util/number.js'), - - Node = require('./Node.js'), - RangeNode = require('./RangeNode.js'), - SymbolNode = require('./SymbolNode.js'), - - BigNumber = require('bignumber.js'), - Index = require('../../type/Index.js'), - Range = require('../../type/Range.js'), - - isNumber = number.isNumber, - toNumber = number.toNumber; - -/** - * @constructor IndexNode - * get a subset of a matrix - * @param {Node} object - * @param {Node[]} ranges - */ -function IndexNode (object, ranges) { - this.object = object; - this.ranges = ranges; -} - -IndexNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -IndexNode.prototype._compile = function (defs) { - return this.compileSubset(defs); -}; - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the - * compiled expression - * @param {String} [replacement] If provided, the function returns - * "math.subset(obj, math.index(...), replacement)" - * Else, the function returns - * "math.subset(obj, math.index(...))" - * @return {String} js - * @returns {string} - */ -IndexNode.prototype.compileSubset = function compileIndex (defs, replacement) { - // check whether any of the ranges expressions uses the context symbol 'end' - var filter = { - type: SymbolNode, - properties: { - name: 'end' - } - }; - var rangesUseEnd = this.ranges.map(function (range) { - return range.find(filter).length > 0; - }); - - // TODO: implement support for bignumber (currently bignumbers are silently - // reduced to numbers when changing the value to zero-based) - - // TODO: Optimization: when the range values are ConstantNodes, - // we can beforehand resolve the zero-based value - - var ranges = this.ranges.map(function(range, i) { - var useEnd = rangesUseEnd[i]; - if (range instanceof RangeNode) { - if (useEnd) { - // resolve end and create range (change from one based to zero based) - return '(function (scope) {' + - ' scope = Object.create(scope); ' + - ' scope["end"] = size[' + i + '];' + - ' var step = ' + (range.step ? range.step._compile(defs) : '1') + ';' + - ' return [' + - ' ' + range.start._compile(defs) + ' - 1, ' + - ' ' + range.end._compile(defs) + ' - (step > 0 ? 0 : 2), ' + - ' step' + - ' ];' + - '})(scope)'; - } - else { - // create range (change from one based to zero based) - return '(function () {' + - ' var step = ' + (range.step ? range.step._compile(defs) : '1') + ';' + - ' return [' + - ' ' + range.start._compile(defs) + ' - 1, ' + - ' ' + range.end._compile(defs) + ' - (step > 0 ? 0 : 2), ' + - ' step' + - ' ];' + - '})()'; - } - } - else { - if (useEnd) { - // resolve the parameter 'end', adjust the index value to zero-based - return '(function (scope) {' + - ' scope = Object.create(scope); ' + - ' scope["end"] = size[' + i + '];' + - ' return ' + range._compile(defs) + ' - 1;' + - '})(scope)' - } - else { - // just evaluate the expression, and change from one-based to zero-based - return range._compile(defs) + ' - 1'; - } - } - }); - - // if some parameters use the 'end' parameter, we need to calculate the size - var someUseEnd = ranges.some(function (useEnd) { - return useEnd; - }); - if (someUseEnd) { - return '(function () {' + - ' var obj = ' + this.object._compile(defs) + ';' + - ' var size = math.size(obj).valueOf();' + - ' return math.subset(' + - ' obj, ' + - ' math.index(' + ranges.join(', ') + ')' + - ' ' + (replacement ? (', ' + replacement) : '') + - ' );' + - '})()'; - } - else { - return 'math.subset(' + - this.object._compile(defs) + ',' + - 'math.index(' + ranges.join(', ') + - (replacement ? (', ' + replacement) : '') + - ')'; - } -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter options - * @returns {Node[]} nodes - */ -IndexNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search object - if (this.object) { - nodes = nodes.concat(this.object.find(filter)); - } - - // search in parameters - var ranges = this.ranges; - if (ranges) { - for (var i = 0, len = ranges.length; i < len; i++) { - nodes = nodes.concat(ranges[i].find(filter)); - } - } - - return nodes; -}; - -/** - * Get the name of the object linked to this IndexNode - * @return {string} name - */ -IndexNode.prototype.objectName = function objectName () { - return this.object.name; -}; - -/** - * Get string representation - * @return {String} str - */ -IndexNode.prototype.toString = function() { - // format the parameters like "[1, 0:5]" - var str = this.object ? this.object.toString() : ''; - if (this.ranges) { - str += '[' + this.ranges.join(', ') + ']'; - } - return str; -}; - -module.exports = IndexNode; -},{"../../type/Index.js":210,"../../type/Range.js":212,"../../util/number.js":219,"./Node.js":111,"./RangeNode.js":114,"./SymbolNode.js":115,"bignumber.js":223}],111:[function(require,module,exports){ -/** - * Node - */ -function Node() {} - -/** - * Evaluate the node - * @return {*} result - */ -// TODO: cleanup deprecated code one day. Deprecated since version 0.19.0 -Node.prototype.eval = function () { - throw new Error('Node.eval is deprecated. ' + - 'Use Node.compile(math).eval([scope]) instead.'); -}; - -/** - * Compile the node to javascript code - * @param {Object} math math.js instance - * @return {{eval: function}} expr Returns an object with a function 'eval', - * which can be invoked as expr.eval([scope]), - * where scope is an optional object with - * variables. - */ -Node.prototype.compile = function (math) { - if (typeof math !== 'object') { - throw new TypeError('Object expected as parameter math'); - } - - // definitions globally available inside the closure of the compiled expressions - var defs = { - math: math - }; - - var code = this._compile(defs); - - var defsCode = Object.keys(defs).map(function (name) { - return ' var ' + name + ' = defs["' + name + '"];'; - }); - - var factoryCode = - defsCode.join(' ') + - 'return {' + - ' "eval": function (scope) {' + - ' scope = scope || {};' + - ' return ' + code + ';' + - ' }' + - '};'; - - var factory = new Function ('defs', factoryCode); - return factory(defs); -}; - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * and constants globally available inside the closure - * of the compiled expression - * @return {String} js - * @private - */ -Node.prototype._compile = function (defs) { - throw new Error('Cannot compile a Node interface'); -}; - -/** - * Find any node in the node tree matching given filter. For example, to - * find all nodes of type SymbolNode having name 'x': - * - * var results = Node.find({ - * type: SymbolNode, - * properties: { - * name: 'x' - * } - * }); - * - * @param {Object} filter Available parameters: - * {Function} type - * {Object} properties - * @return {Node[]} nodes An array with nodes matching given filter criteria - */ -Node.prototype.find = function (filter) { - return this.match(filter) ? [this] : []; -}; - -/** - * Test if this object matches given filter - * @param {Object} filter Available parameters: - * {Function} type - * {Object} properties - * @return {Boolean} matches True if there is a match - */ -Node.prototype.match = function (filter) { - var match = true; - - if (filter) { - if (filter.type && !(this instanceof filter.type)) { - match = false; - } - if (match && filter.properties) { - for (var prop in filter.properties) { - if (filter.properties.hasOwnProperty(prop)) { - if (this[prop] != filter.properties[prop]) { - match = false; - break; - } - } - } - } - } - - return match; -}; - -/** - * Get string representation - * @return {String} - */ -Node.prototype.toString = function() { - return ''; -}; - -module.exports = Node; - -},{}],112:[function(require,module,exports){ -var Node = require('./Node'); - -/** - * @constructor OperatorNode - * @extends {Node} - * An operator with two arguments, like 2+3 - * - * @param {String} op Operator name, for example '+' - * @param {String} fn Function name, for example 'add' - * @param {Node[]} params Parameters - */ -function OperatorNode (op, fn, params) { - this.op = op; - this.fn = fn; - this.params = params; -} - -OperatorNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -OperatorNode.prototype._compile = function (defs) { - if (!(this.fn in defs.math)) { - throw new Error('Function ' + this.fn + ' missing in provided namespace "math"'); - } - - var params = this.params.map(function (param) { - return param._compile(defs); - }); - return 'math.' + this.fn + '(' + params.join(', ') + ')'; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -OperatorNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in parameters - var params = this.params; - if (params) { - for (var i = 0, len = params.length; i < len; i++) { - nodes = nodes.concat(params[i].find(filter)); - } - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} str - */ -OperatorNode.prototype.toString = function() { - var params = this.params; - - switch (params.length) { - case 1: - if (this.op == '-') { - // special case: unary minus - return '-' + params[0].toString(); - } - else { - // for example '5!' - return params[0].toString() + this.op; - } - - case 2: // for example '2+3' - var lhs = params[0].toString(); - if (params[0] instanceof OperatorNode) { - lhs = '(' + lhs + ')'; - } - var rhs = params[1].toString(); - if (params[1] instanceof OperatorNode) { - rhs = '(' + rhs + ')'; - } - return lhs + ' ' + this.op + ' ' + rhs; - - default: // this should occur. format as a function call - return this.op + '(' + this.params.join(', ') + ')'; - } -}; - -module.exports = OperatorNode; - -},{"./Node":111}],113:[function(require,module,exports){ -var number= require('../../util/number'), - - Node = require('./Node'), - RangeNode = require('./RangeNode'), - SymbolNode = require('./SymbolNode'), - - BigNumber = require('bignumber.js'), - Index = require('../../type/Index'), - Range = require('../../type/Range'), - - isNumber = number.isNumber, - toNumber = number.toNumber; - -/** - * @constructor ParamsNode - * @extends {Node} - * invoke a list with parameters on a node - * @param {Node} object - * @param {Node[]} params - */ -function ParamsNode (object, params) { - this.object = object; - this.params = params; -} - -ParamsNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -ParamsNode.prototype._compile = function (defs) { - // TODO: implement support for matrix indexes and ranges - var params = this.params.map(function (param) { - return param._compile(defs); - }); - - return this.object._compile(defs) + '(' + params.join(', ') + ')'; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -ParamsNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search object - if (this.object) { - nodes = nodes.concat(this.object.find(filter)); - } - - // search in parameters - var params = this.params; - if (params) { - for (var i = 0, len = params.length; i < len; i++) { - nodes = nodes.concat(params[i].find(filter)); - } - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} str - */ -ParamsNode.prototype.toString = function() { - // format the parameters like "(2, 4.2)" - var str = this.object ? this.object.toString() : ''; - if (this.params) { - str += '(' + this.params.join(', ') + ')'; - } - return str; -}; - -module.exports = ParamsNode; - -},{"../../type/Index":210,"../../type/Range":212,"../../util/number":219,"./Node":111,"./RangeNode":114,"./SymbolNode":115,"bignumber.js":223}],114:[function(require,module,exports){ -var number = require('../../util/number'), - Node = require('./Node'), - - BigNumber = require('bignumber.js'), - Range = require('../../type/Range'), - Matrix = require('../../type/Matrix'), - - toNumber = number.toNumber; - -/** - * @constructor RangeNode - * @extends {Node} - * create a range - * @param {Node[]} params Array [start, end] or [start, end, step] - */ -function RangeNode (params) { - if (params.length != 2 && params.length != 3) { - throw new SyntaxError('Wrong number of arguments. ' + - 'Expected [start, end] or [start, end, step]'); - } - - this.start = params[0]; // included lower-bound - this.end = params[1]; // included upper-bound - this.step = params[2]; // optional step -} - -RangeNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -RangeNode.prototype._compile = function (defs) { - return 'math.range(' + - this.start._compile(defs) + ', ' + - this.end._compile(defs) + ', ' + - (this.step ? (this.step._compile(defs) + ', ') : '') + - 'true)'; // parameter includeEnd = true -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -RangeNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in parameters - if (this.start) { - nodes = nodes.concat(this.start.find(filter)); - } - if (this.step) { - nodes = nodes.concat(this.step.find(filter)); - } - if (this.end) { - nodes = nodes.concat(this.end.find(filter)); - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} str - */ -RangeNode.prototype.toString = function() { - // format the range like "start:step:end" - var str = this.start.toString(); - if (this.step) { - str += ':' + this.step.toString(); - } - str += ':' + this.end.toString(); - - return str; -}; - -module.exports = RangeNode; - -},{"../../type/Matrix":211,"../../type/Range":212,"../../util/number":219,"./Node":111,"bignumber.js":223}],115:[function(require,module,exports){ -var Node = require('./Node'), - Unit = require('../../type/Unit'); - -/** - * @constructor SymbolNode - * @extends {Node} - * A symbol node can hold and resolve a symbol - * @param {String} name - * @extends {Node} - */ -function SymbolNode(name) { - this.name = name; -} - -SymbolNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -SymbolNode.prototype._compile = function (defs) { - // add a function to the definitions - defs['undef'] = undef; - defs['Unit'] = Unit; - - return '(' + - 'scope["' + this.name + '"] !== undefined ? scope["' + this.name + '"] : ' + - 'math["' + this.name + '"] !== undefined ? math["' + this.name + '"] : ' + - (Unit.isPlainUnit(this.name) ? - 'new Unit(null, "' + this.name + '")' : - 'undef("' + this.name + '")') + - ')'; -}; - -/** - * Throws an error 'Undefined symbol {name}' - * @param {String} name - */ -function undef (name) { - throw new Error('Undefined symbol ' + name); -} - -/** - * Get string representation - * @return {String} str - * @override - */ -SymbolNode.prototype.toString = function() { - return this.name; -}; - -module.exports = SymbolNode; - -},{"../../type/Unit":213,"./Node":111}],116:[function(require,module,exports){ -var Node = require('./Node'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - - number = require('../../util/number'), - toNumber = number.toNumber; - -/** - * @constructor UnitNode - * @extends {Node} - * Construct a unit, like '3 cm' - * @param {Node} value - * @param {String} unit Unit name, for example 'meter' 'kg' - */ -function UnitNode (value, unit) { - this.value = value; - this.unit = unit; -} - -UnitNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -UnitNode.prototype._compile = function (defs) { - return 'math.unit(' + this.value._compile(defs) + ', "' + this.unit + '")'; -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -UnitNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // check value - nodes = nodes.concat(this.value.find(filter)); - - return nodes; -}; - -/** - * Get string representation - * @return {String} str - */ -UnitNode.prototype.toString = function() { - return this.value + ' ' + this.unit; -}; - -module.exports = UnitNode; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../util/number":219,"./Node":111,"bignumber.js":223}],117:[function(require,module,exports){ -var number= require('../../util/number'), - - Node = require('./Node'), - RangeNode = require('./RangeNode'), - IndexNode = require('./IndexNode'), - SymbolNode = require('./SymbolNode'), - - BigNumber = require('bignumber.js'), - Index = require('../../type/Index'), - Range = require('../../type/Range'), - - isNumber = number.isNumber, - toNumber = number.toNumber; - -/** - * @constructor UpdateNode - * @extends {Node} - * Update a symbol value, like a(2,3) = 4.5 - * - * @param {IndexNode} index IndexNode containing symbol and ranges - * @param {Node} expr The expression defining the symbol - */ -function UpdateNode(index, expr) { - if (!(index instanceof IndexNode)) { - throw new TypeError('index mus be an IndexNode'); - } - - this.index = index; - this.expr = expr; -} - -UpdateNode.prototype = new Node(); - -/** - * Compile the node to javascript code - * @param {Object} defs Object which can be used to define functions - * or constants globally available for the compiled - * expression - * @return {String} js - * @private - */ -UpdateNode.prototype._compile = function (defs) { - return 'scope["' + this.index.objectName() + '\"] = ' + - this.index.compileSubset(defs, this.expr._compile(defs)); -}; - -/** - * Find all nodes matching given filter - * @param {Object} filter See Node.find for a description of the filter settings - * @returns {Node[]} nodes - */ -UpdateNode.prototype.find = function (filter) { - var nodes = []; - - // check itself - if (this.match(filter)) { - nodes.push(this); - } - - // search in parameters - var ranges = this.ranges; - if (ranges) { - for (var i = 0, len = ranges.length; i < len; i++) { - nodes = nodes.concat(ranges[i].find(filter)); - } - } - - // search in expression - if (this.expr) { - nodes = nodes.concat(this.expr.find(filter)); - } - - return nodes; -}; - -/** - * Get string representation - * @return {String} - */ -UpdateNode.prototype.toString = function() { - return this.index.toString() + ' = ' + this.expr.toString(); -}; - -module.exports = UpdateNode; - -},{"../../type/Index":210,"../../type/Range":212,"../../util/number":219,"./IndexNode":110,"./Node":111,"./RangeNode":114,"./SymbolNode":115,"bignumber.js":223}],118:[function(require,module,exports){ -/** - * Custom node handlers, - * (can be added to the exports object) - */ - -// TODO: remove use of global handlers - -},{}],119:[function(require,module,exports){ -exports.ArrayNode = require('./ArrayNode'); -exports.AssignmentNode = require('./AssignmentNode'); -exports.BlockNode = require('./BlockNode'); -exports.ConstantNode = require('./ConstantNode'); -exports.IndexNode = require('./IndexNode'); -exports.FunctionNode = require('./FunctionNode'); -exports.Node = require('./Node'); -exports.OperatorNode = require('./OperatorNode'); -exports.ParamsNode = require('./ParamsNode'); -exports.RangeNode = require('./RangeNode'); -exports.SymbolNode = require('./SymbolNode'); -exports.UnitNode = require('./UnitNode'); -exports.UpdateNode = require('./UpdateNode'); - -exports.handlers = require('./handlers'); - -},{"./ArrayNode":105,"./AssignmentNode":106,"./BlockNode":107,"./ConstantNode":108,"./FunctionNode":109,"./IndexNode":110,"./Node":111,"./OperatorNode":112,"./ParamsNode":113,"./RangeNode":114,"./SymbolNode":115,"./UnitNode":116,"./UpdateNode":117,"./handlers":118}],120:[function(require,module,exports){ -var util = require('../util/index'), - - toNumber = util.number.toNumber, - isString = util.string.isString, - isArray = Array.isArray, - - // types - Complex = require('../type/Complex'), - Matrix = require('../type/Matrix'), - Unit = require('../type/Unit'), - collection = require('../type/collection'), - - // scope and nodes - ArrayNode = require('./node/ArrayNode'), - AssignmentNode = require('./node/AssignmentNode'), - BlockNode = require('./node/BlockNode'), - ConstantNode = require('./node/ConstantNode'), - FunctionNode = require('./node/FunctionNode'), - IndexNode = require('./node/IndexNode'), - OperatorNode = require('./node/OperatorNode'), - ParamsNode = require('./node/ParamsNode'), - RangeNode = require('./node/RangeNode'), - SymbolNode = require('./node/SymbolNode'), - UnitNode = require('./node/UnitNode'), - UpdateNode = require('./node/UpdateNode'), - handlers = require('./node/handlers'); - -/** - * Parse an expression. Returns a node tree, which can be evaluated by - * invoking node.eval(); - * - * Syntax: - * - * parse(expr) - * parse([expr1, expr2, expr3, ...]) - * - * Example: - * - * var node = parse('sqrt(3^2 + 4^2)'); - * node.compile(math).eval(); // 5 - * - * var scope = {a:3, b:4} - * var node = parse('a * b'); // 12 - * var code = node.compile(math); - * code.eval(scope); // 12 - * scope.a = 5; - * code.eval(scope); // 20 - * - * var nodes = math.parse(['a = 3', 'b = 4', 'a * b']); - * nodes[2].compile(math).eval(); // 12 - * - * @param {String | String[] | Matrix} expr - * @return {Node | Node[]} node - * @throws {Error} - */ -function parse (expr) { - if (arguments.length != 1) { - throw new SyntaxError('Wrong number of arguments: 1 expected'); - } - - if (isString(expr)) { - // parse a single expression - expression = expr || ''; - return parseStart(); - } - else if (isArray(expr) || expr instanceof Matrix) { - // parse an array or matrix with expressions - return collection.deepMap(expr, function (elem) { - expression = elem || ''; - return parseStart(); - }); - } - else { - // oops - throw new TypeError('String or matrix expected'); - } -}; - -// token types enumeration -var TOKENTYPE = { - NULL : 0, - DELIMITER : 1, - NUMBER : 2, - SYMBOL : 3, - UNKNOWN : 4 -}; - -// map with all delimiters -var DELIMITERS = { - ',': true, - '(': true, - ')': true, - '[': true, - ']': true, - '\"': true, - '\n': true, - ';': true, - - '+': true, - '-': true, - '*': true, - '.*': true, - '/': true, - './': true, - '%': true, - '^': true, - '.^': true, - '!': true, - '\'': true, - '=': true, - ':': true, - - '==': true, - '!=': true, - '<': true, - '>': true, - '<=': true, - '>=': true -}; - -// map with all named delimiters -var NAMED_DELIMITERS = { - 'mod': true, - 'to': true, - 'in': true -}; - -var expression = ''; // current expression -var index = 0; // current index in expr -var c = ''; // current token character in expr -var token = ''; // current token -var token_type = TOKENTYPE.NULL; // type of the token - -/** - * Get the first character from the expression. - * The character is stored into the char c. If the end of the expression is - * reached, the function puts an empty string in c. - * @private - */ -function first() { - index = 0; - c = expression.charAt(0); -} - -/** - * Get the next character from the expression. - * The character is stored into the char c. If the end of the expression is - * reached, the function puts an empty string in c. - * @private - */ -function next() { - index++; - c = expression.charAt(index); -} - -/** - * Preview the next character from the expression. - * @return {String} cNext - * @private - */ -function nextPreview() { - return expression.charAt(index + 1); -} - -/** - * Get next token in the current string expr. - * The token and token type are available as token and token_type - * @private - */ -function getToken() { - token_type = TOKENTYPE.NULL; - token = ''; - - // skip over whitespaces - while (c == ' ' || c == '\t') { // space, tab - // TODO: also take '\r' carriage return as newline? Or does that give problems on mac? - next(); - } - - // skip comment - if (c == '#') { - while (c != '\n' && c != '') { - next(); - } - } - - // check for end of expression - if (c == '') { - // token is still empty - token_type = TOKENTYPE.DELIMITER; - return; - } - - // check for delimiters consisting of 2 characters - var c2 = c + nextPreview(); - if (DELIMITERS[c2]) { - token_type = TOKENTYPE.DELIMITER; - token = c2; - next(); - next(); - return; - } - - // check for delimiters consisting of 1 character - if (DELIMITERS[c]) { - token_type = TOKENTYPE.DELIMITER; - token = c; - next(); - return; - } - - // check for a number - if (isDigitDot(c)) { - token_type = TOKENTYPE.NUMBER; - - // get number, can have a single dot - if (c == '.') { - token += c; - next(); - - if (!isDigit(c)) { - // this is no legal number, it is just a dot - token_type = TOKENTYPE.UNKNOWN; - } - } - else { - while (isDigit(c)) { - token += c; - next(); - } - if (c == '.') { - token += c; - next(); - } - } - while (isDigit(c)) { - token += c; - next(); - } - - // check for exponential notation like "2.3e-4" or "1.23e50" - if (c == 'E' || c == 'e') { - token += c; - next(); - - if (c == '+' || c == '-') { - token += c; - next(); - } - - // Scientific notation MUST be followed by an exponent - if (!isDigit(c)) { - // this is no legal number, exponent is missing. - token_type = TOKENTYPE.UNKNOWN; - } - - while (isDigit(c)) { - token += c; - next(); - } - } - - return; - } - - // check for variables, functions, named operators - if (isAlpha(c)) { - while (isAlpha(c) || isDigit(c)) { - token += c; - next(); - } - - if (NAMED_DELIMITERS[token]) { - token_type = TOKENTYPE.DELIMITER; - } - else { - token_type = TOKENTYPE.SYMBOL; - } - - return; - } - - // something unknown is found, wrong characters -> a syntax error - token_type = TOKENTYPE.UNKNOWN; - while (c != '') { - token += c; - next(); - } - throw createSyntaxError('Syntax error in part "' + token + '"'); -} - -/** - * Skip newline tokens - */ -function skipNewlines () { - while (token == '\n') { - getToken(); - } -} - -/** - * Check if a given name is valid - * if not, an error is thrown - * @param {String} name - * @return {boolean} valid - * @private - */ - // TODO: check for valid symbol name -function isValidSymbolName (name) { - for (var i = 0, iMax = name.length; i < iMax; i++) { - var c = name.charAt(i); - //var valid = (isAlpha(c) || (i > 0 && isDigit(c))); // TODO: allow digits in symbol name - var valid = (isAlpha(c)); - if (!valid) { - return false; - } - } - - return true; -} - -/** - * checks if the given char c is a letter (upper or lower case) - * or underscore - * @param {String} c a string with one character - * @return {Boolean} - * @private - */ -function isAlpha (c) { - return ((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - c == '_'); -} - -/** - * checks if the given char c is a digit or dot - * @param {String} c a string with one character - * @return {Boolean} - * @private - */ -function isDigitDot (c) { - return ((c >= '0' && c <= '9') || - c == '.'); -} - -/** - * checks if the given char c is a digit - * @param {String} c a string with one character - * @return {Boolean} - * @private - */ -function isDigit (c) { - return ((c >= '0' && c <= '9')); -} - -/** - * Start of the parse levels below, in order of precedence - * @return {Node} node - * @private - */ -function parseStart () { - // get the first character in expression - first(); - - getToken(); - - var node; - if (token == '') { - // empty expression - node = new ConstantNode('undefined', 'undefined'); - } - else { - node = parseBlock(); - } - - // check for garbage at the end of the expression - // an expression ends with a empty character '' and token_type DELIMITER - if (token != '') { - if (token_type == TOKENTYPE.DELIMITER) { - // user entered a not existing operator like "//" - - // TODO: give hints for aliases, for example with "<>" give as hint " did you mean != ?" - throw createError('Unknown operator ' + token); - } - else { - throw createSyntaxError('Unexpected part "' + token + '"'); - } - } - - return node; -} - -/** - * Parse a block with expressions. Expressions can be separated by a newline - * character '\n', or by a semicolon ';'. In case of a semicolon, no output - * of the preceding line is returned. - * @return {Node} node - * @private - */ -function parseBlock () { - var node, block, visible; - - if (token != '\n' && token != ';' && token != '') { - node = parseAns(); - } - - while (token == '\n' || token == ';') { - if (!block) { - // initialize the block - block = new BlockNode(); - if (node) { - visible = (token != ';'); - block.add(node, visible); - } - } - - getToken(); - if (token != '\n' && token != ';' && token != '') { - node = parseAns(); - - visible = (token != ';'); - block.add(node, visible); - } - } - - if (block) { - return block; - } - - if (!node) { - node = parseAns(); - } - - return node; -} - -/** - * Parse assignment of ans. - * Ans is assigned when the expression itself is no variable or function - * assignment - * @return {Node} node - * @private - */ -function parseAns () { - var expression = parseFunctionAssignment(); - - // create a variable definition for ans - var name = 'ans'; - return new AssignmentNode(name, expression); -} - -/** - * Parse a function assignment like "function f(a,b) = a*b" - * @return {Node} node - * @private - */ -function parseFunctionAssignment () { - // TODO: function assignment using keyword 'function' is deprecated since version 0.18.0, cleanup some day - if (token_type == TOKENTYPE.SYMBOL && token == 'function') { - throw new Error('Deprecated keyword "function". ' + - 'Functions can now be assigned without it, like "f(x) = x^2".'); - } - - return parseAssignment(); -} - -/** - * Assignment of a variable, can be a variable like "a=2.3" or a updating an - * existing variable like "matrix(2,3:5)=[6,7,8]" - * @return {Node} node - * @private - */ -function parseAssignment () { - var name, args, expr; - - var node = parseRange(); - - if (token == '=') { - if (node instanceof SymbolNode) { - // parse a variable assignment like 'a = 2/3' - name = node.name; - getToken(); - expr = parseAssignment(); - return new AssignmentNode(name, expr); - } - else if (node instanceof IndexNode) { - // parse a matrix subset assignment like 'A[1,2] = 4' - getToken(); - expr = parseAssignment(); - return new UpdateNode(node, expr); - } - else if (node instanceof ParamsNode) { - // parse function assignment like 'f(x) = x^2' - var valid = true; - args = []; - if (node.object instanceof SymbolNode) { - name = node.object.name; - node.params.forEach(function (param, index) { - if (param instanceof SymbolNode) { - args[index] = param.name; - } - else { - valid = false; - } - }); - } - else { - valid = false; - } - - if (valid) { - getToken(); - expr = parseAssignment(); - return new FunctionNode(name, args, expr); - } - } - - throw createSyntaxError('Invalid left hand side of assignment operator ='); - } - - return node; -} - -/** - * parse range, "start:end", "start:step:end", ":", "start:", ":end", etc - * @return {Node} node - * @private - */ -function parseRange () { - var node, params = []; - - if (token == ':') { - // implicit start=1 (one-based) - node = new ConstantNode('number', '1'); - } - else { - // explicit start - node = parseBitwiseConditions(); - } - - if (token == ':') { - params.push(node); - - // parse step and end - while (token == ':') { - getToken(); - if (token == ')' || token == ']' || token == ',' || token == '') { - // implicit end - params.push(new SymbolNode('end')); - } - else { - // explicit end - params.push(parseBitwiseConditions()); - } - } - - if (params.length) { - // swap step and end - if (params.length == 3) { - var step = params[2]; - params[2] = params[1]; - params[1] = step; - } - node = new RangeNode(params); - } - } - - return node; -} - -/** - * conditional operators and bitshift - * @return {Node} node - * @private - */ -function parseBitwiseConditions () { - var node = parseComparison(); - - /* TODO: implement bitwise conditions - var operators = { - '&' : 'bitwiseand', - '|' : 'bitwiseor', - // todo: bitwise xor? - '<<': 'bitshiftleft', - '>>': 'bitshiftright' - }; - while (token in operators) { - var name = token; - - getToken(); - var params = [node, parseComparison()]; - node = new OperatorNode(name, fn, params); - } - */ - - return node; -} - -/** - * comparison operators - * @return {Node} node - * @private - */ -function parseComparison () { - var node, operators, name, fn, params; - - node = parseConditions(); - - operators = { - '==': 'equal', - '!=': 'unequal', - '<': 'smaller', - '>': 'larger', - '<=': 'smallereq', - '>=': 'largereq' - }; - while (token in operators) { - name = token; - fn = operators[name]; - - getToken(); - params = [node, parseConditions()]; - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * conditions like and, or, in - * @return {Node} node - * @private - */ -function parseConditions () { - var node, operators, name, fn, params; - - node = parseAddSubtract(); - - // TODO: precedence of And above Or? - // TODO: implement a method for unit to number conversion - operators = { - 'to' : 'to', - 'in' : 'to' // alias of to - /* TODO: implement conditions - 'and' : 'and', - '&&' : 'and', - 'or': 'or', - '||': 'or', - 'xor': 'xor' - */ - }; - - while (token in operators) { - name = token; - fn = operators[name]; - - getToken(); - params = [node, parseAddSubtract()]; - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * add or subtract - * @return {Node} node - * @private - */ -function parseAddSubtract () { - var node, operators, name, fn, params; - - node = parseMultiplyDivide(); - - operators = { - '+': 'add', - '-': 'subtract' - }; - while (token in operators) { - name = token; - fn = operators[name]; - - getToken(); - params = [node, parseMultiplyDivide()]; - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * multiply, divide, modulus - * @return {Node} node - * @private - */ -function parseMultiplyDivide () { - var node, operators, name, fn, params; - - node = parseUnit(); - - operators = { - '*': 'multiply', - '.*': 'emultiply', - '/': 'divide', - './': 'edivide', - '%': 'mod', - 'mod': 'mod' - }; - - while (token in operators) { - name = token; - fn = operators[name]; - - getToken(); - params = [node, parseUnit()]; - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * parse units like in '2i', '2 cm' - * @return {Node} node - * @private - */ -function parseUnit() { - var node, symbol; - - node = parseUnary(); - - if (token_type == TOKENTYPE.SYMBOL || token == 'in') { - // note unit 'in' (inch) is also a conversion operator - symbol = token; - - getToken(); - - node = new UnitNode(node, symbol); - } - - return node; -} - -/** - * Unary minus - * @return {Node} node - * @private - */ -function parseUnary () { - var name, fn, params; - - if (token == '-') { - name = token; - fn = 'unary'; - getToken(); - params = [parseUnary()]; - - return new OperatorNode(name, fn, params); - } - - return parsePow(); -} - -/** - * power - * Note: power operator is right associative - * @return {Node} node - * @private - */ -function parsePow () { - var node, leftNode, nodes, ops, name, fn, params; - - nodes = [ - parseLeftHandOperators() - ]; - ops = []; - - // stack all operands of a chained power operator (like '2^3^3') - while (token == '^' || token == '.^') { - ops.push(token); - getToken(); - nodes.push(parseLeftHandOperators()); - } - - // evaluate the operands from right to left (right associative) - node = nodes.pop(); - while (nodes.length) { - leftNode = nodes.pop(); - name = ops.pop(); - fn = (name == '^') ? 'pow' : 'epow'; - params = [leftNode, node]; - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * Left hand operators: factorial x!, transpose x' - * @return {Node} node - * @private - */ -function parseLeftHandOperators () { - var node, operators, name, fn, params; - - node = parseNodeHandler(); - - operators = { - '!': 'factorial', - '\'': 'transpose' - }; - - while (token in operators) { - name = token; - fn = operators[name]; - - getToken(); - params = [node]; - - node = new OperatorNode(name, fn, params); - } - - return node; -} - -/** - * Parse a custom node handler. A node handler can be used to process - * nodes in a custom way, for example for handling a plot. - * - * A handler must be defined in the namespace math.expression.node.handlers, - * and must extend math.expression.node.Node, and the handler must contain - * functions eval(), find(filter), and toString(). - * - * For example: - * - * math.expression.node.handlers['plot'] = PlotHandler; - * - * The constructor of the handler is called as: - * - * node = new PlotHandler(params); - * - * The handler will be invoked when evaluating an expression like: - * - * node = math.parse('plot(sin(x), x)'); - * - * @return {Node} node - * @private - */ -function parseNodeHandler () { - var params, handler; - - if (token_type == TOKENTYPE.SYMBOL && handlers[token]) { - handler = handlers[token]; - - getToken(); - - // parse parameters - if (token == '(') { - params = []; - - getToken(); - - if (token != ')') { - params.push(parseRange()); - - // parse a list with parameters - while (token == ',') { - getToken(); - - params.push(parseRange()); - } - } - - if (token != ')') { - throw createSyntaxError('Parenthesis ) expected'); - } - getToken(); - } - - // create a new node handler - //noinspection JSValidateTypes - return new handler(params); - } - - return parseSymbol(); -} - -/** - * parse symbols: functions, variables, constants, units - * @return {Node} node - * @private - */ -function parseSymbol () { - var node, name; - - if (token_type == TOKENTYPE.SYMBOL || - (token_type == TOKENTYPE.DELIMITER && token in NAMED_DELIMITERS)) { - name = token; - - getToken(); - - // create a symbol - node = new SymbolNode(name); - - // parse parameters - return parseParams(node); - } - - return parseString(); -} - -/** - * parse parameters, enclosed in parenthesis. Can be two types: - * - round brackets (...) will return a ParamsNode - * - square brackets [...] will return an IndexNode - * @param {Node} node Node on which to apply the parameters. If there - * are no parameters in the expression, the node - * itself is returned - * @return {Node} node - * @private - */ -function parseParams (node) { - var bracket, params; - - while (token == '(' || token == '[') { - bracket = token; - params = []; - - getToken(); - - if (token != ')' && token != ']') { - params.push(parseRange()); - - // parse a list with parameters - while (token == ',') { - getToken(); - params.push(parseRange()); - } - } - - if ((bracket == '(' && token != ')')) { - throw createSyntaxError('Parenthesis ) expected'); - } - if ((bracket == '[' && token != ']')) { - throw createSyntaxError('Parenthesis ] expected'); - } - getToken(); - - if (bracket == '(') { - node = new ParamsNode(node, params); - } - else { - node = new IndexNode(node, params); - } - } - - return node; -} - -/** - * parse a string. - * A string is enclosed by double quotes - * @return {Node} node - * @private - */ -function parseString () { - var node, str, tPrev; - - if (token == '"') { - // string "..." - str = ''; - tPrev = ''; - while (c != '' && (c != '\"' || tPrev == '\\')) { // also handle escape character - str += c; - tPrev = c; - next(); - } - - getToken(); - if (token != '"') { - throw createSyntaxError('End of string " expected'); - } - getToken(); - - // create constant - node = new ConstantNode('string', str); - - // parse parameters - node = parseParams(node); - - return node; - } - - return parseMatrix(); -} - -/** - * parse the matrix - * @return {Node} node - * @private - */ -function parseMatrix () { - var array, params, rows, cols; - - if (token == '[') { - // matrix [...] - getToken(); - skipNewlines(); - - if (token != ']') { - // this is a non-empty matrix - var row = parseRow(); - - if (token == ';') { - // 2 dimensional array - rows = 1; - params = [row]; - - // the rows of the matrix are separated by dot-comma's - while (token == ';') { - getToken(); - skipNewlines(); - - params[rows] = parseRow(); - rows++; - - skipNewlines(); - } - - if (token != ']') { - throw createSyntaxError('End of matrix ] expected'); - } - getToken(); - - // check if the number of columns matches in all rows - cols = (params.length > 0) ? params[0].length : 0; - for (var r = 1; r < rows; r++) { - if (params[r].length != cols) { - throw createError('Number of columns must match ' + - '(' + params[r].length + ' != ' + cols + ')'); - } - } - - array = new ArrayNode(params); - } - else { - // 1 dimensional vector - if (token != ']') { - throw createSyntaxError('End of matrix ] expected'); - } - getToken(); - - array = row; - } - } - else { - // this is an empty matrix "[ ]" - getToken(); - array = new ArrayNode([]); - } - - // parse parameters - array = parseParams(array); - - return array; - } - - return parseNumber(); -} - -/** - * Parse a single comma-separated row from a matrix, like 'a, b, c' - * @return {ArrayNode} node - */ -function parseRow () { - var params = [parseAssignment()]; - var len = 1; - - while (token == ',') { - getToken(); - skipNewlines(); - - // parse expression - params[len] = parseAssignment(); - len++; - - skipNewlines(); - } - - return new ArrayNode(params); -} - -/** - * parse a number - * @return {Node} node - * @private - */ -function parseNumber () { - var node, complex, number; - - if (token_type == TOKENTYPE.NUMBER) { - // this is a number - number = token == '.' ? '0': token; - getToken(); - - if (token == 'i' || token == 'I') { - // create a complex number - getToken(); - node = new ConstantNode('complex', number); - } - else { - // a number - node = new ConstantNode('number', number); - } - - // parse parameters - node = parseParams(node); - - return node; - } - - return parseParentheses(); -} - -/** - * parentheses - * @return {Node} node - * @private - */ -function parseParentheses () { - var node; - - // check if it is a parenthesized expression - if (token == '(') { - // parentheses (...) - getToken(); - node = parseAssignment(); // start again - - if (token != ')') { - throw createSyntaxError('Parenthesis ) expected'); - } - getToken(); - - /* TODO: implicit multiplication? - // TODO: how to calculate a=3; 2/2a ? is this (2/2)*a or 2/(2*a) ? - // check for implicit multiplication - if (token_type == TOKENTYPE.SYMBOL) { - node = multiply(node, parsePow()); - } - //*/ - - // parse parameters - node = parseParams(node); - - return node; - } - - return parseEnd(); -} - -/** - * Evaluated when the expression is not yet ended but expected to end - * @return {Node} res - * @private - */ -function parseEnd () { - if (token == '') { - // syntax error or unexpected end of expression - throw createSyntaxError('Unexpected end of expression'); - } else { - throw createSyntaxError('Value expected'); - } -} - -/** - * Shortcut for getting the current row value (one based) - * Returns the line of the currently handled expression - * @private - */ -function row () { - // TODO: also register row number during parsing - return undefined; -} - -/** - * Shortcut for getting the current col value (one based) - * Returns the column (position) where the last token starts - * @private - */ -function col () { - return index - token.length + 1; -} - -/** - * Build up an error message - * @param {String} message - * @return {String} message with row and column information - * @private - */ -function createErrorMessage (message) { - var r = row(); - var c = col(); - if (r === undefined) { - if (c === undefined) { - return message; - } else { - return message + ' (char ' + c + ')'; - } - } else { - return message + ' (line ' + r + ', char ' + c + ')'; - } -} - -/** - * Create an error - * @param {String} message - * @return {SyntaxError} instantiated error - * @private - */ -function createSyntaxError (message) { - return new SyntaxError(createErrorMessage(message)); -} - -/** - * Create an error - * @param {String} message - * @return {Error} instantiated error - * @private - */ -function createError (message) { - return new Error(createErrorMessage(message)); -} - -module.exports = parse; - -},{"../type/Complex":208,"../type/Matrix":211,"../type/Unit":213,"../type/collection":214,"../util/index":218,"./node/ArrayNode":105,"./node/AssignmentNode":106,"./node/BlockNode":107,"./node/ConstantNode":108,"./node/FunctionNode":109,"./node/IndexNode":110,"./node/OperatorNode":112,"./node/ParamsNode":113,"./node/RangeNode":114,"./node/SymbolNode":115,"./node/UnitNode":116,"./node/UpdateNode":117,"./node/handlers":118}],121:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the absolute value of a value. - * - * abs(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.abs = function abs(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('abs', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.abs(x); - } - - if (isComplex(x)) { - return Math.sqrt(x.re * x.re + x.im * x.im); - } - - if (x instanceof BigNumber) { - return x.abs(); - } - - if (isCollection(x)) { - return collection.deepMap(x, abs); - } - - if (isBoolean(x)) { - return Math.abs(x); - } - - throw new math.error.UnsupportedTypeError('abs', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],122:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isBoolean = util['boolean'].isBoolean, - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Add two values - * - * x + y - * add(x, y) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | String | Array | Matrix} res - */ - math.add = function add(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('add', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - // number + number - return x + y; - } - else if (isComplex(y)) { - // number + complex - return new Complex( - x + y.re, - y.im - ) - } - } - - if (isComplex(x)) { - if (isComplex(y)) { - // complex + complex - return new Complex( - x.re + y.re, - x.im + y.im - ); - } - else if (isNumber(y)) { - // complex + number - return new Complex( - x.re + y, - x.im - ) - } - } - - if (isUnit(x)) { - if (isUnit(y)) { - if (!x.equalBase(y)) { - throw new Error('Units do not match'); - } - - if (x.value == null) { - throw new Error('Unit on left hand side of operator + has an undefined value'); - } - - if (y.value == null) { - throw new Error('Unit on right hand side of operator + has an undefined value'); - } - - var res = x.clone(); - res.value += y.value; - res.fixPrefix = false; - return res; - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.plus(y); - } - - // downgrade to Number - return add(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.plus(y) - } - - // downgrade to Number - return add(x, toNumber(y)); - } - - if (isString(x) || isString(y)) { - return x + y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, add); - } - - if (isBoolean(x)) { - return add(+x, y); - } - if (isBoolean(y)) { - return add(x, +y); - } - - throw new math.error.UnsupportedTypeError('add', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],123:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isCollection =collection.isCollection, - isComplex = Complex.isComplex; - - /** - * Round a value towards plus infinity - * - * ceil(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.ceil = function ceil(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('ceil', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.ceil(x); - } - - if (isComplex(x)) { - return new Complex ( - Math.ceil(x.re), - Math.ceil(x.im) - ); - } - - if (x instanceof BigNumber) { - return x.ceil(); - } - - if (isCollection(x)) { - return collection.deepMap(x, ceil); - } - - if (isBoolean(x)) { - return Math.ceil(x); - } - - throw new math.error.UnsupportedTypeError('ceil', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],124:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Compute the cube of a value - * - * x .* x .* x - * cube(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.cube = function cube(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('cube', arguments.length, 1); - } - - if (isNumber(x)) { - return x * x * x; - } - - if (isComplex(x)) { - return math.multiply(math.multiply(x, x), x); - } - - if (x instanceof BigNumber) { - return x.times(x).times(x); - } - - if (isCollection(x)) { - return collection.deepMap(x, cube); - } - - if (isBoolean(x)) { - return cube(+x); - } - - throw new math.error.UnsupportedTypeError('cube', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],125:[function(require,module,exports){ -module.exports = function(math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Divide two values. - * - * x / y - * divide(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.divide = function divide(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('divide', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - // number / number - return x / y; - } - else if (isComplex(y)) { - // number / complex - return _divideComplex(new Complex(x, 0), y); - } - } - - if (isComplex(x)) { - if (isComplex(y)) { - // complex / complex - return _divideComplex(x, y); - } - else if (isNumber(y)) { - // complex / number - return _divideComplex(x, new Complex(y, 0)); - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.div(y); - } - - // downgrade to Number - return divide(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.div(y) - } - - // downgrade to Number - return divide(x, toNumber(y)); - } - - if (isUnit(x)) { - if (isNumber(y)) { - var res = x.clone(); - res.value /= y; - return res; - } - } - - if (isCollection(x)) { - if (isCollection(y)) { - // TODO: implement matrix right division using pseudo inverse - // http://www.mathworks.nl/help/matlab/ref/mrdivide.html - // http://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html - // http://stackoverflow.com/questions/12263932/how-does-gnu-octave-matrix-division-work-getting-unexpected-behaviour - return math.multiply(x, math.inv(y)); - } - else { - // matrix / scalar - return collection.deepMap2(x, y, divide); - } - } - - if (isCollection(y)) { - // TODO: implement matrix right division using pseudo inverse - return math.multiply(x, math.inv(y)); - } - - if (isBoolean(x)) { - return divide(+x, y); - } - if (isBoolean(y)) { - return divide(x, +y); - } - - throw new math.error.UnsupportedTypeError('divide', x, y); - }; - - /** - * Divide two complex numbers. x / y or divide(x, y) - * @param {Complex} x - * @param {Complex} y - * @return {Complex} res - * @private - */ - function _divideComplex (x, y) { - var den = y.re * y.re + y.im * y.im; - if (den != 0) { - return new Complex( - (x.re * y.re + x.im * y.im) / den, - (x.im * y.re - x.re * y.im) / den - ); - } - else { - // both y.re and y.im are zero - return new Complex( - (x.re != 0) ? (x.re / 0) : 0, - (x.im != 0) ? (x.im / 0) : 0 - ); - } - } -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],126:[function(require,module,exports){ -module.exports = function (math) { - var collection = require('../../type/collection'); - - /** - * Divide two values element wise. - * - * x ./ y - * edivide(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.edivide = function edivide(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('edivide', arguments.length, 2); - } - - return collection.deepMap2(x, y, math.divide); - }; -}; - -},{"../../type/collection":214}],127:[function(require,module,exports){ -module.exports = function (math) { - var collection = require('../../type/collection'); - - /** - * Multiply two values element wise. - * - * x .* y - * emultiply(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.emultiply = function emultiply(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('emultiply', arguments.length, 2); - } - - return collection.deepMap2(x, y, math.multiply); - }; -}; - -},{"../../type/collection":214}],128:[function(require,module,exports){ -module.exports = function (math) { - var collection = require('../../type/collection'); - - /** - * Calculates the power of x to y element wise - * - * x .^ y - * epow(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.epow = function epow(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('epow', arguments.length, 2); - } - - return collection.deepMap2(x, y, math.pow); - }; -}; - -},{"../../type/collection":214}],129:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value x equals y, - * - * x == y - * equal(x, y) - * - * For matrices, the function is evaluated element wise. - * In case of complex numbers, x.re must equal y.re, and x.im must equal y.im. - * - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.equal = function equal(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('equal', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - return x == y; - } - else if (isComplex(y)) { - return (x == y.re) && (y.im == 0); - } - } - - if (isComplex(x)) { - if (isNumber(y)) { - return (x.re == y) && (x.im == 0); - } - else if (isComplex(y)) { - return (x.re == y.re) && (x.im == y.im); - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.eq(y); - } - - // downgrade to Number - return equal(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.eq(y) - } - - // downgrade to Number - return equal(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value == y.value; - } - - if (isString(x) || isString(y)) { - return x == y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, equal); - } - - if (isBoolean(x)) { - return equal(+x, y); - } - if (isBoolean(y)) { - return equal(x, +y); - } - - throw new math.error.UnsupportedTypeError('equal', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],130:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the exponent of a value - * - * exp(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.exp = function exp (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('exp', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.exp(x); - } - - if (isComplex(x)) { - var r = Math.exp(x.re); - return new Complex( - r * Math.cos(x.im), - r * Math.sin(x.im) - ); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return exp(util.number.toNumber(x)); - } - - if (isCollection(x)) { - return collection.deepMap(x, exp); - } - - if (isBoolean(x)) { - return Math.exp(x); - } - - throw new math.error.UnsupportedTypeError('exp', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],131:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Round a value towards zero - * - * fix(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.fix = function fix(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('fix', arguments.length, 1); - } - - if (isNumber(x)) { - return (x > 0) ? Math.floor(x) : Math.ceil(x); - } - - if (isComplex(x)) { - return new Complex( - (x.re > 0) ? Math.floor(x.re) : Math.ceil(x.re), - (x.im > 0) ? Math.floor(x.im) : Math.ceil(x.im) - ); - } - - if (x instanceof BigNumber) { - return x.isNegative() ? x.ceil() : x.floor(); - } - - if (isCollection(x)) { - return collection.deepMap(x, fix); - } - - if (isBoolean(x)) { - return fix(+x); - } - - throw new math.error.UnsupportedTypeError('fix', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],132:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Round a value towards minus infinity - * - * floor(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.floor = function floor(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('floor', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.floor(x); - } - - if (isComplex(x)) { - return new Complex ( - Math.floor(x.re), - Math.floor(x.im) - ); - } - - if (x instanceof BigNumber) { - return x.floor(); - } - - if (isCollection(x)) { - return collection.deepMap(x, floor); - } - - if (isBoolean(x)) { - return floor(+x); - } - - throw new math.error.UnsupportedTypeError('floor', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],133:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - isBoolean = util['boolean'].isBoolean, - isInteger = util.number.isInteger, - isCollection = collection.isCollection; - - /** - * Calculate the greatest common divisor for two or more values or arrays. - * - * gcd(a, b) - * gcd(a, b, c, ...) - * - * For matrices, the function is evaluated element wise. - * - * @param {... Number | Boolean | Array | Matrix} args two or more integer numbers - * @return {Number | Array | Matrix} greatest common divisor - */ - math.gcd = function gcd(args) { - var a = arguments[0], - b = arguments[1], - r; // remainder - - if (arguments.length == 2) { - // two arguments - if (isNumber(a) && isNumber(b)) { - if (!isInteger(a) || !isInteger(b)) { - throw new Error('Parameters in function gcd must be integer numbers'); - } - - // http://en.wikipedia.org/wiki/Euclidean_algorithm - while (b != 0) { - r = a % b; - a = b; - b = r; - } - return (a < 0) ? -a : a; - } - - // evaluate gcd element wise - if (isCollection(a) || isCollection(b)) { - return collection.deepMap2(a, b, gcd); - } - - // TODO: implement BigNumber support for gcd - - // downgrade bignumbers to numbers - if (a instanceof BigNumber) { - return gcd(toNumber(a), b); - } - if (b instanceof BigNumber) { - return gcd(a, toNumber(b)); - } - - if (isBoolean(a)) { - return gcd(+a, b); - } - if (isBoolean(b)) { - return gcd(a, +b); - } - - throw new math.error.UnsupportedTypeError('gcd', a, b); - } - - if (arguments.length > 2) { - // multiple arguments. Evaluate them iteratively - for (var i = 1; i < arguments.length; i++) { - a = gcd(a, arguments[i]); - } - return a; - } - - // zero or one argument - throw new SyntaxError('Function gcd expects two or more arguments'); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],134:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value x is larger y - * - * x > y - * larger(x, y) - * - * For matrices, the function is evaluated element wise. - * In case of complex numbers, the absolute values of a and b are compared. - * - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.larger = function larger(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('larger', arguments.length, 2); - } - - if (isNumber(x) && isNumber(y)) { - return x > y; - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.gt(y); - } - - // downgrade to Number - return larger(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.gt(y) - } - - // downgrade to Number - return larger(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value > y.value; - } - - if (isString(x) || isString(y)) { - return x > y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, larger); - } - - if (isBoolean(x)) { - return larger(+x, y); - } - if (isBoolean(y)) { - return larger(x, +y); - } - - if (isComplex(x) || isComplex(y)) { - throw new TypeError('No ordering relation is defined for complex numbers'); - } - - throw new math.error.UnsupportedTypeError('larger', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],135:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value x is larger or equal to y - * - * x >= y - * largereq(x, y) - * - * For matrices, the function is evaluated element wise. - * In case of complex numbers, the absolute values of a and b are compared. - * - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.largereq = function largereq(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('largereq', arguments.length, 2); - } - - if (isNumber(x) && isNumber(y)) { - return x >= y; - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.gte(y); - } - - // downgrade to Number - return largereq(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.gte(y) - } - - // downgrade to Number - return largereq(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value >= y.value; - } - - if (isString(x) || isString(y)) { - return x >= y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, largereq); - } - - if (isBoolean(x)) { - return largereq(+x, y); - } - if (isBoolean(y)) { - return largereq(x, +y); - } - - if (isComplex(x) || isComplex(y)) { - throw new TypeError('No ordering relation is defined for complex numbers'); - } - - throw new math.error.UnsupportedTypeError('largereq', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],136:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - isBoolean = util['boolean'].isBoolean, - isInteger = util.number.isInteger, - isCollection = collection.isCollection; - - /** - * Calculate the least common multiple for two or more values or arrays. - * - * lcm(a, b) - * lcm(a, b, c, ...) - * - * lcm is defined as: - * lcm(a, b) = abs(a * b) / gcd(a, b) - * - * For matrices, the function is evaluated element wise. - * - * @param {... Number | Boolean | Array | Matrix} args two or more integer numbers - * @return {Number | Array | Matrix} least common multiple - */ - math.lcm = function lcm(args) { - var a = arguments[0], - b = arguments[1], - t; - - if (arguments.length == 2) { - // two arguments - if (isNumber(a) && isNumber(b)) { - if (!isInteger(a) || !isInteger(b)) { - throw new Error('Parameters in function lcm must be integer numbers'); - } - - if (a == 0 || b == 0) { - return 0; - } - - // http://en.wikipedia.org/wiki/Euclidean_algorithm - // evaluate gcd here inline to reduce overhead - var prod = a * b; - while (b != 0) { - t = b; - b = a % t; - a = t; - } - return Math.abs(prod / a); - } - - // evaluate lcm element wise - if (isCollection(a) || isCollection(b)) { - return collection.deepMap2(a, b, lcm); - } - - if (isBoolean(a)) { - return lcm(+a, b); - } - if (isBoolean(b)) { - return lcm(a, +b); - } - - // TODO: implement BigNumber support for lcm - - // downgrade bignumbers to numbers - if (a instanceof BigNumber) { - return lcm(toNumber(a), b); - } - if (b instanceof BigNumber) { - return lcm(a, toNumber(b)); - } - - throw new math.error.UnsupportedTypeError('lcm', a, b); - } - - if (arguments.length > 2) { - // multiple arguments. Evaluate them iteratively - for (var i = 1; i < arguments.length; i++) { - a = lcm(a, arguments[i]); - } - return a; - } - - // zero or one argument - throw new SyntaxError('Function lcm expects two or more arguments'); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],137:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the logarithm of a value - * - * log(x) - * log(x, base) - * - * base is optional. If not provided, the natural logarithm of x is calculated. - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @param {Number | Boolean | Complex} [base] - * @return {Number | Complex | Array | Matrix} res - */ - math.log = function log(x, base) { - if (arguments.length == 1) { - // calculate natural logarithm, log(x) - if (isNumber(x)) { - if (x >= 0) { - return Math.log(x); - } - else { - // negative value -> complex value computation - return log(new Complex(x, 0)); - } - } - - if (isComplex(x)) { - return new Complex ( - Math.log(Math.sqrt(x.re * x.re + x.im * x.im)), - Math.atan2(x.im, x.re) - ); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return log(util.number.toNumber(x)); - } - - if (isCollection(x)) { - return collection.deepMap(x, log); - } - - if (isBoolean(x)) { - return log(+x); - } - - throw new math.error.UnsupportedTypeError('log', x); - } - else if (arguments.length == 2) { - // calculate logarithm for a specified base, log(x, base) - return math.divide(log(x), log(base)); - } - else { - throw new math.error.ArgumentsError('log', arguments.length, 1, 2); - } - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],138:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the 10-base logarithm of a value - * - * log10(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.log10 = function log10(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('log10', arguments.length, 1); - } - - if (isNumber(x)) { - if (x >= 0) { - return Math.log(x) / Math.LN10; - } - else { - // negative value -> complex value computation - return log10(new Complex(x, 0)); - } - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return log10(util.number.toNumber(x)); - } - - if (isComplex(x)) { - return new Complex ( - Math.log(Math.sqrt(x.re * x.re + x.im * x.im)) / Math.LN10, - Math.atan2(x.im, x.re) / Math.LN10 - ); - } - - if (isCollection(x)) { - return collection.deepMap(x, log10); - } - - if (isBoolean(x)) { - return log10(+x); - } - - throw new math.error.UnsupportedTypeError('log10', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],139:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isCollection = collection.isCollection; - - /** - * Calculates the modulus, the remainder of an integer division. - * - * x % y - * mod(x, y) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Array | Matrix} y - * @return {Number | BigNumber | Array | Matrix} res - */ - math.mod = function mod(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('mod', arguments.length, 2); - } - - // see http://functions.wolfram.com/IntegerFunctions/Mod/ - - if (isNumber(x)) { - if (isNumber(y)) { - // number % number - return _mod(x, y); - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.mod(y); - } - - // downgrade to Number - return mod(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.mod(y) - } - - // downgrade to Number - return mod(x, toNumber(y)); - } - - // TODO: implement mod for complex values - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, mod); - } - - if (isBoolean(x)) { - return mod(+x, y); - } - if (isBoolean(y)) { - return mod(x, +y); - } - - throw new math.error.UnsupportedTypeError('mod', x, y); - }; - - /** - * Calculate the modulus of two numbers - * @param {Number} x - * @param {Number} y - * @returns {number} res - * @private - */ - function _mod(x, y) { - if (y > 0) { - if (x > 0) { - return x % y; - } - else if (x == 0) { - return 0; - } - else { // x < 0 - return x - y * Math.floor(x / y); - } - } - else if (y == 0) { - return x; - } - else { // y < 0 - // TODO: implement mod for a negative divisor - throw new Error('Cannot calculate mod for a negative divisor'); - } - } -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],140:[function(require,module,exports){ -module.exports = function(math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - array = util.array, - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isArray = Array.isArray, - isUnit = Unit.isUnit; - - /** - * Multiply two values. - * - * x * y - * multiply(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.multiply = function multiply(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('multiply', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - // number * number - return x * y; - } - else if (isComplex(y)) { - // number * complex - return _multiplyComplex (new Complex(x, 0), y); - } - else if (isUnit(y)) { - res = y.clone(); - res.value *= x; - return res; - } - } - - if (isComplex(x)) { - if (isNumber(y)) { - // complex * number - return _multiplyComplex (x, new Complex(y, 0)); - } - else if (isComplex(y)) { - // complex * complex - return _multiplyComplex (x, y); - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.times(y); - } - - // downgrade to Number - return multiply(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.times(y) - } - - // downgrade to Number - return multiply(x, toNumber(y)); - } - - if (isUnit(x)) { - if (isNumber(y)) { - res = x.clone(); - res.value *= y; - return res; - } - } - - if (isArray(x)) { - if (isArray(y)) { - // array * array - var sizeX = array.size(x); - var sizeY = array.size(y); - - if (sizeX.length == 1) { - if (sizeY.length == 1) { - // vector * vector - if (sizeX[0] != sizeY[0]) { - throw new RangeError('Dimensions mismatch in multiplication. ' + - 'Length of A must match length of B ' + - '(A is ' + sizeX[0] + - ', B is ' + sizeY[0] + - sizeX[0] + ' != ' + sizeY[0] + ')'); - } - - return _multiplyVectorVector(x, y); - } - else if (sizeY.length == 2) { - // vector * matrix - if (sizeX[0] != sizeY[0]) { - throw new RangeError('Dimensions mismatch in multiplication. ' + - 'Length of A must match rows of B ' + - '(A is ' + sizeX[0] + - ', B is ' + sizeY[0] + 'x' + sizeY[1] + ', ' + - sizeX[0] + ' != ' + sizeY[0] + ')'); - } - - return _multiplyVectorMatrix(x, y); - } - else { - throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + - '(B has ' + sizeY.length + ' dimensions)'); - } - } - else if (sizeX.length == 2) { - if (sizeY.length == 1) { - // matrix * vector - if (sizeX[1] != sizeY[0]) { - throw new RangeError('Dimensions mismatch in multiplication. ' + - 'Columns of A must match length of B ' + - '(A is ' + sizeX[0] + 'x' + sizeX[0] + - ', B is ' + sizeY[0] + ', ' + - sizeX[1] + ' != ' + sizeY[0] + ')'); - } - - return _multiplyMatrixVector(x, y); - } - else if (sizeY.length == 2) { - // matrix * matrix - if (sizeX[1] != sizeY[0]) { - throw new RangeError('Dimensions mismatch in multiplication. ' + - 'Columns of A must match rows of B ' + - '(A is ' + sizeX[0] + 'x' + sizeX[1] + - ', B is ' + sizeY[0] + 'x' + sizeY[1] + ', ' + - sizeX[1] + ' != ' + sizeY[0] + ')'); - } - - return _multiplyMatrixMatrix(x, y); - } - else { - throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + - '(B has ' + sizeY.length + ' dimensions)'); - } - } - else { - throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + - '(A has ' + sizeX.length + ' dimensions)'); - } - } - else if (y instanceof Matrix) { - // array * matrix - return new Matrix(multiply(x, y.valueOf())); - } - else { - // array * scalar - return collection.deepMap2(x, y, multiply); - } - } - - if (x instanceof Matrix) { - if (y instanceof Matrix) { - // matrix * matrix - return new Matrix(multiply(x.valueOf(), y.valueOf())); - } - else { - // matrix * array - // matrix * scalar - return new Matrix(multiply(x.valueOf(), y)); - } - } - - if (isArray(y)) { - // scalar * array - return collection.deepMap2(x, y, multiply); - } - else if (y instanceof Matrix) { - // scalar * matrix - return new Matrix(collection.deepMap2(x, y.valueOf(), multiply)); - } - - if (isBoolean(x)) { - return multiply(+x, y); - } - if (isBoolean(y)) { - return multiply(x, +y); - } - - throw new math.error.UnsupportedTypeError('multiply', x, y); - }; - - /** - * Multiply two 2-dimensional matrices. - * The size of the matrices is not validated. - * @param {Array} x A 2d matrix - * @param {Array} y A 2d matrix - * @return {Array} result - * @private - */ - function _multiplyMatrixMatrix(x, y) { - // TODO: performance of matrix multiplication can be improved - var res = [], - rows = x.length, - cols = y[0].length, - num = x[0].length; - - for (var r = 0; r < rows; r++) { - res[r] = []; - for (var c = 0; c < cols; c++) { - var result = null; - for (var n = 0; n < num; n++) { - var p = math.multiply(x[r][n], y[n][c]); - result = (result === null) ? p : math.add(result, p); - } - res[r][c] = result; - } - } - - return res; - } - - /** - * Multiply a vector with a 2-dimensional matrix - * The size of the matrices is not validated. - * @param {Array} x A vector - * @param {Array} y A 2d matrix - * @return {Array} result - * @private - */ - function _multiplyVectorMatrix(x, y) { - // TODO: performance of matrix multiplication can be improved - var res = [], - rows = y.length, - cols = y[0].length; - - for (var c = 0; c < cols; c++) { - var result = null; - for (var r = 0; r < rows; r++) { - var p = math.multiply(x[r], y[r][c]); - result = (r === 0) ? p : math.add(result, p); - } - res[c] = result; - } - - return res; - } - - /** - * Multiply a 2-dimensional matrix with a vector - * The size of the matrices is not validated. - * @param {Array} x A 2d matrix - * @param {Array} y A vector - * @return {Array} result - * @private - */ - function _multiplyMatrixVector(x, y) { - // TODO: performance of matrix multiplication can be improved - var res = [], - rows = x.length, - cols = x[0].length; - - for (var r = 0; r < rows; r++) { - var result = null; - for (var c = 0; c < cols; c++) { - var p = math.multiply(x[r][c], y[c]); - result = (c === 0) ? p : math.add(result, p); - } - res[r] = result; - } - - return res; - } - - /** - * Multiply two vectors, calculate the dot product - * The size of the matrices is not validated. - * @param {Array} x A vector - * @param {Array} y A vector - * @return {Number} dotProduct - * @private - */ - function _multiplyVectorVector(x, y) { - // TODO: performance of matrix multiplication can be improved - var len = x.length, - dot = null; - - if (len) { - dot = 0; - - for (var i = 0, ii = x.length; i < ii; i++) { - dot = math.add(dot, math.multiply(x[i], y[i])); - } - } - - return dot; - } - - /** - * Multiply two complex numbers. x * y or multiply(x, y) - * @param {Complex} x - * @param {Complex} y - * @return {Complex | Number} res - * @private - */ - function _multiplyComplex (x, y) { - // Note: we test whether x or y are pure real or pure complex, - // to prevent unnecessary NaN values. For example, Infinity*i should - // result in Infinity*i, and not in NaN+Infinity*i - - if (x.im == 0) { - // x is pure real - if (y.im == 0) { - // y is pure real - return new Complex(x.re * y.re, 0); - } - else if (y.re == 0) { - // y is pure complex - return new Complex( - 0, - x.re * y.im - ); - } - else { - // y has a real and complex part - return new Complex( - x.re * y.re, - x.re * y.im - ); - } - } - else if (x.re == 0) { - // x is pure complex - if (y.im == 0) { - // y is pure real - return new Complex( - 0, - x.im * y.re - ); - } - else if (y.re == 0) { - // y is pure complex - return new Complex(-x.im * y.im, 0); - } - else { - // y has a real and complex part - return new Complex( - -x.im * y.im, - x.im * y.re - ); - } - } - else { - // x has a real and complex part - if (y.im == 0) { - // y is pure real - return new Complex( - x.re * y.re, - x.im * y.re - ); - } - else if (y.re == 0) { - // y is pure complex - return new Complex( - -x.im * y.im, - x.re * y.im - ); - } - else { - // y has a real and complex part - return new Complex( - x.re * y.re - x.im * y.im, - x.re * y.im + x.im * y.re - ); - } - } - } -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],141:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - array = util.array, - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isArray = Array.isArray, - isInteger = util.number.isInteger, - isComplex = Complex.isComplex; - - /** - * Calculates the power of x to y - * - * x ^ y - * pow(x, y) - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex} y - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.pow = function pow(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('pow', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - if (isInteger(y) || x >= 0) { - // real value computation - return Math.pow(x, y); - } - else { - return powComplex(new Complex(x, 0), new Complex(y, 0)); - } - } - else if (isComplex(y)) { - return powComplex(new Complex(x, 0), y); - } - } - - if (isComplex(x)) { - if (isNumber(y)) { - return powComplex(x, new Complex(y, 0)); - } - else if (isComplex(y)) { - return powComplex(x, y); - } - } - - // TODO: pow for complex numbers and bignumbers - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.pow(y); - } - - // downgrade to Number - return pow(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.pow(y) - } - - // downgrade to Number - return pow(x, toNumber(y)); - } - - - if (isArray(x)) { - if (!isNumber(y) || !isInteger(y) || y < 0) { - throw new TypeError('For A^b, b must be a positive integer ' + - '(value is ' + y + ')'); - } - // verify that A is a 2 dimensional square matrix - var s = array.size(x); - if (s.length != 2) { - throw new Error('For A^b, A must be 2 dimensional ' + - '(A has ' + s.length + ' dimensions)'); - } - if (s[0] != s[1]) { - throw new Error('For A^b, A must be square ' + - '(size is ' + s[0] + 'x' + s[1] + ')'); - } - - if (y == 0) { - // return the identity matrix - return math.eye(s[0]); - } - else { - // value > 0 - var res = x; - for (var i = 1; i < y; i++) { - res = math.multiply(x, res); - } - return res; - } - } - else if (x instanceof Matrix) { - return new Matrix(pow(x.valueOf(), y)); - } - - if (isBoolean(x)) { - return pow(+x, y); - } - if (isBoolean(y)) { - return pow(x, +y); - } - - throw new math.error.UnsupportedTypeError('pow', x, y); - }; - - /** - * Calculates the power of x to y, x^y, for two complex numbers. - * @param {Complex} x - * @param {Complex} y - * @return {Complex} res - * @private - */ - function powComplex (x, y) { - // complex computation - // x^y = exp(log(x)*y) = exp((abs(x)+i*arg(x))*y) - var temp1 = math.log(x); - var temp2 = math.multiply(temp1, y); - return math.exp(temp2); - } -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],142:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Round a value towards the nearest integer - * - * round(x) - * round(x, n) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Array} [n] number of decimals (by default n=0) - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.round = function round(x, n) { - if (arguments.length != 1 && arguments.length != 2) { - throw new math.error.ArgumentsError('round', arguments.length, 1, 2); - } - - if (n == undefined) { - // round (x) - if (isNumber(x)) { - return Math.round(x); - } - - if (isComplex(x)) { - return new Complex ( - Math.round(x.re), - Math.round(x.im) - ); - } - - if (x instanceof BigNumber) { - return x.round(); - } - - if (isCollection(x)) { - return collection.deepMap(x, round); - } - - if (isBoolean(x)) { - return Math.round(x); - } - - throw new math.error.UnsupportedTypeError('round', x); - } - else { - // round (x, n) - if (n instanceof BigNumber) { - n = parseFloat(n.valueOf()); - } - - if (!isNumber(n) || !isInteger(n)) { - throw new TypeError('Number of decimals in function round must be an integer'); - } - if (n < 0 || n > 9) { - throw new Error ('Number of decimals in function round must be in te range of 0-9'); - } - - if (isNumber(x)) { - return roundNumber(x, n); - } - - if (isComplex(x)) { - return new Complex ( - roundNumber(x.re, n), - roundNumber(x.im, n) - ); - } - - if (x instanceof BigNumber) { - if (isNumber(n)) { - return x.round(n); - } - } - - if (isCollection(x) || isCollection(n)) { - return collection.deepMap2(x, n, round); - } - - if (isBoolean(x)) { - return round(+x, n); - } - if (isBoolean(n)) { - return round(x, +n); - } - - throw new math.error.UnsupportedTypeError('round', x, n); - } - }; - - /** - * round a number to the given number of decimals, or to zero if decimals is - * not provided - * @param {Number} value - * @param {Number} [decimals] number of decimals, between 0 and 15 (0 by default) - * @return {Number} roundedValue - */ - function roundNumber (value, decimals) { - if (decimals) { - var p = Math.pow(10, decimals); - return Math.round(value * p) / p; - } - else { - return Math.round(value); - } - } -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],143:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - number = util.number, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Compute the sign of a value. - * - * sign(x) - * - * The sign of a value x is 1 when x > 1, -1 when x < 0, and 0 when x == 0 - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.sign = function sign(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('sign', arguments.length, 1); - } - - if (isNumber(x)) { - return number.sign(x); - } - - if (isComplex(x)) { - var abs = Math.sqrt(x.re * x.re + x.im * x.im); - return new Complex(x.re / abs, x.im / abs); - } - - if (x instanceof BigNumber) { - return new BigNumber(x.cmp(0)); - } - - if (isCollection(x)) { - return collection.deepMap(x, sign); - } - - if (isBoolean(x)) { - return number.sign(x); - } - - throw new math.error.UnsupportedTypeError('sign', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],144:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value x is smaller y - * - * x < y - * smaller(x, y) - * - * For matrices, the function is evaluated element wise. - * In case of complex numbers, the absolute values of a and b are compared. - * - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.smaller = function smaller(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('smaller', arguments.length, 2); - } - - if (isNumber(x) && isNumber(y)) { - return x < y; - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.lt(y); - } - - // downgrade to Number - return smaller(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.lt(y) - } - - // downgrade to Number - return smaller(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value < y.value; - } - - if (isString(x) || isString(y)) { - return x < y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, smaller); - } - - if (isBoolean(x)) { - return smaller(+x, y); - } - if (isBoolean(y)) { - return smaller(x, +y); - } - - if (isComplex(x) || isComplex(y)) { - throw new TypeError('No ordering relation is defined for complex numbers'); - } - - throw new math.error.UnsupportedTypeError('smaller', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],145:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value a is smaller or equal to b - * - * a <= b - * smallereq(a, b) - * - * For matrices, the function is evaluated element wise. - * In case of complex numbers, the absolute values of a and b are compared. - * - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.smallereq = function smallereq(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('smallereq', arguments.length, 2); - } - - if (isNumber(x) && isNumber(y)) { - return x <= y; - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.lte(y); - } - - // downgrade to Number - return smallereq(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.lte(y) - } - - // downgrade to Number - return smallereq(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value <= y.value; - } - - if (isString(x) || isString(y)) { - return x <= y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, smallereq); - } - - if (isBoolean(x)) { - return smallereq(+x, y); - } - if (isBoolean(y)) { - return smallereq(x, +y); - } - - if (isComplex(x) || isComplex(y)) { - throw new TypeError('No ordering relation is defined for complex numbers'); - } - - throw new math.error.UnsupportedTypeError('smallereq', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],146:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the square root of a value - * - * sqrt(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.sqrt = function sqrt (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('sqrt', arguments.length, 1); - } - - if (isNumber(x)) { - if (x >= 0) { - return Math.sqrt(x); - } - else { - return sqrt(new Complex(x, 0)); - } - } - - if (isComplex(x)) { - var r = Math.sqrt(x.re * x.re + x.im * x.im); - if (x.im >= 0) { - return new Complex( - 0.5 * Math.sqrt(2.0 * (r + x.re)), - 0.5 * Math.sqrt(2.0 * (r - x.re)) - ); - } - else { - return new Complex( - 0.5 * Math.sqrt(2.0 * (r + x.re)), - -0.5 * Math.sqrt(2.0 * (r - x.re)) - ); - } - } - - if (x instanceof BigNumber) { - return x.sqrt(); - } - - if (isCollection(x)) { - return collection.deepMap(x, sqrt); - } - - if (isBoolean(x)) { - return sqrt(+x); - } - - throw new math.error.UnsupportedTypeError('sqrt', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],147:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Compute the square of a value - * - * x .* x - * square(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.square = function square(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('square', arguments.length, 1); - } - - if (isNumber(x)) { - return x * x; - } - - if (isComplex(x)) { - return math.multiply(x, x); - } - - if (x instanceof BigNumber) { - return x.times(x); - } - - if (isCollection(x)) { - return collection.deepMap(x, square); - } - - if (isBoolean(x)) { - return x * x; - } - - throw new math.error.UnsupportedTypeError('square', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],148:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isNumber = util.number.isNumber, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Subtract two values - * - * x - y - * subtract(x, y) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.subtract = function subtract(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('subtract', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - // number - number - return x - y; - } - else if (isComplex(y)) { - // number - complex - return new Complex ( - x - y.re, - - y.im - ); - } - } - else if (isComplex(x)) { - if (isNumber(y)) { - // complex - number - return new Complex ( - x.re - y, - x.im - ) - } - else if (isComplex(y)) { - // complex - complex - return new Complex ( - x.re - y.re, - x.im - y.im - ) - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return x.minus(y); - } - - // downgrade to Number - return subtract(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return x.minus(y) - } - - // downgrade to Number - return subtract(x, toNumber(y)); - } - - if (isUnit(x)) { - if (isUnit(y)) { - if (!x.equalBase(y)) { - throw new Error('Units do not match'); - } - - if (x.value == null) { - throw new Error('Unit on left hand side of operator - has an undefined value'); - } - - if (y.value == null) { - throw new Error('Unit on right hand side of operator - has an undefined value'); - } - - var res = x.clone(); - res.value -= y.value; - res.fixPrefix = false; - - return res; - } - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, subtract); - } - - if (isBoolean(x)) { - return subtract(+x, y); - } - if (isBoolean(y)) { - return subtract(x, +y); - } - - throw new math.error.UnsupportedTypeError('subtract', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],149:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Inverse the sign of a value. - * - * -x - * unary(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res - */ - math.unary = function unary(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('unary', arguments.length, 1); - } - - if (isNumber(x)) { - return -x; - } - - if (isComplex(x)) { - return new Complex( - -x.re, - -x.im - ); - } - - if (x instanceof BigNumber) { - return x.neg(); - } - - if (isUnit(x)) { - var res = x.clone(); - res.value = -x.value; - return res; - } - - if (isCollection(x)) { - return collection.deepMap(x, unary); - } - - if (isBoolean(x)) { - return -x; - } - - throw new math.error.UnsupportedTypeError('unary', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],150:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Check if value x unequals y, x != y - * In case of complex numbers, x.re must unequal y.re, or x.im must unequal y.im - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x - * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y - * @return {Boolean | Array | Matrix} res - */ - math.unequal = function unequal(x, y) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('unequal', arguments.length, 2); - } - - if (isNumber(x)) { - if (isNumber(y)) { - return x != y; - } - else if (isComplex(y)) { - return (x != y.re) || (y.im != 0); - } - } - - if (isComplex(x)) { - if (isNumber(y)) { - return (x.re != y) || (x.im != 0); - } - else if (isComplex(y)) { - return (x.re != y.re) || (x.im != y.im); - } - } - - if (x instanceof BigNumber) { - // try to convert to big number - if (isNumber(y)) { - y = toBigNumber(y); - } - else if (isBoolean(y)) { - y = new BigNumber(y ? 1 : 0); - } - - if (y instanceof BigNumber) { - return !x.eq(y); - } - - // downgrade to Number - return unequal(toNumber(x), y); - } - if (y instanceof BigNumber) { - // try to convert to big number - if (isNumber(x)) { - x = toBigNumber(x); - } - else if (isBoolean(x)) { - x = new BigNumber(x ? 1 : 0); - } - - if (x instanceof BigNumber) { - return !x.eq(y) - } - - // downgrade to Number - return unequal(x, toNumber(y)); - } - - if ((isUnit(x)) && (isUnit(y))) { - if (!x.equalBase(y)) { - throw new Error('Cannot compare units with different base'); - } - return x.value != y.value; - } - - if (isString(x) || isString(y)) { - return x != y; - } - - if (isCollection(x) || isCollection(y)) { - return collection.deepMap2(x, y, unequal); - } - - if (isBoolean(x)) { - return unequal(+x, y); - } - if (isBoolean(y)) { - return unequal(x, +y); - } - - throw new math.error.UnsupportedTypeError('unequal', x, y); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],151:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - - toNumber = util.number.toNumber, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isInteger = util.number.isInteger; - - /** - * Calculate the extended greatest common divisor for two values. - * - * xgcd(a, b) - * - * @param {Number | Boolean} a An integer number - * @param {Number | Boolean} b An integer number - * @return {Array} An array containing 3 integers [div, m, n] - * where div = gcd(a, b) and a*m + b*n = div - * - * @see http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm - */ - math.xgcd = function xgcd(a, b) { - if (arguments.length == 2) { - // two arguments - if (isNumber(a) && isNumber(b)) { - if (!isInteger(a) || !isInteger(b)) { - throw new Error('Parameters in function xgcd must be integer numbers'); - } - - return _xgcd(a, b); - } - - // TODO: implement BigNumber support for xgcd - - // downgrade bignumbers to numbers - if (a instanceof BigNumber) { - return xgcd(toNumber(a), b); - } - if (b instanceof BigNumber) { - return xgcd(a, toNumber(b)); - } - - if (isBoolean(a)) { - return xgcd(+a, b); - } - if (isBoolean(b)) { - return xgcd(a, +b); - } - - throw new math.error.UnsupportedTypeError('xgcd', a, b); - } - - // zero or one argument - throw new SyntaxError('Function xgcd expects two arguments'); - }; - - /** - * Calculate xgcd for two numbers - * @param {Number} a - * @param {Number} b - * @private - */ - function _xgcd(a, b) { - //* - // source: http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm - var t, // used to swap two variables - q, // quotient - r, // remainder - x = 0, lastx = 1, - y = 1, lasty = 0; - - while (b) { - q = Math.floor(a / b); - r = a % b; - - t = x; - x = lastx - q * x; - lastx = t; - - t = y; - y = lasty - q * y; - lasty = t; - - a = b; - b = r; - } - - if (a < 0) { - return [-a, a ? -lastx : 0, -lasty]; - } - else { - return [a, a ? lastx : 0, lasty]; - } - } -}; - -},{"../../util/index":218,"bignumber.js":223}],152:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isCollection = collection.isCollection, - isComplex = Complex.isComplex; - - /** - * Compute the argument of a complex value. - * If x = a + bi, the argument is computed as atan2(b, a). - * - * arg(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Complex | Array | Matrix | Boolean} x - * @return {Number | Array | Matrix} res - */ - math.arg = function arg(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('arg', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.atan2(0, x); - } - - if (isComplex(x)) { - return Math.atan2(x.im, x.re); - } - - if (isCollection(x)) { - return collection.deepMap(x, arg); - } - - if (isBoolean(x)) { - return arg(+x); - } - - if (x instanceof BigNumber) { - // downgrade to Number - // TODO: implement BigNumber support - return arg(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('arg', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],153:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - object = util.object, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isCollection =collection.isCollection, - isComplex = Complex.isComplex; - - /** - * Compute the complex conjugate of a complex value. - * If x = a+bi, the complex conjugate is a-bi. - * - * conj(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x - * @return {Number | BigNumber | Complex | Array | Matrix} res - */ - math.conj = function conj(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('conj', arguments.length, 1); - } - - if (isNumber(x)) { - return x; - } - - if (x instanceof BigNumber) { - return new BigNumber(x); - } - - if (isComplex(x)) { - return new Complex(x.re, -x.im); - } - - if (isCollection(x)) { - return collection.deepMap(x, conj); - } - - if (isBoolean(x)) { - return +x; - } - - // return a clone of the value for non-complex values - return object.clone(x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],154:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isCollection =collection.isCollection, - isComplex = Complex.isComplex; - - /** - * Get the imaginary part of a complex number. - * - * im(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x - * @return {Number | BigNumber | Array | Matrix} im - */ - math.im = function im(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('im', arguments.length, 1); - } - - if (isNumber(x)) { - return 0; - } - - if (x instanceof BigNumber) { - return new BigNumber(0); - } - - if (isComplex(x)) { - return x.im; - } - - if (isCollection(x)) { - return collection.deepMap(x, im); - } - - if (isBoolean(x)) { - return 0; - } - - // return 0 for all non-complex values - return 0; - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],155:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - object = util.object, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isCollection = collection.isCollection, - isComplex = Complex.isComplex; - - /** - * Get the real part of a complex number. - * - * re(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x - * @return {Number | BigNumber | Array | Matrix} re - */ - math.re = function re(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('re', arguments.length, 1); - } - - if (isNumber(x)) { - return x; - } - - if (x instanceof BigNumber) { - return new BigNumber(x); - } - - if (isComplex(x)) { - return x.re; - } - - if (isCollection(x)) { - return collection.deepMap(x, re); - } - - if (isBoolean(x)) { - return +x; - } - - // return a clone of the value itself for all non-complex values - return object.clone(x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],156:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection, - isNumber = util.number.isNumber, - isString = util.string.isString, - isBoolean = util['boolean'].isBoolean; - - // extend BigNumber with a function clone - if (typeof BigNumber.prototype.clone !== 'function') { - /** - * Clone a bignumber - * @return {BigNumber} clone - */ - BigNumber.prototype.clone = function clone () { - return new BigNumber(this); - }; - } - - /** - * Create a big number, which can store numbers with higher precision than - * a JavaScript Number. - * When value is a matrix, all elements will be converted to bignumber. - * - * @param {Number | String | Array | Matrix} [value] Value for the big number, - * 0 by default. - */ - math.bignumber = function bignumber(value) { - if (arguments.length > 1) { - throw new math.error.ArgumentsError('bignumber', arguments.length, 0, 1); - } - - if ((value instanceof BigNumber) || isNumber(value) || isString(value)) { - return new BigNumber(value); - } - - if (isBoolean(value)) { - return new BigNumber(+value); - } - - if (isCollection(value)) { - return collection.deepMap(value, bignumber); - } - - if (arguments.length == 0) { - return new BigNumber(0); - } - - throw new math.error.UnsupportedTypeError('bignumber', value); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],157:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection, - isNumber = util.number.isNumber, - isString = util.string.isString; - - /** - * Create a boolean or convert a string or number to a boolean. - * In case of a number, true is returned for non-zero numbers, and false in - * case of zero. - * Strings can be 'true' or 'false', or can contain a number. - * When value is a matrix, all elements will be converted to boolean. - * @param {String | Number | Boolean | Array | Matrix} value - * @return {Boolean | Array | Matrix} bool - */ - math['boolean'] = function bool (value) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('boolean', arguments.length, 0, 1); - } - - if (value === 'true' || value === true) { - return true; - } - - if (value === 'false' || value === false) { - return false; - } - - if (value instanceof Boolean) { - return value ? true : false; - } - - if (isNumber(value)) { - return (value !== 0); - } - - if (value instanceof BigNumber) { - return !value.isZero(); - } - - if (isString(value)) { - // try case insensitive - var lcase = value.toLowerCase(); - if (lcase === 'true') { - return true; - } - else if (lcase === 'false') { - return false; - } - - // test whether value is a valid number - var num = Number(value); - if (value != '' && !isNaN(num)) { - return (num !== 0); - } - } - - if (isCollection(value)) { - return collection.deepMap(value, bool); - } - - throw new SyntaxError(value.toString() + ' is no valid boolean'); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],158:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection, - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - isString = util.string.isString, - isComplex = Complex.isComplex; - - /** - * Create a complex value or convert a value to a complex value. - * - * The method accepts the following arguments: - * complex() creates a complex value with zero - * as real and imaginary part. - * complex(re : number, im : string) creates a complex value with provided - * values for real and imaginary part. - * complex(re : number) creates a complex value with provided - * real value and zero imaginary part. - * complex(complex : Complex) clones the provided complex value. - * complex(arg : string) parses a string into a complex value. - * complex(array : Array) converts the elements of the array - * or matrix element wise into a - * complex value. - * - * Example usage: - * var a = math.complex(3, -4); // 3 - 4i - * a.re = 5; // a = 5 - 4i - * var i = a.im; // -4; - * var b = math.complex('2 + 6i'); // 2 + 6i - * var c = math.complex(); // 0 + 0i - * var d = math.add(a, b); // 5 + 2i - * - * @param {* | Array | Matrix} [args] - * @return {Complex | Array | Matrix} value - */ - math.complex = function complex(args) { - switch (arguments.length) { - case 0: - // no parameters. Set re and im zero - return new Complex(0, 0); - break; - - case 1: - // parse string into a complex number - var arg = arguments[0]; - - if (isNumber(arg)) { - return new Complex(arg, 0); - } - - if (arg instanceof BigNumber) { - // convert to Number - return new Complex(toNumber(arg), 0); - } - - if (isComplex(arg)) { - // create a clone - return arg.clone(); - } - - if (isString(arg)) { - var c = Complex.parse(arg); - if (c) { - return c; - } - else { - throw new SyntaxError('String "' + arg + '" is no valid complex number'); - } - } - - if (isCollection(arg)) { - return collection.deepMap(arg, complex); - } - - throw new TypeError( - 'Two numbers or a single string expected in function complex'); - break; - - case 2: - // re and im provided - var re = arguments[0], - im = arguments[1]; - - // convert re to number - if (re instanceof BigNumber) { - re = toNumber(re); - } - - // convert im to number - if (im instanceof BigNumber) { - im = toNumber(im); - } - - if (isNumber(re) && isNumber(im)) { - return new Complex(re, im); - } - else { - throw new TypeError( - 'Two numbers or a single string expected in function complex'); - } - - break; - - default: - throw new math.error.ArgumentsError('complex', arguments.length, 0, 2); - } - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],159:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Index = require('../../type/Index'), - - toNumber = util.number.toNumber; - - /** - * Create an index. An Index can store ranges having start, step, and end - * for multiple dimensions. - * Matrix.get, Matrix.set, and math.subset accept an Index as input. - * - * Usage: - * var index = math.index(range1, range2, ...); - * - * Where each range can be any of: - * An array [start, end] - * An array [start, end, step] - * A number - * null, this will create select the whole dimension - * - * The parameters start, end, and step must be integer numbers. - * - * @param {...*} ranges - */ - math.index = function matrix(ranges) { - var i = new Index(); - - // downgrade BigNumber to Number - var args = Array.prototype.slice.apply(arguments).map(function (arg) { - if (arg instanceof BigNumber) { - return toNumber(arg); - } - else if (Array.isArray(arg)) { - return arg.map(function (elem) { - return (elem instanceof BigNumber) ? toNumber (elem) : elem; - }); - } - else { - return arg; - } - }); - - Index.apply(i, args); - return i; - }; -}; - -},{"../../type/Index":210,"../../util/index":218,"bignumber.js":223}],160:[function(require,module,exports){ -module.exports = function (math) { - var Matrix = require('../../type/Matrix'); - - /** - * Create a matrix. The function creates a new math.type.Matrix object. - * - * The method accepts the following arguments: - * matrix() creates an empty matrix - * matrix(data) creates a matrix with initial data. - * - * Example usage: - * var m = matrix([[1, 2], [3, 4]); - * m.size(); // [2, 2] - * m.resize([3, 2], 5); - * m.valueOf(); // [[1, 2], [3, 4], [5, 5]] - * m.get([1, 0]) // 3 - * - * @param {Array | Matrix} [data] A multi dimensional array - * @return {Matrix} matrix - */ - math.matrix = function matrix(data) { - if (arguments.length > 1) { - throw new math.error.ArgumentsError('matrix', arguments.length, 0, 1); - } - - return new Matrix(data); - }; -}; - -},{"../../type/Matrix":211}],161:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection, - toNumber = util.number.toNumber; - - /** - * Create a number or convert a string to a number. - * When value is a matrix, all elements will be converted to number. - * @param {String | Number | Boolean | Array | Matrix} [value] - * @return {Number | Array | Matrix} num - */ - math.number = function number (value) { - switch (arguments.length) { - case 0: - return 0; - - case 1: - if (isCollection(value)) { - return collection.deepMap(value, number); - } - - if (value instanceof BigNumber) { - return toNumber(value); - } - - var num = Number(value); - if (isNaN(num)) { - num = Number(value.valueOf()); - } - if (isNaN(num)) { - throw new SyntaxError(value.toString() + ' is no valid number'); - } - return num; - default: - throw new math.error.ArgumentsError('number', arguments.length, 0, 1); - } - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],162:[function(require,module,exports){ -module.exports = function (math) { - var Parser = require('../../expression/Parser'); - - /** - * Create a parser. The function creates a new math.expression.Parser object. - * - * parser() - * - * Example usage: - * var parser = new math.parser(); - * - * // evaluate expressions - * var a = parser.eval('sqrt(3^2 + 4^2)'); // 5 - * var b = parser.eval('sqrt(-4)'); // 2i - * var c = parser.eval('2 inch in cm'); // 5.08 cm - * var d = parser.eval('cos(45 deg)'); // 0.7071067811865476 - * - * // define variables and functions - * parser.eval('x = 7 / 2'); // 3.5 - * parser.eval('x + 3'); // 6.5 - * parser.eval('function f(x, y) = x^y'); // f(x, y) - * parser.eval('f(2, 3)'); // 8 - * - * // get and set variables and functions - * var x = parser.get('x'); // 7 - * var f = parser.get('f'); // function - * var g = f(3, 2); // 9 - * parser.set('h', 500); - * var i = parser.eval('h / 2'); // 250 - * parser.set('hello', function (name) { - * return 'hello, ' + name + '!'; - * }); - * parser.eval('hello("user")'); // "hello, user!" - * - * // clear defined functions and variables - * parser.clear(); - * - * @return {Parser} Parser - */ - math.parser = function parser() { - return new Parser(math); - }; -}; - -},{"../../expression/Parser":4}],163:[function(require,module,exports){ -module.exports = function (math) { - /** - * Wrap any value in a Selector, allowing to perform chained operations on - * the value. - * - * All methods available in the math.js library can be called upon the selector, - * and then will be evaluated with the value itself as first argument. - * The selector can be closed by executing selector.done(), which will return - * the final value. - * - * Example usage: - * math.select(3) - * .add(4) - * .subtract(2) - * .done(); // 5 - * math.select( [[1, 2], [3, 4]] ) - * .set([1, 1], 8) - * .multiply(3) - * .done(); // [[24, 6], [9, 12]] - * - * The Selector has a number of special functions: - * - done() Finalize the chained operation and return the selectors value. - * - valueOf() The same as done() - * - toString() Executes math.format() onto the selectors value, returning - * a string representation of the value. - * - get(...) Get a subselection of the selectors value. Only applicable when - * the value has a method get, for example when value is a Matrix - * or Array. - * - set(...) Replace a subselection of the selectors value. Only applicable - * when the value has a method get, for example when value is a - * Matrix or Array. - * - * @param {*} value - * @return {math.chaining.Selector} selector - */ - math.select = function select(value) { - // TODO: check number of arguments - return new math.chaining.Selector(value); - }; -}; - -},{}],164:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - collection = require('../../type/collection'), - - number = util.number, - isNumber = util.number.isNumber, - isCollection = collection.isCollection; - - /** - * Create a string or convert any object into a string. - * Elements of Arrays and Matrices are processed element wise - * @param {* | Array | Matrix} [value] - * @return {String | Array | Matrix} str - */ - math.string = function string (value) { - switch (arguments.length) { - case 0: - return ''; - - case 1: - if (isNumber(value)) { - return number.format(value); - } - - if (isCollection(value)) { - return collection.deepMap(value, string); - } - - if (value === null) { - return 'null'; - } - - return value.toString(); - - default: - throw new math.error.ArgumentsError('string', arguments.length, 0, 1); - } - }; -}; - -},{"../../type/collection":214,"../../util/index":218}],165:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection, - toNumber = util.number.toNumber, - isString = util.string.isString; - - /** - * Create a unit. Depending on the passed arguments, the function - * will create and return a new math.type.Unit object. - * When a matrix is provided, all elements will be converted to units. - * - * The method accepts the following arguments: - * unit(unit : string) - * unit(value : number, unit : string) - * - * Example usage: - * var a = math.unit(5, 'cm'); // 50 mm - * var b = math.unit('23 kg'); // 23 kg - * var c = math.in(a, math.unit('m'); // 0.05 m - * - * @param {* | Array | Matrix} args - * @return {Unit | Array | Matrix} value - */ - math.unit = function unit(args) { - switch(arguments.length) { - case 1: - // parse a string - var arg = arguments[0]; - - if (arg instanceof Unit) { - // create a clone of the unit - return arg.clone(); - } - - if (isString(arg)) { - if (Unit.isPlainUnit(arg)) { - return new Unit(null, arg); // a pure unit - } - - var u = Unit.parse(arg); // a unit with value, like '5cm' - if (u) { - return u; - } - - throw new SyntaxError('String "' + arg + '" is no valid unit'); - } - - if (isCollection(args)) { - return collection.deepMap(args, unit); - } - - throw new TypeError('A string or a number and string expected in function unit'); - break; - - case 2: - // a number and a unit - - if (arguments[0] instanceof BigNumber) { - // convert value to number - return new Unit(toNumber(arguments[0]), arguments[1]); - } - else { - return new Unit(arguments[0], arguments[1]); - } - break; - - default: - throw new math.error.ArgumentsError('unit', arguments.length, 1, 2); - } - }; -}; - -},{"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],166:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - collection = require('../../type/collection'), - - isString = util.string.isString, - isCollection = collection.isCollection; - - /** - * Evaluate an expression. - * - * Syntax: - * - * math.eval(expr) - * math.eval(expr, scope) - * math.eval([expr1, expr2, expr3, ...]) - * math.eval([expr1, expr2, expr3, ...], scope) - * - * Example: - * - * math.eval('(2+3)/4'); // 1.25 - * math.eval('sqrt(3^2 + 4^2)'); // 5 - * math.eval('sqrt(-4)'); // 2i - * math.eval(['a=3', 'b=4', 'a*b']);, // [3, 4, 12] - * - * var scope = {a:3, b:4}; - * math.eval('a * b', scope); // 12 - * - * @param {String | String[] | Matrix} expr - * @param {Object} [scope] - * @return {*} res - * @throws {Error} - */ - math.eval = function _eval (expr, scope) { - if (arguments.length != 1 && arguments.length != 2) { - throw new math.error.ArgumentsError('eval', arguments.length, 1, 2); - } - - // instantiate a scope - scope = scope || {}; - - if (isString(expr)) { - // evaluate a single expression - return math.parse(expr) - .compile(math) - .eval(scope); - } - else if (isCollection(expr)) { - // evaluate an array or matrix with expressions - return collection.deepMap(expr, function (elem) { - return math.parse(elem) - .compile(math).eval(scope); - }); - } - else { - // oops - throw new TypeError('String or matrix expected'); - } - }; -}; - -},{"../../type/collection":214,"../../util/index":218}],167:[function(require,module,exports){ -module.exports = function (math) { - var Help = require('../../type/Help'); - - /** - * Retrieve help on a function or data type. - * Help files are retrieved from the documentation in math.expression.docs. - * @param {function | string | Object} search - * @return {Help} help - */ - math.help = function help(search) { - if (arguments.length != 1) { - throw new SyntaxError('Wrong number of arguments in function help ' + - '(' + arguments.length + ' provided, 1 expected)'); - } - - var text = null; - if ((search instanceof String) || (typeof(search) === 'string')) { - text = search; - } - else { - var prop; - for (prop in math) { - // search in functions and constants - if (math.hasOwnProperty(prop)) { - if (search === math[prop]) { - text = prop; - break; - } - } - } - - if (!text) { - // search data type - for (prop in math.type) { - if (math.type.hasOwnProperty(prop)) { - if (search === math.type[prop]) { - text = prop; - break; - } - } - } - } - } - - if (!text) { - throw new Error('Could not find search term "' + search + '"'); - } - else { - var doc = math.expression.docs[text]; - if (!doc) { - throw new Error('No documentation found on "' + text + '"'); - } - return new Help(math, doc); - } - }; -}; - -},{"../../type/Help":209}],168:[function(require,module,exports){ -module.exports = function (math, settings) { - var _parse = require('../../expression/parse'); - - /** - * Parse an expression. - * Returns a node tree which can be compiled and evaluated. - * - * Syntax: - * - * math.parse(expr) - * math.parse([expr1, expr2, expr3, ...]) - * - * Example: - * - * var node = math.parse('sqrt(3^2 + 4^2)'); - * node.compile(math).eval(); // 5 - * - * var scope = {a: 3, b: 4} - * var node = math.parse('a * b'); // 12 - * var code = node.compile(math); - * code.eval(scope); // 12 - * scope.a = 5; - * code.eval(scope); // 20 - * - * var nodes = math.parse(['a = 3', 'b = 4', 'a * b']); - * nodes[2].compile(math).eval(); // 12 - * - * @param {String | String[] | Matrix} expr - * @return {Node | Node[]} node - * @throws {Error} - */ - math.parse = function parse (expr) { - return _parse.apply(_parse, arguments); - } - -}; - -},{"../../expression/parse":120}],169:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - object = util.object, - array = util.array, - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - isCollection = collection.isCollection; - - /** - * Concatenate two or more matrices - * Usage: - * math.concat(A, B, C, ...) - * math.concat(A, B, C, ..., dim) - * - * Where the optional dim is the zero-based number of the dimension to be - * concatenated. - * - * @param {... Array | Matrix} args - * @return {Array | Matrix} res - */ - math.concat = function concat (args) { - var i, - len = arguments.length, - dim = -1, // zero-based dimension - prevDim, - asMatrix = false, - matrices = []; // contains multi dimensional arrays - - for (i = 0; i < len; i++) { - var arg = arguments[i]; - - // test whether we need to return a Matrix (if not we return an Array) - if (arg instanceof Matrix) { - asMatrix = true; - } - - if ((i == len - 1) && isNumber(arg)) { - // last argument contains the dimension on which to concatenate - prevDim = dim; - dim = arg; - - if (!isInteger(dim) || dim < 0) { - throw new TypeError('Dimension number must be a positive integer ' + - '(dim = ' + dim + ')'); - } - - if (i > 0 && dim > prevDim) { - throw new RangeError('Dimension out of range ' + - '(' + dim + ' > ' + prevDim + ')'); - } - } - else if (isCollection(arg)) { - // this is a matrix or array - var matrix = object.clone(arg).valueOf(); - var size = array.size(arg.valueOf()); - matrices[i] = matrix; - prevDim = dim; - dim = size.length - 1; - - // verify whether each of the matrices has the same number of dimensions - if (i > 0 && dim != prevDim) { - throw new RangeError('Dimension mismatch ' + - '(' + prevDim + ' != ' + dim + ')'); - } - } - else { - throw new math.error.UnsupportedTypeError('concat', arg); - } - } - - if (matrices.length == 0) { - throw new SyntaxError('At least one matrix expected'); - } - - var res = matrices.shift(); - while (matrices.length) { - res = _concat(res, matrices.shift(), dim, 0); - } - - return asMatrix ? new Matrix(res) : res; - }; - - /** - * Recursively concatenate two matrices. - * The contents of the matrices is not cloned. - * @param {Array} a Multi dimensional array - * @param {Array} b Multi dimensional array - * @param {Number} concatDim The dimension on which to concatenate (zero-based) - * @param {Number} dim The current dim (zero-based) - * @return {Array} c The concatenated matrix - * @private - */ - function _concat(a, b, concatDim, dim) { - if (dim < concatDim) { - // recurse into next dimension - if (a.length != b.length) { - throw new Error('Dimensions mismatch (' + a.length + ' != ' + b.length + ')'); - } - - var c = []; - for (var i = 0; i < a.length; i++) { - c[i] = _concat(a[i], b[i], concatDim, dim + 1); - } - return c; - } - else { - // concatenate this dimension - return a.concat(b); - } - } -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],170:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - - object = util.object, - array = util.array, - string = util.string; - - /** - * @constructor det - * Calculate the determinant of a matrix - * - * det(x) - * - * @param {Array | Matrix} x - * @return {Number} determinant - */ - math.det = function det (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('det', arguments.length, 1); - } - - var size = array.size(x.valueOf()); - switch (size.length) { - case 0: - // scalar - return object.clone(x); - break; - - case 1: - // vector - if (size[0] == 1) { - return object.clone(x.valueOf()[0]); - } - else { - throw new RangeError('Matrix must be square ' + - '(size: ' + string.format(size) + ')'); - } - break; - - case 2: - // two dimensional array - var rows = size[0]; - var cols = size[1]; - if (rows == cols) { - return _det(x.valueOf(), rows, cols); - } - else { - throw new RangeError('Matrix must be square ' + - '(size: ' + string.format(size) + ')'); - } - break; - - default: - // multi dimensional array - throw new RangeError('Matrix must be two dimensional ' + - '(size: ' + string.format(size) + ')'); - } - }; - - /** - * Calculate the determinant of a matrix - * @param {Array[]} matrix A square, two dimensional matrix - * @param {Number} rows Number of rows of the matrix (zero-based) - * @param {Number} cols Number of columns of the matrix (zero-based) - * @returns {Number} det - * @private - */ - function _det (matrix, rows, cols) { - if (rows == 1) { - // this is a 1 x 1 matrix - return matrix[0][0]; - } - else if (rows == 2) { - // this is a 2 x 2 matrix - // the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12 - return math.subtract( - math.multiply(matrix[0][0], matrix[1][1]), - math.multiply(matrix[1][0], matrix[0][1]) - ); - } - else { - // this is an n x n matrix - var d = 1; - var lead = 0; - for (var r = 0; r < rows; r++) { - if (lead >= cols) { - break; - } - var i = r; - // Find the pivot element. - while (matrix[i][lead] == 0) { - i++; - if (i == rows) { - i = r; - lead++; - if (lead == cols) { - // We found the last pivot. - if (object.deepEqual(matrix, eye(rows).valueOf())) { - return math.round(d, 6); - } else { - return 0; - } - } - } - } - if (i != r) { - // Swap rows i and r, which negates the determinant. - for (var a = 0; a < cols; a++) { - var temp = matrix[i][a]; - matrix[i][a] = matrix[r][a]; - matrix[r][a] = temp; - } - d *= -1; - } - // Scale row r and the determinant simultaneously. - var div = matrix[r][lead]; - for (var a = 0; a < cols; a++) { - matrix[r][a] = matrix[r][a] / div; - } - d *= div; - // Back-substitute upwards. - for (var j = 0; j < rows; j++) { - if (j != r) { - // Taking linear combinations does not change the det. - var c = matrix[j][lead]; - for (var a = 0; a < cols; a++) { - matrix[j][a] = matrix[j][a] - matrix[r][a] * c; - } - } - } - lead++; // Now looking for a pivot further right. - } - // If reduction did not result in the identity, the matrix is singular. - if (object.deepEqual(matrix, math.eye(rows).valueOf())) { - return math.round(d, 6); - } else { - return 0; - } - } - } -}; - -},{"../../type/Matrix":211,"../../util/index":218}],171:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - object = util.object, - isArray = util.array.isArray, - isNumber = util.number.isNumber, - isInteger = util.number.isInteger; - - /** - * Create a diagonal matrix or retrieve the diagonal of a matrix - * - * diag(v) - * diag(v, k) - * diag(X) - * diag(X, k) - * - * TODO: more documentation on diag - * - * @param {Matrix | Array} x - * @param {Number} [k] - * @return {Matrix | Array} matrix - */ - math.diag = function diag (x, k) { - var data, vector, i, iMax; - - if (arguments.length != 1 && arguments.length != 2) { - throw new math.error.ArgumentsError('diag', arguments.length, 1, 2); - } - - if (k) { - if (!isNumber(k) || !isInteger(k)) { - throw new TypeError ('Second parameter in function diag must be an integer'); - } - } - else { - k = 0; - } - var kSuper = k > 0 ? k : 0; - var kSub = k < 0 ? -k : 0; - - // check type of input - if (x instanceof Matrix) { - // nice, nothing to do - } - else if (isArray(x)) { - // convert to matrix - x = new Matrix(x); - } - else { - throw new TypeError ('First parameter in function diag must be a Matrix or Array'); - } - - var s = x.size(); - switch (s.length) { - case 1: - // x is a vector. create diagonal matrix - vector = x.valueOf(); - var matrix = new Matrix(); - var defaultValue = 0; - matrix.resize([vector.length + kSub, vector.length + kSuper], defaultValue); - data = matrix.valueOf(); - iMax = vector.length; - for (i = 0; i < iMax; i++) { - data[i + kSub][i + kSuper] = object.clone(vector[i]); - } - return (settings.matrix === 'array') ? matrix.valueOf() : matrix; - break; - - case 2: - // x is a matrix get diagonal from matrix - vector = []; - data = x.valueOf(); - iMax = Math.min(s[0] - kSub, s[1] - kSuper); - for (i = 0; i < iMax; i++) { - vector[i] = object.clone(data[i + kSub][i + kSuper]); - } - return (settings.matrix === 'array') ? vector : new Matrix(vector); - break; - - default: - throw new RangeError('Matrix for function diag must be 2 dimensional'); - } - }; -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],172:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - toNumber = util.number.toNumber, - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - isArray = Array.isArray; - - /** - * Create a 2-dimensional identity matrix with size m x n or n x n - * - * eye(n) - * eye(m, n) - * eye([m, n]) - * - * TODO: more documentation on eye - * - * @param {...Number | Matrix | Array} size - * @return {Matrix | Array | Number} matrix - */ - math.eye = function eye (size) { - var args = collection.argsToArray(arguments), - asMatrix = (size instanceof Matrix) ? true : - (isArray(size) ? false : (settings.matrix === 'matrix')); - - - if (args.length == 0) { - // return an empty array - return asMatrix ? new Matrix() : []; - } - else if (args.length == 1) { - // change to a 2-dimensional square - args[1] = args[0]; - } - else if (args.length > 2) { - // error in case of an n-dimensional size - throw new math.error.ArgumentsError('eye', args.length, 0, 2); - } - - var asBigNumber = args[0] instanceof BigNumber, - rows = args[0], - cols = args[1]; - - if (rows instanceof BigNumber) { - rows = toNumber(rows); - } - if (cols instanceof BigNumber) { - cols = toNumber(cols); - } - - if (!isNumber(rows) || !isInteger(rows) || rows < 1) { - throw new Error('Parameters in function eye must be positive integers'); - } - if (cols) { - if (!isNumber(cols) || !isInteger(cols) || cols < 1) { - throw new Error('Parameters in function eye must be positive integers'); - } - } - - // create and args the matrix - var matrix = new Matrix(); - var one = asBigNumber ? new BigNumber(1) : 1; - var defaultValue = asBigNumber ? new BigNumber(0) : 0; - matrix.resize(args.map(toNumber), defaultValue); - - // fill in ones on the diagonal - var minimum = math.min(args); - var data = matrix.valueOf(); - for (var d = 0; d < minimum; d++) { - data[d][d] = one; - } - - return asMatrix ? matrix : matrix.valueOf(); - }; -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],173:[function(require,module,exports){ -module.exports = function (math) { - var string = require('../../util/string'), - - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'); - - /** - * Calculate the inverse of a matrix - * - * inv(x) - * - * TODO: more documentation on inv - * - * @param {Number | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} inv - */ - math.inv = function inv (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('inv', arguments.length, 1); - } - var size = math.size(x).valueOf(); - switch (size.length) { - case 0: - // scalar - return math.divide(1, x); - break; - - case 1: - // vector - if (size[0] == 1) { - if (x instanceof Matrix) { - return new Matrix([ - math.divide(1, x.valueOf()[0]) - ]); - } - else { - return [ - math.divide(1, x[0]) - ]; - } - } - else { - throw new RangeError('Matrix must be square ' + - '(size: ' + string.format(size) + ')'); - } - break; - - case 2: - // two dimensional array - var rows = size[0]; - var cols = size[1]; - if (rows == cols) { - if (x instanceof Matrix) { - return new Matrix( - _inv(x.valueOf(), rows, cols) - ); - } - else { - // return an Array - return _inv(x, rows, cols); - } - } - else { - throw new RangeError('Matrix must be square ' + - '(size: ' + string.format(size) + ')'); - } - break; - - default: - // multi dimensional array - throw new RangeError('Matrix must be two dimensional ' + - '(size: ' + string.format(size) + ')'); - } - }; - - /** - * Calculate the inverse of a square matrix - * @param {Array[]} matrix A square matrix - * @param {Number} rows Number of rows - * @param {Number} cols Number of columns, must equal rows - * @return {Array[]} inv Inverse matrix - * @private - */ - function _inv (matrix, rows, cols){ - var r, s, f, value, temp; - - if (rows == 1) { - // this is a 1 x 1 matrix - value = matrix[0][0]; - if (value == 0) { - throw Error('Cannot calculate inverse, determinant is zero'); - } - return [[ - math.divide(1, value) - ]]; - } - else if (rows == 2) { - // this is a 2 x 2 matrix - var d = math.det(matrix); - if (d == 0) { - throw Error('Cannot calculate inverse, determinant is zero'); - } - return [ - [ - math.divide(matrix[1][1], d), - math.divide(math.unary(matrix[0][1]), d) - ], - [ - math.divide(math.unary(matrix[1][0]), d), - math.divide(matrix[0][0], d) - ] - ]; - } - else { - // this is a matrix of 3 x 3 or larger - // calculate inverse using gauss-jordan elimination - // http://en.wikipedia.org/wiki/Gaussian_elimination - // http://mathworld.wolfram.com/MatrixInverse.html - // http://math.uww.edu/~mcfarlat/inverse.htm - - // make a copy of the matrix (only the arrays, not of the elements) - var A = matrix.concat(); - for (r = 0; r < rows; r++) { - A[r] = A[r].concat(); - } - - // create an identity matrix which in the end will contain the - // matrix inverse - var B = math.eye(rows).valueOf(); - - // loop over all columns, and perform row reductions - for (var c = 0; c < cols; c++) { - // element Acc should be non zero. if not, swap content - // with one of the lower rows - r = c; - while (r < rows && A[r][c] == 0) { - r++; - } - if (r == rows || A[r][c] == 0) { - throw Error('Cannot calculate inverse, determinant is zero'); - } - if (r != c) { - temp = A[c]; A[c] = A[r]; A[r] = temp; - temp = B[c]; B[c] = B[r]; B[r] = temp; - } - - // eliminate non-zero values on the other rows at column c - var Ac = A[c], - Bc = B[c]; - for (r = 0; r < rows; r++) { - var Ar = A[r], - Br = B[r]; - if(r != c) { - // eliminate value at column c and row r - if (Ar[c] != 0) { - f = math.divide(math.unary(Ar[c]), Ac[c]); - - // add (f * row c) to row r to eliminate the value - // at column c - for (s = c; s < cols; s++) { - Ar[s] = math.add(Ar[s], math.multiply(f, Ac[s])); - } - for (s = 0; s < cols; s++) { - Br[s] = math.add(Br[s], math.multiply(f, Bc[s])); - } - } - } - else { - // normalize value at Acc to 1, - // divide each value on row r with the value at Acc - f = Ac[c]; - for (s = c; s < cols; s++) { - Ar[s] = math.divide(Ar[s], f); - } - for (s = 0; s < cols; s++) { - Br[s] = math.divide(Br[s], f); - } - } - } - } - return B; - } - } -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/string":221}],174:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - array = util.array, - - toNumber = util.number.toNumber, - isArray = Array.isArray; - - /** - * Create a matrix filled with ones - * - * ones(m) - * ones(m, n) - * ones([m, n]) - * ones([m, n, p, ...]) - * - * @param {...Number | Array} size - * @return {Array | Matrix | Number} matrix - */ - math.ones = function ones (size) { - var args = collection.argsToArray(arguments); - var asMatrix = (size instanceof Matrix) ? true : - (isArray(size) ? false : (settings.matrix === 'matrix')); - - if (args.length == 0) { - // output an empty matrix - return asMatrix ? new Matrix() : []; - } - else { - // output an array or matrix - var res = []; - var defaultValue = (args[0] instanceof BigNumber) ? new BigNumber(1) : 1; - res = array.resize(res, args.map(toNumber), defaultValue); - - return asMatrix ? new Matrix(res) : res; - } - }; -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],175:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isNumber = util.number.isNumber, - toNumber = util.number.toNumber, - toBigNumber = util.number.toBigNumber; - - /** - * Create an array from a range. - * By default, the range end is excluded. This can be customized by providing - * an extra parameter `includeEnd`. - * - * The method accepts the following arguments - * range(str [, includeEnd]) Create a range from a string, - * where the string contains the - * start, optional step, and end, - * separated by a colon. - * range(start, end [, includeEnd]) Create a range with start and - * end and a step size of 1. - * range(start, end, step [, includeEnd]) Create a range with start, step, - * and end. - * - * Where: - * {String} str - * {Number | BigNumber} start Start of the range - * {Number | BigNumber} end End of the range, excluded by default, - * included when parameter includeEnd=true - * {Number | BigNumber} step=1 Step size. - * {boolean} includeEnd=false Option to specify whether to include - * the end or not. - * - * Example usage: - * math.range(2, 6); // [2,3,4,5] - * math.range(2, -3, -1); // [2,1,0,-1,-2] - * math.range('2:1:6'); // [2,3,4,5] - * math.range(2, 6, true); // [2,3,4,5,6] - * - * @param {...*} args - * @return {Array | Matrix} range - */ - math.range = function range(args) { - var params = Array.prototype.slice.call(arguments), - start, - end, - step, - includeEnd = false; - - // read the includeEnd parameter - if (isBoolean(params[params.length - 1])) { - includeEnd = params.pop() ? true : false; - } - - switch (params.length) { - case 1: - // range(str) - // parse string into a range - if (isString(params[0])) { - var r = _parse(params[0]); - if (!r){ - throw new SyntaxError('String "' + r + '" is no valid range'); - } - - start = r.start; - end = r.end; - step = r.step; - } - else { - throw new TypeError( - 'Two or three numbers or a single string expected in function range'); - } - break; - - case 2: - // range(str, end) - // range(start, end) - start = params[0]; - end = params[1]; - step = 1; - break; - - case 3: - // range(start, end, step) - start = params[0]; - end = params[1]; - step = params[2]; - break; - - default: - throw new math.error.ArgumentsError('range', arguments.length, 2, 4); - } - - // verify type of parameters - if (!isNumber(start) && !(start instanceof BigNumber)) { - throw new TypeError('Parameter start must be a number'); - } - if (!isNumber(end) && !(end instanceof BigNumber)) { - throw new TypeError('Parameter end must be a number'); - } - if (!isNumber(step) && !(step instanceof BigNumber)) { - throw new TypeError('Parameter step must be a number'); - } - if (!isBoolean(includeEnd)) { - throw new TypeError('Parameter includeEnd must be a boolean'); - } - - // go big - if (start instanceof BigNumber || end instanceof BigNumber || step instanceof BigNumber) { - // create a range with big numbers - var asBigNumber = true; - - // convert start, end, step to BigNumber - if (!(start instanceof BigNumber)) { - start = toBigNumber(start); - } - if (!(end instanceof BigNumber)) { - end = toBigNumber(end); - } - if (!(step instanceof BigNumber)) { - step = toBigNumber(step); - } - - if (!(start instanceof BigNumber) || !(end instanceof BigNumber) || !(step instanceof BigNumber)) { - // not all values can be converted to big number :( - // fall back to numbers - asBigNumber = false; - start = toNumber(start); - end = toNumber(end); - step = toNumber(step); - } - } - - // generate the range - var fn = asBigNumber ? - (includeEnd ? _bigRangeInc : _bigRange) : - (includeEnd ? _rangeInc : _range); - var array = fn(start, end, step); - - // return as array or matrix - return (settings.matrix === 'array') ? array : new Matrix(array); - }; - - /** - * Create a range with numbers. End is excluded - * @param {Number} start - * @param {Number} end - * @param {Number} step - * @returns {Array} range - * @private - */ - function _range (start, end, step) { - var array = [], - x = start; - if (step > 0) { - while (x < end) { - array.push(x); - x += step; - } - } - else if (step < 0) { - while (x > end) { - array.push(x); - x += step; - } - } - - return array; - } - - /** - * Create a range with numbers. End is included - * @param {Number} start - * @param {Number} end - * @param {Number} step - * @returns {Array} range - * @private - */ - function _rangeInc (start, end, step) { - var array = [], - x = start; - if (step > 0) { - while (x <= end) { - array.push(x); - x += step; - } - } - else if (step < 0) { - while (x >= end) { - array.push(x); - x += step; - } - } - - return array; - } - - /** - * Create a range with big numbers. End is excluded - * @param {BigNumber} start - * @param {BigNumber} end - * @param {BigNumber} step - * @returns {Array} range - * @private - */ - function _bigRange (start, end, step) { - var array = [], - x = start.clone(), - zero = new BigNumber(0); - if (step.gt(zero)) { - while (x.lt(end)) { - array.push(x); - x = x.plus(step); - } - } - else if (step.lt(zero)) { - while (x.gt(end)) { - array.push(x); - x = x.plus(step); - } - } - - return array; - } - - /** - * Create a range with big numbers. End is included - * @param {BigNumber} start - * @param {BigNumber} end - * @param {BigNumber} step - * @returns {Array} range - * @private - */ - function _bigRangeInc (start, end, step) { - var array = [], - x = start.clone(), - zero = new BigNumber(0); - if (step.gt(zero)) { - while (x.lte(end)) { - array.push(x); - x = x.plus(step); - } - } - else if (step.lt(zero)) { - while (x.gte(end)) { - array.push(x); - x = x.plus(step); - } - } - - return array; - } - - /** - * Parse a string into a range, - * The string contains the start, optional step, and end, separated by a colon. - * If the string does not contain a valid range, null is returned. - * For example str='0:2:11'. - * @param {String} str - * @return {Object | null} range Object containing properties start, end, step - * @private - */ - function _parse (str) { - var args = str.split(':'), - nums = null; - - if (settings.number === 'bignumber') { - // bignumber - try { - nums = args.map(function (arg) { - return new BigNumber(arg); - }); - } - catch (err) { - return null; - } - } - else { - // number - nums = args.map(function (arg) { - return parseFloat(arg); - }); - - var invalid = nums.some(function (num) { - return isNaN(num); - }); - if(invalid) { - return null; - } - } - - switch (nums.length) { - case 2: - return { - start: nums[0], - end: nums[1], - step: 1 - }; - - case 3: - return { - start: nums[0], - end: nums[2], - step: nums[1] - }; - - default: - return null; - } - } - -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],176:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Matrix = require('../../type/Matrix'), - - array = util.array, - clone = util.object.clone, - isString = util.string.isString, - toNumber = util.number.toNumber, - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - isArray = array.isArray; - - /** - * Resize a matrix - * - * resize(x, size) - * resize(x, size, defaultValue) - * - * @param {* | Array | Matrix} x - * @param {Array | Matrix} size One dimensional array with numbers - * @param {Number | String} [defaultValue] Undefined by default, except in - * case of a string, in that case - * defaultValue = ' ' - * @return {* | Array | Matrix} res - */ - math.resize = function resize (x, size, defaultValue) { - if (arguments.length != 2 && arguments.length != 3) { - throw new math.error.ArgumentsError('resize', arguments.length, 2, 3); - } - - var asMatrix = (x instanceof Matrix) ? true : isArray(x) ? false : (settings.matrix !== 'array'); - - if (x instanceof Matrix) { - x = x.valueOf(); // get Array - } - if (size instanceof Matrix) { - size = size.valueOf(); // get Array - } - - if (size.length && size[0] instanceof BigNumber) { - // convert bignumbers to numbers - size = size.map(toNumber); - } - - if (isString(x)) { - return _resizeString(x, size, defaultValue); - } - else { - if (size.length == 0) { - // output a scalar - while (isArray(x)) { - x = x[0]; - } - - return clone(x); - } - else { - // output an array/matrix - if (!isArray(x)) { - x = [x]; - } - x = clone(x); - - var res = array.resize(x, size, defaultValue); - return asMatrix ? new Matrix(res) : res; - } - } - }; - - /** - * Resize a string - * @param {String} str - * @param {Number[]} size - * @param {string} defaultChar - * @private - */ - function _resizeString(str, size, defaultChar) { - if (defaultChar !== undefined) { - if (!isString(defaultChar) || defaultChar.length !== 1) { - throw new TypeError('Single character expected as defaultValue'); - } - } - else { - defaultChar = ' '; - } - - if (size.length !== 1) { - throw new Error('Dimension mismatch: (' + size.length + ' != 1)'); - } - var len = size[0]; - if (!isNumber(len) || !isInteger(len)) { - throw new TypeError('Size must contain numbers'); - } - - if (str.length > len) { - return str.substring(0, len); - } - else if (str.length < len) { - var res = str; - for (var i = 0, ii = len - str.length; i < ii; i++) { - res += defaultChar; - } - return res; - } - else { - return str; - } - } -}; - -},{"../../type/Matrix":211,"../../util/index":218,"bignumber.js":223}],177:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - Matrix = require('../../type/Matrix'), - - array = util.array, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit; - - /** - * Calculate the size of a matrix or scalar - * - * size(x) - * - * @param {Boolean | Number | Complex | Unit | String | Array | Matrix} x - * @return {Array | Matrix} res - */ - math.size = function size (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('size', arguments.length, 1); - } - - var asArray = (settings.matrix === 'array'); - - if (isNumber(x) || isComplex(x) || isUnit(x) || isBoolean(x) || - x == null || x instanceof BigNumber) { - return asArray ? [] : new Matrix([]); - } - - if (isString(x)) { - return asArray ? [x.length] : new Matrix([x.length]); - } - - if (Array.isArray(x)) { - return array.size(x); - } - - if (x instanceof Matrix) { - return new Matrix(x.size()); - } - - throw new math.error.UnsupportedTypeError('size', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../util/index":218,"bignumber.js":223}],178:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - - object = util.object, - array = util.array, - isArray = Array.isArray; - - /** - * Remove singleton dimensions from a matrix - * - * squeeze(x) - * - * @param {Matrix | Array} x - * @return {Matrix | Array} res - */ - math.squeeze = function squeeze (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('squeeze', arguments.length, 1); - } - - if (isArray(x)) { - return array.squeeze(object.clone(x)); - } - else if (x instanceof Matrix) { - var res = array.squeeze(x.toArray()); - return isArray(res) ? new Matrix(res) : res; - } - else { - // scalar - return object.clone(x); - } - }; -}; - -},{"../../type/Matrix":211,"../../util/index":218}],179:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - Index = require('../../type/Index'), - - array = util.array, - isString = util.string.isString, - isArray = Array.isArray; - - /** - * Get or set a subset of a matrix or string - * - * Usage: - * // retrieve subset: - * var subset = math.subset(value, index) - * - * // replace subset: - * var value = math.subset(value, index, replacement [, defaultValue]) - * - * Where: - * {Array | Matrix | String} value An array, matrix, or string - * {Index} index An index containing ranges for each - * dimension - * {*} replacement An array, matrix, or scalar - * {*} [defaultValue] Default value, filled in on new entries when - * the matrix is resized. If not provided, - * new matrix elements will be left undefined. - * @param args - * @return res - */ - math.subset = function subset (args) { - switch (arguments.length) { - case 2: // get subset - return _getSubset(arguments[0], arguments[1]); - - // intentional fall through - case 3: // set subset - case 4: // set subset with default value - return _setSubset(arguments[0], arguments[1], arguments[2], arguments[3]); - - default: // wrong number of arguments - throw new math.error.ArgumentsError('subset', arguments.length, 2, 4); - } - }; - - /** - * Retrieve a subset of an value such as an Array, Matrix, or String - * @param {Array | Matrix | String} value Object from which to get a subset - * @param {Index} index An index containing ranges for each - * dimension - * @returns {Array | Matrix | *} subset - * @private - */ - function _getSubset(value, index) { - var m, subset; - - if (isArray(value)) { - m = new Matrix(value); - subset = m.subset(index); - return subset.valueOf(); - } - else if (value instanceof Matrix) { - return value.subset(index); - } - else if (isString(value)) { - return _getSubstring(value, index); - } - else { - throw new math.error.UnsupportedTypeError('subset', value); - } - } - - /** - * Retrieve a subset of a string - * @param {String} str String from which to get a substring - * @param {Index} index An index containing ranges for each dimension - * @returns {string} substring - * @private - */ - function _getSubstring(str, index) { - if (!(index instanceof Index)) { - // TODO: better error message - throw new TypeError('Index expected'); - } - if (index.size().length != 1) { - throw new RangeError('Dimension mismatch (' + index.size().length + ' != 1)'); - } - - var range = index.range(0); - - var substr = ''; - var strLen = str.length; - range.forEach(function (v) { - array.validateIndex(v, strLen); - substr += str.charAt(v); - }); - - return substr; - } - - /** - * Replace a subset in an value such as an Array, Matrix, or String - * @param {Array | Matrix | String} value Object to be replaced - * @param {Index} index An index containing ranges for each - * dimension - * @param {Array | Matrix | *} replacement - * @param {*} [defaultValue] Default value, filled in on new entries when - * the matrix is resized. If not provided, - * new matrix elements will be left undefined. - * @returns {*} result - * @private - */ - function _setSubset(value, index, replacement, defaultValue) { - var m; - - if (isArray(value)) { - m = new Matrix(math.clone(value)); - m.subset(index, replacement, defaultValue); - return m.valueOf(); - } - else if (value instanceof Matrix) { - return value.clone().subset(index, replacement, defaultValue); - } - else if (isString(value)) { - return _setSubstring(value, index, replacement, defaultValue); - } - else { - throw new math.error.UnsupportedTypeError('subset', value); - } - } - - /** - * Replace a substring in a string - * @param {String} str String to be replaced - * @param {Index} index An index containing ranges for each dimension - * @param {String} replacement Replacement string - * @param {String} [defaultValue] Default value to be uses when resizing - * the string. is ' ' by default - * @returns {string} result - * @private - */ - function _setSubstring(str, index, replacement, defaultValue) { - if (!(index instanceof Index)) { - // TODO: better error message - throw new TypeError('Index expected'); - } - if (index.size().length != 1) { - throw new RangeError('Dimension mismatch (' + index.size().length + ' != 1)'); - } - if (defaultValue !== undefined) { - if (!isString(defaultValue) || defaultValue.length !== 1) { - throw new TypeError('Single character expected as defaultValue'); - } - } - else { - defaultValue = ' '; - } - - var range = index.range(0); - var len = range.size()[0]; - - if (len != replacement.length) { - throw new RangeError('Dimension mismatch ' + - '(' + range.size()[0] + ' != ' + replacement.length + ')'); - } - - // copy the string into an array with characters - var strLen = str.length; - var chars = []; - for (var i = 0; i < strLen; i++) { - chars[i] = str.charAt(i); - } - - range.forEach(function (v, i) { - array.validateIndex(v); - chars[v] = replacement.charAt(i); - }); - - // initialize undefined characters with a space - if (chars.length > strLen) { - for (i = strLen - 1, len = chars.length; i < len; i++) { - if (!chars[i]) { - chars[i] = defaultValue; - } - } - } - - return chars.join(''); - } -}; - -},{"../../type/Index":210,"../../type/Matrix":211,"../../util/index":218}],180:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - object = util.object, - string = util.string; - - /** - * Create the transpose of a matrix - * - * transpose(x) - * - * @param {Array | Matrix} x - * @return {Array | Matrix} transpose - */ - math.transpose = function transpose (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('transpose', arguments.length, 1); - } - - var size = math.size(x).valueOf(); - switch (size.length) { - case 0: - // scalar - return object.clone(x); - break; - - case 1: - // vector - return object.clone(x); - break; - - case 2: - // two dimensional array - var rows = size[1], - cols = size[0], - asMatrix = (x instanceof Matrix), - data = x.valueOf(), - transposed = [], - transposedRow, - clone = object.clone; - - if (rows === 0) { - // whoops - throw new RangeError('Cannot transpose a 2D matrix with no rows' + - '(size: ' + string.format(size) + ')'); - } - - for (var r = 0; r < rows; r++) { - transposedRow = transposed[r] = []; - for (var c = 0; c < cols; c++) { - transposedRow[c] = clone(data[c][r]); - } - } - if (cols == 0) { - transposed[0] = []; - } - - return asMatrix ? new Matrix(transposed) : transposed; - break; - - default: - // multi dimensional array - throw new RangeError('Matrix must be two dimensional ' + - '(size: ' + string.format(size) + ')'); - } - }; -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],181:[function(require,module,exports){ -module.exports = function (math, settings) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - array = util.array, - toNumber = util.number.toNumber, - isArray = Array.isArray; - - /** - * create a matrix filled with zeros - * - * zeros(m) - * zeros(m, n) - * zeros([m, n]) - * zeros([m, n, p, ...]) - * - * @param {...Number | Array} size - * @return {Array | Matrix | Number} matrix - */ - math.zeros = function zeros (size) { - var args = collection.argsToArray(arguments); - var asMatrix = (size instanceof Matrix) ? true : - (isArray(size) ? false : (settings.matrix === 'matrix')); - - if (args.length == 0) { - // output an empty matrix - return asMatrix ? new Matrix() : []; - } - else { - // output an array or matrix - var res = []; - var defaultValue = (args[0] instanceof BigNumber) ? new BigNumber(0) : 0; - res = array.resize(res, args.map(toNumber), defaultValue); - - return asMatrix ? new Matrix(res) : res; - } - }; -}; - -},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],182:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - toBigNumber = util.number.toBigNumber; - - /** - * Compute the number of combinations of n items taken k at a time - * - * combinations(n, k) - * - * combinations only takes integer arguments - * the following condition must be enforced: k <= n - * - * @Param {Number} n - * @Param {Number} k - * @return {Number} combinations - */ - math.combinations = function combinations (n, k) { - var arity = arguments.length; - if (arity != 2) { - throw new math.error.ArgumentsError('combinations', arguments.length, 2); - } - - if (isNumber(n)) { - if (!isInteger(n) || n < 0) { - throw new TypeError('Positive integer value enpected in function combinations'); - } - if (k > n) { - throw new TypeError('k must be less than or equal to n'); - } - return Math.floor(math.factorial(n) / (math.factorial(k) * math.factorial(n-k))); - } - - if (n instanceof BigNumber) { - // make sure k is a BigNumber as well - // not all numbers can be converted to BigNumber - k = toBigNumber(k); - - if (!(k instanceof BigNumber) || !isPositiveInteger(n) || !isPositiveInteger(k)) { - throw new TypeError('Positive integer value expected in function combinations'); - } - if (k.gt(n)) { - throw new TypeError('k must be less than n in function combinations'); - } - - return math.floor(math.divide(math.factorial(n), - math.multiply(math.factorial(k), - math.factorial(math.subtract(n, k))))); - } - - throw new math.error.UnsupportedTypeError('combinations', n); - }; - - /** - * Test whether BigNumber n is a positive integer - * @param {BigNumber} n - * @returns {boolean} isPositiveInteger - */ - var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],183:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isInteger = util.number.isInteger, - isCollection = collection.isCollection; - - /** - * Compute the factorial of a value - * - * n! - * factorial(n) - * - * Factorial only supports an integer value as argument. - * For matrices, the function is evaluated element wise. - * - * @Param {Number | BigNumber | Array | Matrix} n - * @return {Number | BigNumber | Array | Matrix} res - */ - math.factorial = function factorial (n) { - var value, res; - - if (arguments.length != 1) { - throw new math.error.ArgumentsError('factorial', arguments.length, 1); - } - - if (isNumber(n)) { - if (!isInteger(n) || n < 0) { - throw new TypeError('Positive integer value expected in function factorial'); - } - - value = n - 1; - res = n; - while (value > 1) { - res *= value; - value--; - } - - if (res == 0) { - res = 1; // 0! is per definition 1 - } - - return res; - } - - if (n instanceof BigNumber) { - if (!(isPositiveInteger(n))) { - throw new TypeError('Positive integer value expected in function factorial'); - } - - var one = new BigNumber(1); - - value = n.minus(one); - res = n; - while (value.gt(one)) { - res = res.times(value); - value = value.minus(one); - } - - if (res.equals(0)) { - res = one; // 0! is per definition 1 - } - - return res; - } - - if (isBoolean(n)) { - return 1; // factorial(1) = 1, factorial(0) = 1 - } - - if (isCollection(n)) { - return collection.deepMap(n, factorial); - } - - throw new math.error.UnsupportedTypeError('factorial', n); - }; - - /** - * Test whether BigNumber n is a positive integer - * @param {BigNumber} n - * @returns {boolean} isPositiveInteger - */ - var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); - }; -}; - -},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],184:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - - isNumber = util.number.isNumber, - isInteger = util.number.isInteger, - toBigNumber = util.number.toBigNumber; - - /** - * Compute the number of permutations of n items taken k at a time - * - * permutations(n) - * permutations(n, k) - * - * permutations only takes integer arguments - * the following condition must be enforced: k <= n - * - * @Param {Number} n - * @Param {Number} k - * @return {Number} permutations - */ - math.permutations = function permutations (n, k) { - var arity = arguments.length; - if (arity > 2) { - throw new math.error.ArgumentsError('permutations', arguments.length, 2); - } - - if (isNumber(n)) { - if (!isInteger(n) || n < 0) { - throw new TypeError('Positive integer value enpected in function permutations'); - } - - // Permute n objects - if (arity == 1) { - return math.factorial(n); - } - - // Permute n objects, k at a time - if (arity == 2) { - if (isNumber(k)) { - if (!isInteger(k) || k < 0) { - throw new TypeError('Positive integer value enpected in function permutations'); - } - if (k > n) { - throw new TypeError('second argument k must be less than or equal to first argument n'); - } - return Math.floor(math.factorial(n) / math.factorial(n-k)); - } - } - } - - if (n instanceof BigNumber) { - if (k === undefined && isPositiveInteger(n)) { - return math.factorial(n); - } - - // make sure k is a BigNumber as well - // not all numbers can be converted to BigNumber - k = toBigNumber(k); - - if (!(k instanceof BigNumber) || !isPositiveInteger(n) || !isPositiveInteger(k)) { - throw new TypeError('Positive integer value expected in function permutations'); - } - if (k.gt(n)) { - throw new TypeError('second argument k must be less than or equal to first argument n'); - } - - return math.floor(math.divide(math.factorial(n), - math.factorial( - math.subtract(n, k)))); - } - - throw new math.error.UnsupportedTypeError('permutations', n); - }; - - /** - * Test whether BigNumber n is a positive integer - * @param {BigNumber} n - * @returns {boolean} isPositiveInteger - */ - var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); - }; -}; - -},{"../../util/index":218,"bignumber.js":223}],185:[function(require,module,exports){ -module.exports = function (math, settings) { - var Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'); - - // TODO: implement BigNumber support for random - - /** - * Return a random number between 0 and 1 - * - * random() - * - * @return {Number} res - */ - - // Each distribution is a function that takes no argument and when called returns - // a number between 0 and 1. - var distributions = { - - uniform: function() { - return Math.random; - }, - - // Implementation of normal distribution using Box-Muller transform - // ref : http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform - // We take : mean = 0.5, standard deviation = 1/6 - // so that 99.7% values are in [0, 1]. - normal: function() { - return function() { - var u1, u2, - picked = -1; - // We reject values outside of the interval [0, 1] - // TODO: check if it is ok to do that? - while (picked < 0 || picked > 1) { - u1 = Math.random(); - u2 = Math.random(); - picked = 1/6 * Math.pow(-2 * Math.log(u1), 0.5) * Math.cos(2 * Math.PI * u2) + 0.5; - } - return picked; - } - } - }; - - /** - * Create a distribution object. - * @param {String} name Name of a distribution. - * Choose from 'uniform', 'normal'. - * @return {Object} distribution A distribution object containing functions: - * random([size, min, max]) - * randomInt([min, max]) - * pickRandom(array) - */ - math.distribution = function(name) { - if (!distributions.hasOwnProperty(name)) - throw new Error('unknown distribution ' + name); - - var args = Array.prototype.slice.call(arguments, 1), - distribution = distributions[name].apply(this, args); - - return (function(distribution) { - - // This is the public API for all distributions - var randFunctions = { - - random: function(arg1, arg2, arg3) { - var size, min, max; - if (arguments.length > 3) { - throw new math.error.ArgumentsError('random', arguments.length, 0, 3); - - // `random(max)` or `random(size)` - } else if (arguments.length === 1) { - if (Array.isArray(arg1)) - size = arg1; - else - max = arg1; - // `random(min, max)` or `random(size, max)` - } else if (arguments.length === 2) { - if (Array.isArray(arg1)) - size = arg1; - else { - min = arg1; - max = arg2; - } - // `random(size, min, max)` - } else { - size = arg1; - min = arg2; - max = arg3; - } - - if (max === undefined) max = 1; - if (min === undefined) min = 0; - if (size !== undefined) { - var res = _randomDataForMatrix(size, min, max, _random); - return (settings.matrix === 'array') ? res : new Matrix(res); - } - else return _random(min, max); - }, - - randomInt: function(arg1, arg2, arg3) { - var size, min, max; - if (arguments.length > 3 || arguments.length < 1) - throw new math.error.ArgumentsError('randomInt', arguments.length, 1, 3); - - // `randomInt(max)` - else if (arguments.length === 1) max = arg1; - // `randomInt(min, max)` or `randomInt(size, max)` - else if (arguments.length === 2) { - if (Object.prototype.toString.call(arg1) === '[object Array]') - size = arg1; - else { - min = arg1; - max = arg2; - } - // `randomInt(size, min, max)` - } else { - size = arg1; - min = arg2; - max = arg3; - } - - if (min === undefined) min = 0; - if (size !== undefined) { - var res = _randomDataForMatrix(size, min, max, _randomInt); - return (settings.matrix === 'array') ? res : new Matrix(res); - } - else return _randomInt(min, max); - }, - - pickRandom: function(possibles) { - if (arguments.length !== 1) { - throw new math.error.ArgumentsError('pickRandom', arguments.length, 1); - } - if (!Array.isArray(possibles)) { - throw new math.error.UnsupportedTypeError('pickRandom', possibles); - } - - // TODO: add support for matrices - return possibles[Math.floor(Math.random() * possibles.length)]; - } - - }; - - var _random = function(min, max) { - return min + distribution() * (max - min); - }; - - var _randomInt = function(min, max) { - return Math.floor(min + distribution() * (max - min)); - }; - - // This is a function for generating a random matrix recursively. - var _randomDataForMatrix = function(size, min, max, randFunc) { - var data = [], length, i; - size = size.slice(0); - - if (size.length > 1) { - for (i = 0, length = size.shift(); i < length; i++) - data.push(_randomDataForMatrix(size, min, max, randFunc)); - } else { - for (i = 0, length = size.shift(); i < length; i++) - data.push(randFunc(min, max)); - } - - return data; - }; - - return randFunctions; - - })(distribution); - - }; - - // Default random functions use uniform distribution - // TODO: put random functions in separate files? - var uniformRandFunctions = math.distribution('uniform'); - math.random = uniformRandFunctions.random; - math.randomInt = uniformRandFunctions.randomInt; - math.pickRandom = uniformRandFunctions.pickRandom; -}; - -},{"../../type/Matrix":211,"../../type/collection":214}],186:[function(require,module,exports){ -module.exports = function (math) { - var Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection; - - /** - * Compute the maximum value of a list of values - * In case of a multi dimensional array, the maximum of the flattened array - * will be calculated. When dim is provided, the maximum over the selected - * dimension will be calculated. - * - * max(a, b, c, ...) - * max(A) - * max(A, dim) - * - * @param {... *} args A single matrix or or multiple scalar values - * @return {*} res - */ - math.max = function max(args) { - if (arguments.length == 0) { - throw new SyntaxError('Function max requires one or more parameters (0 provided)'); - } - - if (isCollection(args)) { - if (arguments.length == 1) { - // max([a, b, c, d, ...]) - return _max(args); - } - else if (arguments.length == 2) { - // max([a, b, c, d, ...], dim) - return collection.reduce(arguments[0], arguments[1], _getlarger); - } - else { - throw new SyntaxError('Wrong number of parameters'); - } - } - else { - // max(a, b, c, d, ...) - return _max(arguments); - } - }; - - function _getlarger(x, y){ - if( math.larger(x,y) ) - return x; - else - return y; - } - - /** - * Recursively calculate the maximum value in an n-dimensional array - * @param {Array} array - * @return {Number} max - * @private - */ - function _max(array) { - var max = null; - - collection.deepForEach(array, function (value) { - if (max === null || math.larger(value, max)) { - max = value; - } - }); - - if (max === null) { - throw new Error('Cannot calculate max of an empty array'); - } - - return max; - } -}; - -},{"../../type/Matrix":211,"../../type/collection":214}],187:[function(require,module,exports){ -module.exports = function (math) { - var Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection; - - /** - * Compute the mean value of a list of values - * In case of a multi dimensional array, the mean of the flattened array - * will be calculated. When dim is provided, the maximum over the selected - * dimension will be calculated. - * - * mean(a, b, c, ...) - * mean(A) - * mean(A, dim) - * - * @param {... *} args A single matrix or or multiple scalar values - * @return {*} res - */ - math.mean = function mean(args) { - if (arguments.length == 0) { - throw new SyntaxError('Function mean requires one or more parameters (0 provided)'); - } - - if (isCollection(args)) { - if (arguments.length == 1) { - // mean([a, b, c, d, ...]) - return _mean(args); - } - else if (arguments.length == 2) { - // mean([a, b, c, d, ...], dim) - return _nmean(arguments[0], arguments[1]); - } - else { - throw new SyntaxError('Wrong number of parameters'); - } - } - else { - // mean(a, b, c, d, ...) - return _mean(arguments); - } - }; - - /** - * Calculate the mean value in an n-dimensional array, returning a - * n-1 dimensional array - * @param {Array} array - * @param {Number} dim - * @return {Number} mean - * @private - */ - function _nmean(array, dim){ - var sum; - sum = collection.reduce(array, dim, math.add); - return math.divide(sum, size(array)[dim]); - }; - - /** - * Recursively calculate the mean value in an n-dimensional array - * @param {Array} array - * @return {Number} mean - * @private - */ - function _mean(array) { - var sum = 0; - var num = 0; - - collection.deepForEach(array, function (value) { - sum = math.add(sum, value); - num++; - }); - - if (num === 0) { - throw new Error('Cannot calculate mean of an empty array'); - } - - return math.divide(sum, num); - } -}; - -},{"../../type/Matrix":211,"../../type/collection":214}],188:[function(require,module,exports){ -module.exports = function (math) { - var Matrix = require('../../type/Matrix'), - collection = require('../../type/collection'), - - isCollection = collection.isCollection; - - /** - * Compute the minimum value of a list of values. - * In case of a multi dimensional array, the minimum of the flattened array - * will be calculated. When dim is provided, the maximum over the selected - * dimension will be calculated. - * - * min(a, b, c, ...) - * min(A) - * min(A, dim) - * - * @param {... *} args A single matrix or multiple scalar values - * @return {*} res - */ - math.min = function min(args) { - if (arguments.length == 0) { - throw new SyntaxError('Function min requires one or more parameters (0 provided)'); - } - - if (isCollection(args)) { - if (arguments.length == 1) { - // min([a, b, c, d, ...]) - return _min(args); - } - else if (arguments.length == 2) { - // min([a, b, c, d, ...], dim) - return collection.reduce(arguments[0], arguments[1], _getsmaller); - } - else { - throw new SyntaxError('Wrong number of parameters'); - } - } - else { - // min(a, b, c, d, ...) - return _min(arguments); - } - }; - - function _getsmaller(x, y){ - if( math.smaller(x,y) ) - return x; - else - return y; - } - - /** - * Recursively calculate the minimum value in an n-dimensional array - * @param {Array} array - * @return {Number} min - * @private - */ - function _min(array) { - var min = null; - - collection.deepForEach(array, function (value) { - if (min === null || math.smaller(value, min)) { - min = value; - } - }); - - if (min === null) { - throw new Error('Cannot calculate min of an empty array'); - } - - return min; - } -}; - -},{"../../type/Matrix":211,"../../type/collection":214}],189:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the inverse cosine of a value - * - * acos(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/InverseCosine.html - */ - math.acos = function acos(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('acos', arguments.length, 1); - } - - if (isNumber(x)) { - if (x >= -1 && x <= 1) { - return Math.acos(x); - } - else { - return acos(new Complex(x, 0)); - } - } - - if (isComplex(x)) { - // acos(z) = 0.5*pi + i*log(iz + sqrt(1-z^2)) - var temp1 = new Complex( - x.im * x.im - x.re * x.re + 1.0, - -2.0 * x.re * x.im - ); - var temp2 = math.sqrt(temp1); - var temp3; - if (temp2 instanceof Complex) { - temp3 = new Complex( - temp2.re - x.im, - temp2.im + x.re - ) - } - else { - temp3 = new Complex( - temp2 - x.im, - x.re - ) - } - var temp4 = math.log(temp3); - - // 0.5*pi = 1.5707963267948966192313216916398 - if (temp4 instanceof Complex) { - return new Complex( - 1.57079632679489661923 - temp4.im, - temp4.re - ); - } - else { - return new Complex( - 1.57079632679489661923, - temp4 - ); - } - } - - if (isCollection(x)) { - return collection.deepMap(x, acos); - } - - if (isBoolean(x)) { - return Math.acos(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return acos(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('acos', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],190:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the inverse sine of a value - * - * asin(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/InverseSine.html - */ - math.asin = function asin(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('asin', arguments.length, 1); - } - - if (isNumber(x)) { - if (x >= -1 && x <= 1) { - return Math.asin(x); - } - else { - return asin(new Complex(x, 0)); - } - } - - if (isComplex(x)) { - // asin(z) = -i*log(iz + sqrt(1-z^2)) - var re = x.re; - var im = x.im; - var temp1 = new Complex( - im * im - re * re + 1.0, - -2.0 * re * im - ); - - var temp2 = math.sqrt(temp1); - var temp3; - if (temp2 instanceof Complex) { - temp3 = new Complex( - temp2.re - im, - temp2.im + re - ); - } - else { - temp3 = new Complex( - temp2 - im, - re - ); - } - - var temp4 = math.log(temp3); - - if (temp4 instanceof Complex) { - return new Complex(temp4.im, -temp4.re); - } - else { - return new Complex(0, -temp4); - } - } - - if (isCollection(x)) { - return collection.deepMap(x, asin); - } - - if (isBoolean(x)) { - return Math.asin(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return asin(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('asin', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],191:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Calculate the inverse tangent of a value - * - * atan(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/InverseTangent.html - */ - math.atan = function atan(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('atan', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.atan(x); - } - - if (isComplex(x)) { - // atan(z) = 1/2 * i * (ln(1-iz) - ln(1+iz)) - var re = x.re; - var im = x.im; - var den = re * re + (1.0 - im) * (1.0 - im); - - var temp1 = new Complex( - (1.0 - im * im - re * re) / den, - (-2.0 * re) / den - ); - var temp2 = math.log(temp1); - - if (temp2 instanceof Complex) { - return new Complex( - -0.5 * temp2.im, - 0.5 * temp2.re - ); - } - else { - return new Complex( - 0, - 0.5 * temp2 - ); - } - } - - if (isCollection(x)) { - return collection.deepMap(x, atan); - } - - if (isBoolean(x)) { - return Math.atan(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return atan(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('atan', x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],192:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - collection = require('../../type/collection'), - - toNumber = util.number.toNumber, - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isCollection = collection.isCollection; - - /** - * Computes the principal value of the arc tangent of y/x in radians - * - * atan2(y, x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Array | Matrix} y - * @param {Number | Boolean | Complex | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/InverseTangent.html - */ - math.atan2 = function atan2(y, x) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('atan2', arguments.length, 2); - } - - if (isNumber(y)) { - if (isNumber(x)) { - return Math.atan2(y, x); - } - /* TODO: support for complex computation of atan2 - else if (isComplex(x)) { - return Math.atan2(y.re, x.re); - } - */ - } - else if (isComplex(y)) { - if (isNumber(x)) { - return Math.atan2(y.re, x); - } - /* TODO: support for complex computation of atan2 - else if (isComplex(x)) { - return Math.atan2(y.re, x.re); - } - */ - } - - if (isCollection(y) || isCollection(x)) { - return collection.deepMap2(y, x, atan2); - } - - if (isBoolean(y)) { - return atan2(+y, x); - } - if (isBoolean(x)) { - return atan2(y, +x); - } - - // TODO: implement bignumber support - if (y instanceof BigNumber) { - return atan2(toNumber(y), x); - } - if (x instanceof BigNumber) { - return atan2(y, toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('atan2', y, x); - }; -}; - -},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],193:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the cosine of a value - * - * cos(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/Cosine.html - */ - math.cos = function cos(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('cos', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.cos(x); - } - - if (isComplex(x)) { - // cos(z) = (exp(iz) + exp(-iz)) / 2 - return new Complex( - 0.5 * Math.cos(x.re) * (Math.exp(-x.im) + Math.exp(x.im)), - 0.5 * Math.sin(x.re) * (Math.exp(-x.im) - Math.exp(x.im)) - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function cos is no angle'); - } - return Math.cos(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, cos); - } - - if (isBoolean(x)) { - return Math.cos(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return cos(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('cos', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],194:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the cotangent of a value. cot(x) is defined as 1 / tan(x) - * - * cot(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.cot = function cot(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('cot', arguments.length, 1); - } - - if (isNumber(x)) { - return 1 / Math.tan(x); - } - - if (isComplex(x)) { - var den = Math.exp(-4.0 * x.im) - - 2.0 * Math.exp(-2.0 * x.im) * Math.cos(2.0 * x.re) + 1.0; - - return new Complex( - 2.0 * Math.exp(-2.0 * x.im) * Math.sin(2.0 * x.re) / den, - (Math.exp(-4.0 * x.im) - 1.0) / den - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function cot is no angle'); - } - return 1 / Math.tan(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, cot); - } - - if (isBoolean(x)) { - return cot(+x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return cot(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('cot', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],195:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the cosecant of a value, csc(x) = 1/sin(x) - * - * csc(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.csc = function csc(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('csc', arguments.length, 1); - } - - if (isNumber(x)) { - return 1 / Math.sin(x); - } - - if (isComplex(x)) { - // csc(z) = 1/sin(z) = (2i) / (exp(iz) - exp(-iz)) - var den = 0.25 * (Math.exp(-2.0 * x.im) + Math.exp(2.0 * x.im)) - - 0.5 * Math.cos(2.0 * x.re); - - return new Complex ( - 0.5 * Math.sin(x.re) * (Math.exp(-x.im) + Math.exp(x.im)) / den, - 0.5 * Math.cos(x.re) * (Math.exp(-x.im) - Math.exp(x.im)) / den - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function csc is no angle'); - } - return 1 / Math.sin(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, csc); - } - - if (isBoolean(x)) { - return csc(+x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return csc(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('csc', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],196:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the secant of a value, sec(x) = 1/cos(x) - * - * sec(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - */ - math.sec = function sec(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('sec', arguments.length, 1); - } - - if (isNumber(x)) { - return 1 / Math.cos(x); - } - - if (isComplex(x)) { - // sec(z) = 1/cos(z) = 2 / (exp(iz) + exp(-iz)) - var den = 0.25 * (Math.exp(-2.0 * x.im) + Math.exp(2.0 * x.im)) + - 0.5 * Math.cos(2.0 * x.re); - return new Complex( - 0.5 * Math.cos(x.re) * (Math.exp(-x.im) + Math.exp( x.im)) / den, - 0.5 * Math.sin(x.re) * (Math.exp( x.im) - Math.exp(-x.im)) / den - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function sec is no angle'); - } - return 1 / Math.cos(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, sec); - } - - if (isBoolean(x)) { - return sec(+x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return sec(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('sec', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],197:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the sine of a value - * - * sin(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/Sine.html - */ - math.sin = function sin(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('sin', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.sin(x); - } - - if (isComplex(x)) { - return new Complex( - 0.5 * Math.sin(x.re) * (Math.exp(-x.im) + Math.exp( x.im)), - 0.5 * Math.cos(x.re) * (Math.exp( x.im) - Math.exp(-x.im)) - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function sin is no angle'); - } - return Math.sin(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, sin); - } - - if (isBoolean(x)) { - return Math.sin(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return sin(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('sin', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],198:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isNumber = util.number.isNumber, - isBoolean = util['boolean'].isBoolean, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Calculate the tangent of a value - * - * tan(x) - * - * For matrices, the function is evaluated element wise. - * - * @param {Number | Boolean | Complex | Unit | Array | Matrix} x - * @return {Number | Complex | Array | Matrix} res - * - * @see http://mathworld.wolfram.com/Tangent.html - */ - math.tan = function tan(x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('tan', arguments.length, 1); - } - - if (isNumber(x)) { - return Math.tan(x); - } - - if (isComplex(x)) { - var den = Math.exp(-4.0 * x.im) + - 2.0 * Math.exp(-2.0 * x.im) * Math.cos(2.0 * x.re) + - 1.0; - - return new Complex( - 2.0 * Math.exp(-2.0 * x.im) * Math.sin(2.0 * x.re) / den, - (1.0 - Math.exp(-4.0 * x.im)) / den - ); - } - - if (isUnit(x)) { - if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { - throw new TypeError ('Unit in function tan is no angle'); - } - return Math.tan(x.value); - } - - if (isCollection(x)) { - return collection.deepMap(x, tan); - } - - if (isBoolean(x)) { - return Math.tan(x); - } - - if (x instanceof BigNumber) { - // TODO: implement BigNumber support - // downgrade to Number - return tan(util.number.toNumber(x)); - } - - throw new math.error.UnsupportedTypeError('tan', x); - }; -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],199:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Unit = require('../../type/Unit'), - collection = require('../../type/collection'), - - isString = util.string.isString, - isUnit = Unit.isUnit, - isCollection = collection.isCollection; - - /** - * Change the unit of a value. - * - * x to unit - * to(x, unit) - * - * For matrices, the function is evaluated element wise. - * - * @param {Unit | Array | Matrix} x - * @param {Unit | Array | Matrix} unit - * @return {Unit | Array | Matrix} res - */ - math.to = function to(x, unit) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('to', arguments.length, 2); - } - - if (isUnit(x)) { - if (isUnit(unit) || isString(unit)) { - return x.to(unit); - } - } - - // TODO: add support for string, in that case, convert to unit - - if (isCollection(x) || isCollection(unit)) { - return collection.deepMap2(x, unit, to); - } - - throw new math.error.UnsupportedTypeError('to', x, unit); - }; -}; - -},{"../../type/Unit":213,"../../type/collection":214,"../../util/index":218}],200:[function(require,module,exports){ -module.exports = function (math) { - var object = require('../../util/object'); - - /** - * Clone an object - * - * clone(x) - * - * @param {*} x - * @return {*} clone - */ - math.clone = function clone (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('clone', arguments.length, 1); - } - - return object.clone(x); - }; -}; - -},{"../../util/object":220}],201:[function(require,module,exports){ -module.exports = function (math) { - var isMatrix = require('../../type/Matrix').isMatrix; - - /** - * Execute a callback method on each entry of the matrix or the array. - * @param {Matrix/array} x The container to iterate on. - * @param {function} callback The callback method is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix/array being traversed. - */ - math.forEach = function (x, callback) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('forEach', arguments.length, 2); - } - - if (Array.isArray(x)) { - return _forEachArray(x, callback); - } else if (isMatrix(x)) { - return x.forEach(callback); - } else { - throw new math.error.UnsupportedTypeError('forEach', x); - } - }; - - function _forEachArray (array, callback) { - var index = []; - var recurse = function (value, dim) { - if (Array.isArray(value)) { - value.forEach(function (child, i) { - index[dim] = i; // zero-based index - recurse(child, dim + 1); - }); - } - else { - callback(value, index, array); - } - }; - recurse(array, 0); - }; - -}; -},{"../../type/Matrix":211}],202:[function(require,module,exports){ -module.exports = function (math) { - var string = require('../../util/string'); - - /** - * Format a value of any type into a string. - * - * Syntax: - * - * format(value) - * format(value, options) - * format(value, precision) - * format(value, fn) - * - * Where: - * - * {*} value The value to be formatted - * {Object} options An object with formatting options. Available options: - * {String} notation - * Number notation. Choose from: - * 'fixed' Always use regular number notation. - * For example '123.40' and '14000000' - * 'exponential' Always use exponential notation. - * For example '1.234e+2' and '1.4e+7' - * 'auto' (default) Regular number notation for numbers - * having an absolute value between - * `lower` and `upper` bounds, and uses - * exponential notation elsewhere. - * Lower bound is included, upper bound - * is excluded. - * For example '123.4' and '1.4e7'. - * {Number} precision A number between 0 and 16 to round - * the digits of the number. - * In case of notations 'exponential' and - * 'auto', `precision` defines the total - * number of significant digits returned - * and is undefined by default. - * In case of notation 'fixed', - * `precision` defines the number of - * significant digits after the decimal - * point, and is 0 by default. - * {Object} exponential An object containing two parameters, - * {Number} lower and {Number} upper, - * used by notation 'auto' to determine - * when to return exponential notation. - * Default values are `lower=1e-3` and - * `upper=1e5`. - * Only applicable for notation `auto`. - * {Function} fn A custom formatting function. Can be used to override the - * built-in notations. Function `fn` is called with `value` as - * parameter and must return a string. Is useful for example to - * format all values inside a matrix in a particular way. - * - * Examples: - * - * format(6.4); // '6.4' - * format(1240000); // '1.24e6' - * format(1/3); // '0.3333333333333333' - * format(1/3, 3); // '0.333' - * format(21385, 2); // '21000' - * format(12.071, {notation: 'fixed'}); // '12' - * format(2.3, {notation: 'fixed', precision: 2}); // '2.30' - * format(52.8, {notation: 'exponential'}); // '5.28e+1' - * - * @param {*} value Value to be stringified - * @param {Object | Function | Number} [options] - * @return {String} str The formatted value - */ - math.format = function format (value, options) { - var num = arguments.length; - if (num !== 1 && num !== 2) { - throw new math.error.ArgumentsError('format', num, 1, 2); - } - - return string.format(value, options); - }; -}; - -},{"../../util/string":221}],203:[function(require,module,exports){ -module.exports = function (math) { - var util = require('../../util/index'), - - Complex = require('../../type/Complex'), - Unit = require('../../type/Unit'), - - isNumber = util.number.isNumber, - isString = util.string.isString, - isComplex = Complex.isComplex, - isUnit = Unit.isUnit; - - /** - * Import functions from an object or a file - * @param {function | String | Object} object - * @param {Object} [options] Available options: - * {Boolean} override - * If true, existing functions will be - * overwritten. False by default. - * {Boolean} wrap - * If true (default), the functions will - * be wrapped in a wrapper function which - * converts data types like Matrix to - * primitive data types like Array. - * The wrapper is needed when extending - * math.js with libraries which do not - * support the math.js data types. - */ -// TODO: return status information - math['import'] = function math_import(object, options) { - var name; - var opts = { - override: false, - wrap: true - }; - if (options && options instanceof Object) { - util.object.extend(opts, options); - } - - if (isString(object)) { - // a string with a filename - if (typeof (require) !== 'undefined') { - // load the file using require - var _module = require(object); - math_import(_module); - } - else { - throw new Error('Cannot load file: require not available.'); - } - } - else if (isSupportedType(object)) { - // a single function - name = object.name; - if (name) { - if (opts.override || math[name] === undefined) { - _import(name, object, opts); - } - } - else { - throw new Error('Cannot import an unnamed function or object'); - } - } - else if (object instanceof Object) { - // a map with functions - for (name in object) { - if (object.hasOwnProperty(name)) { - var value = object[name]; - if (isSupportedType(value)) { - _import(name, value, opts); - } - else { - math_import(value); - } - } - } - } - }; - - /** - * Add a property to the math namespace and create a chain proxy for it. - * @param {String} name - * @param {*} value - * @param {Object} options See import for a description of the options - * @private - */ - function _import(name, value, options) { - if (options.override || math[name] === undefined) { - // add to math namespace - if (options.wrap && typeof value === 'function') { - // create a wrapper around the function - math[name] = function () { - var args = []; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i] = arguments[i].valueOf(); - } - return value.apply(math, args); - }; - } - else { - // just create a link to the function or value - math[name] = value; - } - - // create a proxy for the Selector - math.chaining.Selector.createProxy(name, value); - } - } - - /** - * Check whether given object is a supported type - * @param object - * @return {Boolean} - * @private - */ - function isSupportedType(object) { - return (typeof object == 'function') || - isNumber(object) || isString(object) || - isComplex(object) || isUnit(object); - // TODO: add boolean? - } -}; - -},{"../../type/Complex":208,"../../type/Unit":213,"../../util/index":218}],204:[function(require,module,exports){ -module.exports = function (math) { - var isMatrix = require('../../type/Matrix').isMatrix; - - /** - * Create a new matrix or array with the results of the callback function executed on - * each entry of the matrix/array. - * @param {Matrix/array} x The container to iterate on. - * @param {function} callback The callback method is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix being traversed. - * @return {Matrix/array} container - */ - math.map = function (x, callback) { - if (arguments.length != 2) { - throw new math.error.ArgumentsError('map', arguments.length, 2); - } - - if (Array.isArray(x)) { - return _mapArray(x, callback); - } else if (isMatrix(x)) { - return x.map(callback); - } else { - throw new math.error.UnsupportedTypeError('map', x); - } - }; - - function _mapArray (arrayIn, callback) { - var index = []; - var recurse = function (value, dim) { - if (Array.isArray(value)) { - return value.map(function (child, i) { - index[dim] = i; - return recurse(child, dim + 1); - }); - } - else { - return callback(value, index, arrayIn); - } - }; - - return recurse(arrayIn, 0); - }; -}; - -},{"../../type/Matrix":211}],205:[function(require,module,exports){ -module.exports = function (math) { - var string = require('../../util/string'), - - isString = string.isString; - - /** - * Interpolate values into a string template. - * math.print(template, values) - * math.print(template, values, precision) - * - * Example usage: - * - * // the following outputs: 'The value of pi is 3.141592654' - * math.format('The value of pi is $pi', {pi: math.pi}, 10); - * - * // the following outputs: 'hello Mary! The date is 2013-03-23' - * math.format('Hello $user.name! The date is $date', { - * user: { - * name: 'Mary', - * }, - * date: new Date().toISOString().substring(0, 10) - * }); - * - * @param {String} template - * @param {Object} values - * @param {Number} [precision] Number of digits to format numbers. - * If not provided, the value will not be rounded. - * @return {String} str - */ - math.print = function print (template, values, precision) { - var num = arguments.length; - if (num != 2 && num != 3) { - throw new math.error.ArgumentsError('print', num, 2, 3); - } - - if (!isString(template)) { - throw new TypeError('String expected as first parameter in function format'); - } - if (!(values instanceof Object)) { - throw new TypeError('Object expected as second parameter in function format'); - } - - // format values into a string - return template.replace(/\$([\w\.]+)/g, function (original, key) { - var keys = key.split('.'); - var value = values[keys.shift()]; - while (keys.length && value !== undefined) { - var k = keys.shift(); - value = k ? value[k] : value + '.'; - } - - if (value !== undefined) { - if (!isString(value)) { - return math.format(value, precision); - } - else { - return value; - } - } - - return original; - } - ); - }; -}; - -},{"../../util/string":221}],206:[function(require,module,exports){ -module.exports = function (math) { - var types = require('../../util/types'), - - BigNumber = require('bignumber.js'), - Complex = require('../../type/Complex'), - Matrix = require('../../type/Matrix'), - Unit = require('../../type/Unit'), - Index = require('../../type/Index'), - Range = require('../../type/Range'), - Help = require('../../type/Help'); - - /** - * Determine the type of a variable - * - * typeof(x) - * - * @param {*} x - * @return {String} type Lower case type, for example 'number', 'string', - * 'array'. - */ - math['typeof'] = function _typeof (x) { - if (arguments.length != 1) { - throw new math.error.ArgumentsError('typeof', arguments.length, 1); - } - - // JavaScript types - var type = types.type(x); - - // math.js types - if (type === 'object') { - if (x instanceof Complex) return 'complex'; - if (x instanceof BigNumber) return 'bignumber'; - if (x instanceof Matrix) return 'matrix'; - if (x instanceof Unit) return 'unit'; - if (x instanceof Index) return 'index'; - if (x instanceof Range) return 'range'; - if (x instanceof Help) return 'matrix'; - - if (x instanceof math.chaining.Selector) return 'selector'; - } - - return type; - }; -}; - -},{"../../type/Complex":208,"../../type/Help":209,"../../type/Index":210,"../../type/Matrix":211,"../../type/Range":212,"../../type/Unit":213,"../../util/types":222,"bignumber.js":223}],207:[function(require,module,exports){ -var object = require('./util/object'); - -/** - * math.js factory function. - * - * Usage: - * - * var math = mathjs(); - * var math = mathjs(settings); - * - * @param {Object} [settings] Available settings: - * {String} matrix - * A string 'matrix' (default) or 'array'. - * {String} number - * A string 'number' (default) or 'bignumber' - * {Number} decimals - * The number of decimals behind the decimal - * point for BigNumber. Not applicable for Numbers. - */ -function mathjs (settings) { - // simple test for ES5 support - if (typeof Array.prototype.map !== 'function') { - throw new Error('ES5 not supported by this JavaScript engine. ' + - 'Please load the es5-shim library for compatibility.'); - } - - // create new namespace - var math = {}; - - // create configuration settings. These are private - var _settings = { - // type of default matrix output. Choose 'matrix' (default) or 'array' - matrix: 'matrix', - - // type of default number output. Choose 'number' (default) or 'bignumber' - number: 'number' - }; - - /** - * Set configuration settings for math.js, and get current settings - * @param {Object} [settings] Available settings: - * {String} matrix - * A string 'matrix' (default) or 'array'. - * {String} number - * A string 'number' (default) or 'bignumber' - * {Number} decimals - * The number of decimals behind the decimal - * point for BigNumber. Not applicable for Numbers. - * @return {Object} settings The currently applied settings - */ - math.config = function config (settings) { - var BigNumber = require('bignumber.js'); - - if (settings) { - // merge settings - object.deepExtend(_settings, settings); - - if (settings.decimals) { - BigNumber.config({ - DECIMAL_PLACES: settings.decimals - }); - } - - // TODO: remove deprecated setting some day (deprecated since version 0.17.0) - if (settings.number && settings.number.defaultType) { - throw new Error('setting `number.defaultType` is deprecated. ' + - 'Use `number` instead.') - } - - // TODO: remove deprecated setting some day (deprecated since version 0.17.0) - if (settings.number && settings.number.precision) { - throw new Error('setting `number.precision` is deprecated. ' + - 'Use `decimals` instead.') - } - - // TODO: remove deprecated setting some day (deprecated since version 0.17.0) - if (settings.matrix && settings.matrix.defaultType) { - throw new Error('setting `matrix.defaultType` is deprecated. ' + - 'Use `matrix` instead.') - } - - // TODO: remove deprecated setting some day (deprecated since version 0.15.0) - if (settings.matrix && settings.matrix['default']) { - throw new Error('setting `matrix.default` is deprecated. ' + - 'Use `matrix` instead.') - } - } - - // return a clone of the settings - var current = object.clone(_settings); - current.decimals = BigNumber.config().DECIMAL_PLACES; - return current; - }; - - // apply provided configuration settings - math.config(settings); - - // expression (parse, Parser, nodes, docs) - math.expression = {}; - math.expression.node = require('./expression/node/index.js'); - math.expression.parse = require('./expression/parse.js'); - math.expression.Scope = function () { - throw new Error('Scope is deprecated. Use a regular Object instead'); - }; - math.expression.Parser = require('./expression/Parser.js'); - math.expression.docs = require('./expression/docs/index.js'); - - // types (Matrix, Complex, Unit, ...) - math.type = {}; - math.type.BigNumber = require('bignumber.js'); - math.type.Complex = require('./type/Complex'); - math.type.Range = require('./type/Range'); - math.type.Index = require('./type/Index'); - math.type.Matrix = require('./type/Matrix'); - math.type.Unit = require('./type/Unit'); - math.type.Help = require('./type/Help'); - - math.collection = require('./type/collection'); - - // error utility functions - require('./type/error')(math); - - // expression parser - require('./function/expression/eval.js')(math, _settings); - require('./function/expression/help.js')(math, _settings); - require('./function/expression/parse.js')(math, _settings); - - // functions - arithmetic - require('./function/arithmetic/abs.js')(math, _settings); - require('./function/arithmetic/add.js')(math, _settings); - require('./function/arithmetic/ceil.js')(math, _settings); - require('./function/arithmetic/cube.js')(math, _settings); - require('./function/arithmetic/divide.js')(math, _settings); - require('./function/arithmetic/edivide.js')(math, _settings); - require('./function/arithmetic/emultiply.js')(math, _settings); - require('./function/arithmetic/epow.js')(math, _settings); - require('./function/arithmetic/equal.js')(math, _settings); - require('./function/arithmetic/exp.js')(math, _settings); - require('./function/arithmetic/fix.js')(math, _settings); - require('./function/arithmetic/floor.js')(math, _settings); - require('./function/arithmetic/gcd.js')(math, _settings); - require('./function/arithmetic/larger.js')(math, _settings); - require('./function/arithmetic/largereq.js')(math, _settings); - require('./function/arithmetic/lcm.js')(math, _settings); - require('./function/arithmetic/log.js')(math, _settings); - require('./function/arithmetic/log10.js')(math, _settings); - require('./function/arithmetic/mod.js')(math, _settings); - require('./function/arithmetic/multiply.js')(math, _settings); - require('./function/arithmetic/pow.js')(math, _settings); - require('./function/arithmetic/round.js')(math, _settings); - require('./function/arithmetic/sign.js')(math, _settings); - require('./function/arithmetic/smaller.js')(math, _settings); - require('./function/arithmetic/smallereq.js')(math, _settings); - require('./function/arithmetic/sqrt.js')(math, _settings); - require('./function/arithmetic/square.js')(math, _settings); - require('./function/arithmetic/subtract.js')(math, _settings); - require('./function/arithmetic/unary.js')(math, _settings); - require('./function/arithmetic/unequal.js')(math, _settings); - require('./function/arithmetic/xgcd.js')(math, _settings); - - // functions - complex - require('./function/complex/arg.js')(math, _settings); - require('./function/complex/conj.js')(math, _settings); - require('./function/complex/re.js')(math, _settings); - require('./function/complex/im.js')(math, _settings); - - // functions - construction - require('./function/construction/bignumber')(math, _settings); - require('./function/construction/boolean.js')(math, _settings); - require('./function/construction/complex.js')(math, _settings); - require('./function/construction/index.js')(math, _settings); - require('./function/construction/matrix.js')(math, _settings); - require('./function/construction/number.js')(math, _settings); - require('./function/construction/parser.js')(math, _settings); - require('./function/construction/select.js')(math, _settings); - require('./function/construction/string.js')(math, _settings); - require('./function/construction/unit.js')(math, _settings); - - // functions - matrix - require('./function/matrix/concat.js')(math, _settings); - require('./function/matrix/det.js')(math, _settings); - require('./function/matrix/diag.js')(math, _settings); - require('./function/matrix/eye.js')(math, _settings); - require('./function/matrix/inv.js')(math, _settings); - require('./function/matrix/ones.js')(math, _settings); - require('./function/matrix/range.js')(math, _settings); - require('./function/matrix/resize.js')(math, _settings); - require('./function/matrix/size.js')(math, _settings); - require('./function/matrix/squeeze.js')(math, _settings); - require('./function/matrix/subset.js')(math, _settings); - require('./function/matrix/transpose.js')(math, _settings); - require('./function/matrix/zeros.js')(math, _settings); - - // functions - probability - require('./function/probability/factorial.js')(math, _settings); - require('./function/probability/random.js')(math, _settings); - require('./function/probability/permutations.js')(math, _settings); - require('./function/probability/combinations.js')(math, _settings); - - // functions - statistics - require('./function/statistics/min.js')(math, _settings); - require('./function/statistics/max.js')(math, _settings); - require('./function/statistics/mean.js')(math, _settings); - - // functions - trigonometry - require('./function/trigonometry/acos.js')(math, _settings); - require('./function/trigonometry/asin.js')(math, _settings); - require('./function/trigonometry/atan.js')(math, _settings); - require('./function/trigonometry/atan2.js')(math, _settings); - require('./function/trigonometry/cos.js')(math, _settings); - require('./function/trigonometry/cot.js')(math, _settings); - require('./function/trigonometry/csc.js')(math, _settings); - require('./function/trigonometry/sec.js')(math, _settings); - require('./function/trigonometry/sin.js')(math, _settings); - require('./function/trigonometry/tan.js')(math, _settings); - - // functions - units - require('./function/units/to.js')(math, _settings); - - // functions - utils - require('./function/utils/clone.js')(math, _settings); - require('./function/utils/format.js')(math, _settings); - require('./function/utils/import.js')(math, _settings); - require('./function/utils/map.js')(math, _settings); - require('./function/utils/print.js')(math, _settings); - require('./function/utils/typeof.js')(math, _settings); - require('./function/utils/forEach.js')(math, _settings); - - // constants - require('./constants.js')(math, _settings); - - // selector (we initialize after all functions are loaded) - math.chaining = {}; - math.chaining.Selector = require('./chaining/Selector.js')(math, _settings); - - // return the new instance - return math; -} - - -// return the mathjs factory -module.exports = mathjs; - -},{"./chaining/Selector.js":2,"./constants.js":3,"./expression/Parser.js":4,"./expression/docs/index.js":104,"./expression/node/index.js":119,"./expression/parse.js":120,"./function/arithmetic/abs.js":121,"./function/arithmetic/add.js":122,"./function/arithmetic/ceil.js":123,"./function/arithmetic/cube.js":124,"./function/arithmetic/divide.js":125,"./function/arithmetic/edivide.js":126,"./function/arithmetic/emultiply.js":127,"./function/arithmetic/epow.js":128,"./function/arithmetic/equal.js":129,"./function/arithmetic/exp.js":130,"./function/arithmetic/fix.js":131,"./function/arithmetic/floor.js":132,"./function/arithmetic/gcd.js":133,"./function/arithmetic/larger.js":134,"./function/arithmetic/largereq.js":135,"./function/arithmetic/lcm.js":136,"./function/arithmetic/log.js":137,"./function/arithmetic/log10.js":138,"./function/arithmetic/mod.js":139,"./function/arithmetic/multiply.js":140,"./function/arithmetic/pow.js":141,"./function/arithmetic/round.js":142,"./function/arithmetic/sign.js":143,"./function/arithmetic/smaller.js":144,"./function/arithmetic/smallereq.js":145,"./function/arithmetic/sqrt.js":146,"./function/arithmetic/square.js":147,"./function/arithmetic/subtract.js":148,"./function/arithmetic/unary.js":149,"./function/arithmetic/unequal.js":150,"./function/arithmetic/xgcd.js":151,"./function/complex/arg.js":152,"./function/complex/conj.js":153,"./function/complex/im.js":154,"./function/complex/re.js":155,"./function/construction/bignumber":156,"./function/construction/boolean.js":157,"./function/construction/complex.js":158,"./function/construction/index.js":159,"./function/construction/matrix.js":160,"./function/construction/number.js":161,"./function/construction/parser.js":162,"./function/construction/select.js":163,"./function/construction/string.js":164,"./function/construction/unit.js":165,"./function/expression/eval.js":166,"./function/expression/help.js":167,"./function/expression/parse.js":168,"./function/matrix/concat.js":169,"./function/matrix/det.js":170,"./function/matrix/diag.js":171,"./function/matrix/eye.js":172,"./function/matrix/inv.js":173,"./function/matrix/ones.js":174,"./function/matrix/range.js":175,"./function/matrix/resize.js":176,"./function/matrix/size.js":177,"./function/matrix/squeeze.js":178,"./function/matrix/subset.js":179,"./function/matrix/transpose.js":180,"./function/matrix/zeros.js":181,"./function/probability/combinations.js":182,"./function/probability/factorial.js":183,"./function/probability/permutations.js":184,"./function/probability/random.js":185,"./function/statistics/max.js":186,"./function/statistics/mean.js":187,"./function/statistics/min.js":188,"./function/trigonometry/acos.js":189,"./function/trigonometry/asin.js":190,"./function/trigonometry/atan.js":191,"./function/trigonometry/atan2.js":192,"./function/trigonometry/cos.js":193,"./function/trigonometry/cot.js":194,"./function/trigonometry/csc.js":195,"./function/trigonometry/sec.js":196,"./function/trigonometry/sin.js":197,"./function/trigonometry/tan.js":198,"./function/units/to.js":199,"./function/utils/clone.js":200,"./function/utils/forEach.js":201,"./function/utils/format.js":202,"./function/utils/import.js":203,"./function/utils/map.js":204,"./function/utils/print.js":205,"./function/utils/typeof.js":206,"./type/Complex":208,"./type/Help":209,"./type/Index":210,"./type/Matrix":211,"./type/Range":212,"./type/Unit":213,"./type/collection":214,"./type/error":215,"./util/object":220,"bignumber.js":223}],208:[function(require,module,exports){ -var util = require('../util/index'), - number = util.number, - - isNumber = util.number.isNumber, - isString = util.string.isString; - -/** - * @constructor Complex - * - * A complex value can be constructed in the following ways: - * var a = new Complex(); - * var b = new Complex(re, im); - * var c = Complex.parse(str); - * - * Example usage: - * var a = new Complex(3, -4); // 3 - 4i - * a.re = 5; // a = 5 - 4i - * var i = a.im; // -4; - * var b = Complex.parse('2 + 6i'); // 2 + 6i - * var c = new Complex(); // 0 + 0i - * var d = math.add(a, b); // 5 + 2i - * - * @param {Number} re The real part of the complex value - * @param {Number} [im] The imaginary part of the complex value - */ -function Complex(re, im) { - if (!(this instanceof Complex)) { - throw new SyntaxError( - 'Complex constructor must be called with the new operator'); - } - - switch (arguments.length) { - case 0: - this.re = 0; - this.im = 0; - break; - - case 2: - if (!isNumber(re) || !isNumber(im)) { - throw new TypeError('Two numbers expected in Complex constructor'); - } - this.re = re; - this.im = im; - break; - - default: - if (arguments.length != 0 && arguments.length != 2) { - throw new SyntaxError( - 'Two or zero arguments expected in Complex constructor'); - } - break; - } -} - -/** - * Test whether value is a Complex value - * @param {*} value - * @return {Boolean} isComplex - */ -Complex.isComplex = function isComplex(value) { - return (value instanceof Complex); -}; - -// private variables and functions for the parser -var text, index, c; - -function skipWhitespace() { - while (c == ' ' || c == '\t') { - next(); - } -} - -function isDigitDot (c) { - return ((c >= '0' && c <= '9') || c == '.'); -} - -function isDigit (c) { - return ((c >= '0' && c <= '9')); -} - -function next() { - index++; - c = text.charAt(index); -} - -function revert(oldIndex) { - index = oldIndex; - c = text.charAt(index); -} - -function parseNumber () { - var number = ''; - var oldIndex; - oldIndex = index; - - if (c == '+') { - next(); - } - else if (c == '-') { - number += c; - next(); - } - - if (!isDigitDot(c)) { - // a + or - must be followed by a digit - revert(oldIndex); - return null; - } - - // get number, can have a single dot - if (c == '.') { - number += c; - next(); - if (!isDigit(c)) { - // this is no legal number, it is just a dot - revert(oldIndex); - return null; - } - } - else { - while (isDigit(c)) { - number += c; - next(); - } - if (c == '.') { - number += c; - next(); - } - } - while (isDigit(c)) { - number += c; - next(); - } - - // check for exponential notation like "2.3e-4" or "1.23e50" - if (c == 'E' || c == 'e') { - number += c; - next(); - - if (c == '+' || c == '-') { - number += c; - next(); - } - - // Scientific notation MUST be followed by an exponent - if (!isDigit(c)) { - // this is no legal number, exponent is missing. - revert(oldIndex); - return null; - } - - while (isDigit(c)) { - number += c; - next(); - } - } - - return number; -} - -function parseComplex () { - // check for 'i', '-i', '+i' - var cnext = text.charAt(index + 1); - if (c == 'I' || c == 'i') { - next(); - return '1'; - } - else if ((c == '+' || c == '-') && (cnext == 'I' || cnext == 'i')) { - var number = (c == '+') ? '1' : '-1'; - next(); - next(); - return number; - } - - return null; -} - -/** - * Parse a complex number from a string. For example Complex.parse("2 + 3i") - * will return a Complex value where re = 2, im = 3. - * Returns null if provided string does not contain a valid complex number. - * @param {String} str - * @returns {Complex | null} complex - */ -Complex.parse = function parse (str) { - text = str; - index = -1; - c = ''; - - if (!isString(text)) { - return null; - } - - next(); - skipWhitespace(); - var first = parseNumber(); - if (first) { - if (c == 'I' || c == 'i') { - // pure imaginary number - next(); - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - return new Complex(0, Number(first)); - } - else { - // complex and real part - skipWhitespace(); - var separator = c; - if (separator != '+' && separator != '-') { - // pure real number - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - return new Complex(Number(first), 0); - } - else { - // complex and real part - next(); - skipWhitespace(); - var second = parseNumber(); - if (second) { - if (c != 'I' && c != 'i') { - // 'i' missing at the end of the complex number - return null; - } - next(); - } - else { - second = parseComplex(); - if (!second) { - // imaginary number missing after separator - return null; - } - } - - if (separator == '-') { - if (second[0] == '-') { - second = '+' + second.substring(1); - } - else { - second = '-' + second; - } - } - - next(); - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - return new Complex(Number(first), Number(second)); - } - } - } - else { - // check for 'i', '-i', '+i' - first = parseComplex(); - if (first) { - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - return new Complex(0, Number(first)); - } - } - - return null; -}; - -/** - * Create a copy of the complex value - * @return {Complex} clone - */ -Complex.prototype.clone = function clone () { - return new Complex(this.re, this.im); -}; - -/** - * Test whether this complex number equals an other complex value. - * Two complex numbers are equal when both their real and imaginary parts - * are equal. - * @param {Complex} other - * @return {boolean} isEqual - */ -Complex.prototype.equals = function equals (other) { - return (this.re === other.re) && (this.im === other.im); -}; - -/** - * Get a string representation of the complex number, - * with optional formatting options. - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @return {String} str - */ -Complex.prototype.format = function format (options) { - var str = '', - strRe = number.format(this.re, options), - strIm = number.format(this.im, options); - - if (this.im == 0) { - // real value - str = strRe; - } - else if (this.re == 0) { - // purely complex value - if (this.im == 1) { - str = 'i'; - } - else if (this.im == -1) { - str = '-i'; - } - else { - str = strIm + 'i'; - } - } - else { - // complex value - if (this.im > 0) { - if (this.im == 1) { - str = strRe + ' + i'; - } - else { - str = strRe + ' + ' + strIm + 'i'; - } - } - else { - if (this.im == -1) { - str = strRe + ' - i'; - } - else { - str = strRe + ' - ' + strIm.substring(1) + 'i'; - } - } - } - - return str; -}; - -/** - * Get a string representation of the complex number. - * @return {String} str - */ -Complex.prototype.toString = function toString () { - return this.format(); -}; - -// exports -module.exports = Complex; - -// to trick my IDE which doesn't get it -exports.isComplex = Complex.isComplex; -exports.parse = Complex.parse; - -},{"../util/index":218}],209:[function(require,module,exports){ -var util = require('../util/index'), - object = util.object, - string = util.string; - -/** - * Documentation object - * @param {Object} math The math.js namespace - * @param {Object} doc Object containing properties: - * {String} name - * {String} category - * {String[]} syntax - * {String[]} examples - * {String[]} seealso - * @constructor - */ -function Help (math, doc) { - this.math = math; - this.doc = doc; -} - -/** - * Test whether a value is an instance of Help - * @param {*} value - * @return {Boolean} isHelp - */ -Help.isHelp = function isHelp (value) { - return (value instanceof Help); -}; - -/** - * Generate readable description from a Help object - * @return {String} readableDoc - * @private - */ -Help.prototype.toString = function () { - var doc = this.doc || {}; - var desc = '\n'; - - if (doc.name) { - desc += 'Name: ' + doc.name + '\n\n'; - } - if (doc.category) { - desc += 'Category: ' + doc.category + '\n\n'; - } - if (doc.description) { - desc += 'Description:\n ' + doc.description + '\n\n'; - } - if (doc.syntax) { - desc += 'Syntax:\n ' + doc.syntax.join('\n ') + '\n\n'; - } - if (doc.examples) { - var parser = this.math.parser(); - desc += 'Examples:\n'; - for (var i = 0; i < doc.examples.length; i++) { - var expr = doc.examples[i]; - var res; - try { - res = parser.eval(expr); - } - catch (e) { - res = e; - } - desc += ' ' + expr + '\n'; - if (res && !(res instanceof Help)) { - desc += ' ' + string.format(res) + '\n'; - } - } - desc += '\n'; - } - if (doc.seealso) { - desc += 'See also: ' + doc.seealso.join(', ') + '\n'; - } - - return desc; -}; - -// TODO: implement a toHTML function in Help - -/** - * Export the help object to JSON - */ -Help.prototype.toJSON = function () { - return object.extend({}, this.doc); -}; - -// exports -module.exports = Help; - -// to trick my IDE which doesn't get it -exports.isHelp = Help.isHelp; - -},{"../util/index":218}],210:[function(require,module,exports){ -var util = require('../util/index'), - - Range = require('./Range'), - - number = util.number, - - isNumber = number.isNumber, - isInteger = number.isInteger, - isArray = Array.isArray, - validateIndex = util.array.validateIndex; - -/** - * @Constructor Index - * Create an index. An Index can store ranges having start, step, and end - * for multiple dimensions. - * Matrix.get, Matrix.set, and math.subset accept an Index as input. - * - * Usage: - * var index = new Index(range1, range2, ...); - * - * Where each range can be any of: - * An array [start, end] - * An array [start, end, step] - * A number - * An instance of Range - * - * The parameters start, end, and step must be integer numbers. - * - * @param {...*} ranges - */ -function Index(ranges) { - if (!(this instanceof Index)) { - throw new SyntaxError( - 'Index constructor must be called with the new operator'); - } - - this._ranges = []; - - for (var i = 0, ii = arguments.length; i < ii; i++) { - var arg = arguments[i]; - - if (arg instanceof Range) { - this._ranges.push(arg); - } - else { - if (arg) { - arg = arg.valueOf(); - } - - if (isArray(arg)) { - this._ranges.push(_createRange(arg)); - } - else if (isNumber(arg)) { - this._ranges.push(_createRange([arg, arg + 1])); - } - // TODO: implement support for wildcard '*' - else { - throw new TypeError('Range expected as Array, Number, or String'); - } - } - } -} - -/** - * Parse an argument into a range and validate the range - * @param {Array} arg An array with [start: Number, end: Number] and - * optional a third element step:Number - * @return {Range} range - * @private - */ -function _createRange(arg) { - // TODO: make function _createRange simpler/faster - - // test whether all arguments are integers - var num = arg.length; - for (var i = 0; i < num; i++) { - if (!isNumber(arg[i]) || !isInteger(arg[i])) { - throw new TypeError('Index parameters must be integer numbers'); - } - } - - switch (arg.length) { - case 2: - return new Range(arg[0], arg[1]); // start, end - case 3: - return new Range(arg[0], arg[1], arg[2]); // start, end, step - default: - // TODO: improve error message - throw new SyntaxError('Wrong number of arguments in Index (2 or 3 expected)'); - } -} - -/** - * Create a clone of the index - * @return {Index} clone - */ -Index.prototype.clone = function clone () { - var index = new Index(); - index._ranges = util.object.clone(this._ranges); - return index; -}; - -/** - * Test whether an object is an Index - * @param {*} object - * @return {Boolean} isIndex - */ -Index.isIndex = function isIndex(object) { - return (object instanceof Index); -}; - -/** - * Create an index from an array with ranges/numbers - * @param {Array.} ranges - * @return {Index} index - * @private - */ -Index.create = function create(ranges) { - var index = new Index(); - Index.apply(index, ranges); - return index; -}; - -/** - * Retrieve the size of the index, the number of elements for each dimension. - * @returns {Number[]} size - */ -Index.prototype.size = function size () { - var size = []; - - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - var range = this._ranges[i]; - - size[i] = range.size()[0]; - } - - return size; -}; - -/** - * Get the maximum value for each of the indexes ranges. - * @returns {Number[]} max - */ -Index.prototype.max = function max () { - var values = []; - - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - var range = this._ranges[i]; - values[i] = range.max(); - } - - return values; -}; - -/** - * Get the minimum value for each of the indexes ranges. - * @returns {Number[]} min - */ -Index.prototype.min = function min () { - var values = []; - - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - var range = this._ranges[i]; - - values[i] = range.min(); - } - - return values; -}; - -/** - * Loop over each of the ranges of the index - * @param {function} callback Called for each range with a Range as first - * argument, the dimension as second, and the - * index object as third. - */ -Index.prototype.forEach = function forEach(callback) { - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - callback(this._ranges[i], i, this); - } -}; - -/** - * Retrieve the range for a given dimension number from the index - * @param {Number} dim Number of the dimension - * @returns {Range | undefined} range - */ -Index.prototype.range = function range (dim) { - return this._ranges[dim]; -}; - -/** - * Test whether this index contains only a single value - * @return {boolean} isScalar - */ -Index.prototype.isScalar = function isScalar () { - var size = this.size(); - - for (var i = 0, ii = size.length; i < ii; i++) { - if (size[i] !== 1) { - return false; - } - } - - return true; -}; - -/** - * Expand the Index into an array. - * For example new Index([0,3], [2,7]) returns [[0,1,2], [2,3,4,5,6]] - * @returns {Array} array - */ -Index.prototype.toArray = function toArray() { - var array = []; - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - var range = this._ranges[i], - row = [], - x = range.start, - end = range.end, - step = range.step; - - if (step > 0) { - while (x < end) { - row.push(x); - x += step; - } - } - else if (step < 0) { - while (x > end) { - row.push(x); - x += step; - } - } - - array.push(row); - } - - return array; -}; - -/** - * Get the primitive value of the Index, a two dimensional array. - * Equivalent to Index.toArray(). - * @returns {Array} array - */ -Index.prototype.valueOf = Index.prototype.toArray; - -/** - * Get the string representation of the index, for example '[2:6]' or '[0:2:10, 4:7]' - * @returns {String} str - */ -Index.prototype.toString = function () { - var strings = []; - - for (var i = 0, ii = this._ranges.length; i < ii; i++) { - var range = this._ranges[i]; - var str = number.format(range.start); - if (range.step != 1) { - str += ':' + number.format(range.step); - } - str += ':' + number.format(range.end); - strings.push(str); - } - - return '[' + strings.join(',') + ']'; -}; - -// exports -module.exports = Index; - -// to trick my IDE which doesn't get it -exports.isIndex = Index.isIndex; -exports.create = Index.create; - -},{"../util/index":218,"./Range":212}],211:[function(require,module,exports){ -var util = require('../util/index'), - Index = require('./Index'), - - number = util.number, - string = util.string, - array = util.array, - object = util.object, - - isArray = Array.isArray, - validateIndex = array.validateIndex; - -/** - * @constructor Matrix - * - * A Matrix is a wrapper around an Array. A matrix can hold a multi dimensional - * array. A matrix can be constructed as: - * var matrix = new Matrix(data) - * - * Matrix contains the functions to resize, get and set values, get the size, - * clone the matrix and to convert the matrix to a vector, array, or scalar. - * Furthermore, one can iterate over the matrix using map and forEach. - * The internal Array of the Matrix can be accessed using the function valueOf. - * - * Example usage: - * var matrix = new Matrix([[1, 2], [3, 4]); - * matix.size(); // [2, 2] - * matrix.resize([3, 2], 5); - * matrix.valueOf(); // [[1, 2], [3, 4], [5, 5]] - * matrix.subset([1,2]) // 3 (indexes are zero-based) - * - * @param {Array | Matrix} [data] A multi dimensional array - */ -function Matrix(data) { - if (!(this instanceof Matrix)) { - throw new SyntaxError( - 'Matrix constructor must be called with the new operator'); - } - - if (data instanceof Matrix) { - // clone data from a Matrix - this._data = data.clone()._data; - } - else if (isArray(data)) { - // use array - // replace nested Matrices with Arrays - this._data = preprocess(data); - } - else if (data != null) { - // unsupported type - throw new TypeError('Unsupported type of data (' + util.types.type(data) + ')'); - } - else { - // nothing provided - this._data = []; - } - - // verify the size of the array - this._size = array.size(this._data); -} - -/** - * Test whether an object is a Matrix - * @param {*} object - * @return {Boolean} isMatrix - */ -Matrix.isMatrix = function isMatrix(object) { - return (object instanceof Matrix); -}; - -/** - * Get a subset of the matrix, or replace a subset of the matrix. - * - * Usage: - * var subset = matrix.subset(index) // retrieve subset - * var value = matrix.subset(index, replacement) // replace subset - * - * @param {Index} index - * @param {Array | Matrix | *} [replacement] - * @param {*} [defaultValue] Default value, filled in on new entries when - * the matrix is resized. If not provided, - * new matrix elements will be left undefined. - */ -Matrix.prototype.subset = function subset(index, replacement, defaultValue) { - switch (arguments.length) { - case 1: - return _get(this, index); - - // intentional fall through - case 2: - case 3: - return _set(this, index, replacement, defaultValue); - - default: - throw new SyntaxError('Wrong number of arguments'); - } -}; - -/** - * Get a single element from the matrix. - * @param {Number[]} index Zero-based index - * @return {*} value - */ -Matrix.prototype.get = function get(index) { - if (!isArray(index)) { - throw new Error('Array expected'); - } - if (index.length != this._size.length) { - throw new RangeError('Dimension mismatch ' + - '(' + index.length + ' != ' + this._size.length + ')'); - } - - var data = this._data; - for (var i = 0, ii = index.length; i < ii; i++) { - var index_i = index[i]; - validateIndex(index_i, data.length); - data = data[index_i]; - } - - return object.clone(data); -}; - -/** - * Replace a single element in the matrix. - * @param {Number[]} index Zero-based index - * @param {*} value - * @param {*} [defaultValue] Default value, filled in on new entries when - * the matrix is resized. If not provided, - * new matrix elements will be left undefined. - * @return {Matrix} self - */ -Matrix.prototype.set = function set (index, value, defaultValue) { - var i, ii; - - // validate input type and dimensions - if (!isArray(index)) { - throw new Error('Array expected'); - } - if (index.length < this._size.length) { - throw new RangeError('Dimension mismatch ' + - '(' + index.length + ' < ' + this._size.length + ')'); - } - - // enlarge matrix when needed - var size = index.map(function (i) { - return i + 1; - }); - _fit(this, size, defaultValue); - - // traverse over the dimensions - var data = this._data; - for (i = 0, ii = index.length - 1; i < ii; i++) { - var index_i = index[i]; - validateIndex(index_i, data.length); - data = data[index_i]; - } - - // set new value - index_i = index[index.length - 1]; - validateIndex(index_i, data.length); - data[index_i] = value; - - return this; -}; - -/** - * Get a submatrix of this matrix - * @param {Matrix} matrix - * @param {Index} index Zero-based index - * @private - */ -function _get (matrix, index) { - if (!(index instanceof Index)) { - throw new TypeError('Invalid index'); - } - - var isScalar = index.isScalar(); - if (isScalar) { - // return a scalar - return matrix.get(index.min()); - } - else { - // validate dimensions - var size = index.size(); - if (size.length != matrix._size.length) { - throw new RangeError('Dimension mismatch ' + - '(' + size.length + ' != ' + matrix._size.length + ')'); - } - - // retrieve submatrix - var submatrix = new Matrix(_getSubmatrix(matrix._data, index, size.length, 0)); - // TODO: more efficient when creating an empty matrix and setting _data and _size manually - - // squeeze matrix output - while (isArray(submatrix._data) && submatrix._data.length == 1) { - submatrix._data = submatrix._data[0]; - submatrix._size.shift(); - } - - return submatrix; - } -} - -/** - * Recursively get a submatrix of a multi dimensional matrix. - * Index is not checked for correct number of dimensions. - * @param {Array} data - * @param {Index} index - * @param {number} dims Total number of dimensions - * @param {number} dim Current dimension - * @return {Array} submatrix - * @private - */ -function _getSubmatrix (data, index, dims, dim) { - var last = (dim == dims - 1); - var range = index.range(dim); - - if (last) { - return range.map(function (i) { - validateIndex(i, data.length); - return data[i]; - }); - } - else { - return range.map(function (i) { - validateIndex(i, data.length); - var child = data[i]; - return _getSubmatrix(child, index, dims, dim + 1); - }); - } -} - -/** - * Replace a submatrix in this matrix - * Indexes are zero-based. - * @param {Matrix} matrix - * @param {Index} index - * @param {Matrix | Array | *} submatrix - * @param {*} [defaultValue] Default value, filled in on new entries when - * the matrix is resized. If not provided, - * new matrix elements will be left undefined. - * @return {Matrix} matrix - * @private - */ -function _set (matrix, index, submatrix, defaultValue) { - if (!(index instanceof Index)) { - throw new TypeError('Invalid index'); - } - - // get index size and check whether the index contains a single value - var iSize = index.size(), - isScalar = index.isScalar(); - - // calculate the size of the submatrix, and convert it into an Array if needed - var sSize; - if (submatrix instanceof Matrix) { - sSize = submatrix.size(); - submatrix = submatrix.valueOf(); - } - else { - sSize = array.size(submatrix); - } - - if (isScalar) { - // set a scalar - - // check whether submatrix is a scalar - if (sSize.length != 0) { - throw new TypeError('Scalar value expected'); - } - - matrix.set(index.min(), submatrix, defaultValue); - } - else { - // set a submatrix - - // validate dimensions - if (iSize.length < matrix._size.length) { - throw new RangeError('Dimension mismatch ' + - '(' + iSize.length + ' < ' + matrix._size.length + ')'); - } - - // unsqueeze the submatrix when needed - for (var i = 0, ii = iSize.length - sSize.length; i < ii; i++) { - submatrix = [submatrix]; - sSize.unshift(1); - } - - // check whether the size of the submatrix matches the index size - if (!object.deepEqual(iSize, sSize)) { - throw new RangeError('Dimensions mismatch ' + - '(' + string.format(iSize) + ' != '+ string.format(sSize) + ')'); - } - - // enlarge matrix when needed - var size = index.max().map(function (i) { - return i + 1; - }); - _fit(matrix, size, defaultValue); - - // insert the sub matrix - var dims = iSize.length, - dim = 0; - _setSubmatrix (matrix._data, index, submatrix, dims, dim); - } - - return matrix; -} - -/** - * Replace a submatrix of a multi dimensional matrix. - * @param {Array} data - * @param {Index} index - * @param {Array} submatrix - * @param {number} dims Total number of dimensions - * @param {number} dim - * @private - */ -function _setSubmatrix (data, index, submatrix, dims, dim) { - var last = (dim == dims - 1), - range = index.range(dim); - - if (last) { - range.forEach(function (dataIndex, subIndex) { - validateIndex(dataIndex); - data[dataIndex] = submatrix[subIndex]; - }); - } - else { - range.forEach(function (dataIndex, subIndex) { - validateIndex(dataIndex); - _setSubmatrix(data[dataIndex], index, submatrix[subIndex], dims, dim + 1); - }); - } -} - -/** - * Resize the matrix - * @param {Number[]} size - * @param {*} [defaultValue] Default value, filled in on new entries. - * If not provided, the matrix elements will - * be left undefined. - * @return {Matrix} self The matrix itself is returned - */ -Matrix.prototype.resize = function resize(size, defaultValue) { - this._size = object.clone(size); - this._data = array.resize(this._data, this._size, defaultValue); - - // return the matrix itself - return this; -}; - -/** - * Enlarge the matrix when it is smaller than given size. - * If the matrix is larger or equal sized, nothing is done. - * @param {Matrix} matrix The matrix to be resized - * @param {Number[]} size - * @param {*} [defaultValue] Default value, filled in on new entries. - * If not provided, the matrix elements will - * be left undefined. - * @private - */ -function _fit(matrix, size, defaultValue) { - if (!isArray(size)) { - throw new Error('Array expected'); - } - - var newSize = object.clone(matrix._size), - changed = false; - - // add dimensions when needed - while (newSize.length < size.length) { - newSize.unshift(0); - changed = true; - } - - // enlarge size when needed - for (var i = 0, ii = size.length; i < ii; i++) { - if (size[i] > newSize[i]) { - newSize[i] = size[i]; - changed = true; - } - } - - if (changed) { - // resize only when size is changed - matrix.resize(newSize, defaultValue); - } -} - -/** - * Create a clone of the matrix - * @return {Matrix} clone - */ -Matrix.prototype.clone = function clone() { - var matrix = new Matrix(); - matrix._data = object.clone(this._data); - matrix._size = object.clone(this._size); - return matrix; -}; - -/** - * Retrieve the size of the matrix. - * @returns {Number[]} size - */ -Matrix.prototype.size = function size() { - return this._size; -}; - -/** - * Create a new matrix with the results of the callback function executed on - * each entry of the matrix. - * @param {function} callback The callback function is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix being traversed. - * @return {Matrix} matrix - */ -Matrix.prototype.map = function map(callback) { - var me = this; - var matrix = new Matrix(); - var index = []; - var recurse = function (value, dim) { - if (isArray(value)) { - return value.map(function (child, i) { - index[dim] = i; - return recurse(child, dim + 1); - }); - } - else { - return callback(value, index, me); - } - }; - matrix._data = recurse(this._data, 0); - matrix._size = object.clone(this._size); - - return matrix; -}; - -/** - * Execute a callback function on each entry of the matrix. - * @param {function} callback The callback function is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix being traversed. - */ -Matrix.prototype.forEach = function forEach(callback) { - var me = this; - var index = []; - var recurse = function (value, dim) { - if (isArray(value)) { - value.forEach(function (child, i) { - index[dim] = i; - recurse(child, dim + 1); - }); - } - else { - callback(value, index, me); - } - }; - recurse(this._data, 0); -}; - -/** - * Create an Array with a copy of the data of the Matrix - * @returns {Array} array - */ -Matrix.prototype.toArray = function toArray() { - return object.clone(this._data); -}; - -/** - * Get the primitive value of the Matrix: a multidimensional array - * @returns {Array} array - */ -Matrix.prototype.valueOf = function valueOf() { - return this._data; -}; - -/** - * Get a string representation of the matrix, with optional formatting options. - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @returns {String} str - */ -Matrix.prototype.format = function format(options) { - return string.format(this._data, options); -}; - -/** - * Get a string representation of the matrix - * @returns {String} str - */ -Matrix.prototype.toString = function toString() { - return string.format(this._data); -}; - -/** - * Preprocess data, which can be an Array or Matrix with nested Arrays and - * Matrices. Replaces all nested Matrices with Arrays - * @param {Array} data - * @return {Array} data - */ -function preprocess(data) { - for (var i = 0, ii = data.length; i < ii; i++) { - var elem = data[i]; - if (isArray(elem)) { - data[i] = preprocess(elem); - } - else if (elem instanceof Matrix) { - data[i] = preprocess(elem._data); - } - } - - return data; -} - -// exports -module.exports = Matrix; - -// to trick my IDE which doesn't get it -exports.isMatrix = Matrix.isMatrix; - -},{"../util/index":218,"./Index":210}],212:[function(require,module,exports){ -var util = require('../util/index'), - - number = util.number, - string = util.string, - array = util.array; - -/** - * @constructor Range - * Create a range. A range has a start, step, and end, and contains functions - * to iterate over the range. - * - * A range can be constructed as: - * var range = new Range(start, end); - * var range = new Range(start, end, step); - * - * To get the result of the range: - * range.forEach(function (x) { - * console.log(x); - * }); - * range.map(function (x) { - * return math.sin(x); - * }); - * range.toArray(); - * - * Example usage: - * var c = new Range(2, 6); // 2:1:5 - * c.toArray(); // [2, 3, 4, 5] - * var d = new Range(2, -3, -1); // 2:-1:-2 - * d.toArray(); // [2, 1, 0, -1, -2] - * - * @param {Number} start included lower bound - * @param {Number} end excluded upper bound - * @param {Number} [step] step size, default value is 1 - */ -function Range(start, end, step) { - if (!(this instanceof Range)) { - throw new SyntaxError( - 'Range constructor must be called with the new operator'); - } - - if (start != null && !number.isNumber(start)) { - throw new TypeError('Parameter start must be a number'); - } - if (end != null && !number.isNumber(end)) { - throw new TypeError('Parameter end must be a number'); - } - if (step != null && !number.isNumber(step)) { - throw new TypeError('Parameter step must be a number'); - } - - this.start = (start != null) ? parseFloat(start) : 0; - this.end = (end != null) ? parseFloat(end) : 0; - this.step = (step != null) ? parseFloat(step) : 1; -} - -/** - * Parse a string into a range, - * The string contains the start, optional step, and end, separated by a colon. - * If the string does not contain a valid range, null is returned. - * For example str='0:2:11'. - * @param {String} str - * @return {Range | null} range - */ -Range.parse = function parse (str) { - if (!string.isString(str)) { - return null; - } - - var args = str.split(':'); - var nums = args.map(function (arg) { - return parseFloat(arg); - }); - - var invalid = nums.some(function (num) { - return isNaN(num); - }); - if(invalid) { - return null; - } - - switch (nums.length) { - case 2: return new Range(nums[0], nums[1]); - case 3: return new Range(nums[0], nums[2], nums[1]); - default: return null; - } -}; - -/** - * Create a clone of the range - * @return {Range} clone - */ -Range.prototype.clone = function clone() { - return new Range(this.start, this.end, this.step); -}; - -/** - * Test whether an object is a Range - * @param {*} object - * @return {Boolean} isRange - */ -Range.isRange = function isRange(object) { - return (object instanceof Range); -}; - -/** - * Retrieve the size of the range. - * Returns an array containing one number, the number of elements in the range. - * @returns {Number[]} size - */ -Range.prototype.size = function size() { - var len = 0, - start = this.start, - step = this.step, - end = this.end, - diff = end - start; - - if (number.sign(step) == number.sign(diff)) { - len = Math.ceil((diff) / step); - } - else if (diff == 0) { - len = 0; - } - - if (isNaN(len)) { - len = 0; - } - return [len]; -}; - -/** - * Calculate the minimum value in the range - * @return {Number | undefined} min - */ -Range.prototype.min = function min () { - var size = this.size()[0]; - - if (size > 0) { - if (this.step > 0) { - // positive step - return this.start; - } - else { - // negative step - return this.start + (size - 1) * this.step; - } - } - else { - return undefined; - } -}; - -/** - * Calculate the maximum value in the range - * @return {Number | undefined} max - */ -Range.prototype.max = function max () { - var size = this.size()[0]; - - if (size > 0) { - if (this.step > 0) { - // positive step - return this.start + (size - 1) * this.step; - } - else { - // negative step - return this.start; - } - } - else { - return undefined; - } -}; - - -/** - * Execute a callback function for each value in the range. - * @param {function} callback The callback method is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix being traversed. - */ -Range.prototype.forEach = function forEach(callback) { - var x = this.start; - var step = this.step; - var end = this.end; - var i = 0; - - if (step > 0) { - while (x < end) { - callback(x, i, this); - x += step; - i++; - } - } - else if (step < 0) { - while (x > end) { - callback(x, i, this); - x += step; - i++; - } - } -}; - -/** - * Execute a callback function for each value in the Range, and return the - * results as an array - * @param {function} callback The callback method is invoked with three - * parameters: the value of the element, the index - * of the element, and the Matrix being traversed. - * @returns {Array} array - */ -Range.prototype.map = function map(callback) { - var array = []; - this.forEach(function (value, index, obj) { - array[index] = callback(value, index, obj); - }); - return array; -}; - -/** - * Create an Array with a copy of the Ranges data - * @returns {Array} array - */ -Range.prototype.toArray = function toArray() { - var array = []; - this.forEach(function (value, index) { - array[index] = value; - }); - return array; -}; - -/** - * Get the primitive value of the Range, a one dimensional array - * @returns {Array} array - */ -Range.prototype.valueOf = function valueOf() { - // TODO: implement a caching mechanism for range.valueOf() - return this.toArray(); -}; - -/** - * Get a string representation of the range, with optional formatting options. - * Output is formatted as 'start:step:end', for example '2:6' or '0:0.2:11' - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @returns {String} str - */ -Range.prototype.format = function format(options) { - var str = number.format(this.start, options); - - if (this.step != 1) { - str += ':' + number.format(this.step, options); - } - str += ':' + number.format(this.end, options); - return str; -}; - -/** - * Get a string representation of the range. - * @returns {String} - */ -Range.prototype.toString = function toString() { - return this.format(); -}; - -// exports -module.exports = Range; - -// to trick my IDE which doesn't get it -exports.isRange = Range.isRange; -exports.parse = Range.parse; - -},{"../util/index":218}],213:[function(require,module,exports){ -var util = require('../util/index'), - - number = util.number, - string = util.string, - isNumber = util.number.isNumber, - isString = util.string.isString; - -/** - * @constructor Unit - * - * A unit can be constructed in the following ways: - * var a = new Unit(value, unit); - * var b = new Unit(null, unit); - * var c = Unit.parse(str); - * - * Example usage: - * var a = new Unit(5, 'cm'); // 50 mm - * var b = Unit.parse('23 kg'); // 23 kg - * var c = math.in(a, new Unit(null, 'm'); // 0.05 m - * - * @param {Number} [value] A value like 5.2 - * @param {String} [unit] A unit like "cm" or "inch" - */ -function Unit(value, unit) { - if (!(this instanceof Unit)) { - throw new Error('Unit constructor must be called with the new operator'); - } - - if (value != null && !isNumber(value)) { - throw new TypeError('First parameter in Unit constructor must be a number'); - } - if (unit != null && !isString(unit)) { - throw new TypeError('Second parameter in Unit constructor must be a string'); - } - - if (unit != null) { - // find the unit and prefix from the string - var res = _findUnit(unit); - if (!res) { - throw new SyntaxError('Unknown unit "' + unit + '"'); - } - this.unit = res.unit; - this.prefix = res.prefix; - } - else { - this.unit = UNIT_NONE; - this.prefix = PREFIX_NONE; // link to a list with supported prefixes - } - - if (value != null) { - this.value = this._normalize(value); - this.fixPrefix = false; // is set true by the methods Unit.in and math.in - } - else { - this.value = null; - this.fixPrefix = true; - } -} - -// private variables and functions for the Unit parser -var text, index, c; - -function skipWhitespace() { - while (c == ' ' || c == '\t') { - next(); - } -} - -function isDigitDot (c) { - return ((c >= '0' && c <= '9') || c == '.'); -} - -function isDigit (c) { - return ((c >= '0' && c <= '9')); -} - -function next() { - index++; - c = text.charAt(index); -} - -function revert(oldIndex) { - index = oldIndex; - c = text.charAt(index); -} - -function parseNumber () { - var number = ''; - var oldIndex; - oldIndex = index; - - if (c == '+') { - next(); - } - else if (c == '-') { - number += c; - next(); - } - - if (!isDigitDot(c)) { - // a + or - must be followed by a digit - revert(oldIndex); - return null; - } - - // get number, can have a single dot - if (c == '.') { - number += c; - next(); - if (!isDigit(c)) { - // this is no legal number, it is just a dot - revert(oldIndex); - return null; - } - } - else { - while (isDigit(c)) { - number += c; - next(); - } - if (c == '.') { - number += c; - next(); - } - } - while (isDigit(c)) { - number += c; - next(); - } - - // check for exponential notation like "2.3e-4" or "1.23e50" - if (c == 'E' || c == 'e') { - number += c; - next(); - - if (c == '+' || c == '-') { - number += c; - next(); - } - - // Scientific notation MUST be followed by an exponent - if (!isDigit(c)) { - // this is no legal number, exponent is missing. - revert(oldIndex); - return null; - } - - while (isDigit(c)) { - number += c; - next(); - } - } - - return number; -} - -function parseUnit() { - var unit = ''; - - skipWhitespace(); - while (c && c != ' ' && c != '\t') { - unit += c; - next(); - } - - return unit || null; -} - -/** - * Parse a string into a unit. Returns null if the provided string does not - * contain a valid unit. - * @param {String} str A string like "5.2 inch", "4e2 kg" - * @return {Unit | null} unit - */ -Unit.parse = function parse(str) { - text = str; - index = -1; - c = ''; - - if (!isString(text)) { - return null; - } - - next(); - skipWhitespace(); - var value = parseNumber(); - var unit; - if (value) { - unit = parseUnit(); - - next(); - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - if (value && unit) { - return new Unit(Number(value), unit); - } - } - else { - unit = parseUnit(); - - next(); - skipWhitespace(); - if (c) { - // garbage at the end. not good. - return null; - } - - return new Unit(null, unit) - } - - return null; -}; - -/** - * Test whether value is of type Unit - * @param {*} value - * @return {Boolean} isUnit - */ -Unit.isUnit = function isUnit(value) { - return (value instanceof Unit); -}; - -/** - * create a copy of this unit - * @return {Unit} clone - */ -Unit.prototype.clone = function () { - var clone = new Unit(); - - for (var p in this) { - if (this.hasOwnProperty(p)) { - clone[p] = this[p]; - } - } - - return clone; -}; - -/** - * Normalize a value, based on its currently set unit - * @param {Number} value - * @return {Number} normalized value - * @private - */ -Unit.prototype._normalize = function(value) { - return (value + this.unit.offset) * - this.unit.value * this.prefix.value; -}; - -/** - * Unnormalize a value, based on its currently set unit - * @param {Number} value - * @param {Number} [prefixValue] Optional prefix value to be used - * @return {Number} unnormalized value - * @private - */ -Unit.prototype._unnormalize = function (value, prefixValue) { - if (prefixValue == undefined) { - return value / this.unit.value / this.prefix.value - - this.unit.offset; - } - else { - return value / this.unit.value / prefixValue - - this.unit.offset; - } -}; - -/** - * Find a unit from a string - * @param {String} str A string like 'cm' or 'inch' - * @returns {Object | null} result When found, an object with fields unit and - * prefix is returned. Else, null is returned. - * @private - */ -function _findUnit(str) { - for (var name in UNITS) { - if (UNITS.hasOwnProperty(name)) { - if (string.endsWith(str, name) ) { - var unit = UNITS[name]; - var prefixLen = (str.length - name.length); - var prefixName = str.substring(0, prefixLen); - var prefix = unit.prefixes[prefixName]; - if (prefix !== undefined) { - // store unit, prefix, and value - return { - unit: unit, - prefix: prefix - }; - } - } - } - } - - return null; -} - -/** - * Test if the given expression is a unit. - * The unit can have a prefix but cannot have a value. - * @param {String} unit A plain unit without value. Can have prefix, like "cm" - * @return {Boolean} true if the given string is a unit - */ -Unit.isPlainUnit = function (unit) { - return (_findUnit(unit) != null); -}; - -/** - * check if this unit has given base unit - * @param {BASE_UNITS | undefined} base - */ -Unit.prototype.hasBase = function(base) { - if (this.unit.base === undefined) { - return (base === undefined); - } - return (this.unit.base === base); -}; - -/** - * Check if this unit has a base equal to another base - * @param {Unit} other - * @return {Boolean} true if equal base - */ -Unit.prototype.equalBase = function(other) { - return (this.unit.base === other.unit.base); -}; - -/** - * Check if this unit equals another unit - * @param {Unit} other - * @return {Boolean} true if both units are equal - */ -Unit.prototype.equals = function(other) { - return (this.equalBase(other) && this.value == other.value); -}; - -/** - * Create a clone of this unit with a representation - * @param {String | Unit} plainUnit A plain unit, without value. Can have prefix, like "cm" - * @returns {Unit} unit having fixed, specified unit - */ -Unit.prototype.to = function (plainUnit) { - var other; - if (isString(plainUnit)) { - other = new Unit(null, plainUnit); - - if (!this.equalBase(other)) { - throw new Error('Units do not match'); - } - - other.value = this.value; - return other; - } - else if (plainUnit instanceof Unit) { - if (!this.equalBase(plainUnit)) { - throw new Error('Units do not match'); - } - if (plainUnit.value != null) { - throw new Error('Cannot convert to a unit with a value'); - } - if (plainUnit.unit == null) { - throw new Error('Unit expected on the right hand side of function in'); - } - - other = plainUnit.clone(); - other.value = this.value; - other.fixPrefix = true; - return other; - } - else { - throw new Error('String or Unit expected as parameter'); - } -}; - -/** - * Return the value of the unit when represented with given plain unit - * @param {String | Unit} plainUnit For example 'cm' or 'inch' - * @return {Number} value - */ -Unit.prototype.toNumber = function (plainUnit) { - var other = this.to(plainUnit); - var prefix = this.fixPrefix ? other._bestPrefix() : other.prefix; - return other._unnormalize(other.value, prefix.value); -}; - - -/** - * Get a string representation of the unit. - * @return {String} - */ -Unit.prototype.toString = function toString() { - return this.format(); -}; - -/** - * Get a string representation of the Unit, with optional formatting options. - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @return {String} - */ -Unit.prototype.format = function format(options) { - var value, - str; - - if (!this.fixPrefix) { - var bestPrefix = this._bestPrefix(); - value = this._unnormalize(this.value, bestPrefix.value); - str = (this.value != null) ? number.format(value, options) + ' ' : ''; - str += bestPrefix.name + this.unit.name; - } - else { - value = this._unnormalize(this.value); - str = (this.value != null) ? number.format(value, options) + ' ' : ''; - str += this.prefix.name + this.unit.name; - } - return str; -}; - -/** - * Calculate the best prefix using current value. - * @returns {Object} prefix - * @private - */ -Unit.prototype._bestPrefix = function () { - // find the best prefix value (resulting in the value of which - // the absolute value of the log10 is closest to zero, - // though with a little offset of 1.2 for nicer values: you get a - // sequence 1mm 100mm 500mm 0.6m 1m 10m 100m 500m 0.6km 1km ... - var absValue = Math.abs(this.value / this.unit.value); - var bestPrefix = PREFIX_NONE; - var bestDiff = Math.abs( - Math.log(absValue / bestPrefix.value) / Math.LN10 - 1.2); - - var prefixes = this.unit.prefixes; - for (var p in prefixes) { - if (prefixes.hasOwnProperty(p)) { - var prefix = prefixes[p]; - if (prefix.scientific) { - var diff = Math.abs( - Math.log(absValue / prefix.value) / Math.LN10 - 1.2); - - if (diff < bestDiff) { - bestPrefix = prefix; - bestDiff = diff; - } - } - } - } - - return bestPrefix; -}; - -var PREFIXES = { - 'NONE': { - '': {'name': '', 'value': 1, 'scientific': true} - }, - 'SHORT': { - '': {'name': '', 'value': 1, 'scientific': true}, - - 'da': {'name': 'da', 'value': 1e1, 'scientific': false}, - 'h': {'name': 'h', 'value': 1e2, 'scientific': false}, - 'k': {'name': 'k', 'value': 1e3, 'scientific': true}, - 'M': {'name': 'M', 'value': 1e6, 'scientific': true}, - 'G': {'name': 'G', 'value': 1e9, 'scientific': true}, - 'T': {'name': 'T', 'value': 1e12, 'scientific': true}, - 'P': {'name': 'P', 'value': 1e15, 'scientific': true}, - 'E': {'name': 'E', 'value': 1e18, 'scientific': true}, - 'Z': {'name': 'Z', 'value': 1e21, 'scientific': true}, - 'Y': {'name': 'Y', 'value': 1e24, 'scientific': true}, - - 'd': {'name': 'd', 'value': 1e-1, 'scientific': false}, - 'c': {'name': 'c', 'value': 1e-2, 'scientific': false}, - 'm': {'name': 'm', 'value': 1e-3, 'scientific': true}, - 'u': {'name': 'u', 'value': 1e-6, 'scientific': true}, - 'n': {'name': 'n', 'value': 1e-9, 'scientific': true}, - 'p': {'name': 'p', 'value': 1e-12, 'scientific': true}, - 'f': {'name': 'f', 'value': 1e-15, 'scientific': true}, - 'a': {'name': 'a', 'value': 1e-18, 'scientific': true}, - 'z': {'name': 'z', 'value': 1e-21, 'scientific': true}, - 'y': {'name': 'y', 'value': 1e-24, 'scientific': true} - }, - 'LONG': { - '': {'name': '', 'value': 1, 'scientific': true}, - - 'deca': {'name': 'deca', 'value': 1e1, 'scientific': false}, - 'hecto': {'name': 'hecto', 'value': 1e2, 'scientific': false}, - 'kilo': {'name': 'kilo', 'value': 1e3, 'scientific': true}, - 'mega': {'name': 'mega', 'value': 1e6, 'scientific': true}, - 'giga': {'name': 'giga', 'value': 1e9, 'scientific': true}, - 'tera': {'name': 'tera', 'value': 1e12, 'scientific': true}, - 'peta': {'name': 'peta', 'value': 1e15, 'scientific': true}, - 'exa': {'name': 'exa', 'value': 1e18, 'scientific': true}, - 'zetta': {'name': 'zetta', 'value': 1e21, 'scientific': true}, - 'yotta': {'name': 'yotta', 'value': 1e24, 'scientific': true}, - - 'deci': {'name': 'deci', 'value': 1e-1, 'scientific': false}, - 'centi': {'name': 'centi', 'value': 1e-2, 'scientific': false}, - 'milli': {'name': 'milli', 'value': 1e-3, 'scientific': true}, - 'micro': {'name': 'micro', 'value': 1e-6, 'scientific': true}, - 'nano': {'name': 'nano', 'value': 1e-9, 'scientific': true}, - 'pico': {'name': 'pico', 'value': 1e-12, 'scientific': true}, - 'femto': {'name': 'femto', 'value': 1e-15, 'scientific': true}, - 'atto': {'name': 'atto', 'value': 1e-18, 'scientific': true}, - 'zepto': {'name': 'zepto', 'value': 1e-21, 'scientific': true}, - 'yocto': {'name': 'yocto', 'value': 1e-24, 'scientific': true} - }, - 'SQUARED': { - '': {'name': '', 'value': 1, 'scientific': true}, - - 'da': {'name': 'da', 'value': 1e2, 'scientific': false}, - 'h': {'name': 'h', 'value': 1e4, 'scientific': false}, - 'k': {'name': 'k', 'value': 1e6, 'scientific': true}, - 'M': {'name': 'M', 'value': 1e12, 'scientific': true}, - 'G': {'name': 'G', 'value': 1e18, 'scientific': true}, - 'T': {'name': 'T', 'value': 1e24, 'scientific': true}, - 'P': {'name': 'P', 'value': 1e30, 'scientific': true}, - 'E': {'name': 'E', 'value': 1e36, 'scientific': true}, - 'Z': {'name': 'Z', 'value': 1e42, 'scientific': true}, - 'Y': {'name': 'Y', 'value': 1e48, 'scientific': true}, - - 'd': {'name': 'd', 'value': 1e-2, 'scientific': false}, - 'c': {'name': 'c', 'value': 1e-4, 'scientific': false}, - 'm': {'name': 'm', 'value': 1e-6, 'scientific': true}, - 'u': {'name': 'u', 'value': 1e-12, 'scientific': true}, - 'n': {'name': 'n', 'value': 1e-18, 'scientific': true}, - 'p': {'name': 'p', 'value': 1e-24, 'scientific': true}, - 'f': {'name': 'f', 'value': 1e-30, 'scientific': true}, - 'a': {'name': 'a', 'value': 1e-36, 'scientific': true}, - 'z': {'name': 'z', 'value': 1e-42, 'scientific': true}, - 'y': {'name': 'y', 'value': 1e-42, 'scientific': true} - }, - 'CUBIC': { - '': {'name': '', 'value': 1, 'scientific': true}, - - 'da': {'name': 'da', 'value': 1e3, 'scientific': false}, - 'h': {'name': 'h', 'value': 1e6, 'scientific': false}, - 'k': {'name': 'k', 'value': 1e9, 'scientific': true}, - 'M': {'name': 'M', 'value': 1e18, 'scientific': true}, - 'G': {'name': 'G', 'value': 1e27, 'scientific': true}, - 'T': {'name': 'T', 'value': 1e36, 'scientific': true}, - 'P': {'name': 'P', 'value': 1e45, 'scientific': true}, - 'E': {'name': 'E', 'value': 1e54, 'scientific': true}, - 'Z': {'name': 'Z', 'value': 1e63, 'scientific': true}, - 'Y': {'name': 'Y', 'value': 1e72, 'scientific': true}, - - 'd': {'name': 'd', 'value': 1e-3, 'scientific': false}, - 'c': {'name': 'c', 'value': 1e-6, 'scientific': false}, - 'm': {'name': 'm', 'value': 1e-9, 'scientific': true}, - 'u': {'name': 'u', 'value': 1e-18, 'scientific': true}, - 'n': {'name': 'n', 'value': 1e-27, 'scientific': true}, - 'p': {'name': 'p', 'value': 1e-36, 'scientific': true}, - 'f': {'name': 'f', 'value': 1e-45, 'scientific': true}, - 'a': {'name': 'a', 'value': 1e-54, 'scientific': true}, - 'z': {'name': 'z', 'value': 1e-63, 'scientific': true}, - 'y': {'name': 'y', 'value': 1e-72, 'scientific': true} - }, - 'BINARY_SHORT': { - '': {'name': '', 'value': 1, 'scientific': true}, - 'k': {'name': 'k', 'value': 1024, 'scientific': true}, - 'M': {'name': 'M', 'value': Math.pow(1024, 2), 'scientific': true}, - 'G': {'name': 'G', 'value': Math.pow(1024, 3), 'scientific': true}, - 'T': {'name': 'T', 'value': Math.pow(1024, 4), 'scientific': true}, - 'P': {'name': 'P', 'value': Math.pow(1024, 5), 'scientific': true}, - 'E': {'name': 'E', 'value': Math.pow(1024, 6), 'scientific': true}, - 'Z': {'name': 'Z', 'value': Math.pow(1024, 7), 'scientific': true}, - 'Y': {'name': 'Y', 'value': Math.pow(1024, 8), 'scientific': true}, - - 'Ki': {'name': 'Ki', 'value': 1024, 'scientific': true}, - 'Mi': {'name': 'Mi', 'value': Math.pow(1024, 2), 'scientific': true}, - 'Gi': {'name': 'Gi', 'value': Math.pow(1024, 3), 'scientific': true}, - 'Ti': {'name': 'Ti', 'value': Math.pow(1024, 4), 'scientific': true}, - 'Pi': {'name': 'Pi', 'value': Math.pow(1024, 5), 'scientific': true}, - 'Ei': {'name': 'Ei', 'value': Math.pow(1024, 6), 'scientific': true}, - 'Zi': {'name': 'Zi', 'value': Math.pow(1024, 7), 'scientific': true}, - 'Yi': {'name': 'Yi', 'value': Math.pow(1024, 8), 'scientific': true} - }, - 'BINARY_LONG': { - '': {'name': '', 'value': 1, 'scientific': true}, - 'kilo': {'name': 'kilo', 'value': 1024, 'scientific': true}, - 'mega': {'name': 'mega', 'value': Math.pow(1024, 2), 'scientific': true}, - 'giga': {'name': 'giga', 'value': Math.pow(1024, 3), 'scientific': true}, - 'tera': {'name': 'tera', 'value': Math.pow(1024, 4), 'scientific': true}, - 'peta': {'name': 'peta', 'value': Math.pow(1024, 5), 'scientific': true}, - 'exa': {'name': 'exa', 'value': Math.pow(1024, 6), 'scientific': true}, - 'zetta': {'name': 'zetta', 'value': Math.pow(1024, 7), 'scientific': true}, - 'yotta': {'name': 'yotta', 'value': Math.pow(1024, 8), 'scientific': true}, - - 'kibi': {'name': 'kibi', 'value': 1024, 'scientific': true}, - 'mebi': {'name': 'mebi', 'value': Math.pow(1024, 2), 'scientific': true}, - 'gibi': {'name': 'gibi', 'value': Math.pow(1024, 3), 'scientific': true}, - 'tebi': {'name': 'tebi', 'value': Math.pow(1024, 4), 'scientific': true}, - 'pebi': {'name': 'pebi', 'value': Math.pow(1024, 5), 'scientific': true}, - 'exi': {'name': 'exi', 'value': Math.pow(1024, 6), 'scientific': true}, - 'zebi': {'name': 'zebi', 'value': Math.pow(1024, 7), 'scientific': true}, - 'yobi': {'name': 'yobi', 'value': Math.pow(1024, 8), 'scientific': true} - } -}; - -var PREFIX_NONE = {'name': '', 'value': 1, 'scientific': true}; - -var BASE_UNITS = { - 'NONE': {}, - - 'LENGTH': {}, // meter - 'MASS': {}, // kilogram - 'TIME': {}, // second - 'CURRENT': {}, // ampere - 'TEMPERATURE': {}, // kelvin - 'LUMINOUS_INTENSITY': {}, // candela - 'AMOUNT_OF_SUBSTANCE': {}, // mole - - 'FORCE': {}, // Newton - 'SURFACE': {}, // m2 - 'VOLUME': {}, // m3 - 'ANGLE': {}, // rad - 'BIT': {} // bit (digital) -}; - -BASE_UNIT_NONE = {}; - -UNIT_NONE = {'name': '', 'base': BASE_UNIT_NONE, 'value': 1, 'offset': 0}; - -var UNITS = { - // length - meter: {'name': 'meter', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, - inch: {'name': 'inch', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0254, 'offset': 0}, - foot: {'name': 'foot', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.3048, 'offset': 0}, - yard: {'name': 'yard', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.9144, 'offset': 0}, - mile: {'name': 'mile', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1609.344, 'offset': 0}, - link: {'name': 'link', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.201168, 'offset': 0}, - rod: {'name': 'rod', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 5.029210, 'offset': 0}, - chain: {'name': 'chain', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 20.1168, 'offset': 0}, - angstrom: {'name': 'angstrom', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1e-10, 'offset': 0}, - - m: {'name': 'm', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, - 'in': {'name': 'in', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0254, 'offset': 0}, - ft: {'name': 'ft', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.3048, 'offset': 0}, - yd: {'name': 'yd', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.9144, 'offset': 0}, - mi: {'name': 'mi', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1609.344, 'offset': 0}, - li: {'name': 'li', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.201168, 'offset': 0}, - rd: {'name': 'rd', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 5.029210, 'offset': 0}, - ch: {'name': 'ch', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 20.1168, 'offset': 0}, - mil: {'name': 'mil', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0000254, 'offset': 0}, // 1/1000 inch - - // Surface - m2: {'name': 'm2', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.SQUARED, 'value': 1, 'offset': 0}, - sqin: {'name': 'sqin', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.00064516, 'offset': 0}, // 645.16 mm2 - sqft: {'name': 'sqft', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.09290304, 'offset': 0}, // 0.09290304 m2 - sqyd: {'name': 'sqyd', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.83612736, 'offset': 0}, // 0.83612736 m2 - sqmi: {'name': 'sqmi', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 2589988.110336, 'offset': 0}, // 2.589988110336 km2 - sqrd: {'name': 'sqrd', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 25.29295, 'offset': 0}, // 25.29295 m2 - sqch: {'name': 'sqch', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 404.6873, 'offset': 0}, // 404.6873 m2 - sqmil: {'name': 'sqmil', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 6.4516e-10, 'offset': 0}, // 6.4516 * 10^-10 m2 - - // Volume - m3: {'name': 'm3', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.CUBIC, 'value': 1, 'offset': 0}, - L: {'name': 'L', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, // litre - l: {'name': 'l', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, // litre - litre: {'name': 'litre', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.LONG, 'value': 0.001, 'offset': 0}, - cuin: {'name': 'cuin', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 1.6387064e-5, 'offset': 0}, // 1.6387064e-5 m3 - cuft: {'name': 'cuft', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.028316846592, 'offset': 0}, // 28.316 846 592 L - cuyd: {'name': 'cuyd', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.764554857984, 'offset': 0}, // 764.554 857 984 L - teaspoon: {'name': 'teaspoon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000005, 'offset': 0}, // 5 mL - tablespoon: {'name': 'tablespoon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000015, 'offset': 0}, // 15 mL - //{'name': 'cup', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000240, 'offset': 0}, // 240 mL // not possible, we have already another cup - - // Liquid volume - minim: {'name': 'minim', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00000006161152, 'offset': 0}, // 0.06161152 mL - fluiddram: {'name': 'fluiddram', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0000036966911, 'offset': 0}, // 3.696691 mL - fluidounce: {'name': 'fluidounce', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00002957353, 'offset': 0}, // 29.57353 mL - gill: {'name': 'gill', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0001182941, 'offset': 0}, // 118.2941 mL - cc: {'name': 'cc', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 1e-6, 'offset': 0}, // 1e-6 L - cup: {'name': 'cup', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0002365882, 'offset': 0}, // 236.5882 mL - pint: {'name': 'pint', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0004731765, 'offset': 0}, // 473.1765 mL - quart: {'name': 'quart', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0009463529, 'offset': 0}, // 946.3529 mL - gallon: {'name': 'gallon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.003785412, 'offset': 0}, // 3.785412 L - beerbarrel: {'name': 'beerbarrel', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1173478, 'offset': 0}, // 117.3478 L - oilbarrel: {'name': 'oilbarrel', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1589873, 'offset': 0}, // 158.9873 L - hogshead: {'name': 'hogshead', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.2384810, 'offset': 0}, // 238.4810 L - - //{'name': 'min', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00000006161152, 'offset': 0}, // 0.06161152 mL // min is already in use as minute - fldr: {'name': 'fldr', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0000036966911, 'offset': 0}, // 3.696691 mL - floz: {'name': 'floz', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00002957353, 'offset': 0}, // 29.57353 mL - gi: {'name': 'gi', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0001182941, 'offset': 0}, // 118.2941 mL - cp: {'name': 'cp', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0002365882, 'offset': 0}, // 236.5882 mL - pt: {'name': 'pt', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0004731765, 'offset': 0}, // 473.1765 mL - qt: {'name': 'qt', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0009463529, 'offset': 0}, // 946.3529 mL - gal: {'name': 'gal', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.003785412, 'offset': 0}, // 3.785412 L - bbl: {'name': 'bbl', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1173478, 'offset': 0}, // 117.3478 L - obl: {'name': 'obl', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1589873, 'offset': 0}, // 158.9873 L - //{'name': 'hogshead', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.2384810, 'offset': 0}, // 238.4810 L // TODO: hh? - - // Mass - g: {'name': 'g', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, - gram: {'name': 'gram', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.LONG, 'value': 0.001, 'offset': 0}, - - ton: {'name': 'ton', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 907.18474, 'offset': 0}, - tonne: {'name': 'tonne', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 1000, 'offset': 0}, - - grain: {'name': 'grain', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 64.79891e-6, 'offset': 0}, - dram: {'name': 'dram', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 1.7718451953125e-3, 'offset': 0}, - ounce: {'name': 'ounce', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 28.349523125e-3, 'offset': 0}, - poundmass: {'name': 'poundmass', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 453.59237e-3, 'offset': 0}, - hundredweight: {'name': 'hundredweight', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 45.359237, 'offset': 0}, - stick: {'name': 'stick', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 115e-3, 'offset': 0}, - - gr: {'name': 'gr', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 64.79891e-6, 'offset': 0}, - dr: {'name': 'dr', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 1.7718451953125e-3, 'offset': 0}, - oz: {'name': 'oz', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 28.349523125e-3, 'offset': 0}, - lbm: {'name': 'lbm', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 453.59237e-3, 'offset': 0}, - cwt: {'name': 'cwt', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 45.359237, 'offset': 0}, - - // Time - s: {'name': 's', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, - min: {'name': 'min', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 60, 'offset': 0}, - h: {'name': 'h', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 3600, 'offset': 0}, - second: {'name': 'second', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, - sec: {'name': 'sec', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, - minute: {'name': 'minute', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 60, 'offset': 0}, - hour: {'name': 'hour', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 3600, 'offset': 0}, - day: {'name': 'day', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 86400, 'offset': 0}, - - // Angle - rad: {'name': 'rad', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - // deg = rad / (2*pi) * 360 = rad / 0.017453292519943295769236907684888 - deg: {'name': 'deg', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 0.017453292519943295769236907684888, 'offset': 0}, - // grad = rad / (2*pi) * 400 = rad / 0.015707963267948966192313216916399 - grad: {'name': 'grad', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 0.015707963267948966192313216916399, 'offset': 0}, - // cycle = rad / (2*pi) = rad / 6.2831853071795864769252867665793 - cycle: {'name': 'cycle', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 6.2831853071795864769252867665793, 'offset': 0}, - - // Electric current - A: {'name': 'A', 'base': BASE_UNITS.CURRENT, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, - ampere: {'name': 'ampere', 'base': BASE_UNITS.CURRENT, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, - - // Temperature - // K(C) = °C + 273.15 - // K(F) = (°F + 459.67) / 1.8 - // K(R) = °R / 1.8 - K: {'name': 'K', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - degC: {'name': 'degC', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 273.15}, - degF: {'name': 'degF', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 459.67}, - degR: {'name': 'degR', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 0}, - kelvin: {'name': 'kelvin', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - celsius: {'name': 'celsius', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 273.15}, - fahrenheit: {'name': 'fahrenheit', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 459.67}, - rankine: {'name': 'rankine', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 0}, - - // amount of substance - mol: {'name': 'mol', 'base': BASE_UNITS.AMOUNT_OF_SUBSTANCE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - mole: {'name': 'mole', 'base': BASE_UNITS.AMOUNT_OF_SUBSTANCE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - - // luminous intensity - cd: {'name': 'cd', 'base': BASE_UNITS.LUMINOUS_INTENSITY, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - candela: {'name': 'candela', 'base': BASE_UNITS.LUMINOUS_INTENSITY, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - // TODO: units STERADIAN - //{'name': 'sr', 'base': BASE_UNITS.STERADIAN, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - //{'name': 'steradian', 'base': BASE_UNITS.STERADIAN, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, - - // Force - N: {'name': 'N', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, - newton: {'name': 'newton', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, - lbf: {'name': 'lbf', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.NONE, 'value': 4.4482216152605, 'offset': 0}, - poundforce: {'name': 'poundforce', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.NONE, 'value': 4.4482216152605, 'offset': 0}, - - // Binary - b: {'name': 'b', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_SHORT, 'value': 1, 'offset': 0}, - bits: {'name': 'bits', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_LONG, 'value': 1, 'offset': 0}, - B: {'name': 'B', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_SHORT, 'value': 8, 'offset': 0}, - bytes: {'name': 'bytes', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_LONG, 'value': 8, 'offset': 0} -}; - -// plurals -var PLURALS = { - meters: 'meter', - inches: 'inch', - yards: 'yard', - miles: 'mile', - links: 'link', - rods: 'rod', - chains: 'chain', - angstroms: 'angstrom', - - litres: 'litre', - teaspoons: 'teaspoon', - tablespoons: 'tablespoon', - minims: 'minim', - fluiddrams: 'fluiddram', - fluidounces: 'fluidounce', - gills: 'gill', - cups: 'cup', - pints: 'pint', - quarts: 'quart', - gallons: 'gallon', - beerbarrels: 'beerbarrel', - oilbarrels: 'oilbarrel', - hogsheads: 'hogshead', - - grams: 'gram', - tons: 'ton', - tonnes: 'tonne', - grains: 'grain', - drams: 'dram', - ounces: 'ounce', - poundmasses: 'poundmass', - hundredweights: 'hundredweight', - sticks: 'stick', - - seconds: 'second', - minutes: 'minute', - hours: 'hour', - days: 'day', - - radians: 'rad', - degrees: 'deg', - gradients: 'grad', - cycles: 'cycle', - - amperes: 'ampere', - moles: 'mole' -}; - -for (var name in PLURALS) { - if (PLURALS.hasOwnProperty(name)) { - var unit = UNITS[PLURALS[name]]; - var plural = Object.create(unit); - plural.name = name; - UNITS[name] = plural; - } -} - -// aliases -UNITS.lt = UNITS.l; -UNITS.liter = UNITS.litre; -UNITS.liters = UNITS.litres; -UNITS.lb = UNITS.lbm; - - -Unit.PREFIXES = PREFIXES; -Unit.BASE_UNITS = BASE_UNITS; -Unit.UNITS = UNITS; - -// end of unit aliases - - -// exports -module.exports = Unit; - -// to trick my IDE which doesn't get it -exports.isUnit = Unit.isUnit; -exports.isPlainUnit = Unit.isPlainUnit; -exports.parse = Unit.parse; - -},{"../util/index":218}],214:[function(require,module,exports){ -// utility methods for arrays and matrices - -var util = require('../util/index'), - - Matrix = require('./Matrix'), - - isArray = util.array.isArray, - isString = util.string.isString; - -/** - * Convert function arguments to an array. Arguments can have the following - * signature: - * fn() - * fn(n) - * fn(m, n, p, ...) - * fn([m, n, p, ...]) - * @param {...Number | Array | Matrix} args - * @returns {Array} array - */ -exports.argsToArray = function argsToArray(args) { - var array; - if (args.length == 0) { - // fn() - array = []; - } - else if (args.length == 1) { - // fn(n) - // fn([m, n, p, ...]) - array = args[0]; - if (array instanceof Matrix) { - array = array.valueOf(); - } - if (!isArray(array)) { - array = [array]; - } - } - else { - // fn(m, n, p, ...) - array = Array.prototype.slice.apply(args); - } - return array; -}; - - -/** - * Test whether a value is a collection: an Array or Matrix - * @param {*} x - * @returns {boolean} isCollection - */ -exports.isCollection = function isCollection (x) { - return (isArray(x) || (x instanceof Matrix)); -}; - -/** - * Execute the callback function element wise for each element in array and any - * nested array - * Returns an array with the results - * @param {Array | Matrix} array - * @param {function} callback The callback is called with two parameters: - * value1 and value2, which contain the current - * element of both arrays. - * @return {Array | Matrix} res - */ -exports.deepMap = function deepMap(array, callback) { - if (array && (typeof array.map === 'function')) { - return array.map(function (x) { - return deepMap(x, callback); - }); - } - else { - return callback(array); - } -}; - -/** - * Execute the callback function element wise for each entry in two given arrays, - * and for any nested array. Objects can also be scalar objects. - * Returns an array with the results. - * @param {Array | Matrix | Object} array1 - * @param {Array | Matrix | Object} array2 - * @param {function} callback The callback is called with two parameters: - * value1 and value2, which contain the current - * element of both arrays. - * @return {Array | Matrix} res - */ -exports.deepMap2 = function deepMap2(array1, array2, callback) { - var res, len, i; - - if (isArray(array1)) { - if (isArray(array2)) { - // callback(array, array) - if (array1.length != array2.length) { - throw new RangeError('Dimension mismatch ' + - '(' + array1.length + ' != ' + array2.length + ')'); - } - - res = []; - len = array1.length; - for (i = 0; i < len; i++) { - res[i] = deepMap2(array1[i], array2[i], callback); - } - } - else if (array2 instanceof Matrix) { - // callback(array, matrix) - res = deepMap2(array1, array2.valueOf(), callback); - return new Matrix(res); - } - else { - // callback(array, object) - res = []; - len = array1.length; - for (i = 0; i < len; i++) { - res[i] = deepMap2(array1[i], array2, callback); - } - } - } - else if (array1 instanceof Matrix) { - if (array2 instanceof Matrix) { - // callback(matrix, matrix) - res = deepMap2(array1.valueOf(), array2.valueOf(), callback); - return new Matrix(res); - } - else { - // callback(matrix, array) - // callback(matrix, object) - res = deepMap2(array1.valueOf(), array2, callback); - return new Matrix(res); - } - } - else { - if (isArray(array2)) { - // callback(object, array) - res = []; - len = array2.length; - for (i = 0; i < len; i++) { - res[i] = deepMap2(array1, array2[i], callback); - } - } - else if (array2 instanceof Matrix) { - // callback(object, matrix) - res = deepMap2(array1, array2.valueOf(), callback); - return new Matrix(res); - } - else { - // callback(object, object) - res = callback(array1, array2); - } - } - - return res; -}; - -/** - * Reduce a given matrix or array to a new matrix or - * array with one less dimension, aplying the given - * callback in the selected dimension. - * @param {Array | Matrix} mat - * @param {Number} dim - * @param {function} callback - * @return {Array | Matrix} res - */ -exports.reduce = function reduce (mat, dim, callback) { - if (mat instanceof Matrix) { - return new Matrix(_reduce(mat.valueOf(), dim, callback)); - }else { - return _reduce(mat, dim, callback); +(function webpackUniversalModuleDefinition(root) { + return function webpackUniversalModuleDefinitionWrapBootstrap(fn) { + return function webpackUniversalModuleDefinitionBootstrap(modules) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = fn(modules); + else if(typeof define === 'function' && define.amd) + define(function() { return fn(modules); }); + else if(typeof exports === 'object') + exports["mathjs"] = fn(modules); + else + root["mathjs"] = fn(modules); + } } -}; +})(this) +/******/ (function(modules) { // webpackBootstrap +/******/ // shortcut for better minimizing +/******/ var exports = "exports"; +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function require(moduleId) { +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId][exports]; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module[exports], module, module[exports], require); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module[exports]; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ require.modules = modules; +/******/ +/******/ // expose the module cache +/******/ require.cache = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ require.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return require(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, require) { -/** - * Recursively reduce a matrix - * @param {Array} mat - * @param {Number} dim - * @param {Function} callback - * @returns {Array} ret - * @private - */ -function _reduce(mat, dim, callback){ - var i, ret, val, tran; + module.exports = require(1); - if(dim<=0){ - if( !isArray(mat[0]) ){ - val = mat[0]; - for(i=1; i': true, + '<=': true, + '>=': true + }; + + // map with all named delimiters + var NAMED_DELIMITERS = { + 'mod': true, + 'to': true, + 'in': true + }; + + var expression = ''; // current expression + var index = 0; // current index in expr + var c = ''; // current token character in expr + var token = ''; // current token + var token_type = TOKENTYPE.NULL; // type of the token + + /** + * Get the first character from the expression. + * The character is stored into the char c. If the end of the expression is + * reached, the function puts an empty string in c. + * @private + */ + function first() { + index = 0; + c = expression.charAt(0); + } + + /** + * Get the next character from the expression. + * The character is stored into the char c. If the end of the expression is + * reached, the function puts an empty string in c. + * @private + */ + function next() { + index++; + c = expression.charAt(index); + } + + /** + * Preview the next character from the expression. + * @return {String} cNext + * @private + */ + function nextPreview() { + return expression.charAt(index + 1); + } + + /** + * Get next token in the current string expr. + * The token and token type are available as token and token_type + * @private + */ + function getToken() { + token_type = TOKENTYPE.NULL; + token = ''; + + // skip over whitespaces + while (c == ' ' || c == '\t') { // space, tab + // TODO: also take '\r' carriage return as newline? Or does that give problems on mac? + next(); + } + + // skip comment + if (c == '#') { + while (c != '\n' && c != '') { + next(); + } + } + + // check for end of expression + if (c == '') { + // token is still empty + token_type = TOKENTYPE.DELIMITER; + return; + } + + // check for delimiters consisting of 2 characters + var c2 = c + nextPreview(); + if (DELIMITERS[c2]) { + token_type = TOKENTYPE.DELIMITER; + token = c2; + next(); + next(); + return; + } + + // check for delimiters consisting of 1 character + if (DELIMITERS[c]) { + token_type = TOKENTYPE.DELIMITER; + token = c; + next(); + return; + } + + // check for a number + if (isDigitDot(c)) { + token_type = TOKENTYPE.NUMBER; + + // get number, can have a single dot + if (c == '.') { + token += c; + next(); + + if (!isDigit(c)) { + // this is no legal number, it is just a dot + token_type = TOKENTYPE.UNKNOWN; + } + } + else { + while (isDigit(c)) { + token += c; + next(); + } + if (c == '.') { + token += c; + next(); + } + } + while (isDigit(c)) { + token += c; + next(); + } + + // check for exponential notation like "2.3e-4" or "1.23e50" + if (c == 'E' || c == 'e') { + token += c; + next(); + + if (c == '+' || c == '-') { + token += c; + next(); + } + + // Scientific notation MUST be followed by an exponent + if (!isDigit(c)) { + // this is no legal number, exponent is missing. + token_type = TOKENTYPE.UNKNOWN; + } + + while (isDigit(c)) { + token += c; + next(); + } + } + + return; + } + + // check for variables, functions, named operators + if (isAlpha(c)) { + while (isAlpha(c) || isDigit(c)) { + token += c; + next(); + } + + if (NAMED_DELIMITERS[token]) { + token_type = TOKENTYPE.DELIMITER; + } + else { + token_type = TOKENTYPE.SYMBOL; + } + + return; + } + + // something unknown is found, wrong characters -> a syntax error + token_type = TOKENTYPE.UNKNOWN; + while (c != '') { + token += c; + next(); + } + throw createSyntaxError('Syntax error in part "' + token + '"'); + } + + /** + * Skip newline tokens + */ + function skipNewlines () { + while (token == '\n') { + getToken(); + } + } + + /** + * Check if a given name is valid + * if not, an error is thrown + * @param {String} name + * @return {boolean} valid + * @private + */ + // TODO: check for valid symbol name + function isValidSymbolName (name) { + for (var i = 0, iMax = name.length; i < iMax; i++) { + var c = name.charAt(i); + //var valid = (isAlpha(c) || (i > 0 && isDigit(c))); // TODO: allow digits in symbol name + var valid = (isAlpha(c)); + if (!valid) { + return false; + } + } + + return true; + } + + /** + * checks if the given char c is a letter (upper or lower case) + * or underscore + * @param {String} c a string with one character + * @return {Boolean} + * @private + */ + function isAlpha (c) { + return ((c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c == '_'); + } + + /** + * checks if the given char c is a digit or dot + * @param {String} c a string with one character + * @return {Boolean} + * @private + */ + function isDigitDot (c) { + return ((c >= '0' && c <= '9') || + c == '.'); + } + + /** + * checks if the given char c is a digit + * @param {String} c a string with one character + * @return {Boolean} + * @private + */ + function isDigit (c) { + return ((c >= '0' && c <= '9')); + } + + /** + * Start of the parse levels below, in order of precedence + * @return {Node} node + * @private + */ + function parseStart () { + // get the first character in expression + first(); + + getToken(); + + var node; + if (token == '') { + // empty expression + node = new ConstantNode('undefined', 'undefined'); + } + else { + node = parseBlock(); + } + + // check for garbage at the end of the expression + // an expression ends with a empty character '' and token_type DELIMITER + if (token != '') { + if (token_type == TOKENTYPE.DELIMITER) { + // user entered a not existing operator like "//" + + // TODO: give hints for aliases, for example with "<>" give as hint " did you mean != ?" + throw createError('Unknown operator ' + token); + } + else { + throw createSyntaxError('Unexpected part "' + token + '"'); + } + } + + return node; + } + + /** + * Parse a block with expressions. Expressions can be separated by a newline + * character '\n', or by a semicolon ';'. In case of a semicolon, no output + * of the preceding line is returned. + * @return {Node} node + * @private + */ + function parseBlock () { + var node, block, visible; + + if (token != '\n' && token != ';' && token != '') { + node = parseAns(); + } + + while (token == '\n' || token == ';') { + if (!block) { + // initialize the block + block = new BlockNode(); + if (node) { + visible = (token != ';'); + block.add(node, visible); + } + } + + getToken(); + if (token != '\n' && token != ';' && token != '') { + node = parseAns(); + + visible = (token != ';'); + block.add(node, visible); + } + } + + if (block) { + return block; + } + + if (!node) { + node = parseAns(); + } + + return node; + } + + /** + * Parse assignment of ans. + * Ans is assigned when the expression itself is no variable or function + * assignment + * @return {Node} node + * @private + */ + function parseAns () { + var expression = parseFunctionAssignment(); + + // create a variable definition for ans + var name = 'ans'; + return new AssignmentNode(name, expression); + } + + /** + * Parse a function assignment like "function f(a,b) = a*b" + * @return {Node} node + * @private + */ + function parseFunctionAssignment () { + // TODO: function assignment using keyword 'function' is deprecated since version 0.18.0, cleanup some day + if (token_type == TOKENTYPE.SYMBOL && token == 'function') { + throw new Error('Deprecated keyword "function". ' + + 'Functions can now be assigned without it, like "f(x) = x^2".'); + } + + return parseAssignment(); + } + + /** + * Assignment of a variable, can be a variable like "a=2.3" or a updating an + * existing variable like "matrix(2,3:5)=[6,7,8]" + * @return {Node} node + * @private + */ + function parseAssignment () { + var name, args, expr; + + var node = parseRange(); + + if (token == '=') { + if (node instanceof SymbolNode) { + // parse a variable assignment like 'a = 2/3' + name = node.name; + getToken(); + expr = parseAssignment(); + return new AssignmentNode(name, expr); + } + else if (node instanceof IndexNode) { + // parse a matrix subset assignment like 'A[1,2] = 4' + getToken(); + expr = parseAssignment(); + return new UpdateNode(node, expr); + } + else if (node instanceof ParamsNode) { + // parse function assignment like 'f(x) = x^2' + var valid = true; + args = []; + if (node.object instanceof SymbolNode) { + name = node.object.name; + node.params.forEach(function (param, index) { + if (param instanceof SymbolNode) { + args[index] = param.name; + } + else { + valid = false; + } + }); + } + else { + valid = false; + } + + if (valid) { + getToken(); + expr = parseAssignment(); + return new FunctionNode(name, args, expr); + } + } + + throw createSyntaxError('Invalid left hand side of assignment operator ='); + } + + return node; + } + + /** + * parse range, "start:end", "start:step:end", ":", "start:", ":end", etc + * @return {Node} node + * @private + */ + function parseRange () { + var node, params = []; + + if (token == ':') { + // implicit start=1 (one-based) + node = new ConstantNode('number', '1'); + } + else { + // explicit start + node = parseBitwiseConditions(); + } + + if (token == ':') { + params.push(node); + + // parse step and end + while (token == ':') { + getToken(); + if (token == ')' || token == ']' || token == ',' || token == '') { + // implicit end + params.push(new SymbolNode('end')); + } + else { + // explicit end + params.push(parseBitwiseConditions()); + } + } + + if (params.length) { + // swap step and end + if (params.length == 3) { + var step = params[2]; + params[2] = params[1]; + params[1] = step; + } + node = new RangeNode(params); + } + } + + return node; + } + + /** + * conditional operators and bitshift + * @return {Node} node + * @private + */ + function parseBitwiseConditions () { + var node = parseComparison(); + + /* TODO: implement bitwise conditions + var operators = { + '&' : 'bitwiseand', + '|' : 'bitwiseor', + // todo: bitwise xor? + '<<': 'bitshiftleft', + '>>': 'bitshiftright' + }; + while (token in operators) { + var name = token; + + getToken(); + var params = [node, parseComparison()]; + node = new OperatorNode(name, fn, params); + } + */ + + return node; + } + + /** + * comparison operators + * @return {Node} node + * @private + */ + function parseComparison () { + var node, operators, name, fn, params; + + node = parseConditions(); + + operators = { + '==': 'equal', + '!=': 'unequal', + '<': 'smaller', + '>': 'larger', + '<=': 'smallereq', + '>=': 'largereq' + }; + while (token in operators) { + name = token; + fn = operators[name]; + + getToken(); + params = [node, parseConditions()]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * conditions like and, or, in + * @return {Node} node + * @private + */ + function parseConditions () { + var node, operators, name, fn, params; + + node = parseAddSubtract(); + + // TODO: precedence of And above Or? + // TODO: implement a method for unit to number conversion + operators = { + 'to' : 'to', + 'in' : 'to' // alias of to + /* TODO: implement conditions + 'and' : 'and', + '&&' : 'and', + 'or': 'or', + '||': 'or', + 'xor': 'xor' + */ + }; + + while (token in operators) { + name = token; + fn = operators[name]; + + getToken(); + params = [node, parseAddSubtract()]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * add or subtract + * @return {Node} node + * @private + */ + function parseAddSubtract () { + var node, operators, name, fn, params; + + node = parseMultiplyDivide(); + + operators = { + '+': 'add', + '-': 'subtract' + }; + while (token in operators) { + name = token; + fn = operators[name]; + + getToken(); + params = [node, parseMultiplyDivide()]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * multiply, divide, modulus + * @return {Node} node + * @private + */ + function parseMultiplyDivide () { + var node, operators, name, fn, params; + + node = parseUnit(); + + operators = { + '*': 'multiply', + '.*': 'emultiply', + '/': 'divide', + './': 'edivide', + '%': 'mod', + 'mod': 'mod' + }; + + while (token in operators) { + name = token; + fn = operators[name]; + + getToken(); + params = [node, parseUnit()]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * parse units like in '2i', '2 cm' + * @return {Node} node + * @private + */ + function parseUnit() { + var node, symbol; + + node = parseUnary(); + + if (token_type == TOKENTYPE.SYMBOL || token == 'in') { + // note unit 'in' (inch) is also a conversion operator + symbol = token; + + getToken(); + + node = new UnitNode(node, symbol); + } + + return node; + } + + /** + * Unary minus + * @return {Node} node + * @private + */ + function parseUnary () { + var name, fn, params; + + if (token == '-') { + name = token; + fn = 'unary'; + getToken(); + params = [parseUnary()]; + + return new OperatorNode(name, fn, params); + } + + return parsePow(); + } + + /** + * power + * Note: power operator is right associative + * @return {Node} node + * @private + */ + function parsePow () { + var node, leftNode, nodes, ops, name, fn, params; + + nodes = [ + parseLeftHandOperators() + ]; + ops = []; + + // stack all operands of a chained power operator (like '2^3^3') + while (token == '^' || token == '.^') { + ops.push(token); + getToken(); + nodes.push(parseLeftHandOperators()); + } + + // evaluate the operands from right to left (right associative) + node = nodes.pop(); + while (nodes.length) { + leftNode = nodes.pop(); + name = ops.pop(); + fn = (name == '^') ? 'pow' : 'epow'; + params = [leftNode, node]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * Left hand operators: factorial x!, transpose x' + * @return {Node} node + * @private + */ + function parseLeftHandOperators () { + var node, operators, name, fn, params; + + node = parseNodeHandler(); + + operators = { + '!': 'factorial', + '\'': 'transpose' + }; + + while (token in operators) { + name = token; + fn = operators[name]; + + getToken(); + params = [node]; + + node = new OperatorNode(name, fn, params); + } + + return node; + } + + /** + * Parse a custom node handler. A node handler can be used to process + * nodes in a custom way, for example for handling a plot. + * + * A handler must be defined in the namespace math.expression.node.handlers, + * and must extend math.expression.node.Node, and the handler must contain + * functions eval(), find(filter), and toString(). + * + * For example: + * + * math.expression.node.handlers['plot'] = PlotHandler; + * + * The constructor of the handler is called as: + * + * node = new PlotHandler(params); + * + * The handler will be invoked when evaluating an expression like: + * + * node = math.parse('plot(sin(x), x)'); + * + * @return {Node} node + * @private + */ + function parseNodeHandler () { + var params, handler; + + if (token_type == TOKENTYPE.SYMBOL && handlers[token]) { + handler = handlers[token]; + + getToken(); + + // parse parameters + if (token == '(') { + params = []; + + getToken(); + + if (token != ')') { + params.push(parseRange()); + + // parse a list with parameters + while (token == ',') { + getToken(); + + params.push(parseRange()); + } + } + + if (token != ')') { + throw createSyntaxError('Parenthesis ) expected'); + } + getToken(); + } + + // create a new node handler + //noinspection JSValidateTypes + return new handler(params); + } + + return parseSymbol(); + } + + /** + * parse symbols: functions, variables, constants, units + * @return {Node} node + * @private + */ + function parseSymbol () { + var node, name; + + if (token_type == TOKENTYPE.SYMBOL || + (token_type == TOKENTYPE.DELIMITER && token in NAMED_DELIMITERS)) { + name = token; + + getToken(); + + // create a symbol + node = new SymbolNode(name); + + // parse parameters + return parseParams(node); + } + + return parseString(); + } + + /** + * parse parameters, enclosed in parenthesis. Can be two types: + * - round brackets (...) will return a ParamsNode + * - square brackets [...] will return an IndexNode + * @param {Node} node Node on which to apply the parameters. If there + * are no parameters in the expression, the node + * itself is returned + * @return {Node} node + * @private + */ + function parseParams (node) { + var bracket, params; + + while (token == '(' || token == '[') { + bracket = token; + params = []; + + getToken(); + + if (token != ')' && token != ']') { + params.push(parseRange()); + + // parse a list with parameters + while (token == ',') { + getToken(); + params.push(parseRange()); + } + } + + if ((bracket == '(' && token != ')')) { + throw createSyntaxError('Parenthesis ) expected'); + } + if ((bracket == '[' && token != ']')) { + throw createSyntaxError('Parenthesis ] expected'); + } + getToken(); + + if (bracket == '(') { + node = new ParamsNode(node, params); + } + else { + node = new IndexNode(node, params); + } + } + + return node; + } + + /** + * parse a string. + * A string is enclosed by double quotes + * @return {Node} node + * @private + */ + function parseString () { + var node, str, tPrev; + + if (token == '"') { + // string "..." + str = ''; + tPrev = ''; + while (c != '' && (c != '\"' || tPrev == '\\')) { // also handle escape character + str += c; + tPrev = c; + next(); + } + + getToken(); + if (token != '"') { + throw createSyntaxError('End of string " expected'); + } + getToken(); + + // create constant + node = new ConstantNode('string', str); + + // parse parameters + node = parseParams(node); + + return node; + } + + return parseMatrix(); + } + + /** + * parse the matrix + * @return {Node} node + * @private + */ + function parseMatrix () { + var array, params, rows, cols; + + if (token == '[') { + // matrix [...] + getToken(); + skipNewlines(); + + if (token != ']') { + // this is a non-empty matrix + var row = parseRow(); + + if (token == ';') { + // 2 dimensional array + rows = 1; + params = [row]; + + // the rows of the matrix are separated by dot-comma's + while (token == ';') { + getToken(); + skipNewlines(); + + params[rows] = parseRow(); + rows++; + + skipNewlines(); + } + + if (token != ']') { + throw createSyntaxError('End of matrix ] expected'); + } + getToken(); + + // check if the number of columns matches in all rows + cols = (params.length > 0) ? params[0].length : 0; + for (var r = 1; r < rows; r++) { + if (params[r].length != cols) { + throw createError('Number of columns must match ' + + '(' + params[r].length + ' != ' + cols + ')'); + } + } + + array = new ArrayNode(params); + } + else { + // 1 dimensional vector + if (token != ']') { + throw createSyntaxError('End of matrix ] expected'); + } + getToken(); + + array = row; + } + } + else { + // this is an empty matrix "[ ]" + getToken(); + array = new ArrayNode([]); + } + + // parse parameters + array = parseParams(array); + + return array; + } + + return parseNumber(); + } + + /** + * Parse a single comma-separated row from a matrix, like 'a, b, c' + * @return {ArrayNode} node + */ + function parseRow () { + var params = [parseAssignment()]; + var len = 1; + + while (token == ',') { + getToken(); + skipNewlines(); + + // parse expression + params[len] = parseAssignment(); + len++; + + skipNewlines(); + } + + return new ArrayNode(params); + } + + /** + * parse a number + * @return {Node} node + * @private + */ + function parseNumber () { + var node, complex, number; + + if (token_type == TOKENTYPE.NUMBER) { + // this is a number + number = token == '.' ? '0': token; + getToken(); + + if (token == 'i' || token == 'I') { + // create a complex number + getToken(); + node = new ConstantNode('complex', number); + } + else { + // a number + node = new ConstantNode('number', number); + } + + // parse parameters + node = parseParams(node); + + return node; + } + + return parseParentheses(); + } + + /** + * parentheses + * @return {Node} node + * @private + */ + function parseParentheses () { + var node; + + // check if it is a parenthesized expression + if (token == '(') { + // parentheses (...) + getToken(); + node = parseAssignment(); // start again + + if (token != ')') { + throw createSyntaxError('Parenthesis ) expected'); + } + getToken(); + + /* TODO: implicit multiplication? + // TODO: how to calculate a=3; 2/2a ? is this (2/2)*a or 2/(2*a) ? + // check for implicit multiplication + if (token_type == TOKENTYPE.SYMBOL) { + node = multiply(node, parsePow()); + } + //*/ + + // parse parameters + node = parseParams(node); + + return node; + } + + return parseEnd(); + } + + /** + * Evaluated when the expression is not yet ended but expected to end + * @return {Node} res + * @private + */ + function parseEnd () { + if (token == '') { + // syntax error or unexpected end of expression + throw createSyntaxError('Unexpected end of expression'); + } else { + throw createSyntaxError('Value expected'); + } + } + + /** + * Shortcut for getting the current row value (one based) + * Returns the line of the currently handled expression + * @private + */ + function row () { + // TODO: also register row number during parsing + return undefined; + } + + /** + * Shortcut for getting the current col value (one based) + * Returns the column (position) where the last token starts + * @private + */ + function col () { + return index - token.length + 1; + } + + /** + * Build up an error message + * @param {String} message + * @return {String} message with row and column information + * @private + */ + function createErrorMessage (message) { + var r = row(); + var c = col(); + if (r === undefined) { + if (c === undefined) { + return message; + } else { + return message + ' (char ' + c + ')'; + } + } else { + return message + ' (line ' + r + ', char ' + c + ')'; + } + } + + /** + * Create an error + * @param {String} message + * @return {SyntaxError} instantiated error + * @private + */ + function createSyntaxError (message) { + return new SyntaxError(createErrorMessage(message)); + } + + /** + * Create an error + * @param {String} message + * @return {Error} instantiated error + * @private + */ + function createError (message) { + return new Error(createErrorMessage(message)); + } + + module.exports = parse; + + +/***/ }, +/* 5 */ +/***/ function(module, exports, require) { + + var _parse = require(4); + + /** + * @constructor Parser + * Parser contains methods to evaluate or parse expressions, and has a number + * of convenience methods to get, set, and remove variables from memory. Parser + * keeps a scope containing variables in memory, which is used for all + * evaluations. + * + * Methods: + * var result = parser.eval(expr); // evaluate an expression + * var value = parser.get(name); // retrieve a variable from the parser + * parser.set(name, value); // set a variable in the parser + * parser.remove(name); // clear a variable from the + * // parsers scope + * parser.clear(); // clear the parsers scope + * + * // it is possible to parse an expression into a node tree: + * var node = parser.parse(expr); // parse an expression into a node tree + * var code = node.compile(math); // compile a node tree into javascript + * // code + * var code = parser.compile(expr); // parse and compile an expression into + * // javascript code. Equivalent of + * // parser.parse(expr).compile(math) + * + * // A compiled expression can be evaluated as + * var result = code.eval([scope]); // scope is an optional object + * + * Example usage: + * var parser = new Parser(math); + * // Note: there is a convenience method which can be used instead: + * // var parser = new math.parser(); + * + * // evaluate expressions + * parser.eval('sqrt(3^2 + 4^2)'); // 5 + * parser.eval('sqrt(-4)'); // 2i + * parser.eval('2 inch in cm'); // 5.08 cm + * parser.eval('cos(45 deg)'); // 0.7071067811865476 + * + * // define variables and functions + * parser.eval('x = 7 / 2'); // 3.5 + * parser.eval('x + 3'); // 6.5 + * parser.eval('function f(x, y) = x^y'); // f(x, y) + * parser.eval('f(2, 3)'); // 8 + * + * // get and set variables and functions + * var x = parser.get('x'); // 7 + * var f = parser.get('f'); // function + * var g = f(3, 2); // 9 + * parser.set('h', 500); + * var i = parser.eval('h / 2'); // 250 + * parser.set('hello', function (name) { + * return 'hello, ' + name + '!'; + * }); + * parser.eval('hello("user")'); // "hello, user!" + * + * // clear defined functions and variables + * parser.clear(); + * + * + * @param {Object} math Link to the math.js namespace + */ + function Parser(math) { + if (!(this instanceof Parser)) { + throw new SyntaxError( + 'Parser constructor must be called with the new operator'); + } + + if (typeof math !== 'object') { + throw new TypeError('Object expected as parameter math'); + } + + this.math = math; + this.scope = {}; + } + + /** + * Parse an expression and return the parsed function node. + * The node tree can be compiled via `code = node.compile(math)`, + * and the compiled code can be executed as `code.eval([scope])` + * @param {String} expr + * @return {Node} node + * @throws {Error} + */ + Parser.prototype.parse = function (expr) { + // TODO: validate arguments + return _parse(expr); + }; + + /** + * Parse and compile an expression, return the compiled javascript code. + * The node can be evaluated via code.eval([scope]) + * @param {String} expr + * @return {{eval: function}} code + * @throws {Error} + */ + Parser.prototype.compile = function (expr) { + // TODO: validate arguments + return _parse(expr).compile(this.math); + }; + + /** + * Parse and evaluate the given expression + * @param {String} expr A string containing an expression, for example "2+3" + * @return {*} result The result, or undefined when the expression was empty + * @throws {Error} + */ + Parser.prototype.eval = function (expr) { + // TODO: validate arguments + return _parse(expr) + .compile(this.math) + .eval(this.scope); + }; + + /** + * Get a variable (a function or variable) by name from the parsers scope. + * Returns undefined when not found + * @param {String} name + * @return {* | undefined} value + */ + Parser.prototype.get = function (name) { + // TODO: validate arguments + return this.scope[name]; + }; + + /** + * Set a symbol (a function or variable) by name from the parsers scope. + * @param {String} name + * @param {* | undefined} value + */ + Parser.prototype.set = function (name, value) { + // TODO: validate arguments + return this.scope[name] = value; + }; + + /** + * Remove a variable from the parsers scope + * @param {String} name + */ + Parser.prototype.remove = function (name) { + // TODO: validate arguments + delete this.scope[name]; + }; + + /** + * Clear the scope with variables and functions + */ + Parser.prototype.clear = function () { + for (var name in this.scope) { + if (this.scope.hasOwnProperty(name)) { + delete this.scope[name]; + } + } + }; + + module.exports = Parser; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, require) { + + // constants + exports.e = require(118); + exports.E = require(118); + exports['false'] = require(119); + exports.i = require(120); + exports['Infinity'] = require(121); + exports.LN2 = require(122); + exports.LN10 = require(123); + exports.LOG2E = require(124); + exports.LOG10E = require(125); + exports.NaN = require(126); + exports.pi = require(127); + exports.PI = require(127); + exports.SQRT1_2 = require(128); + exports.SQRT2 = require(129); + exports.tau = require(130); + exports['true'] = require(131); + + // functions - arithmetic + exports.abs = require(132); + exports.add = require(133); + exports.ceil = require(134); + exports.cube = require(135); + exports.divide = require(136); + exports.edivide = require(137); + exports.emultiply = require(138); + exports.epow = require(139); + exports.equal = require(140); + exports.exp = require(141); + exports.fix = require(142); + exports.floor = require(143); + exports.gcd = require(144); + exports.larger = require(145); + exports.largereq = require(146); + exports.lcm = require(147); + exports.log = require(148); + exports.log10 = require(149); + exports.mod = require(150); + exports.multiply = require(151); + exports.pow = require(152); + exports.round = require(153); + exports.sign = require(154); + exports.smaller = require(155); + exports.smallereq = require(156); + exports.sqrt = require(157); + exports.square = require(158); + exports.subtract = require(159); + exports.unary = require(160); + exports.unequal = require(161); + exports.xgcd = require(162); + + // functions - complex + exports.arg = require(163); + exports.conj = require(164); + exports.re = require(165); + exports.im = require(166); + + // functions - construction + exports.bignumber = require(167); + exports['boolean'] = require(168); + exports.complex = require(169); + exports.index = require(170); + exports.matrix = require(171); + exports.number = require(172); + exports.string = require(173); + exports.unit = require(174); + + // functions - epxression + exports['eval'] = require(175); + exports.help = require(176); + + // functions - matrix + exports.concat = require(177); + exports.det = require(178); + exports.diag = require(179); + exports.eye = require(180); + exports.inv = require(181); + exports.ones = require(182); + exports.range = require(183); + exports.resize = require(184); + exports.size = require(185); + exports.squeeze = require(186); + exports.subset = require(187); + exports.transpose = require(188); + exports.zeros = require(189); + + // functions - probability + exports.combinations = require(190); + exports.distribution = require(191); + exports.factorial = require(192); + exports.permutations = require(193); + exports.pickRandom = require(194); + exports.random = require(195); + exports.randomInt = require(196); + + // functions - statistics + exports.min = require(197); + exports.mean = require(198); + exports.max = require(199); + + // functions - trigonometry + exports.acos = require(200); + exports.asin = require(201); + exports.atan = require(202); + exports.atan2 = require(203); + exports.cos = require(204); + exports.cot = require(205); + exports.csc = require(206); + exports.sec = require(207); + exports.sin = require(208); + exports.tan = require(209); + + // functions - units + exports.to = require(210); + + // functions - utils + exports.clone = require(211); + exports.map = require(212); + exports.forEach = require(213); + exports.format = require(214); + // exports.print = require('./function/utils/print'); // TODO: add documentation for print as soon as the parser supports objects. + exports['import'] = require(215); + exports['typeof'] = require(216); + + +/***/ }, +/* 7 */ +/***/ function(module, exports, require) { + + var util = require(117), + number = util.number, + + isNumber = util.number.isNumber, + isString = util.string.isString; + + /** + * @constructor Complex + * + * A complex value can be constructed in the following ways: + * var a = new Complex(); + * var b = new Complex(re, im); + * var c = Complex.parse(str); + * + * Example usage: + * var a = new Complex(3, -4); // 3 - 4i + * a.re = 5; // a = 5 - 4i + * var i = a.im; // -4; + * var b = Complex.parse('2 + 6i'); // 2 + 6i + * var c = new Complex(); // 0 + 0i + * var d = math.add(a, b); // 5 + 2i + * + * @param {Number} re The real part of the complex value + * @param {Number} [im] The imaginary part of the complex value + */ + function Complex(re, im) { + if (!(this instanceof Complex)) { + throw new SyntaxError( + 'Complex constructor must be called with the new operator'); + } + + switch (arguments.length) { + case 0: + this.re = 0; + this.im = 0; + break; + + case 2: + if (!isNumber(re) || !isNumber(im)) { + throw new TypeError('Two numbers expected in Complex constructor'); + } + this.re = re; + this.im = im; + break; + + default: + if (arguments.length != 0 && arguments.length != 2) { + throw new SyntaxError( + 'Two or zero arguments expected in Complex constructor'); + } + break; + } + } + + /** + * Test whether value is a Complex value + * @param {*} value + * @return {Boolean} isComplex + */ + Complex.isComplex = function isComplex(value) { + return (value instanceof Complex); + }; + + // private variables and functions for the parser + var text, index, c; + + function skipWhitespace() { + while (c == ' ' || c == '\t') { + next(); + } + } + + function isDigitDot (c) { + return ((c >= '0' && c <= '9') || c == '.'); + } + + function isDigit (c) { + return ((c >= '0' && c <= '9')); + } + + function next() { + index++; + c = text.charAt(index); + } + + function revert(oldIndex) { + index = oldIndex; + c = text.charAt(index); + } + + function parseNumber () { + var number = ''; + var oldIndex; + oldIndex = index; + + if (c == '+') { + next(); + } + else if (c == '-') { + number += c; + next(); + } + + if (!isDigitDot(c)) { + // a + or - must be followed by a digit + revert(oldIndex); + return null; + } + + // get number, can have a single dot + if (c == '.') { + number += c; + next(); + if (!isDigit(c)) { + // this is no legal number, it is just a dot + revert(oldIndex); + return null; + } + } + else { + while (isDigit(c)) { + number += c; + next(); + } + if (c == '.') { + number += c; + next(); + } + } + while (isDigit(c)) { + number += c; + next(); + } + + // check for exponential notation like "2.3e-4" or "1.23e50" + if (c == 'E' || c == 'e') { + number += c; + next(); + + if (c == '+' || c == '-') { + number += c; + next(); + } + + // Scientific notation MUST be followed by an exponent + if (!isDigit(c)) { + // this is no legal number, exponent is missing. + revert(oldIndex); + return null; + } + + while (isDigit(c)) { + number += c; + next(); + } + } + + return number; + } + + function parseComplex () { + // check for 'i', '-i', '+i' + var cnext = text.charAt(index + 1); + if (c == 'I' || c == 'i') { + next(); + return '1'; + } + else if ((c == '+' || c == '-') && (cnext == 'I' || cnext == 'i')) { + var number = (c == '+') ? '1' : '-1'; + next(); + next(); + return number; + } + + return null; + } + + /** + * Parse a complex number from a string. For example Complex.parse("2 + 3i") + * will return a Complex value where re = 2, im = 3. + * Returns null if provided string does not contain a valid complex number. + * @param {String} str + * @returns {Complex | null} complex + */ + Complex.parse = function parse (str) { + text = str; + index = -1; + c = ''; + + if (!isString(text)) { + return null; + } + + next(); + skipWhitespace(); + var first = parseNumber(); + if (first) { + if (c == 'I' || c == 'i') { + // pure imaginary number + next(); + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + return new Complex(0, Number(first)); + } + else { + // complex and real part + skipWhitespace(); + var separator = c; + if (separator != '+' && separator != '-') { + // pure real number + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + return new Complex(Number(first), 0); + } + else { + // complex and real part + next(); + skipWhitespace(); + var second = parseNumber(); + if (second) { + if (c != 'I' && c != 'i') { + // 'i' missing at the end of the complex number + return null; + } + next(); + } + else { + second = parseComplex(); + if (!second) { + // imaginary number missing after separator + return null; + } + } + + if (separator == '-') { + if (second[0] == '-') { + second = '+' + second.substring(1); + } + else { + second = '-' + second; + } + } + + next(); + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + return new Complex(Number(first), Number(second)); + } + } + } + else { + // check for 'i', '-i', '+i' + first = parseComplex(); + if (first) { + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + return new Complex(0, Number(first)); + } + } + + return null; + }; + + /** + * Create a copy of the complex value + * @return {Complex} clone + */ + Complex.prototype.clone = function clone () { + return new Complex(this.re, this.im); + }; + + /** + * Test whether this complex number equals an other complex value. + * Two complex numbers are equal when both their real and imaginary parts + * are equal. + * @param {Complex} other + * @return {boolean} isEqual + */ + Complex.prototype.equals = function equals (other) { + return (this.re === other.re) && (this.im === other.im); + }; + + /** + * Get a string representation of the complex number, + * with optional formatting options. + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @return {String} str + */ + Complex.prototype.format = function format (options) { + var str = '', + strRe = number.format(this.re, options), + strIm = number.format(this.im, options); + + if (this.im == 0) { + // real value + str = strRe; + } + else if (this.re == 0) { + // purely complex value + if (this.im == 1) { + str = 'i'; + } + else if (this.im == -1) { + str = '-i'; + } + else { + str = strIm + 'i'; + } + } + else { + // complex value + if (this.im > 0) { + if (this.im == 1) { + str = strRe + ' + i'; + } + else { + str = strRe + ' + ' + strIm + 'i'; + } + } + else { + if (this.im == -1) { + str = strRe + ' - i'; + } + else { + str = strRe + ' - ' + strIm.substring(1) + 'i'; + } + } + } + + return str; + }; + + /** + * Get a string representation of the complex number. + * @return {String} str + */ + Complex.prototype.toString = function toString () { + return this.format(); + }; + + // exports + module.exports = Complex; + + // to trick my IDE which doesn't get it + exports.isComplex = Complex.isComplex; + exports.parse = Complex.parse; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, require) { + + var util = require(117), + + number = util.number, + string = util.string, + array = util.array; + + /** + * @constructor Range + * Create a range. A range has a start, step, and end, and contains functions + * to iterate over the range. + * + * A range can be constructed as: + * var range = new Range(start, end); + * var range = new Range(start, end, step); + * + * To get the result of the range: + * range.forEach(function (x) { + * console.log(x); + * }); + * range.map(function (x) { + * return math.sin(x); + * }); + * range.toArray(); + * + * Example usage: + * var c = new Range(2, 6); // 2:1:5 + * c.toArray(); // [2, 3, 4, 5] + * var d = new Range(2, -3, -1); // 2:-1:-2 + * d.toArray(); // [2, 1, 0, -1, -2] + * + * @param {Number} start included lower bound + * @param {Number} end excluded upper bound + * @param {Number} [step] step size, default value is 1 + */ + function Range(start, end, step) { + if (!(this instanceof Range)) { + throw new SyntaxError( + 'Range constructor must be called with the new operator'); + } + + if (start != null && !number.isNumber(start)) { + throw new TypeError('Parameter start must be a number'); + } + if (end != null && !number.isNumber(end)) { + throw new TypeError('Parameter end must be a number'); + } + if (step != null && !number.isNumber(step)) { + throw new TypeError('Parameter step must be a number'); + } + + this.start = (start != null) ? parseFloat(start) : 0; + this.end = (end != null) ? parseFloat(end) : 0; + this.step = (step != null) ? parseFloat(step) : 1; + } + + /** + * Parse a string into a range, + * The string contains the start, optional step, and end, separated by a colon. + * If the string does not contain a valid range, null is returned. + * For example str='0:2:11'. + * @param {String} str + * @return {Range | null} range + */ + Range.parse = function parse (str) { + if (!string.isString(str)) { + return null; + } + + var args = str.split(':'); + var nums = args.map(function (arg) { + return parseFloat(arg); + }); + + var invalid = nums.some(function (num) { + return isNaN(num); + }); + if(invalid) { + return null; + } + + switch (nums.length) { + case 2: return new Range(nums[0], nums[1]); + case 3: return new Range(nums[0], nums[2], nums[1]); + default: return null; + } + }; + + /** + * Create a clone of the range + * @return {Range} clone + */ + Range.prototype.clone = function clone() { + return new Range(this.start, this.end, this.step); + }; + + /** + * Test whether an object is a Range + * @param {*} object + * @return {Boolean} isRange + */ + Range.isRange = function isRange(object) { + return (object instanceof Range); + }; + + /** + * Retrieve the size of the range. + * Returns an array containing one number, the number of elements in the range. + * @returns {Number[]} size + */ + Range.prototype.size = function size() { + var len = 0, + start = this.start, + step = this.step, + end = this.end, + diff = end - start; + + if (number.sign(step) == number.sign(diff)) { + len = Math.ceil((diff) / step); + } + else if (diff == 0) { + len = 0; + } + + if (isNaN(len)) { + len = 0; + } + return [len]; + }; + + /** + * Calculate the minimum value in the range + * @return {Number | undefined} min + */ + Range.prototype.min = function min () { + var size = this.size()[0]; + + if (size > 0) { + if (this.step > 0) { + // positive step + return this.start; + } + else { + // negative step + return this.start + (size - 1) * this.step; + } + } + else { + return undefined; + } + }; + + /** + * Calculate the maximum value in the range + * @return {Number | undefined} max + */ + Range.prototype.max = function max () { + var size = this.size()[0]; + + if (size > 0) { + if (this.step > 0) { + // positive step + return this.start + (size - 1) * this.step; + } + else { + // negative step + return this.start; + } + } + else { + return undefined; + } + }; + + + /** + * Execute a callback function for each value in the range. + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + */ + Range.prototype.forEach = function forEach(callback) { + var x = this.start; + var step = this.step; + var end = this.end; + var i = 0; + + if (step > 0) { + while (x < end) { + callback(x, i, this); + x += step; + i++; + } + } + else if (step < 0) { + while (x > end) { + callback(x, i, this); + x += step; + i++; + } + } + }; + + /** + * Execute a callback function for each value in the Range, and return the + * results as an array + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @returns {Array} array + */ + Range.prototype.map = function map(callback) { + var array = []; + this.forEach(function (value, index, obj) { + array[index] = callback(value, index, obj); + }); + return array; + }; + + /** + * Create an Array with a copy of the Ranges data + * @returns {Array} array + */ + Range.prototype.toArray = function toArray() { + var array = []; + this.forEach(function (value, index) { + array[index] = value; + }); + return array; + }; + + /** + * Get the primitive value of the Range, a one dimensional array + * @returns {Array} array + */ + Range.prototype.valueOf = function valueOf() { + // TODO: implement a caching mechanism for range.valueOf() + return this.toArray(); + }; + + /** + * Get a string representation of the range, with optional formatting options. + * Output is formatted as 'start:step:end', for example '2:6' or '0:0.2:11' + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @returns {String} str + */ + Range.prototype.format = function format(options) { + var str = number.format(this.start, options); + + if (this.step != 1) { + str += ':' + number.format(this.step, options); + } + str += ':' + number.format(this.end, options); + return str; + }; + + /** + * Get a string representation of the range. + * @returns {String} + */ + Range.prototype.toString = function toString() { + return this.format(); + }; + + // exports + module.exports = Range; + + // to trick my IDE which doesn't get it + exports.isRange = Range.isRange; + exports.parse = Range.parse; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, require) { + + var util = require(117), + + Range = require(8), + + number = util.number, + + isNumber = number.isNumber, + isInteger = number.isInteger, + isArray = Array.isArray, + validateIndex = util.array.validateIndex; + + /** + * @Constructor Index + * Create an index. An Index can store ranges having start, step, and end + * for multiple dimensions. + * Matrix.get, Matrix.set, and math.subset accept an Index as input. + * + * Usage: + * var index = new Index(range1, range2, ...); + * + * Where each range can be any of: + * An array [start, end] + * An array [start, end, step] + * A number + * An instance of Range + * + * The parameters start, end, and step must be integer numbers. + * + * @param {...*} ranges + */ + function Index(ranges) { + if (!(this instanceof Index)) { + throw new SyntaxError( + 'Index constructor must be called with the new operator'); + } + + this._ranges = []; + + for (var i = 0, ii = arguments.length; i < ii; i++) { + var arg = arguments[i]; + + if (arg instanceof Range) { + this._ranges.push(arg); + } + else { + if (arg) { + arg = arg.valueOf(); + } + + if (isArray(arg)) { + this._ranges.push(_createRange(arg)); + } + else if (isNumber(arg)) { + this._ranges.push(_createRange([arg, arg + 1])); + } + // TODO: implement support for wildcard '*' + else { + throw new TypeError('Range expected as Array, Number, or String'); + } + } + } + } + + /** + * Parse an argument into a range and validate the range + * @param {Array} arg An array with [start: Number, end: Number] and + * optional a third element step:Number + * @return {Range} range + * @private + */ + function _createRange(arg) { + // TODO: make function _createRange simpler/faster + + // test whether all arguments are integers + var num = arg.length; + for (var i = 0; i < num; i++) { + if (!isNumber(arg[i]) || !isInteger(arg[i])) { + throw new TypeError('Index parameters must be integer numbers'); + } + } + + switch (arg.length) { + case 2: + return new Range(arg[0], arg[1]); // start, end + case 3: + return new Range(arg[0], arg[1], arg[2]); // start, end, step + default: + // TODO: improve error message + throw new SyntaxError('Wrong number of arguments in Index (2 or 3 expected)'); + } + } + + /** + * Create a clone of the index + * @return {Index} clone + */ + Index.prototype.clone = function clone () { + var index = new Index(); + index._ranges = util.object.clone(this._ranges); + return index; + }; + + /** + * Test whether an object is an Index + * @param {*} object + * @return {Boolean} isIndex + */ + Index.isIndex = function isIndex(object) { + return (object instanceof Index); + }; + + /** + * Create an index from an array with ranges/numbers + * @param {Array.} ranges + * @return {Index} index + * @private + */ + Index.create = function create(ranges) { + var index = new Index(); + Index.apply(index, ranges); + return index; + }; + + /** + * Retrieve the size of the index, the number of elements for each dimension. + * @returns {Number[]} size + */ + Index.prototype.size = function size () { + var size = []; + + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + var range = this._ranges[i]; + + size[i] = range.size()[0]; + } + + return size; + }; + + /** + * Get the maximum value for each of the indexes ranges. + * @returns {Number[]} max + */ + Index.prototype.max = function max () { + var values = []; + + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + var range = this._ranges[i]; + values[i] = range.max(); + } + + return values; + }; + + /** + * Get the minimum value for each of the indexes ranges. + * @returns {Number[]} min + */ + Index.prototype.min = function min () { + var values = []; + + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + var range = this._ranges[i]; + + values[i] = range.min(); + } + + return values; + }; + + /** + * Loop over each of the ranges of the index + * @param {function} callback Called for each range with a Range as first + * argument, the dimension as second, and the + * index object as third. + */ + Index.prototype.forEach = function forEach(callback) { + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + callback(this._ranges[i], i, this); + } + }; + + /** + * Retrieve the range for a given dimension number from the index + * @param {Number} dim Number of the dimension + * @returns {Range | undefined} range + */ + Index.prototype.range = function range (dim) { + return this._ranges[dim]; + }; + + /** + * Test whether this index contains only a single value + * @return {boolean} isScalar + */ + Index.prototype.isScalar = function isScalar () { + var size = this.size(); + + for (var i = 0, ii = size.length; i < ii; i++) { + if (size[i] !== 1) { + return false; + } + } + + return true; + }; + + /** + * Expand the Index into an array. + * For example new Index([0,3], [2,7]) returns [[0,1,2], [2,3,4,5,6]] + * @returns {Array} array + */ + Index.prototype.toArray = function toArray() { + var array = []; + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + var range = this._ranges[i], + row = [], + x = range.start, + end = range.end, + step = range.step; + + if (step > 0) { + while (x < end) { + row.push(x); + x += step; + } + } + else if (step < 0) { + while (x > end) { + row.push(x); + x += step; + } + } + + array.push(row); + } + + return array; + }; + + /** + * Get the primitive value of the Index, a two dimensional array. + * Equivalent to Index.toArray(). + * @returns {Array} array + */ + Index.prototype.valueOf = Index.prototype.toArray; + + /** + * Get the string representation of the index, for example '[2:6]' or '[0:2:10, 4:7]' + * @returns {String} str + */ + Index.prototype.toString = function () { + var strings = []; + + for (var i = 0, ii = this._ranges.length; i < ii; i++) { + var range = this._ranges[i]; + var str = number.format(range.start); + if (range.step != 1) { + str += ':' + number.format(range.step); + } + str += ':' + number.format(range.end); + strings.push(str); + } + + return '[' + strings.join(',') + ']'; + }; + + // exports + module.exports = Index; + + // to trick my IDE which doesn't get it + exports.isIndex = Index.isIndex; + exports.create = Index.create; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, require) { + + var util = require(117), + Index = require(9), + + number = util.number, + string = util.string, + array = util.array, + object = util.object, + + isArray = Array.isArray, + validateIndex = array.validateIndex; + + /** + * @constructor Matrix + * + * A Matrix is a wrapper around an Array. A matrix can hold a multi dimensional + * array. A matrix can be constructed as: + * var matrix = new Matrix(data) + * + * Matrix contains the functions to resize, get and set values, get the size, + * clone the matrix and to convert the matrix to a vector, array, or scalar. + * Furthermore, one can iterate over the matrix using map and forEach. + * The internal Array of the Matrix can be accessed using the function valueOf. + * + * Example usage: + * var matrix = new Matrix([[1, 2], [3, 4]); + * matix.size(); // [2, 2] + * matrix.resize([3, 2], 5); + * matrix.valueOf(); // [[1, 2], [3, 4], [5, 5]] + * matrix.subset([1,2]) // 3 (indexes are zero-based) + * + * @param {Array | Matrix} [data] A multi dimensional array + */ + function Matrix(data) { + if (!(this instanceof Matrix)) { + throw new SyntaxError( + 'Matrix constructor must be called with the new operator'); + } + + if (data instanceof Matrix) { + // clone data from a Matrix + this._data = data.clone()._data; + } + else if (isArray(data)) { + // use array + // replace nested Matrices with Arrays + this._data = preprocess(data); + } + else if (data != null) { + // unsupported type + throw new TypeError('Unsupported type of data (' + util.types.type(data) + ')'); + } + else { + // nothing provided + this._data = []; + } + + // verify the size of the array + this._size = array.size(this._data); + } + + /** + * Test whether an object is a Matrix + * @param {*} object + * @return {Boolean} isMatrix + */ + Matrix.isMatrix = function isMatrix(object) { + return (object instanceof Matrix); + }; + + /** + * Get a subset of the matrix, or replace a subset of the matrix. + * + * Usage: + * var subset = matrix.subset(index) // retrieve subset + * var value = matrix.subset(index, replacement) // replace subset + * + * @param {Index} index + * @param {Array | Matrix | *} [replacement] + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + */ + Matrix.prototype.subset = function subset(index, replacement, defaultValue) { + switch (arguments.length) { + case 1: + return _get(this, index); + + // intentional fall through + case 2: + case 3: + return _set(this, index, replacement, defaultValue); + + default: + throw new SyntaxError('Wrong number of arguments'); + } + }; + + /** + * Get a single element from the matrix. + * @param {Number[]} index Zero-based index + * @return {*} value + */ + Matrix.prototype.get = function get(index) { + if (!isArray(index)) { + throw new Error('Array expected'); + } + if (index.length != this._size.length) { + throw new RangeError('Dimension mismatch ' + + '(' + index.length + ' != ' + this._size.length + ')'); + } + + var data = this._data; + for (var i = 0, ii = index.length; i < ii; i++) { + var index_i = index[i]; + validateIndex(index_i, data.length); + data = data[index_i]; + } + + return object.clone(data); + }; + + /** + * Replace a single element in the matrix. + * @param {Number[]} index Zero-based index + * @param {*} value + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @return {Matrix} self + */ + Matrix.prototype.set = function set (index, value, defaultValue) { + var i, ii; + + // validate input type and dimensions + if (!isArray(index)) { + throw new Error('Array expected'); + } + if (index.length < this._size.length) { + throw new RangeError('Dimension mismatch ' + + '(' + index.length + ' < ' + this._size.length + ')'); + } + + // enlarge matrix when needed + var size = index.map(function (i) { + return i + 1; + }); + _fit(this, size, defaultValue); + + // traverse over the dimensions + var data = this._data; + for (i = 0, ii = index.length - 1; i < ii; i++) { + var index_i = index[i]; + validateIndex(index_i, data.length); + data = data[index_i]; + } + + // set new value + index_i = index[index.length - 1]; + validateIndex(index_i, data.length); + data[index_i] = value; + + return this; + }; + + /** + * Get a submatrix of this matrix + * @param {Matrix} matrix + * @param {Index} index Zero-based index + * @private + */ + function _get (matrix, index) { + if (!(index instanceof Index)) { + throw new TypeError('Invalid index'); + } + + var isScalar = index.isScalar(); + if (isScalar) { + // return a scalar + return matrix.get(index.min()); + } + else { + // validate dimensions + var size = index.size(); + if (size.length != matrix._size.length) { + throw new RangeError('Dimension mismatch ' + + '(' + size.length + ' != ' + matrix._size.length + ')'); + } + + // retrieve submatrix + var submatrix = new Matrix(_getSubmatrix(matrix._data, index, size.length, 0)); + // TODO: more efficient when creating an empty matrix and setting _data and _size manually + + // squeeze matrix output + while (isArray(submatrix._data) && submatrix._data.length == 1) { + submatrix._data = submatrix._data[0]; + submatrix._size.shift(); + } + + return submatrix; + } + } + + /** + * Recursively get a submatrix of a multi dimensional matrix. + * Index is not checked for correct number of dimensions. + * @param {Array} data + * @param {Index} index + * @param {number} dims Total number of dimensions + * @param {number} dim Current dimension + * @return {Array} submatrix + * @private + */ + function _getSubmatrix (data, index, dims, dim) { + var last = (dim == dims - 1); + var range = index.range(dim); + + if (last) { + return range.map(function (i) { + validateIndex(i, data.length); + return data[i]; + }); + } + else { + return range.map(function (i) { + validateIndex(i, data.length); + var child = data[i]; + return _getSubmatrix(child, index, dims, dim + 1); + }); + } + } + + /** + * Replace a submatrix in this matrix + * Indexes are zero-based. + * @param {Matrix} matrix + * @param {Index} index + * @param {Matrix | Array | *} submatrix + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @return {Matrix} matrix + * @private + */ + function _set (matrix, index, submatrix, defaultValue) { + if (!(index instanceof Index)) { + throw new TypeError('Invalid index'); + } + + // get index size and check whether the index contains a single value + var iSize = index.size(), + isScalar = index.isScalar(); + + // calculate the size of the submatrix, and convert it into an Array if needed + var sSize; + if (submatrix instanceof Matrix) { + sSize = submatrix.size(); + submatrix = submatrix.valueOf(); + } + else { + sSize = array.size(submatrix); + } + + if (isScalar) { + // set a scalar + + // check whether submatrix is a scalar + if (sSize.length != 0) { + throw new TypeError('Scalar value expected'); + } + + matrix.set(index.min(), submatrix, defaultValue); + } + else { + // set a submatrix + + // validate dimensions + if (iSize.length < matrix._size.length) { + throw new RangeError('Dimension mismatch ' + + '(' + iSize.length + ' < ' + matrix._size.length + ')'); + } + + // unsqueeze the submatrix when needed + for (var i = 0, ii = iSize.length - sSize.length; i < ii; i++) { + submatrix = [submatrix]; + sSize.unshift(1); + } + + // check whether the size of the submatrix matches the index size + if (!object.deepEqual(iSize, sSize)) { + throw new RangeError('Dimensions mismatch ' + + '(' + string.format(iSize) + ' != '+ string.format(sSize) + ')'); + } + + // enlarge matrix when needed + var size = index.max().map(function (i) { + return i + 1; + }); + _fit(matrix, size, defaultValue); + + // insert the sub matrix + var dims = iSize.length, + dim = 0; + _setSubmatrix (matrix._data, index, submatrix, dims, dim); + } + + return matrix; + } + + /** + * Replace a submatrix of a multi dimensional matrix. + * @param {Array} data + * @param {Index} index + * @param {Array} submatrix + * @param {number} dims Total number of dimensions + * @param {number} dim + * @private + */ + function _setSubmatrix (data, index, submatrix, dims, dim) { + var last = (dim == dims - 1), + range = index.range(dim); + + if (last) { + range.forEach(function (dataIndex, subIndex) { + validateIndex(dataIndex); + data[dataIndex] = submatrix[subIndex]; + }); + } + else { + range.forEach(function (dataIndex, subIndex) { + validateIndex(dataIndex); + _setSubmatrix(data[dataIndex], index, submatrix[subIndex], dims, dim + 1); + }); + } + } + + /** + * Resize the matrix + * @param {Number[]} size + * @param {*} [defaultValue] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be left undefined. + * @return {Matrix} self The matrix itself is returned + */ + Matrix.prototype.resize = function resize(size, defaultValue) { + this._size = object.clone(size); + this._data = array.resize(this._data, this._size, defaultValue); + + // return the matrix itself + return this; + }; + + /** + * Enlarge the matrix when it is smaller than given size. + * If the matrix is larger or equal sized, nothing is done. + * @param {Matrix} matrix The matrix to be resized + * @param {Number[]} size + * @param {*} [defaultValue] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be left undefined. + * @private + */ + function _fit(matrix, size, defaultValue) { + if (!isArray(size)) { + throw new Error('Array expected'); + } + + var newSize = object.clone(matrix._size), + changed = false; + + // add dimensions when needed + while (newSize.length < size.length) { + newSize.unshift(0); + changed = true; + } + + // enlarge size when needed + for (var i = 0, ii = size.length; i < ii; i++) { + if (size[i] > newSize[i]) { + newSize[i] = size[i]; + changed = true; + } + } + + if (changed) { + // resize only when size is changed + matrix.resize(newSize, defaultValue); + } + } + + /** + * Create a clone of the matrix + * @return {Matrix} clone + */ + Matrix.prototype.clone = function clone() { + var matrix = new Matrix(); + matrix._data = object.clone(this._data); + matrix._size = object.clone(this._size); + return matrix; + }; + + /** + * Retrieve the size of the matrix. + * @returns {Number[]} size + */ + Matrix.prototype.size = function size() { + return this._size; + }; + + /** + * Create a new matrix with the results of the callback function executed on + * each entry of the matrix. + * @param {function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @return {Matrix} matrix + */ + Matrix.prototype.map = function map(callback) { + var me = this; + var matrix = new Matrix(); + var index = []; + var recurse = function (value, dim) { + if (isArray(value)) { + return value.map(function (child, i) { + index[dim] = i; + return recurse(child, dim + 1); + }); + } + else { + return callback(value, index, me); + } + }; + matrix._data = recurse(this._data, 0); + matrix._size = object.clone(this._size); + + return matrix; + }; + + /** + * Execute a callback function on each entry of the matrix. + * @param {function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + */ + Matrix.prototype.forEach = function forEach(callback) { + var me = this; + var index = []; + var recurse = function (value, dim) { + if (isArray(value)) { + value.forEach(function (child, i) { + index[dim] = i; + recurse(child, dim + 1); + }); + } + else { + callback(value, index, me); + } + }; + recurse(this._data, 0); + }; + + /** + * Create an Array with a copy of the data of the Matrix + * @returns {Array} array + */ + Matrix.prototype.toArray = function toArray() { + return object.clone(this._data); + }; + + /** + * Get the primitive value of the Matrix: a multidimensional array + * @returns {Array} array + */ + Matrix.prototype.valueOf = function valueOf() { + return this._data; + }; + + /** + * Get a string representation of the matrix, with optional formatting options. + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @returns {String} str + */ + Matrix.prototype.format = function format(options) { + return string.format(this._data, options); + }; + + /** + * Get a string representation of the matrix + * @returns {String} str + */ + Matrix.prototype.toString = function toString() { + return string.format(this._data); + }; + + /** + * Preprocess data, which can be an Array or Matrix with nested Arrays and + * Matrices. Replaces all nested Matrices with Arrays + * @param {Array} data + * @return {Array} data + */ + function preprocess(data) { + for (var i = 0, ii = data.length; i < ii; i++) { + var elem = data[i]; + if (isArray(elem)) { + data[i] = preprocess(elem); + } + else if (elem instanceof Matrix) { + data[i] = preprocess(elem._data); + } + } + + return data; + } + + // exports + module.exports = Matrix; + + // to trick my IDE which doesn't get it + exports.isMatrix = Matrix.isMatrix; + + +/***/ }, +/* 11 */ +/***/ function(module, exports, require) { + + var util = require(117), + + number = util.number, + string = util.string, + isNumber = util.number.isNumber, + isString = util.string.isString; + + /** + * @constructor Unit + * + * A unit can be constructed in the following ways: + * var a = new Unit(value, unit); + * var b = new Unit(null, unit); + * var c = Unit.parse(str); + * + * Example usage: + * var a = new Unit(5, 'cm'); // 50 mm + * var b = Unit.parse('23 kg'); // 23 kg + * var c = math.in(a, new Unit(null, 'm'); // 0.05 m + * + * @param {Number} [value] A value like 5.2 + * @param {String} [unit] A unit like "cm" or "inch" + */ + function Unit(value, unit) { + if (!(this instanceof Unit)) { + throw new Error('Unit constructor must be called with the new operator'); + } + + if (value != null && !isNumber(value)) { + throw new TypeError('First parameter in Unit constructor must be a number'); + } + if (unit != null && !isString(unit)) { + throw new TypeError('Second parameter in Unit constructor must be a string'); + } + + if (unit != null) { + // find the unit and prefix from the string + var res = _findUnit(unit); + if (!res) { + throw new SyntaxError('Unknown unit "' + unit + '"'); + } + this.unit = res.unit; + this.prefix = res.prefix; + } + else { + this.unit = UNIT_NONE; + this.prefix = PREFIX_NONE; // link to a list with supported prefixes + } + + if (value != null) { + this.value = this._normalize(value); + this.fixPrefix = false; // is set true by the methods Unit.in and math.in + } + else { + this.value = null; + this.fixPrefix = true; + } + } + + // private variables and functions for the Unit parser + var text, index, c; + + function skipWhitespace() { + while (c == ' ' || c == '\t') { + next(); + } + } + + function isDigitDot (c) { + return ((c >= '0' && c <= '9') || c == '.'); + } + + function isDigit (c) { + return ((c >= '0' && c <= '9')); + } + + function next() { + index++; + c = text.charAt(index); + } + + function revert(oldIndex) { + index = oldIndex; + c = text.charAt(index); + } + + function parseNumber () { + var number = ''; + var oldIndex; + oldIndex = index; + + if (c == '+') { + next(); + } + else if (c == '-') { + number += c; + next(); + } + + if (!isDigitDot(c)) { + // a + or - must be followed by a digit + revert(oldIndex); + return null; + } + + // get number, can have a single dot + if (c == '.') { + number += c; + next(); + if (!isDigit(c)) { + // this is no legal number, it is just a dot + revert(oldIndex); + return null; + } + } + else { + while (isDigit(c)) { + number += c; + next(); + } + if (c == '.') { + number += c; + next(); + } + } + while (isDigit(c)) { + number += c; + next(); + } + + // check for exponential notation like "2.3e-4" or "1.23e50" + if (c == 'E' || c == 'e') { + number += c; + next(); + + if (c == '+' || c == '-') { + number += c; + next(); + } + + // Scientific notation MUST be followed by an exponent + if (!isDigit(c)) { + // this is no legal number, exponent is missing. + revert(oldIndex); + return null; + } + + while (isDigit(c)) { + number += c; + next(); + } + } + + return number; + } + + function parseUnit() { + var unit = ''; + + skipWhitespace(); + while (c && c != ' ' && c != '\t') { + unit += c; + next(); + } + + return unit || null; + } + + /** + * Parse a string into a unit. Returns null if the provided string does not + * contain a valid unit. + * @param {String} str A string like "5.2 inch", "4e2 kg" + * @return {Unit | null} unit + */ + Unit.parse = function parse(str) { + text = str; + index = -1; + c = ''; + + if (!isString(text)) { + return null; + } + + next(); + skipWhitespace(); + var value = parseNumber(); + var unit; + if (value) { + unit = parseUnit(); + + next(); + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + if (value && unit) { + return new Unit(Number(value), unit); + } + } + else { + unit = parseUnit(); + + next(); + skipWhitespace(); + if (c) { + // garbage at the end. not good. + return null; + } + + return new Unit(null, unit) + } + + return null; + }; + + /** + * Test whether value is of type Unit + * @param {*} value + * @return {Boolean} isUnit + */ + Unit.isUnit = function isUnit(value) { + return (value instanceof Unit); + }; + + /** + * create a copy of this unit + * @return {Unit} clone + */ + Unit.prototype.clone = function () { + var clone = new Unit(); + + for (var p in this) { + if (this.hasOwnProperty(p)) { + clone[p] = this[p]; + } + } + + return clone; + }; + + /** + * Normalize a value, based on its currently set unit + * @param {Number} value + * @return {Number} normalized value + * @private + */ + Unit.prototype._normalize = function(value) { + return (value + this.unit.offset) * + this.unit.value * this.prefix.value; + }; + + /** + * Unnormalize a value, based on its currently set unit + * @param {Number} value + * @param {Number} [prefixValue] Optional prefix value to be used + * @return {Number} unnormalized value + * @private + */ + Unit.prototype._unnormalize = function (value, prefixValue) { + if (prefixValue == undefined) { + return value / this.unit.value / this.prefix.value - + this.unit.offset; + } + else { + return value / this.unit.value / prefixValue - + this.unit.offset; + } + }; + + /** + * Find a unit from a string + * @param {String} str A string like 'cm' or 'inch' + * @returns {Object | null} result When found, an object with fields unit and + * prefix is returned. Else, null is returned. + * @private + */ + function _findUnit(str) { + for (var name in UNITS) { + if (UNITS.hasOwnProperty(name)) { + if (string.endsWith(str, name) ) { + var unit = UNITS[name]; + var prefixLen = (str.length - name.length); + var prefixName = str.substring(0, prefixLen); + var prefix = unit.prefixes[prefixName]; + if (prefix !== undefined) { + // store unit, prefix, and value + return { + unit: unit, + prefix: prefix + }; + } + } + } + } + + return null; + } + + /** + * Test if the given expression is a unit. + * The unit can have a prefix but cannot have a value. + * @param {String} unit A plain unit without value. Can have prefix, like "cm" + * @return {Boolean} true if the given string is a unit + */ + Unit.isPlainUnit = function (unit) { + return (_findUnit(unit) != null); + }; + + /** + * check if this unit has given base unit + * @param {BASE_UNITS | undefined} base + */ + Unit.prototype.hasBase = function(base) { + if (this.unit.base === undefined) { + return (base === undefined); + } + return (this.unit.base === base); + }; + + /** + * Check if this unit has a base equal to another base + * @param {Unit} other + * @return {Boolean} true if equal base + */ + Unit.prototype.equalBase = function(other) { + return (this.unit.base === other.unit.base); + }; + + /** + * Check if this unit equals another unit + * @param {Unit} other + * @return {Boolean} true if both units are equal + */ + Unit.prototype.equals = function(other) { + return (this.equalBase(other) && this.value == other.value); + }; + + /** + * Create a clone of this unit with a representation + * @param {String | Unit} plainUnit A plain unit, without value. Can have prefix, like "cm" + * @returns {Unit} unit having fixed, specified unit + */ + Unit.prototype.to = function (plainUnit) { + var other; + if (isString(plainUnit)) { + other = new Unit(null, plainUnit); + + if (!this.equalBase(other)) { + throw new Error('Units do not match'); + } + + other.value = this.value; + return other; + } + else if (plainUnit instanceof Unit) { + if (!this.equalBase(plainUnit)) { + throw new Error('Units do not match'); + } + if (plainUnit.value != null) { + throw new Error('Cannot convert to a unit with a value'); + } + if (plainUnit.unit == null) { + throw new Error('Unit expected on the right hand side of function in'); + } + + other = plainUnit.clone(); + other.value = this.value; + other.fixPrefix = true; + return other; + } + else { + throw new Error('String or Unit expected as parameter'); + } + }; + + /** + * Return the value of the unit when represented with given plain unit + * @param {String | Unit} plainUnit For example 'cm' or 'inch' + * @return {Number} value + */ + Unit.prototype.toNumber = function (plainUnit) { + var other = this.to(plainUnit); + var prefix = this.fixPrefix ? other._bestPrefix() : other.prefix; + return other._unnormalize(other.value, prefix.value); + }; + + + /** + * Get a string representation of the unit. + * @return {String} + */ + Unit.prototype.toString = function toString() { + return this.format(); + }; + + /** + * Get a string representation of the Unit, with optional formatting options. + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @return {String} + */ + Unit.prototype.format = function format(options) { + var value, + str; + + if (!this.fixPrefix) { + var bestPrefix = this._bestPrefix(); + value = this._unnormalize(this.value, bestPrefix.value); + str = (this.value != null) ? number.format(value, options) + ' ' : ''; + str += bestPrefix.name + this.unit.name; + } + else { + value = this._unnormalize(this.value); + str = (this.value != null) ? number.format(value, options) + ' ' : ''; + str += this.prefix.name + this.unit.name; + } + return str; + }; + + /** + * Calculate the best prefix using current value. + * @returns {Object} prefix + * @private + */ + Unit.prototype._bestPrefix = function () { + // find the best prefix value (resulting in the value of which + // the absolute value of the log10 is closest to zero, + // though with a little offset of 1.2 for nicer values: you get a + // sequence 1mm 100mm 500mm 0.6m 1m 10m 100m 500m 0.6km 1km ... + var absValue = Math.abs(this.value / this.unit.value); + var bestPrefix = PREFIX_NONE; + var bestDiff = Math.abs( + Math.log(absValue / bestPrefix.value) / Math.LN10 - 1.2); + + var prefixes = this.unit.prefixes; + for (var p in prefixes) { + if (prefixes.hasOwnProperty(p)) { + var prefix = prefixes[p]; + if (prefix.scientific) { + var diff = Math.abs( + Math.log(absValue / prefix.value) / Math.LN10 - 1.2); + + if (diff < bestDiff) { + bestPrefix = prefix; + bestDiff = diff; + } + } + } + } + + return bestPrefix; + }; + + var PREFIXES = { + 'NONE': { + '': {'name': '', 'value': 1, 'scientific': true} + }, + 'SHORT': { + '': {'name': '', 'value': 1, 'scientific': true}, + + 'da': {'name': 'da', 'value': 1e1, 'scientific': false}, + 'h': {'name': 'h', 'value': 1e2, 'scientific': false}, + 'k': {'name': 'k', 'value': 1e3, 'scientific': true}, + 'M': {'name': 'M', 'value': 1e6, 'scientific': true}, + 'G': {'name': 'G', 'value': 1e9, 'scientific': true}, + 'T': {'name': 'T', 'value': 1e12, 'scientific': true}, + 'P': {'name': 'P', 'value': 1e15, 'scientific': true}, + 'E': {'name': 'E', 'value': 1e18, 'scientific': true}, + 'Z': {'name': 'Z', 'value': 1e21, 'scientific': true}, + 'Y': {'name': 'Y', 'value': 1e24, 'scientific': true}, + + 'd': {'name': 'd', 'value': 1e-1, 'scientific': false}, + 'c': {'name': 'c', 'value': 1e-2, 'scientific': false}, + 'm': {'name': 'm', 'value': 1e-3, 'scientific': true}, + 'u': {'name': 'u', 'value': 1e-6, 'scientific': true}, + 'n': {'name': 'n', 'value': 1e-9, 'scientific': true}, + 'p': {'name': 'p', 'value': 1e-12, 'scientific': true}, + 'f': {'name': 'f', 'value': 1e-15, 'scientific': true}, + 'a': {'name': 'a', 'value': 1e-18, 'scientific': true}, + 'z': {'name': 'z', 'value': 1e-21, 'scientific': true}, + 'y': {'name': 'y', 'value': 1e-24, 'scientific': true} + }, + 'LONG': { + '': {'name': '', 'value': 1, 'scientific': true}, + + 'deca': {'name': 'deca', 'value': 1e1, 'scientific': false}, + 'hecto': {'name': 'hecto', 'value': 1e2, 'scientific': false}, + 'kilo': {'name': 'kilo', 'value': 1e3, 'scientific': true}, + 'mega': {'name': 'mega', 'value': 1e6, 'scientific': true}, + 'giga': {'name': 'giga', 'value': 1e9, 'scientific': true}, + 'tera': {'name': 'tera', 'value': 1e12, 'scientific': true}, + 'peta': {'name': 'peta', 'value': 1e15, 'scientific': true}, + 'exa': {'name': 'exa', 'value': 1e18, 'scientific': true}, + 'zetta': {'name': 'zetta', 'value': 1e21, 'scientific': true}, + 'yotta': {'name': 'yotta', 'value': 1e24, 'scientific': true}, + + 'deci': {'name': 'deci', 'value': 1e-1, 'scientific': false}, + 'centi': {'name': 'centi', 'value': 1e-2, 'scientific': false}, + 'milli': {'name': 'milli', 'value': 1e-3, 'scientific': true}, + 'micro': {'name': 'micro', 'value': 1e-6, 'scientific': true}, + 'nano': {'name': 'nano', 'value': 1e-9, 'scientific': true}, + 'pico': {'name': 'pico', 'value': 1e-12, 'scientific': true}, + 'femto': {'name': 'femto', 'value': 1e-15, 'scientific': true}, + 'atto': {'name': 'atto', 'value': 1e-18, 'scientific': true}, + 'zepto': {'name': 'zepto', 'value': 1e-21, 'scientific': true}, + 'yocto': {'name': 'yocto', 'value': 1e-24, 'scientific': true} + }, + 'SQUARED': { + '': {'name': '', 'value': 1, 'scientific': true}, + + 'da': {'name': 'da', 'value': 1e2, 'scientific': false}, + 'h': {'name': 'h', 'value': 1e4, 'scientific': false}, + 'k': {'name': 'k', 'value': 1e6, 'scientific': true}, + 'M': {'name': 'M', 'value': 1e12, 'scientific': true}, + 'G': {'name': 'G', 'value': 1e18, 'scientific': true}, + 'T': {'name': 'T', 'value': 1e24, 'scientific': true}, + 'P': {'name': 'P', 'value': 1e30, 'scientific': true}, + 'E': {'name': 'E', 'value': 1e36, 'scientific': true}, + 'Z': {'name': 'Z', 'value': 1e42, 'scientific': true}, + 'Y': {'name': 'Y', 'value': 1e48, 'scientific': true}, + + 'd': {'name': 'd', 'value': 1e-2, 'scientific': false}, + 'c': {'name': 'c', 'value': 1e-4, 'scientific': false}, + 'm': {'name': 'm', 'value': 1e-6, 'scientific': true}, + 'u': {'name': 'u', 'value': 1e-12, 'scientific': true}, + 'n': {'name': 'n', 'value': 1e-18, 'scientific': true}, + 'p': {'name': 'p', 'value': 1e-24, 'scientific': true}, + 'f': {'name': 'f', 'value': 1e-30, 'scientific': true}, + 'a': {'name': 'a', 'value': 1e-36, 'scientific': true}, + 'z': {'name': 'z', 'value': 1e-42, 'scientific': true}, + 'y': {'name': 'y', 'value': 1e-42, 'scientific': true} + }, + 'CUBIC': { + '': {'name': '', 'value': 1, 'scientific': true}, + + 'da': {'name': 'da', 'value': 1e3, 'scientific': false}, + 'h': {'name': 'h', 'value': 1e6, 'scientific': false}, + 'k': {'name': 'k', 'value': 1e9, 'scientific': true}, + 'M': {'name': 'M', 'value': 1e18, 'scientific': true}, + 'G': {'name': 'G', 'value': 1e27, 'scientific': true}, + 'T': {'name': 'T', 'value': 1e36, 'scientific': true}, + 'P': {'name': 'P', 'value': 1e45, 'scientific': true}, + 'E': {'name': 'E', 'value': 1e54, 'scientific': true}, + 'Z': {'name': 'Z', 'value': 1e63, 'scientific': true}, + 'Y': {'name': 'Y', 'value': 1e72, 'scientific': true}, + + 'd': {'name': 'd', 'value': 1e-3, 'scientific': false}, + 'c': {'name': 'c', 'value': 1e-6, 'scientific': false}, + 'm': {'name': 'm', 'value': 1e-9, 'scientific': true}, + 'u': {'name': 'u', 'value': 1e-18, 'scientific': true}, + 'n': {'name': 'n', 'value': 1e-27, 'scientific': true}, + 'p': {'name': 'p', 'value': 1e-36, 'scientific': true}, + 'f': {'name': 'f', 'value': 1e-45, 'scientific': true}, + 'a': {'name': 'a', 'value': 1e-54, 'scientific': true}, + 'z': {'name': 'z', 'value': 1e-63, 'scientific': true}, + 'y': {'name': 'y', 'value': 1e-72, 'scientific': true} + }, + 'BINARY_SHORT': { + '': {'name': '', 'value': 1, 'scientific': true}, + 'k': {'name': 'k', 'value': 1024, 'scientific': true}, + 'M': {'name': 'M', 'value': Math.pow(1024, 2), 'scientific': true}, + 'G': {'name': 'G', 'value': Math.pow(1024, 3), 'scientific': true}, + 'T': {'name': 'T', 'value': Math.pow(1024, 4), 'scientific': true}, + 'P': {'name': 'P', 'value': Math.pow(1024, 5), 'scientific': true}, + 'E': {'name': 'E', 'value': Math.pow(1024, 6), 'scientific': true}, + 'Z': {'name': 'Z', 'value': Math.pow(1024, 7), 'scientific': true}, + 'Y': {'name': 'Y', 'value': Math.pow(1024, 8), 'scientific': true}, + + 'Ki': {'name': 'Ki', 'value': 1024, 'scientific': true}, + 'Mi': {'name': 'Mi', 'value': Math.pow(1024, 2), 'scientific': true}, + 'Gi': {'name': 'Gi', 'value': Math.pow(1024, 3), 'scientific': true}, + 'Ti': {'name': 'Ti', 'value': Math.pow(1024, 4), 'scientific': true}, + 'Pi': {'name': 'Pi', 'value': Math.pow(1024, 5), 'scientific': true}, + 'Ei': {'name': 'Ei', 'value': Math.pow(1024, 6), 'scientific': true}, + 'Zi': {'name': 'Zi', 'value': Math.pow(1024, 7), 'scientific': true}, + 'Yi': {'name': 'Yi', 'value': Math.pow(1024, 8), 'scientific': true} + }, + 'BINARY_LONG': { + '': {'name': '', 'value': 1, 'scientific': true}, + 'kilo': {'name': 'kilo', 'value': 1024, 'scientific': true}, + 'mega': {'name': 'mega', 'value': Math.pow(1024, 2), 'scientific': true}, + 'giga': {'name': 'giga', 'value': Math.pow(1024, 3), 'scientific': true}, + 'tera': {'name': 'tera', 'value': Math.pow(1024, 4), 'scientific': true}, + 'peta': {'name': 'peta', 'value': Math.pow(1024, 5), 'scientific': true}, + 'exa': {'name': 'exa', 'value': Math.pow(1024, 6), 'scientific': true}, + 'zetta': {'name': 'zetta', 'value': Math.pow(1024, 7), 'scientific': true}, + 'yotta': {'name': 'yotta', 'value': Math.pow(1024, 8), 'scientific': true}, + + 'kibi': {'name': 'kibi', 'value': 1024, 'scientific': true}, + 'mebi': {'name': 'mebi', 'value': Math.pow(1024, 2), 'scientific': true}, + 'gibi': {'name': 'gibi', 'value': Math.pow(1024, 3), 'scientific': true}, + 'tebi': {'name': 'tebi', 'value': Math.pow(1024, 4), 'scientific': true}, + 'pebi': {'name': 'pebi', 'value': Math.pow(1024, 5), 'scientific': true}, + 'exi': {'name': 'exi', 'value': Math.pow(1024, 6), 'scientific': true}, + 'zebi': {'name': 'zebi', 'value': Math.pow(1024, 7), 'scientific': true}, + 'yobi': {'name': 'yobi', 'value': Math.pow(1024, 8), 'scientific': true} + } + }; + + var PREFIX_NONE = {'name': '', 'value': 1, 'scientific': true}; + + var BASE_UNITS = { + 'NONE': {}, + + 'LENGTH': {}, // meter + 'MASS': {}, // kilogram + 'TIME': {}, // second + 'CURRENT': {}, // ampere + 'TEMPERATURE': {}, // kelvin + 'LUMINOUS_INTENSITY': {}, // candela + 'AMOUNT_OF_SUBSTANCE': {}, // mole + + 'FORCE': {}, // Newton + 'SURFACE': {}, // m2 + 'VOLUME': {}, // m3 + 'ANGLE': {}, // rad + 'BIT': {} // bit (digital) + }; + + BASE_UNIT_NONE = {}; + + UNIT_NONE = {'name': '', 'base': BASE_UNIT_NONE, 'value': 1, 'offset': 0}; + + var UNITS = { + // length + meter: {'name': 'meter', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, + inch: {'name': 'inch', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0254, 'offset': 0}, + foot: {'name': 'foot', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.3048, 'offset': 0}, + yard: {'name': 'yard', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.9144, 'offset': 0}, + mile: {'name': 'mile', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1609.344, 'offset': 0}, + link: {'name': 'link', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.201168, 'offset': 0}, + rod: {'name': 'rod', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 5.029210, 'offset': 0}, + chain: {'name': 'chain', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 20.1168, 'offset': 0}, + angstrom: {'name': 'angstrom', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1e-10, 'offset': 0}, + + m: {'name': 'm', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, + 'in': {'name': 'in', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0254, 'offset': 0}, + ft: {'name': 'ft', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.3048, 'offset': 0}, + yd: {'name': 'yd', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.9144, 'offset': 0}, + mi: {'name': 'mi', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 1609.344, 'offset': 0}, + li: {'name': 'li', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.201168, 'offset': 0}, + rd: {'name': 'rd', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 5.029210, 'offset': 0}, + ch: {'name': 'ch', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 20.1168, 'offset': 0}, + mil: {'name': 'mil', 'base': BASE_UNITS.LENGTH, 'prefixes': PREFIXES.NONE, 'value': 0.0000254, 'offset': 0}, // 1/1000 inch + + // Surface + m2: {'name': 'm2', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.SQUARED, 'value': 1, 'offset': 0}, + sqin: {'name': 'sqin', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.00064516, 'offset': 0}, // 645.16 mm2 + sqft: {'name': 'sqft', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.09290304, 'offset': 0}, // 0.09290304 m2 + sqyd: {'name': 'sqyd', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 0.83612736, 'offset': 0}, // 0.83612736 m2 + sqmi: {'name': 'sqmi', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 2589988.110336, 'offset': 0}, // 2.589988110336 km2 + sqrd: {'name': 'sqrd', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 25.29295, 'offset': 0}, // 25.29295 m2 + sqch: {'name': 'sqch', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 404.6873, 'offset': 0}, // 404.6873 m2 + sqmil: {'name': 'sqmil', 'base': BASE_UNITS.SURFACE, 'prefixes': PREFIXES.NONE, 'value': 6.4516e-10, 'offset': 0}, // 6.4516 * 10^-10 m2 + + // Volume + m3: {'name': 'm3', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.CUBIC, 'value': 1, 'offset': 0}, + L: {'name': 'L', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, // litre + l: {'name': 'l', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, // litre + litre: {'name': 'litre', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.LONG, 'value': 0.001, 'offset': 0}, + cuin: {'name': 'cuin', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 1.6387064e-5, 'offset': 0}, // 1.6387064e-5 m3 + cuft: {'name': 'cuft', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.028316846592, 'offset': 0}, // 28.316 846 592 L + cuyd: {'name': 'cuyd', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.764554857984, 'offset': 0}, // 764.554 857 984 L + teaspoon: {'name': 'teaspoon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000005, 'offset': 0}, // 5 mL + tablespoon: {'name': 'tablespoon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000015, 'offset': 0}, // 15 mL + //{'name': 'cup', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.000240, 'offset': 0}, // 240 mL // not possible, we have already another cup + + // Liquid volume + minim: {'name': 'minim', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00000006161152, 'offset': 0}, // 0.06161152 mL + fluiddram: {'name': 'fluiddram', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0000036966911, 'offset': 0}, // 3.696691 mL + fluidounce: {'name': 'fluidounce', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00002957353, 'offset': 0}, // 29.57353 mL + gill: {'name': 'gill', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0001182941, 'offset': 0}, // 118.2941 mL + cc: {'name': 'cc', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 1e-6, 'offset': 0}, // 1e-6 L + cup: {'name': 'cup', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0002365882, 'offset': 0}, // 236.5882 mL + pint: {'name': 'pint', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0004731765, 'offset': 0}, // 473.1765 mL + quart: {'name': 'quart', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0009463529, 'offset': 0}, // 946.3529 mL + gallon: {'name': 'gallon', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.003785412, 'offset': 0}, // 3.785412 L + beerbarrel: {'name': 'beerbarrel', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1173478, 'offset': 0}, // 117.3478 L + oilbarrel: {'name': 'oilbarrel', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1589873, 'offset': 0}, // 158.9873 L + hogshead: {'name': 'hogshead', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.2384810, 'offset': 0}, // 238.4810 L + + //{'name': 'min', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00000006161152, 'offset': 0}, // 0.06161152 mL // min is already in use as minute + fldr: {'name': 'fldr', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0000036966911, 'offset': 0}, // 3.696691 mL + floz: {'name': 'floz', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.00002957353, 'offset': 0}, // 29.57353 mL + gi: {'name': 'gi', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0001182941, 'offset': 0}, // 118.2941 mL + cp: {'name': 'cp', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0002365882, 'offset': 0}, // 236.5882 mL + pt: {'name': 'pt', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0004731765, 'offset': 0}, // 473.1765 mL + qt: {'name': 'qt', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.0009463529, 'offset': 0}, // 946.3529 mL + gal: {'name': 'gal', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.003785412, 'offset': 0}, // 3.785412 L + bbl: {'name': 'bbl', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1173478, 'offset': 0}, // 117.3478 L + obl: {'name': 'obl', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.1589873, 'offset': 0}, // 158.9873 L + //{'name': 'hogshead', 'base': BASE_UNITS.VOLUME, 'prefixes': PREFIXES.NONE, 'value': 0.2384810, 'offset': 0}, // 238.4810 L // TODO: hh? + + // Mass + g: {'name': 'g', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 0.001, 'offset': 0}, + gram: {'name': 'gram', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.LONG, 'value': 0.001, 'offset': 0}, + + ton: {'name': 'ton', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 907.18474, 'offset': 0}, + tonne: {'name': 'tonne', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.SHORT, 'value': 1000, 'offset': 0}, + + grain: {'name': 'grain', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 64.79891e-6, 'offset': 0}, + dram: {'name': 'dram', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 1.7718451953125e-3, 'offset': 0}, + ounce: {'name': 'ounce', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 28.349523125e-3, 'offset': 0}, + poundmass: {'name': 'poundmass', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 453.59237e-3, 'offset': 0}, + hundredweight: {'name': 'hundredweight', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 45.359237, 'offset': 0}, + stick: {'name': 'stick', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 115e-3, 'offset': 0}, + + gr: {'name': 'gr', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 64.79891e-6, 'offset': 0}, + dr: {'name': 'dr', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 1.7718451953125e-3, 'offset': 0}, + oz: {'name': 'oz', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 28.349523125e-3, 'offset': 0}, + lbm: {'name': 'lbm', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 453.59237e-3, 'offset': 0}, + cwt: {'name': 'cwt', 'base': BASE_UNITS.MASS, 'prefixes': PREFIXES.NONE, 'value': 45.359237, 'offset': 0}, + + // Time + s: {'name': 's', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, + min: {'name': 'min', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 60, 'offset': 0}, + h: {'name': 'h', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 3600, 'offset': 0}, + second: {'name': 'second', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, + sec: {'name': 'sec', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, + minute: {'name': 'minute', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 60, 'offset': 0}, + hour: {'name': 'hour', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 3600, 'offset': 0}, + day: {'name': 'day', 'base': BASE_UNITS.TIME, 'prefixes': PREFIXES.NONE, 'value': 86400, 'offset': 0}, + + // Angle + rad: {'name': 'rad', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + // deg = rad / (2*pi) * 360 = rad / 0.017453292519943295769236907684888 + deg: {'name': 'deg', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 0.017453292519943295769236907684888, 'offset': 0}, + // grad = rad / (2*pi) * 400 = rad / 0.015707963267948966192313216916399 + grad: {'name': 'grad', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 0.015707963267948966192313216916399, 'offset': 0}, + // cycle = rad / (2*pi) = rad / 6.2831853071795864769252867665793 + cycle: {'name': 'cycle', 'base': BASE_UNITS.ANGLE, 'prefixes': PREFIXES.NONE, 'value': 6.2831853071795864769252867665793, 'offset': 0}, + + // Electric current + A: {'name': 'A', 'base': BASE_UNITS.CURRENT, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, + ampere: {'name': 'ampere', 'base': BASE_UNITS.CURRENT, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, + + // Temperature + // K(C) = °C + 273.15 + // K(F) = (°F + 459.67) / 1.8 + // K(R) = °R / 1.8 + K: {'name': 'K', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + degC: {'name': 'degC', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 273.15}, + degF: {'name': 'degF', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 459.67}, + degR: {'name': 'degR', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 0}, + kelvin: {'name': 'kelvin', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + celsius: {'name': 'celsius', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 273.15}, + fahrenheit: {'name': 'fahrenheit', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 459.67}, + rankine: {'name': 'rankine', 'base': BASE_UNITS.TEMPERATURE, 'prefixes': PREFIXES.NONE, 'value': 1/1.8, 'offset': 0}, + + // amount of substance + mol: {'name': 'mol', 'base': BASE_UNITS.AMOUNT_OF_SUBSTANCE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + mole: {'name': 'mole', 'base': BASE_UNITS.AMOUNT_OF_SUBSTANCE, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + + // luminous intensity + cd: {'name': 'cd', 'base': BASE_UNITS.LUMINOUS_INTENSITY, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + candela: {'name': 'candela', 'base': BASE_UNITS.LUMINOUS_INTENSITY, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + // TODO: units STERADIAN + //{'name': 'sr', 'base': BASE_UNITS.STERADIAN, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + //{'name': 'steradian', 'base': BASE_UNITS.STERADIAN, 'prefixes': PREFIXES.NONE, 'value': 1, 'offset': 0}, + + // Force + N: {'name': 'N', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.SHORT, 'value': 1, 'offset': 0}, + newton: {'name': 'newton', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.LONG, 'value': 1, 'offset': 0}, + lbf: {'name': 'lbf', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.NONE, 'value': 4.4482216152605, 'offset': 0}, + poundforce: {'name': 'poundforce', 'base': BASE_UNITS.FORCE, 'prefixes': PREFIXES.NONE, 'value': 4.4482216152605, 'offset': 0}, + + // Binary + b: {'name': 'b', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_SHORT, 'value': 1, 'offset': 0}, + bits: {'name': 'bits', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_LONG, 'value': 1, 'offset': 0}, + B: {'name': 'B', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_SHORT, 'value': 8, 'offset': 0}, + bytes: {'name': 'bytes', 'base': BASE_UNITS.BIT, 'prefixes': PREFIXES.BINARY_LONG, 'value': 8, 'offset': 0} + }; + + // plurals + var PLURALS = { + meters: 'meter', + inches: 'inch', + feet: 'foot', + yards: 'yard', + miles: 'mile', + links: 'link', + rods: 'rod', + chains: 'chain', + angstroms: 'angstrom', + + litres: 'litre', + teaspoons: 'teaspoon', + tablespoons: 'tablespoon', + minims: 'minim', + fluiddrams: 'fluiddram', + fluidounces: 'fluidounce', + gills: 'gill', + cups: 'cup', + pints: 'pint', + quarts: 'quart', + gallons: 'gallon', + beerbarrels: 'beerbarrel', + oilbarrels: 'oilbarrel', + hogsheads: 'hogshead', + + grams: 'gram', + tons: 'ton', + tonnes: 'tonne', + grains: 'grain', + drams: 'dram', + ounces: 'ounce', + poundmasses: 'poundmass', + hundredweights: 'hundredweight', + sticks: 'stick', + + seconds: 'second', + minutes: 'minute', + hours: 'hour', + days: 'day', + + radians: 'rad', + degrees: 'deg', + gradients: 'grad', + cycles: 'cycle', + + amperes: 'ampere', + moles: 'mole' + }; + + for (var name in PLURALS) { + if (PLURALS.hasOwnProperty(name)) { + var unit = UNITS[PLURALS[name]]; + var plural = Object.create(unit); + plural.name = name; + UNITS[name] = plural; + } + } + + // aliases + UNITS.lt = UNITS.l; + UNITS.liter = UNITS.litre; + UNITS.liters = UNITS.litres; + UNITS.lb = UNITS.lbm; + + + Unit.PREFIXES = PREFIXES; + Unit.BASE_UNITS = BASE_UNITS; + Unit.UNITS = UNITS; + + // end of unit aliases + + + // exports + module.exports = Unit; + + // to trick my IDE which doesn't get it + exports.isUnit = Unit.isUnit; + exports.isPlainUnit = Unit.isPlainUnit; + exports.parse = Unit.parse; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, require) { + + var util = require(117), + object = util.object, + string = util.string; + + /** + * Documentation object + * @param {Object} math The math.js namespace + * @param {Object} doc Object containing properties: + * {String} name + * {String} category + * {String[]} syntax + * {String[]} examples + * {String[]} seealso + * @constructor + */ + function Help (math, doc) { + this.math = math; + this.doc = doc; + } + + /** + * Test whether a value is an instance of Help + * @param {*} value + * @return {Boolean} isHelp + */ + Help.isHelp = function isHelp (value) { + return (value instanceof Help); + }; + + /** + * Generate readable description from a Help object + * @return {String} readableDoc + * @private + */ + Help.prototype.toString = function () { + var doc = this.doc || {}; + var desc = '\n'; + + if (doc.name) { + desc += 'Name: ' + doc.name + '\n\n'; + } + if (doc.category) { + desc += 'Category: ' + doc.category + '\n\n'; + } + if (doc.description) { + desc += 'Description:\n ' + doc.description + '\n\n'; + } + if (doc.syntax) { + desc += 'Syntax:\n ' + doc.syntax.join('\n ') + '\n\n'; + } + if (doc.examples) { + var parser = this.math.parser(); + desc += 'Examples:\n'; + for (var i = 0; i < doc.examples.length; i++) { + var expr = doc.examples[i]; + var res; + try { + res = parser.eval(expr); + } + catch (e) { + res = e; + } + desc += ' ' + expr + '\n'; + if (res && !(res instanceof Help)) { + desc += ' ' + string.format(res) + '\n'; + } + } + desc += '\n'; + } + if (doc.seealso) { + desc += 'See also: ' + doc.seealso.join(', ') + '\n'; + } + + return desc; + }; + + // TODO: implement a toHTML function in Help + + /** + * Export the help object to JSON + */ + Help.prototype.toJSON = function () { + return object.extend({}, this.doc); + }; + + // exports + module.exports = Help; + + // to trick my IDE which doesn't get it + exports.isHelp = Help.isHelp; + + +/***/ }, +/* 13 */ +/***/ function(module, exports, require) { + + // utility methods for arrays and matrices + + var util = require(117), + + Matrix = require(10), + + isArray = util.array.isArray, + isString = util.string.isString; + + /** + * Convert function arguments to an array. Arguments can have the following + * signature: + * fn() + * fn(n) + * fn(m, n, p, ...) + * fn([m, n, p, ...]) + * @param {...Number | Array | Matrix} args + * @returns {Array} array + */ + exports.argsToArray = function argsToArray(args) { + var array; + if (args.length == 0) { + // fn() + array = []; + } + else if (args.length == 1) { + // fn(n) + // fn([m, n, p, ...]) + array = args[0]; + if (array instanceof Matrix) { + array = array.valueOf(); + } + if (!isArray(array)) { + array = [array]; + } + } + else { + // fn(m, n, p, ...) + array = Array.prototype.slice.apply(args); + } + return array; + }; + + + /** + * Test whether a value is a collection: an Array or Matrix + * @param {*} x + * @returns {boolean} isCollection + */ + exports.isCollection = function isCollection (x) { + return (isArray(x) || (x instanceof Matrix)); + }; + + /** + * Execute the callback function element wise for each element in array and any + * nested array + * Returns an array with the results + * @param {Array | Matrix} array + * @param {function} callback The callback is called with two parameters: + * value1 and value2, which contain the current + * element of both arrays. + * @return {Array | Matrix} res + */ + exports.deepMap = function deepMap(array, callback) { + if (array && (typeof array.map === 'function')) { + return array.map(function (x) { + return deepMap(x, callback); + }); + } + else { + return callback(array); + } + }; + + /** + * Execute the callback function element wise for each entry in two given arrays, + * and for any nested array. Objects can also be scalar objects. + * Returns an array with the results. + * @param {Array | Matrix | Object} array1 + * @param {Array | Matrix | Object} array2 + * @param {function} callback The callback is called with two parameters: + * value1 and value2, which contain the current + * element of both arrays. + * @return {Array | Matrix} res + */ + exports.deepMap2 = function deepMap2(array1, array2, callback) { + var res, len, i; + + if (isArray(array1)) { + if (isArray(array2)) { + // callback(array, array) + if (array1.length != array2.length) { + throw new RangeError('Dimension mismatch ' + + '(' + array1.length + ' != ' + array2.length + ')'); + } + + res = []; + len = array1.length; + for (i = 0; i < len; i++) { + res[i] = deepMap2(array1[i], array2[i], callback); + } + } + else if (array2 instanceof Matrix) { + // callback(array, matrix) + res = deepMap2(array1, array2.valueOf(), callback); + return new Matrix(res); + } + else { + // callback(array, object) + res = []; + len = array1.length; + for (i = 0; i < len; i++) { + res[i] = deepMap2(array1[i], array2, callback); + } + } + } + else if (array1 instanceof Matrix) { + if (array2 instanceof Matrix) { + // callback(matrix, matrix) + res = deepMap2(array1.valueOf(), array2.valueOf(), callback); + return new Matrix(res); + } + else { + // callback(matrix, array) + // callback(matrix, object) + res = deepMap2(array1.valueOf(), array2, callback); + return new Matrix(res); + } + } + else { + if (isArray(array2)) { + // callback(object, array) + res = []; + len = array2.length; + for (i = 0; i < len; i++) { + res[i] = deepMap2(array1, array2[i], callback); + } + } + else if (array2 instanceof Matrix) { + // callback(object, matrix) + res = deepMap2(array1, array2.valueOf(), callback); + return new Matrix(res); + } + else { + // callback(object, object) + res = callback(array1, array2); + } + } + + return res; + }; + + /** + * Reduce a given matrix or array to a new matrix or + * array with one less dimension, aplying the given + * callback in the selected dimension. + * @param {Array | Matrix} mat + * @param {Number} dim + * @param {function} callback + * @return {Array | Matrix} res + */ + exports.reduce = function reduce (mat, dim, callback) { + if (mat instanceof Matrix) { + return new Matrix(_reduce(mat.valueOf(), dim, callback)); + }else { + return _reduce(mat, dim, callback); + } + }; + + /** + * Recursively reduce a matrix + * @param {Array} mat + * @param {Number} dim + * @param {Function} callback + * @returns {Array} ret + * @private + */ + function _reduce(mat, dim, callback){ + var i, ret, val, tran; + + if(dim<=0){ + if( !isArray(mat[0]) ){ + val = mat[0]; + for(i=1; i does not support a parameter of type '; - * @param {String} name Function name - * @param {*} [value1] - * @param {*...} [value_n] - * @extends TypeError - */ - error.UnsupportedTypeError = function UnsupportedTypeError(name, value1, value_n) { - if (arguments.length == 2) { - var type1 = math['typeof'](value1); - this.message = 'Function ' + name + '(' + type1 + ') not supported'; - } - else if (arguments.length > 2) { - var values = Array.prototype.splice.call(arguments, 1); - var types = values.map(function (value) { - return math['typeof'](value); - }); - this.message = 'Function ' + name + '(' + types.join(', ') + ') not supported'; - } - else { - this.message = 'Unsupported type of argument in function ' + name; - } - }; - - error.UnsupportedTypeError.prototype = new TypeError(); - error.UnsupportedTypeError.prototype.name = 'UnsupportedTypeError'; - - /** - * Create a syntax error with the message: - * 'Wrong number of arguments in function ( provided, - expected)' - * @param {String} name Function name - * @param {Number} count Actual argument count - * @param {Number} min Minimum required argument count - * @param {Number} [max] Maximum required argument count - * @extends SyntaxError - */ - error.ArgumentsError = function ArgumentsError(name, count, min, max) { - this.message = 'Wrong number of arguments in function ' + name + - ' (' + count + ' provided, ' + - min + ((max != undefined) ? ('-' + max) : '') + ' expected)'; - }; - - error.ArgumentsError.prototype = new SyntaxError(); - error.ArgumentsError.prototype.name = 'ArgumentError'; -}; -},{"./../util/types":222}],216:[function(require,module,exports){ -var number = require('./number'), - string = require('./string'), - object = require('./object'), - types = require('./types'), - isArray = Array.isArray; - -/** - * Calculate the size of a multi dimensional array. - * @param {Array} x - * @Return {Number[]} size - * @private - */ -function _size(x) { - var size = []; - - while (isArray(x)) { - size.push(x.length); - x = x[0]; - } - - return size; -} - -/** - * Calculate the size of a multi dimensional array. - * All elements in the array are checked for matching dimensions using the - * method validate - * @param {Array} x - * @Return {Number[]} size - * @throws RangeError - */ -exports.size = function size (x) { - // calculate the size - var s = _size(x); - - // verify the size - exports.validate(x, s); - // TODO: don't validate here? only in a Matrix constructor? - - return s; -}; - -/** - * Recursively validate whether each element in a multi dimensional array - * has a size corresponding to the provided size array. - * @param {Array} array Array to be validated - * @param {Number[]} size Array with the size of each dimension - * @param {Number} dim Current dimension - * @throws RangeError - * @private - */ -function _validate(array, size, dim) { - var i; - var len = array.length; - - if (len != size[dim]) { - throw new RangeError('Dimension mismatch (' + len + ' != ' + size[dim] + ')'); - } - - if (dim < size.length - 1) { - // recursively validate each child array - var dimNext = dim + 1; - for (i = 0; i < len; i++) { - var child = array[i]; - if (!isArray(child)) { - throw new RangeError('Dimension mismatch ' + - '(' + (size.length - 1) + ' < ' + size.length + ')'); - } - _validate(array[i], size, dimNext); - } - } - else { - // last dimension. none of the childs may be an array - for (i = 0; i < len; i++) { - if (isArray(array[i])) { - throw new RangeError('Dimension mismatch ' + - '(' + (size.length + 1) + ' > ' + size.length + ')'); - } - } - } -} - -/** - * Validate whether each element in a multi dimensional array has - * a size corresponding to the provided size array. - * @param {Array} array Array to be validated - * @param {Number[]} size Array with the size of each dimension - * @throws RangeError - */ -exports.validate = function validate(array, size) { - var isScalar = (size.length == 0); - if (isScalar) { - // scalar - if (isArray(array)) { - throw new RangeError('Dimension mismatch (' + array.length + ' != 0)'); - } - } - else { - // array - _validate(array, size, 0); - } -}; - -/** - * Test whether index is an integer number with index >= 0 and index < length - * @param {*} index Zero-based index - * @param {Number} [length] Length of the array - */ -exports.validateIndex = function validateIndex (index, length) { - if (!number.isNumber(index) || !number.isInteger(index)) { - throw new TypeError('Index must be an integer (value: ' + index + ')'); - } - if (index < 0) { - throw new RangeError('Index out of range (' + index + ' < 0)'); - } - if (length !== undefined && index >= length) { - throw new RangeError('Index out of range (' + index + ' > ' + (length - 1) + ')'); - } -}; - -/** - * Resize a multi dimensional array. The resized array is returned. - * @param {Array} array Array to be resized - * @param {Array.} size Array with the size of each dimension - * @param {*} [defaultValue] Value to be filled in in new entries, - * undefined by default - * @return {Array} array The resized array - */ -exports.resize = function resize(array, size, defaultValue) { - // TODO: add support for scalars, having size=[] ? - - // check the type of the arguments - if (!isArray(array) || !isArray(size)) { - throw new TypeError('Array expected'); - } - if (size.length === 0) { - throw new Error('Resizing to scalar is not supported'); - } - - // check whether size contains positive integers - size.forEach(function (value) { - if (!number.isNumber(value) || !number.isInteger(value) || value < 0) { - throw new TypeError('Invalid size, must contain positive integers ' + - '(size: ' + string.format(size) + ')'); - } - }); - - // count the current number of dimensions - var dims = 1; - var elem = array[0]; - while (isArray(elem)) { - dims++; - elem = elem[0]; - } - - // adjust the number of dimensions when needed - while (dims < size.length) { // add dimensions - array = [array]; - dims++; - } - while (dims > size.length) { // remove dimensions - array = array[0]; - dims--; - } - - // recursively resize the array - _resize(array, size, 0, defaultValue); - - return array; -}; - -/** - * Recursively resize a multi dimensional array - * @param {Array} array Array to be resized - * @param {Number[]} size Array with the size of each dimension - * @param {Number} dim Current dimension - * @param {*} [defaultValue] Value to be filled in in new entries, - * undefined by default. - * @private - */ -function _resize (array, size, dim, defaultValue) { - if (!isArray(array)) { - throw Error('Array expected'); - } - - var i, elem, - oldLen = array.length, - newLen = size[dim], - minLen = Math.min(oldLen, newLen); - - // apply new length - array.length = newLen; - - if (dim < size.length - 1) { - // non-last dimension - var dimNext = dim + 1; - - // resize existing child arrays - for (i = 0; i < minLen; i++) { - // resize child array - elem = array[i]; - _resize(elem, size, dimNext, defaultValue); - } - - // create new child arrays - for (i = minLen; i < newLen; i++) { - // get child array - elem = []; - array[i] = elem; - - // resize new child array - _resize(elem, size, dimNext, defaultValue); - } - } - else { - // last dimension - if(defaultValue !== undefined) { - // fill new elements with the default value - for (i = oldLen; i < newLen; i++) { - array[i] = object.clone(defaultValue); - } - } - } -} - -/** - * Squeeze a multi dimensional array - * @param {Array} array - * @return {Array} array - * @private - */ -exports.squeeze = function squeeze(array) { - while(isArray(array) && array.length === 1) { - array = array[0]; - } - - return array; -}; - -/** - * Unsqueeze a multi dimensional array: add dimensions when missing - * @param {Array} array - * @param {Number} dims Number of desired dimensions - * @return {Array} array - * @private - */ -exports.unsqueeze = function unsqueeze(array, dims) { - var size = exports.size(array); - - for (var i = 0, ii = (dims - size.length); i < ii; i++) { - array = [array]; - } - - return array; -}; - -/** - * Test whether an object is an array - * @param {*} value - * @return {Boolean} isArray - */ -exports.isArray = isArray; -},{"./number":219,"./object":220,"./string":221,"./types":222}],217:[function(require,module,exports){ -/** - * Test whether value is a Boolean - * @param {*} value - * @return {Boolean} isBoolean - */ -exports.isBoolean = function isBoolean(value) { - return (value instanceof Boolean) || (typeof value == 'boolean'); -}; - -},{}],218:[function(require,module,exports){ -exports.array = require('./array'); -exports['boolean'] = require('./boolean'); -exports.number = require('./number'); -exports.object = require('./object'); -exports.string = require('./string'); -exports.types = require('./types'); - -},{"./array":216,"./boolean":217,"./number":219,"./object":220,"./string":221,"./types":222}],219:[function(require,module,exports){ -var BigNumber = require('bignumber.js'); - -/** - * Test whether value is a Number - * @param {*} value - * @return {Boolean} isNumber - */ -exports.isNumber = function isNumber(value) { - return (value instanceof Number) || (typeof value == 'number'); -}; - -/** - * Check if a number is integer - * @param {Number | Boolean} value - * @return {Boolean} isInteger - */ -exports.isInteger = function isInteger(value) { - return (value == Math.round(value)); - // Note: we use ==, not ===, as we can have Booleans as well -}; - -/** - * Calculate the sign of a number - * @param {Number} x - * @returns {*} - */ -exports.sign = function sign (x) { - if (x > 0) { - return 1; - } - else if (x < 0) { - return -1; - } - else { - return 0; - } -}; - -/** - * Convert a number to a formatted string representation. - * - * Syntax: - * - * format(value) - * format(value, options) - * format(value, precision) - * format(value, fn) - * - * Where: - * - * {Number} value The value to be formatted - * {Object} options An object with formatting options. Available options: - * {String} notation - * Number notation. Choose from: - * 'fixed' Always use regular number notation. - * For example '123.40' and '14000000' - * 'exponential' Always use exponential notation. - * For example '1.234e+2' and '1.4e+7' - * 'auto' (default) Regular number notation for numbers - * having an absolute value between - * `lower` and `upper` bounds, and uses - * exponential notation elsewhere. - * Lower bound is included, upper bound - * is excluded. - * For example '123.4' and '1.4e7'. - * {Number} precision A number between 0 and 16 to round - * the digits of the number. - * In case of notations 'exponential' and - * 'auto', `precision` defines the total - * number of significant digits returned - * and is undefined by default. - * In case of notation 'fixed', - * `precision` defines the number of - * significant digits after the decimal - * point, and is 0 by default. - * {Object} exponential An object containing two parameters, - * {Number} lower and {Number} upper, - * used by notation 'auto' to determine - * when to return exponential notation. - * Default values are `lower=1e-3` and - * `upper=1e5`. - * Only applicable for notation `auto`. - * {Function} fn A custom formatting function. Can be used to override the - * built-in notations. Function `fn` is called with `value` as - * parameter and must return a string. Is useful for example to - * format all values inside a matrix in a particular way. - * - * Examples: - * - * format(6.4); // '6.4' - * format(1240000); // '1.24e6' - * format(1/3); // '0.3333333333333333' - * format(1/3, 3); // '0.333' - * format(21385, 2); // '21000' - * format(12.071, {notation: 'fixed'}); // '12' - * format(2.3, {notation: 'fixed', precision: 2}); // '2.30' - * format(52.8, {notation: 'exponential'}); // '5.28e+1' - * - * @param {Number | BigNumber} value - * @param {Object | Function | Number} [options] - * @return {String} str The formatted value - */ -exports.format = function format(value, options) { - if (typeof options === 'function') { - // handle format(value, fn) - return options(value); - } - - // handle special cases - if (value === Infinity) { - return 'Infinity'; - } - else if (value === -Infinity) { - return '-Infinity'; - } - else if (isNaN(value)) { - return 'NaN'; - } - - // default values for options - var notation = 'auto'; - var precision = undefined; - - if (options !== undefined) { - // determine notation from options - if (options.notation) { - notation = options.notation; - } - - // determine precision from options - if (options) { - if (exports.isNumber(options)) { - precision = options; - } - else if (options.precision) { - precision = options.precision; - } - } - } - - // handle the various notations - switch (notation) { - case 'fixed': - return exports.toFixed(value, precision); - - // TODO: notation 'scientific' is deprecated since version 0.16.0, remove this some day - case 'scientific': - throw new Error('Format notation "scientific" is deprecated. Use "exponential" instead.'); - - case 'exponential': - return exports.toExponential(value, precision); - - case 'auto': - // determine lower and upper bound for exponential notation. - // TODO: implement support for upper and lower to be BigNumbers themselves - var lower = 1e-3; - var upper = 1e5; - if (options && options.exponential) { - if (options.exponential.lower !== undefined) { - lower = options.exponential.lower; - } - if (options.exponential.upper !== undefined) { - upper = options.exponential.upper; - } - } - else if (options && options.scientific) { - // TODO: 'options.scientific' is deprecated since version 0.16.0, remove this some day - throw new Error('options.scientific is deprecated, use options.exponential instead.'); - } - - // adjust BigNumber configuration - var isBigNumber = value instanceof BigNumber; - if (isBigNumber) { - var oldScientific = BigNumber.config().EXPONENTIAL_AT; - BigNumber.config({ - EXPONENTIAL_AT: [ - Math.round(Math.log(lower) / Math.LN10), - Math.round(Math.log(upper) / Math.LN10) - ] - }); - } - - // handle special case zero - if (_isZero(value)) { - return '0'; - } - - // determine whether or not to output exponential notation - var str; - if (_isBetween(value, lower, upper)) { - // normal number notation - if (isBigNumber) { - str = new BigNumber(value.toPrecision(precision)).toString(); - } - else { // Number - // Note: IE7 does not allow value.toPrecision(undefined) - var valueStr = precision ? - value.toPrecision(Math.min(precision, 21)) : - value.toPrecision(); - str = parseFloat(valueStr) + ''; - } - } - else { - // exponential notation - str = exports.toExponential(value, precision); - } - - // restore BigNumber configuration - if (isBigNumber) { - BigNumber.config({EXPONENTIAL_AT: oldScientific}); - } - - // remove trailing zeros after the decimal point - return str.replace(/((\.\d*?)(0+))($|e)/, function () { - var digits = arguments[2]; - var e = arguments[4]; - return (digits !== '.') ? digits + e : e; - }); - - default: - throw new Error('Unknown notation "' + notation + '". ' + - 'Choose "auto", "exponential", or "fixed".'); - } -}; - -/** - * Test whether a value is zero - * @param {Number | BigNumber} value - * @return {boolean} isZero - * @private - */ -function _isZero (value) { - return (value instanceof BigNumber) ? value.isZero() : (value === 0); -} - -/** - * Test whether a value is inside a range: - * - * lower >= value < upper - * - * @param {Number | BigNumber} value - * @param {Number} lower Included lower bound - * @param {Number} upper Excluded upper bound - * @return {boolean} isBetween - * @private - */ -function _isBetween(value, lower, upper) { - var abs; - if (value instanceof BigNumber) { - abs = value.abs(); - return (abs.gte(lower) && abs.lt(upper)); - } - else { - abs = Math.abs(value); - return (abs >= lower && abs < upper); - } -} - -/** - * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3' - * @param {Number | BigNumber} value - * @param {Number} [precision] Number of digits in formatted output. - * If not provided, the maximum available digits - * is used. - * @returns {string} str - */ -exports.toExponential = function toExponential (value, precision) { - if (precision !== undefined) { - if (value instanceof BigNumber) { - return value.toExponential(precision - 1); - } - else { // Number - return value.toExponential(Math.min(precision - 1, 20)); - } - } - else { - return value.toExponential(); - } -}; - -/** - * Format a number with fixed notation. - * @param {Number | BigNumber} value - * @param {Number} [precision=0] Optional number of decimals after the - * decimal point. Zero by default. - */ -exports.toFixed = function toFixed (value, precision) { - if (value instanceof BigNumber) { - return value.toFixed(precision || 0); - // Note: the (precision || 0) is needed as the toFixed of BigNumber has an - // undefined default precision instead of 0. - } - else { // Number - return value.toFixed(Math.min(precision, 20)); - } -}; - -/** - * Count the number of significant digits of a number. - * - * For example: - * 2.34 returns 3 - * 0.0034 returns 2 - * 120.5e+3 returns 4 - * - * @param {Number} value - * @return {Number} digits Number of significant digits - */ -exports.digits = function digits (value) { - return value - .toExponential() - .replace(/e[\+\-0-9]*$/, '') // remove exponential notation - .replace( /^0\.0*|\./, '') // remove decimal point and leading zeros - .length -}; - -/** - * Convert a Number in to a BigNumber. If the number has 15 or mor significant - * digits, the Number cannot be converted to BigNumber and will return the - * original number. - * @param {Number} number - * @return {BigNumber | Number} bignumber - */ -exports.toBigNumber = function toBigNumber (number) { - if (exports.digits(number) > 15) { - return number; - } - else { - return new BigNumber(number); - } -}; - -/** - * Convert a BigNumber into a Number. If the number is out of range, it will - * get the value Infinity or 0. - * @param {BigNumber} bignumber - * @return {Number} number - */ -exports.toNumber = function toNumber (bignumber) { - return parseFloat(bignumber.valueOf()); -}; - -},{"bignumber.js":223}],220:[function(require,module,exports){ -/** - * Clone an object - * - * clone(x) - * - * Can clone any primitive type, array, and object. - * If x has a function clone, this function will be invoked to clone the object. - * - * @param {*} x - * @return {*} clone - */ -exports.clone = function clone(x) { - var type = typeof x; - - // immutable primitive types - if (type === 'number' || type === 'string' || type === 'boolean' || - x === null || x === undefined) { - return x; - } - - // use clone function of the object when available - if (typeof x.clone === 'function') { - return x.clone(); - } - - // array - if (Array.isArray(x)) { - return x.map(function (value) { - return clone(value); - }); - } - - // object - if (x instanceof Object) { - var m = {}; - for (var key in x) { - if (x.hasOwnProperty(key)) { - m[key] = clone(x[key]); - } - } - return x; - } - - // this should never happen - throw new TypeError('Cannot clone ' + x); -}; - -/** - * Extend object a with the properties of object b - * @param {Object} a - * @param {Object} b - * @return {Object} a - */ -exports.extend = function extend (a, b) { - for (var prop in b) { - if (b.hasOwnProperty(prop)) { - a[prop] = b[prop]; - } - } - return a; -}; - -/** - * Deep extend an object a with the properties of object b - * @param {Object} a - * @param {Object} b - * @returns {Object} - */ -exports.deepExtend = function deepExtend (a, b) { - for (var prop in b) { - if (b.hasOwnProperty(prop)) { - if (b[prop] && b[prop].constructor === Object) { - if (a[prop] === undefined) { - a[prop] = {}; - } - if (a[prop].constructor === Object) { - deepExtend(a[prop], b[prop]); - } - else { - a[prop] = b[prop]; - } - } else { - a[prop] = b[prop]; - } - } - } - return a; -}; - -/** - * Deep test equality of all fields in two pairs of arrays or objects. - * @param {Array | Object} a - * @param {Array | Object} b - * @returns {boolean} - */ -exports.deepEqual = function deepEqual (a, b) { - var prop, i, len; - if (Array.isArray(a)) { - if (!Array.isArray(b)) { - return false; - } - - if (a.length != b.length) { - return false; - } - - for (i = 0, len = a.length; i < len; i++) { - if (!exports.deepEqual(a[i], b[i])) { - return false; - } - } - return true; - } - else if (a instanceof Object) { - if (Array.isArray(b) || !(b instanceof Object)) { - return false; - } - - for (prop in a) { - if (a.hasOwnProperty(prop)) { - if (!exports.deepEqual(a[prop], b[prop])) { - return false; - } - } - } - for (prop in b) { - if (b.hasOwnProperty(prop)) { - if (!exports.deepEqual(a[prop], b[prop])) { - return false; - } - } - } - return true; - } - else { - return (a == b); - } -}; - -},{}],221:[function(require,module,exports){ -var number = require('./number'), - BigNumber = require('bignumber.js'); - -/** - * Test whether value is a String - * @param {*} value - * @return {Boolean} isString - */ -exports.isString = function isString(value) { - return (value instanceof String) || (typeof value == 'string'); -}; - -/** - * Check if a text ends with a certain string. - * @param {String} text - * @param {String} search - */ -exports.endsWith = function endsWith(text, search) { - var start = text.length - search.length; - var end = text.length; - return (text.substring(start, end) === search); -}; - -/** - * Format a value of any type into a string. - * - * Usage: - * math.format(value) - * math.format(value, precision) - * - * If value is a function, the returned string is 'function' unless the function - * has a property `description`, in that case this properties value is returned. - * - * Example usage: - * math.format(2/7); // '0.2857142857142857' - * math.format(math.pi, 3); // '3.14' - * math.format(new Complex(2, 3)); // '2 + 3i' - * math.format('hello'); // '"hello"' - * - * @param {*} value Value to be stringified - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @return {String} str - */ -exports.format = function format(value, options) { - if (number.isNumber(value) || value instanceof BigNumber) { - return number.format(value, options); - } - - if (Array.isArray(value)) { - return formatArray(value, options); - } - - if (exports.isString(value)) { - return '"' + value + '"'; - } - - if (typeof value === 'function') { - return value.syntax ? value.syntax + '' : 'function'; - } - - if (value instanceof Object) { - if (typeof value.format === 'function') { - return value.format(options); - } - else { - return value.toString(); - } - } - - return String(value); -}; - -/** - * Recursively format an n-dimensional matrix - * Example output: "[[1, 2], [3, 4]]" - * @param {Array} array - * @param {Object | Number | Function} [options] Formatting options. See - * lib/util/number:format for a - * description of the available - * options. - * @returns {String} str - */ -function formatArray (array, options) { - if (Array.isArray(array)) { - var str = '['; - var len = array.length; - for (var i = 0; i < len; i++) { - if (i != 0) { - str += ', '; - } - str += formatArray(array[i], options); - } - str += ']'; - return str; - } - else { - return exports.format(array, options); - } -} - -},{"./number":219,"bignumber.js":223}],222:[function(require,module,exports){ -/** - * Determine the type of a variable - * - * typeof(x) - * - * @param {*} x - * @return {String} type Lower case type, for example 'number', 'string', - * 'array', 'date'. - */ -exports.type = function type (x) { - var type = typeof x; - - if (type === 'object') { - if (x === null) { - return 'null'; - } - if (x instanceof Boolean) { - return 'boolean'; - } - if (x instanceof Number) { - return 'number'; - } - if (x instanceof String) { - return 'string'; - } - if (Array.isArray(x)) { - return 'array'; - } - if (x instanceof Date) { - return 'date'; - } - } - - return type; -}; - -},{}],223:[function(require,module,exports){ -/* bignumber.js v1.3.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ - -/*jslint ass: true, bitwise: true, eqeq: true, plusplus: true, sub: true, white: true, maxerr: 500 */ -/*global module, define */ - -;(function ( global ) { - 'use strict'; - - /* - bignumber.js v1.3.0 - A JavaScript library for arbitrary-precision arithmetic. - https://github.com/MikeMcl/bignumber.js - Copyright (c) 2012 Michael Mclaughlin - MIT Expat Licence - */ - - /*********************************** DEFAULTS ************************************/ - - /* - * The default values below must be integers within the stated ranges (inclusive). - * Most of these values can be changed during run-time using BigNumber.config(). - */ - - /* - * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, - * MAX_EXP, and the argument to toFixed, toPrecision and toExponential, beyond - * which an exception is thrown (if ERRORS is true). - */ - var MAX = 1E9, // 0 to 1e+9 - - // Limit of magnitude of exponent argument to toPower. - MAX_POWER = 1E6, // 1 to 1e+6 - - // The maximum number of decimal places for operations involving division. - DECIMAL_PLACES = 20, // 0 to MAX - - /* - * The rounding mode used when rounding to the above decimal places, and when - * using toFixed, toPrecision and toExponential, and round (default value). - * UP 0 Away from zero. - * DOWN 1 Towards zero. - * CEIL 2 Towards +Infinity. - * FLOOR 3 Towards -Infinity. - * HALF_UP 4 Towards nearest neighbour. If equidistant, up. - * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. - * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. - * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. - * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. - */ - ROUNDING_MODE = 4, // 0 to 8 - - // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] - - // The exponent value at and beneath which toString returns exponential notation. - // Number type: -7 - TO_EXP_NEG = -7, // 0 to -MAX - - // The exponent value at and above which toString returns exponential notation. - // Number type: 21 - TO_EXP_POS = 21, // 0 to MAX - - // RANGE : [MIN_EXP, MAX_EXP] - - // The minimum exponent value, beneath which underflow to zero occurs. - // Number type: -324 (5e-324) - MIN_EXP = -MAX, // -1 to -MAX - - // The maximum exponent value, above which overflow to Infinity occurs. - // Number type: 308 (1.7976931348623157e+308) - MAX_EXP = MAX, // 1 to MAX - - // Whether BigNumber Errors are ever thrown. - // CHANGE parseInt to parseFloat if changing ERRORS to false. - ERRORS = true, // true or false - parse = parseInt, // parseInt or parseFloat - - /***********************************************************************************/ - - P = BigNumber.prototype, - DIGITS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', - outOfRange, - id = 0, - isValid = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, - trim = String.prototype.trim || function () {return this.replace(/^\s+|\s+$/g, '')}, - ONE = BigNumber(1); - - - // CONSTRUCTOR - - - /* - * The exported function. - * Create and return a new instance of a BigNumber object. - * - * n {number|string|BigNumber} A numeric value. - * [b] {number} The base of n. Integer, 2 to 64 inclusive. - */ - function BigNumber( n, b ) { - var e, i, isNum, digits, valid, orig, - x = this; - // Enable constructor usage without new. - if ( !(x instanceof BigNumber) ) { - return new BigNumber( n, b ) - } - - // Duplicate. - if ( n instanceof BigNumber ) { - id = 0; - - // e is undefined. - if ( b !== e ) { - n += '' - } else { - x['s'] = n['s']; - x['e'] = n['e']; - x['c'] = ( n = n['c'] ) ? n.slice() : n; - return; - } - } - - // If number, check if minus zero. - if ( typeof n != 'string' ) { - n = ( isNum = typeof n == 'number' || - Object.prototype.toString.call(n) == '[object Number]' ) && - n === 0 && 1 / n < 0 ? '-0' : n + ''; - } + /** + * Transpose a matrix + * @param {Array} mat + * @returns {Array} ret + * @private + */ + function _switch(mat){ + var I = mat.length; + var J = mat[0].length; + var i, j; + var ret = []; + for( j=0; j does not support a parameter of type '; + * @param {String} name Function name + * @param {*} [value1] + * @param {*...} [value_n] + * @extends TypeError + */ + // TODO: rename UnsupportedTypeError to TypeError? + error.UnsupportedTypeError = function UnsupportedTypeError(name, value1, value_n) { + if (arguments.length == 2) { + var type1 = math['typeof'](value1); + this.message = 'Function ' + name + '(' + type1 + ') not supported'; + } + else if (arguments.length > 2) { + var values = Array.prototype.splice.call(arguments, 1); + var types = values.map(function (value) { + return math['typeof'](value); + }); + this.message = 'Function ' + name + '(' + types.join(', ') + ') not supported'; + } + else { + this.message = 'Unsupported type of argument in function ' + name; + } + + this.stack = (new Error()).stack; + }; + + error.UnsupportedTypeError.prototype = new TypeError(); + error.UnsupportedTypeError.prototype.constructor = TypeError; + error.UnsupportedTypeError.prototype.name = 'UnsupportedTypeError'; + + /** + * Create a syntax error with the message: + * 'Wrong number of arguments in function ( provided, - expected)' + * @param {String} name Function name + * @param {Number} count Actual argument count + * @param {Number} min Minimum required argument count + * @param {Number} [max] Maximum required argument count + * @extends SyntaxError + */ + error.ArgumentsError = function ArgumentsError(name, count, min, max) { + this.message = 'Wrong number of arguments in function ' + name + + ' (' + count + ' provided, ' + + min + ((max != undefined) ? ('-' + max) : '') + ' expected)'; + + this.stack = (new Error()).stack; + }; + + error.ArgumentsError.prototype = new Error(); + error.ArgumentsError.prototype.constructor = Error; + error.ArgumentsError.prototype.name = 'ArgumentError'; + + // TODO: implement a InvalidValueError? + + }; + +/***/ }, +/* 15 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + collection = require(13), + + isString = util.string.isString, + isCollection = collection.isCollection; + + /** + * Evaluate an expression. + * + * Syntax: + * + * math.eval(expr) + * math.eval(expr, scope) + * math.eval([expr1, expr2, expr3, ...]) + * math.eval([expr1, expr2, expr3, ...], scope) + * + * Example: + * + * math.eval('(2+3)/4'); // 1.25 + * math.eval('sqrt(3^2 + 4^2)'); // 5 + * math.eval('sqrt(-4)'); // 2i + * math.eval(['a=3', 'b=4', 'a*b']);, // [3, 4, 12] + * + * var scope = {a:3, b:4}; + * math.eval('a * b', scope); // 12 + * + * @param {String | String[] | Matrix} expr + * @param {Object} [scope] + * @return {*} res + * @throws {Error} + */ + math.eval = function _eval (expr, scope) { + if (arguments.length != 1 && arguments.length != 2) { + throw new math.error.ArgumentsError('eval', arguments.length, 1, 2); + } + + // instantiate a scope + scope = scope || {}; + + if (isString(expr)) { + // evaluate a single expression + return math.parse(expr) + .compile(math) + .eval(scope); + } + else if (isCollection(expr)) { + // evaluate an array or matrix with expressions + return collection.deepMap(expr, function (elem) { + return math.parse(elem) + .compile(math).eval(scope); + }); + } + else { + // oops + throw new TypeError('String or matrix expected'); + } + }; + }; + + +/***/ }, +/* 16 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Help = require(12); + + /** + * Retrieve help on a function or data type. + * Help files are retrieved from the documentation in math.expression.docs. + * @param {function | string | Object} search + * @return {Help} help + */ + math.help = function help(search) { + if (arguments.length != 1) { + throw new SyntaxError('Wrong number of arguments in function help ' + + '(' + arguments.length + ' provided, 1 expected)'); + } + + var text = null; + if ((search instanceof String) || (typeof(search) === 'string')) { + text = search; + } + else { + var prop; + for (prop in math) { + // search in functions and constants + if (math.hasOwnProperty(prop)) { + if (search === math[prop]) { + text = prop; + break; + } + } + } + + if (!text) { + // search data type + for (prop in math.type) { + if (math.type.hasOwnProperty(prop)) { + if (search === math.type[prop]) { + text = prop; + break; + } + } + } + } + } + + if (!text) { + throw new Error('Could not find search term "' + search + '"'); + } + else { + var doc = math.expression.docs[text]; + if (!doc) { + throw new Error('No documentation found on "' + text + '"'); + } + return new Help(math, doc); + } + }; + }; + + +/***/ }, +/* 17 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var _parse = require(4); + + /** + * Parse an expression. + * Returns a node tree which can be compiled and evaluated. + * + * Syntax: + * + * math.parse(expr) + * math.parse([expr1, expr2, expr3, ...]) + * + * Example: + * + * var node = math.parse('sqrt(3^2 + 4^2)'); + * node.compile(math).eval(); // 5 + * + * var scope = {a: 3, b: 4} + * var node = math.parse('a * b'); // 12 + * var code = node.compile(math); + * code.eval(scope); // 12 + * scope.a = 5; + * code.eval(scope); // 20 + * + * var nodes = math.parse(['a = 3', 'b = 4', 'a * b']); + * nodes[2].compile(math).eval(); // 12 + * + * @param {String | String[] | Matrix} expr + * @return {Node | Node[]} node + * @throws {Error} + */ + math.parse = function parse (expr) { + return _parse.apply(_parse, arguments); + } + + }; + + +/***/ }, +/* 18 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the absolute value of a value. + * + * abs(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.abs = function abs(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('abs', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.abs(x); + } + + if (isComplex(x)) { + return Math.sqrt(x.re * x.re + x.im * x.im); + } + + if (x instanceof BigNumber) { + return x.abs(); + } + + if (isCollection(x)) { + return collection.deepMap(x, abs); + } + + if (isBoolean(x)) { + return Math.abs(x); + } + + throw new math.error.UnsupportedTypeError('abs', x); + }; + }; + + +/***/ }, +/* 19 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + Unit = require(11), + collection = require(13), + + isBoolean = util['boolean'].isBoolean, + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Add two values + * + * x + y + * add(x, y) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | String | Array | Matrix} res + */ + math.add = function add(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('add', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + // number + number + return x + y; + } + else if (isComplex(y)) { + // number + complex + return new Complex( + x + y.re, + y.im + ) + } + } + + if (isComplex(x)) { + if (isComplex(y)) { + // complex + complex + return new Complex( + x.re + y.re, + x.im + y.im + ); + } + else if (isNumber(y)) { + // complex + number + return new Complex( + x.re + y, + x.im + ) + } + } + + if (isUnit(x)) { + if (isUnit(y)) { + if (!x.equalBase(y)) { + throw new Error('Units do not match'); + } + + if (x.value == null) { + throw new Error('Unit on left hand side of operator + has an undefined value'); + } + + if (y.value == null) { + throw new Error('Unit on right hand side of operator + has an undefined value'); + } + + var res = x.clone(); + res.value += y.value; + res.fixPrefix = false; + return res; + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.plus(y); + } + + // downgrade to Number + return add(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.plus(y) + } + + // downgrade to Number + return add(x, toNumber(y)); + } + + if (isString(x) || isString(y)) { + return x + y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, add); + } + + if (isBoolean(x)) { + return add(+x, y); + } + if (isBoolean(y)) { + return add(x, +y); + } + + throw new math.error.UnsupportedTypeError('add', x, y); + }; + }; + + +/***/ }, +/* 20 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isCollection =collection.isCollection, + isComplex = Complex.isComplex; + + /** + * Round a value towards plus infinity + * + * ceil(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.ceil = function ceil(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('ceil', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.ceil(x); + } + + if (isComplex(x)) { + return new Complex ( + Math.ceil(x.re), + Math.ceil(x.im) + ); + } + + if (x instanceof BigNumber) { + return x.ceil(); + } + + if (isCollection(x)) { + return collection.deepMap(x, ceil); + } + + if (isBoolean(x)) { + return Math.ceil(x); + } + + throw new math.error.UnsupportedTypeError('ceil', x); + }; + }; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Compute the cube of a value + * + * x .* x .* x + * cube(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.cube = function cube(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('cube', arguments.length, 1); + } + + if (isNumber(x)) { + return x * x * x; + } + + if (isComplex(x)) { + return math.multiply(math.multiply(x, x), x); + } + + if (x instanceof BigNumber) { + return x.times(x).times(x); + } + + if (isCollection(x)) { + return collection.deepMap(x, cube); + } + + if (isBoolean(x)) { + return cube(+x); + } + + throw new math.error.UnsupportedTypeError('cube', x); + }; + }; + + +/***/ }, +/* 22 */ +/***/ function(module, exports, require) { + + module.exports = function(math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Divide two values. + * + * x / y + * divide(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.divide = function divide(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('divide', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + // number / number + return x / y; + } + else if (isComplex(y)) { + // number / complex + return _divideComplex(new Complex(x, 0), y); + } + } + + if (isComplex(x)) { + if (isComplex(y)) { + // complex / complex + return _divideComplex(x, y); + } + else if (isNumber(y)) { + // complex / number + return _divideComplex(x, new Complex(y, 0)); + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.div(y); + } + + // downgrade to Number + return divide(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.div(y) + } + + // downgrade to Number + return divide(x, toNumber(y)); + } + + if (isUnit(x)) { + if (isNumber(y)) { + var res = x.clone(); + res.value /= y; + return res; + } + } + + if (isCollection(x)) { + if (isCollection(y)) { + // TODO: implement matrix right division using pseudo inverse + // http://www.mathworks.nl/help/matlab/ref/mrdivide.html + // http://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html + // http://stackoverflow.com/questions/12263932/how-does-gnu-octave-matrix-division-work-getting-unexpected-behaviour + return math.multiply(x, math.inv(y)); + } + else { + // matrix / scalar + return collection.deepMap2(x, y, divide); + } + } + + if (isCollection(y)) { + // TODO: implement matrix right division using pseudo inverse + return math.multiply(x, math.inv(y)); + } + + if (isBoolean(x)) { + return divide(+x, y); + } + if (isBoolean(y)) { + return divide(x, +y); + } + + throw new math.error.UnsupportedTypeError('divide', x, y); + }; + + /** + * Divide two complex numbers. x / y or divide(x, y) + * @param {Complex} x + * @param {Complex} y + * @return {Complex} res + * @private + */ + function _divideComplex (x, y) { + var den = y.re * y.re + y.im * y.im; + if (den != 0) { + return new Complex( + (x.re * y.re + x.im * y.im) / den, + (x.im * y.re - x.re * y.im) / den + ); + } + else { + // both y.re and y.im are zero + return new Complex( + (x.re != 0) ? (x.re / 0) : 0, + (x.im != 0) ? (x.im / 0) : 0 + ); + } + } + }; + + +/***/ }, +/* 23 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var collection = require(13); + + /** + * Divide two values element wise. + * + * x ./ y + * edivide(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.edivide = function edivide(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('edivide', arguments.length, 2); + } + + return collection.deepMap2(x, y, math.divide); + }; + }; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var collection = require(13); + + /** + * Multiply two values element wise. + * + * x .* y + * emultiply(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.emultiply = function emultiply(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('emultiply', arguments.length, 2); + } + + return collection.deepMap2(x, y, math.multiply); + }; + }; + + +/***/ }, +/* 25 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var collection = require(13); + + /** + * Calculates the power of x to y element wise + * + * x .^ y + * epow(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.epow = function epow(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('epow', arguments.length, 2); + } + + return collection.deepMap2(x, y, math.pow); + }; + }; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value x equals y, + * + * x == y + * equal(x, y) + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, x.re must equal y.re, and x.im must equal y.im. + * + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.equal = function equal(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('equal', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + return x == y; + } + else if (isComplex(y)) { + return (x == y.re) && (y.im == 0); + } + } + + if (isComplex(x)) { + if (isNumber(y)) { + return (x.re == y) && (x.im == 0); + } + else if (isComplex(y)) { + return (x.re == y.re) && (x.im == y.im); + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.eq(y); + } + + // downgrade to Number + return equal(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.eq(y) + } + + // downgrade to Number + return equal(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value == y.value; + } + + if (isString(x) || isString(y)) { + return x == y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, equal); + } + + if (isBoolean(x)) { + return equal(+x, y); + } + if (isBoolean(y)) { + return equal(x, +y); + } + + throw new math.error.UnsupportedTypeError('equal', x, y); + }; + }; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the exponent of a value + * + * exp(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.exp = function exp (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('exp', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.exp(x); + } + + if (isComplex(x)) { + var r = Math.exp(x.re); + return new Complex( + r * Math.cos(x.im), + r * Math.sin(x.im) + ); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return exp(util.number.toNumber(x)); + } + + if (isCollection(x)) { + return collection.deepMap(x, exp); + } + + if (isBoolean(x)) { + return Math.exp(x); + } + + throw new math.error.UnsupportedTypeError('exp', x); + }; + }; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Round a value towards zero + * + * fix(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.fix = function fix(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('fix', arguments.length, 1); + } + + if (isNumber(x)) { + return (x > 0) ? Math.floor(x) : Math.ceil(x); + } + + if (isComplex(x)) { + return new Complex( + (x.re > 0) ? Math.floor(x.re) : Math.ceil(x.re), + (x.im > 0) ? Math.floor(x.im) : Math.ceil(x.im) + ); + } + + if (x instanceof BigNumber) { + return x.isNegative() ? x.ceil() : x.floor(); + } + + if (isCollection(x)) { + return collection.deepMap(x, fix); + } + + if (isBoolean(x)) { + return fix(+x); + } + + throw new math.error.UnsupportedTypeError('fix', x); + }; + }; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Round a value towards minus infinity + * + * floor(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.floor = function floor(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('floor', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.floor(x); + } + + if (isComplex(x)) { + return new Complex ( + Math.floor(x.re), + Math.floor(x.im) + ); + } + + if (x instanceof BigNumber) { + return x.floor(); + } + + if (isCollection(x)) { + return collection.deepMap(x, floor); + } + + if (isBoolean(x)) { + return floor(+x); + } + + throw new math.error.UnsupportedTypeError('floor', x); + }; + }; + + +/***/ }, +/* 30 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + isBoolean = util['boolean'].isBoolean, + isInteger = util.number.isInteger, + isCollection = collection.isCollection; + + /** + * Calculate the greatest common divisor for two or more values or arrays. + * + * gcd(a, b) + * gcd(a, b, c, ...) + * + * For matrices, the function is evaluated element wise. + * + * @param {... Number | Boolean | Array | Matrix} args two or more integer numbers + * @return {Number | Array | Matrix} greatest common divisor + */ + math.gcd = function gcd(args) { + var a = arguments[0], + b = arguments[1], + r; // remainder + + if (arguments.length == 2) { + // two arguments + if (isNumber(a) && isNumber(b)) { + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function gcd must be integer numbers'); + } + + // http://en.wikipedia.org/wiki/Euclidean_algorithm + while (b != 0) { + r = a % b; + a = b; + b = r; + } + return (a < 0) ? -a : a; + } + + // evaluate gcd element wise + if (isCollection(a) || isCollection(b)) { + return collection.deepMap2(a, b, gcd); + } + + // TODO: implement BigNumber support for gcd + + // downgrade bignumbers to numbers + if (a instanceof BigNumber) { + return gcd(toNumber(a), b); + } + if (b instanceof BigNumber) { + return gcd(a, toNumber(b)); + } + + if (isBoolean(a)) { + return gcd(+a, b); + } + if (isBoolean(b)) { + return gcd(a, +b); + } + + throw new math.error.UnsupportedTypeError('gcd', a, b); + } + + if (arguments.length > 2) { + // multiple arguments. Evaluate them iteratively + for (var i = 1; i < arguments.length; i++) { + a = gcd(a, arguments[i]); + } + return a; + } + + // zero or one argument + throw new SyntaxError('Function gcd expects two or more arguments'); + }; + }; + + +/***/ }, +/* 31 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value x is larger y + * + * x > y + * larger(x, y) + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, the absolute values of a and b are compared. + * + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.larger = function larger(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('larger', arguments.length, 2); + } + + if (isNumber(x) && isNumber(y)) { + return x > y; + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.gt(y); + } + + // downgrade to Number + return larger(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.gt(y) + } + + // downgrade to Number + return larger(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value > y.value; + } + + if (isString(x) || isString(y)) { + return x > y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, larger); + } + + if (isBoolean(x)) { + return larger(+x, y); + } + if (isBoolean(y)) { + return larger(x, +y); + } + + if (isComplex(x) || isComplex(y)) { + throw new TypeError('No ordering relation is defined for complex numbers'); + } + + throw new math.error.UnsupportedTypeError('larger', x, y); + }; + }; + + +/***/ }, +/* 32 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value x is larger or equal to y + * + * x >= y + * largereq(x, y) + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, the absolute values of a and b are compared. + * + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.largereq = function largereq(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('largereq', arguments.length, 2); + } + + if (isNumber(x) && isNumber(y)) { + return x >= y; + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.gte(y); + } + + // downgrade to Number + return largereq(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.gte(y) + } + + // downgrade to Number + return largereq(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value >= y.value; + } + + if (isString(x) || isString(y)) { + return x >= y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, largereq); + } + + if (isBoolean(x)) { + return largereq(+x, y); + } + if (isBoolean(y)) { + return largereq(x, +y); + } + + if (isComplex(x) || isComplex(y)) { + throw new TypeError('No ordering relation is defined for complex numbers'); + } + + throw new math.error.UnsupportedTypeError('largereq', x, y); + }; + }; + + +/***/ }, +/* 33 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + isBoolean = util['boolean'].isBoolean, + isInteger = util.number.isInteger, + isCollection = collection.isCollection; + + /** + * Calculate the least common multiple for two or more values or arrays. + * + * lcm(a, b) + * lcm(a, b, c, ...) + * + * lcm is defined as: + * lcm(a, b) = abs(a * b) / gcd(a, b) + * + * For matrices, the function is evaluated element wise. + * + * @param {... Number | Boolean | Array | Matrix} args two or more integer numbers + * @return {Number | Array | Matrix} least common multiple + */ + math.lcm = function lcm(args) { + var a = arguments[0], + b = arguments[1], + t; + + if (arguments.length == 2) { + // two arguments + if (isNumber(a) && isNumber(b)) { + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function lcm must be integer numbers'); + } + + if (a == 0 || b == 0) { + return 0; + } + + // http://en.wikipedia.org/wiki/Euclidean_algorithm + // evaluate gcd here inline to reduce overhead + var prod = a * b; + while (b != 0) { + t = b; + b = a % t; + a = t; + } + return Math.abs(prod / a); + } + + // evaluate lcm element wise + if (isCollection(a) || isCollection(b)) { + return collection.deepMap2(a, b, lcm); + } + + if (isBoolean(a)) { + return lcm(+a, b); + } + if (isBoolean(b)) { + return lcm(a, +b); + } + + // TODO: implement BigNumber support for lcm + + // downgrade bignumbers to numbers + if (a instanceof BigNumber) { + return lcm(toNumber(a), b); + } + if (b instanceof BigNumber) { + return lcm(a, toNumber(b)); + } + + throw new math.error.UnsupportedTypeError('lcm', a, b); + } + + if (arguments.length > 2) { + // multiple arguments. Evaluate them iteratively + for (var i = 1; i < arguments.length; i++) { + a = lcm(a, arguments[i]); + } + return a; + } + + // zero or one argument + throw new SyntaxError('Function lcm expects two or more arguments'); + }; + }; + + +/***/ }, +/* 34 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the logarithm of a value + * + * log(x) + * log(x, base) + * + * base is optional. If not provided, the natural logarithm of x is calculated. + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @param {Number | Boolean | Complex} [base] + * @return {Number | Complex | Array | Matrix} res + */ + math.log = function log(x, base) { + if (arguments.length == 1) { + // calculate natural logarithm, log(x) + if (isNumber(x)) { + if (x >= 0) { + return Math.log(x); + } + else { + // negative value -> complex value computation + return log(new Complex(x, 0)); + } + } + + if (isComplex(x)) { + return new Complex ( + Math.log(Math.sqrt(x.re * x.re + x.im * x.im)), + Math.atan2(x.im, x.re) + ); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return log(util.number.toNumber(x)); + } + + if (isCollection(x)) { + return collection.deepMap(x, log); + } + + if (isBoolean(x)) { + return log(+x); + } + + throw new math.error.UnsupportedTypeError('log', x); + } + else if (arguments.length == 2) { + // calculate logarithm for a specified base, log(x, base) + return math.divide(log(x), log(base)); + } + else { + throw new math.error.ArgumentsError('log', arguments.length, 1, 2); + } + }; + }; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the 10-base logarithm of a value + * + * log10(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.log10 = function log10(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('log10', arguments.length, 1); + } + + if (isNumber(x)) { + if (x >= 0) { + return Math.log(x) / Math.LN10; + } + else { + // negative value -> complex value computation + return log10(new Complex(x, 0)); + } + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return log10(util.number.toNumber(x)); + } + + if (isComplex(x)) { + return new Complex ( + Math.log(Math.sqrt(x.re * x.re + x.im * x.im)) / Math.LN10, + Math.atan2(x.im, x.re) / Math.LN10 + ); + } + + if (isCollection(x)) { + return collection.deepMap(x, log10); + } + + if (isBoolean(x)) { + return log10(+x); + } + + throw new math.error.UnsupportedTypeError('log10', x); + }; + }; + + +/***/ }, +/* 36 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isCollection = collection.isCollection; + + /** + * Calculates the modulus, the remainder of an integer division. + * + * x % y + * mod(x, y) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Array | Matrix} y + * @return {Number | BigNumber | Array | Matrix} res + */ + math.mod = function mod(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('mod', arguments.length, 2); + } + + // see http://functions.wolfram.com/IntegerFunctions/Mod/ + + if (isNumber(x)) { + if (isNumber(y)) { + // number % number + return _mod(x, y); + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.mod(y); + } + + // downgrade to Number + return mod(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.mod(y) + } + + // downgrade to Number + return mod(x, toNumber(y)); + } + + // TODO: implement mod for complex values + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, mod); + } + + if (isBoolean(x)) { + return mod(+x, y); + } + if (isBoolean(y)) { + return mod(x, +y); + } + + throw new math.error.UnsupportedTypeError('mod', x, y); + }; + + /** + * Calculate the modulus of two numbers + * @param {Number} x + * @param {Number} y + * @returns {number} res + * @private + */ + function _mod(x, y) { + if (y > 0) { + if (x > 0) { + return x % y; + } + else if (x == 0) { + return 0; + } + else { // x < 0 + return x - y * Math.floor(x / y); + } + } + else if (y == 0) { + return x; + } + else { // y < 0 + // TODO: implement mod for a negative divisor + throw new Error('Cannot calculate mod for a negative divisor'); + } + } + }; + + +/***/ }, +/* 37 */ +/***/ function(module, exports, require) { + + module.exports = function(math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + Unit = require(11), + collection = require(13), + + array = util.array, + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isArray = Array.isArray, + isUnit = Unit.isUnit; + + /** + * Multiply two values. + * + * x * y + * multiply(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.multiply = function multiply(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('multiply', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + // number * number + return x * y; + } + else if (isComplex(y)) { + // number * complex + return _multiplyComplex (new Complex(x, 0), y); + } + else if (isUnit(y)) { + res = y.clone(); + res.value *= x; + return res; + } + } + + if (isComplex(x)) { + if (isNumber(y)) { + // complex * number + return _multiplyComplex (x, new Complex(y, 0)); + } + else if (isComplex(y)) { + // complex * complex + return _multiplyComplex (x, y); + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.times(y); + } + + // downgrade to Number + return multiply(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.times(y) + } + + // downgrade to Number + return multiply(x, toNumber(y)); + } + + if (isUnit(x)) { + if (isNumber(y)) { + res = x.clone(); + res.value *= y; + return res; + } + } + + if (isArray(x)) { + if (isArray(y)) { + // array * array + var sizeX = array.size(x); + var sizeY = array.size(y); + + if (sizeX.length == 1) { + if (sizeY.length == 1) { + // vector * vector + if (sizeX[0] != sizeY[0]) { + throw new RangeError('Dimensions mismatch in multiplication. ' + + 'Length of A must match length of B ' + + '(A is ' + sizeX[0] + + ', B is ' + sizeY[0] + + sizeX[0] + ' != ' + sizeY[0] + ')'); + } + + return _multiplyVectorVector(x, y); + } + else if (sizeY.length == 2) { + // vector * matrix + if (sizeX[0] != sizeY[0]) { + throw new RangeError('Dimensions mismatch in multiplication. ' + + 'Length of A must match rows of B ' + + '(A is ' + sizeX[0] + + ', B is ' + sizeY[0] + 'x' + sizeY[1] + ', ' + + sizeX[0] + ' != ' + sizeY[0] + ')'); + } + + return _multiplyVectorMatrix(x, y); + } + else { + throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + + '(B has ' + sizeY.length + ' dimensions)'); + } + } + else if (sizeX.length == 2) { + if (sizeY.length == 1) { + // matrix * vector + if (sizeX[1] != sizeY[0]) { + throw new RangeError('Dimensions mismatch in multiplication. ' + + 'Columns of A must match length of B ' + + '(A is ' + sizeX[0] + 'x' + sizeX[0] + + ', B is ' + sizeY[0] + ', ' + + sizeX[1] + ' != ' + sizeY[0] + ')'); + } + + return _multiplyMatrixVector(x, y); + } + else if (sizeY.length == 2) { + // matrix * matrix + if (sizeX[1] != sizeY[0]) { + throw new RangeError('Dimensions mismatch in multiplication. ' + + 'Columns of A must match rows of B ' + + '(A is ' + sizeX[0] + 'x' + sizeX[1] + + ', B is ' + sizeY[0] + 'x' + sizeY[1] + ', ' + + sizeX[1] + ' != ' + sizeY[0] + ')'); + } + + return _multiplyMatrixMatrix(x, y); + } + else { + throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + + '(B has ' + sizeY.length + ' dimensions)'); + } + } + else { + throw new Error('Can only multiply a 1 or 2 dimensional matrix ' + + '(A has ' + sizeX.length + ' dimensions)'); + } + } + else if (y instanceof Matrix) { + // array * matrix + return new Matrix(multiply(x, y.valueOf())); + } + else { + // array * scalar + return collection.deepMap2(x, y, multiply); + } + } + + if (x instanceof Matrix) { + if (y instanceof Matrix) { + // matrix * matrix + return new Matrix(multiply(x.valueOf(), y.valueOf())); + } + else { + // matrix * array + // matrix * scalar + return new Matrix(multiply(x.valueOf(), y)); + } + } + + if (isArray(y)) { + // scalar * array + return collection.deepMap2(x, y, multiply); + } + else if (y instanceof Matrix) { + // scalar * matrix + return new Matrix(collection.deepMap2(x, y.valueOf(), multiply)); + } + + if (isBoolean(x)) { + return multiply(+x, y); + } + if (isBoolean(y)) { + return multiply(x, +y); + } + + throw new math.error.UnsupportedTypeError('multiply', x, y); + }; + + /** + * Multiply two 2-dimensional matrices. + * The size of the matrices is not validated. + * @param {Array} x A 2d matrix + * @param {Array} y A 2d matrix + * @return {Array} result + * @private + */ + function _multiplyMatrixMatrix(x, y) { + // TODO: performance of matrix multiplication can be improved + var res = [], + rows = x.length, + cols = y[0].length, + num = x[0].length; + + for (var r = 0; r < rows; r++) { + res[r] = []; + for (var c = 0; c < cols; c++) { + var result = null; + for (var n = 0; n < num; n++) { + var p = math.multiply(x[r][n], y[n][c]); + result = (result === null) ? p : math.add(result, p); + } + res[r][c] = result; + } + } + + return res; + } + + /** + * Multiply a vector with a 2-dimensional matrix + * The size of the matrices is not validated. + * @param {Array} x A vector + * @param {Array} y A 2d matrix + * @return {Array} result + * @private + */ + function _multiplyVectorMatrix(x, y) { + // TODO: performance of matrix multiplication can be improved + var res = [], + rows = y.length, + cols = y[0].length; + + for (var c = 0; c < cols; c++) { + var result = null; + for (var r = 0; r < rows; r++) { + var p = math.multiply(x[r], y[r][c]); + result = (r === 0) ? p : math.add(result, p); + } + res[c] = result; + } + + return res; + } + + /** + * Multiply a 2-dimensional matrix with a vector + * The size of the matrices is not validated. + * @param {Array} x A 2d matrix + * @param {Array} y A vector + * @return {Array} result + * @private + */ + function _multiplyMatrixVector(x, y) { + // TODO: performance of matrix multiplication can be improved + var res = [], + rows = x.length, + cols = x[0].length; + + for (var r = 0; r < rows; r++) { + var result = null; + for (var c = 0; c < cols; c++) { + var p = math.multiply(x[r][c], y[c]); + result = (c === 0) ? p : math.add(result, p); + } + res[r] = result; + } + + return res; + } + + /** + * Multiply two vectors, calculate the dot product + * The size of the matrices is not validated. + * @param {Array} x A vector + * @param {Array} y A vector + * @return {Number} dotProduct + * @private + */ + function _multiplyVectorVector(x, y) { + // TODO: performance of matrix multiplication can be improved + var len = x.length, + dot = null; + + if (len) { + dot = 0; + + for (var i = 0, ii = x.length; i < ii; i++) { + dot = math.add(dot, math.multiply(x[i], y[i])); + } + } + + return dot; + } + + /** + * Multiply two complex numbers. x * y or multiply(x, y) + * @param {Complex} x + * @param {Complex} y + * @return {Complex | Number} res + * @private + */ + function _multiplyComplex (x, y) { + // Note: we test whether x or y are pure real or pure complex, + // to prevent unnecessary NaN values. For example, Infinity*i should + // result in Infinity*i, and not in NaN+Infinity*i + + if (x.im == 0) { + // x is pure real + if (y.im == 0) { + // y is pure real + return new Complex(x.re * y.re, 0); + } + else if (y.re == 0) { + // y is pure complex + return new Complex( + 0, + x.re * y.im + ); + } + else { + // y has a real and complex part + return new Complex( + x.re * y.re, + x.re * y.im + ); + } + } + else if (x.re == 0) { + // x is pure complex + if (y.im == 0) { + // y is pure real + return new Complex( + 0, + x.im * y.re + ); + } + else if (y.re == 0) { + // y is pure complex + return new Complex(-x.im * y.im, 0); + } + else { + // y has a real and complex part + return new Complex( + -x.im * y.im, + x.im * y.re + ); + } + } + else { + // x has a real and complex part + if (y.im == 0) { + // y is pure real + return new Complex( + x.re * y.re, + x.im * y.re + ); + } + else if (y.re == 0) { + // y is pure complex + return new Complex( + -x.im * y.im, + x.re * y.im + ); + } + else { + // y has a real and complex part + return new Complex( + x.re * y.re - x.im * y.im, + x.re * y.im + x.im * y.re + ); + } + } + } + }; + + +/***/ }, +/* 38 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + collection = require(13), + + array = util.array, + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isArray = Array.isArray, + isInteger = util.number.isInteger, + isComplex = Complex.isComplex; + + /** + * Calculates the power of x to y + * + * x ^ y + * pow(x, y) + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex} y + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.pow = function pow(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('pow', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + if (isInteger(y) || x >= 0) { + // real value computation + return Math.pow(x, y); + } + else { + return powComplex(new Complex(x, 0), new Complex(y, 0)); + } + } + else if (isComplex(y)) { + return powComplex(new Complex(x, 0), y); + } + } + + if (isComplex(x)) { + if (isNumber(y)) { + return powComplex(x, new Complex(y, 0)); + } + else if (isComplex(y)) { + return powComplex(x, y); + } + } + + // TODO: pow for complex numbers and bignumbers + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.pow(y); + } + + // downgrade to Number + return pow(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.pow(y) + } + + // downgrade to Number + return pow(x, toNumber(y)); + } + + + if (isArray(x)) { + if (!isNumber(y) || !isInteger(y) || y < 0) { + throw new TypeError('For A^b, b must be a positive integer ' + + '(value is ' + y + ')'); + } + // verify that A is a 2 dimensional square matrix + var s = array.size(x); + if (s.length != 2) { + throw new Error('For A^b, A must be 2 dimensional ' + + '(A has ' + s.length + ' dimensions)'); + } + if (s[0] != s[1]) { + throw new Error('For A^b, A must be square ' + + '(size is ' + s[0] + 'x' + s[1] + ')'); + } + + // compute power of matrix + var res = math.eye(s[0]).valueOf(); + var px = x; + while (y >= 1) { + if ((y & 1) == 1) { + res = math.multiply(px, res); + } + y >>= 1; + px = math.multiply(px, px); + } + return res; + } + else if (x instanceof Matrix) { + return new Matrix(pow(x.valueOf(), y)); + } + + if (isBoolean(x)) { + return pow(+x, y); + } + if (isBoolean(y)) { + return pow(x, +y); + } + + throw new math.error.UnsupportedTypeError('pow', x, y); + }; + + /** + * Calculates the power of x to y, x^y, for two complex numbers. + * @param {Complex} x + * @param {Complex} y + * @return {Complex} res + * @private + */ + function powComplex (x, y) { + // complex computation + // x^y = exp(log(x)*y) = exp((abs(x)+i*arg(x))*y) + var temp1 = math.log(x); + var temp2 = math.multiply(temp1, y); + return math.exp(temp2); + } + }; + + +/***/ }, +/* 39 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Round a value towards the nearest integer + * + * round(x) + * round(x, n) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Array} [n] number of decimals (by default n=0) + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.round = function round(x, n) { + if (arguments.length != 1 && arguments.length != 2) { + throw new math.error.ArgumentsError('round', arguments.length, 1, 2); + } + + if (n == undefined) { + // round (x) + if (isNumber(x)) { + return Math.round(x); + } + + if (isComplex(x)) { + return new Complex ( + Math.round(x.re), + Math.round(x.im) + ); + } + + if (x instanceof BigNumber) { + return x.round(); + } + + if (isCollection(x)) { + return collection.deepMap(x, round); + } + + if (isBoolean(x)) { + return Math.round(x); + } + + throw new math.error.UnsupportedTypeError('round', x); + } + else { + // round (x, n) + if (n instanceof BigNumber) { + n = parseFloat(n.valueOf()); + } + + if (!isNumber(n) || !isInteger(n)) { + throw new TypeError('Number of decimals in function round must be an integer'); + } + if (n < 0 || n > 9) { + throw new Error ('Number of decimals in function round must be in te range of 0-9'); + } + + if (isNumber(x)) { + return roundNumber(x, n); + } + + if (isComplex(x)) { + return new Complex ( + roundNumber(x.re, n), + roundNumber(x.im, n) + ); + } + + if (x instanceof BigNumber) { + if (isNumber(n)) { + return x.round(n); + } + } + + if (isCollection(x) || isCollection(n)) { + return collection.deepMap2(x, n, round); + } + + if (isBoolean(x)) { + return round(+x, n); + } + if (isBoolean(n)) { + return round(x, +n); + } + + throw new math.error.UnsupportedTypeError('round', x, n); + } + }; + + /** + * round a number to the given number of decimals, or to zero if decimals is + * not provided + * @param {Number} value + * @param {Number} [decimals] number of decimals, between 0 and 15 (0 by default) + * @return {Number} roundedValue + */ + function roundNumber (value, decimals) { + if (decimals) { + var p = Math.pow(10, decimals); + return Math.round(value * p) / p; + } + else { + return Math.round(value); + } + } + }; + + +/***/ }, +/* 40 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + number = util.number, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Compute the sign of a value. + * + * sign(x) + * + * The sign of a value x is 1 when x > 1, -1 when x < 0, and 0 when x == 0 + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.sign = function sign(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('sign', arguments.length, 1); + } + + if (isNumber(x)) { + return number.sign(x); + } + + if (isComplex(x)) { + var abs = Math.sqrt(x.re * x.re + x.im * x.im); + return new Complex(x.re / abs, x.im / abs); + } + + if (x instanceof BigNumber) { + return new BigNumber(x.cmp(0)); + } + + if (isCollection(x)) { + return collection.deepMap(x, sign); + } + + if (isBoolean(x)) { + return number.sign(x); + } + + throw new math.error.UnsupportedTypeError('sign', x); + }; + }; + + +/***/ }, +/* 41 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value x is smaller y + * + * x < y + * smaller(x, y) + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, the absolute values of a and b are compared. + * + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.smaller = function smaller(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('smaller', arguments.length, 2); + } + + if (isNumber(x) && isNumber(y)) { + return x < y; + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.lt(y); + } + + // downgrade to Number + return smaller(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.lt(y) + } + + // downgrade to Number + return smaller(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value < y.value; + } + + if (isString(x) || isString(y)) { + return x < y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, smaller); + } + + if (isBoolean(x)) { + return smaller(+x, y); + } + if (isBoolean(y)) { + return smaller(x, +y); + } + + if (isComplex(x) || isComplex(y)) { + throw new TypeError('No ordering relation is defined for complex numbers'); + } + + throw new math.error.UnsupportedTypeError('smaller', x, y); + }; + }; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value a is smaller or equal to b + * + * a <= b + * smallereq(a, b) + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, the absolute values of a and b are compared. + * + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.smallereq = function smallereq(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('smallereq', arguments.length, 2); + } + + if (isNumber(x) && isNumber(y)) { + return x <= y; + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.lte(y); + } + + // downgrade to Number + return smallereq(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.lte(y) + } + + // downgrade to Number + return smallereq(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value <= y.value; + } + + if (isString(x) || isString(y)) { + return x <= y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, smallereq); + } + + if (isBoolean(x)) { + return smallereq(+x, y); + } + if (isBoolean(y)) { + return smallereq(x, +y); + } + + if (isComplex(x) || isComplex(y)) { + throw new TypeError('No ordering relation is defined for complex numbers'); + } + + throw new math.error.UnsupportedTypeError('smallereq', x, y); + }; + }; + + +/***/ }, +/* 43 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the square root of a value + * + * sqrt(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.sqrt = function sqrt (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('sqrt', arguments.length, 1); + } + + if (isNumber(x)) { + if (x >= 0) { + return Math.sqrt(x); + } + else { + return sqrt(new Complex(x, 0)); + } + } + + if (isComplex(x)) { + var r = Math.sqrt(x.re * x.re + x.im * x.im); + if (x.im >= 0) { + return new Complex( + 0.5 * Math.sqrt(2.0 * (r + x.re)), + 0.5 * Math.sqrt(2.0 * (r - x.re)) + ); + } + else { + return new Complex( + 0.5 * Math.sqrt(2.0 * (r + x.re)), + -0.5 * Math.sqrt(2.0 * (r - x.re)) + ); + } + } + + if (x instanceof BigNumber) { + return x.sqrt(); + } + + if (isCollection(x)) { + return collection.deepMap(x, sqrt); + } + + if (isBoolean(x)) { + return sqrt(+x); + } + + throw new math.error.UnsupportedTypeError('sqrt', x); + }; + }; + + +/***/ }, +/* 44 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Compute the square of a value + * + * x .* x + * square(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Array | Matrix} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.square = function square(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('square', arguments.length, 1); + } + + if (isNumber(x)) { + return x * x; + } + + if (isComplex(x)) { + return math.multiply(x, x); + } + + if (x instanceof BigNumber) { + return x.times(x); + } + + if (isCollection(x)) { + return collection.deepMap(x, square); + } + + if (isBoolean(x)) { + return x * x; + } + + throw new math.error.UnsupportedTypeError('square', x); + }; + }; + + +/***/ }, +/* 45 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + Unit = require(11), + collection = require(13), + + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isNumber = util.number.isNumber, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Subtract two values + * + * x - y + * subtract(x, y) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} y + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.subtract = function subtract(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('subtract', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + // number - number + return x - y; + } + else if (isComplex(y)) { + // number - complex + return new Complex ( + x - y.re, + - y.im + ); + } + } + else if (isComplex(x)) { + if (isNumber(y)) { + // complex - number + return new Complex ( + x.re - y, + x.im + ) + } + else if (isComplex(y)) { + // complex - complex + return new Complex ( + x.re - y.re, + x.im - y.im + ) + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return x.minus(y); + } + + // downgrade to Number + return subtract(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return x.minus(y) + } + + // downgrade to Number + return subtract(x, toNumber(y)); + } + + if (isUnit(x)) { + if (isUnit(y)) { + if (!x.equalBase(y)) { + throw new Error('Units do not match'); + } + + if (x.value == null) { + throw new Error('Unit on left hand side of operator - has an undefined value'); + } + + if (y.value == null) { + throw new Error('Unit on right hand side of operator - has an undefined value'); + } + + var res = x.clone(); + res.value -= y.value; + res.fixPrefix = false; + + return res; + } + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, subtract); + } + + if (isBoolean(x)) { + return subtract(+x, y); + } + if (isBoolean(y)) { + return subtract(x, +y); + } + + throw new math.error.UnsupportedTypeError('subtract', x, y); + }; + }; + + +/***/ }, +/* 46 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Inverse the sign of a value. + * + * -x + * unary(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | BigNumber | Complex | Unit | Array | Matrix} res + */ + math.unary = function unary(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('unary', arguments.length, 1); + } + + if (isNumber(x)) { + return -x; + } + + if (isComplex(x)) { + return new Complex( + -x.re, + -x.im + ); + } + + if (x instanceof BigNumber) { + return x.neg(); + } + + if (isUnit(x)) { + var res = x.clone(); + res.value = -x.value; + return res; + } + + if (isCollection(x)) { + return collection.deepMap(x, unary); + } + + if (isBoolean(x)) { + return -x; + } + + throw new math.error.UnsupportedTypeError('unary', x); + }; + }; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Check if value x unequals y, x != y + * In case of complex numbers, x.re must unequal y.re, or x.im must unequal y.im + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} x + * @param {Number | BigNumber | Boolean | Complex | Unit | String | Array | Matrix} y + * @return {Boolean | Array | Matrix} res + */ + math.unequal = function unequal(x, y) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('unequal', arguments.length, 2); + } + + if (isNumber(x)) { + if (isNumber(y)) { + return x != y; + } + else if (isComplex(y)) { + return (x != y.re) || (y.im != 0); + } + } + + if (isComplex(x)) { + if (isNumber(y)) { + return (x.re != y) || (x.im != 0); + } + else if (isComplex(y)) { + return (x.re != y.re) || (x.im != y.im); + } + } + + if (x instanceof BigNumber) { + // try to convert to big number + if (isNumber(y)) { + y = toBigNumber(y); + } + else if (isBoolean(y)) { + y = new BigNumber(y ? 1 : 0); + } + + if (y instanceof BigNumber) { + return !x.eq(y); + } + + // downgrade to Number + return unequal(toNumber(x), y); + } + if (y instanceof BigNumber) { + // try to convert to big number + if (isNumber(x)) { + x = toBigNumber(x); + } + else if (isBoolean(x)) { + x = new BigNumber(x ? 1 : 0); + } + + if (x instanceof BigNumber) { + return !x.eq(y) + } + + // downgrade to Number + return unequal(x, toNumber(y)); + } + + if ((isUnit(x)) && (isUnit(y))) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + return x.value != y.value; + } + + if (isString(x) || isString(y)) { + return x != y; + } + + if (isCollection(x) || isCollection(y)) { + return collection.deepMap2(x, y, unequal); + } + + if (isBoolean(x)) { + return unequal(+x, y); + } + if (isBoolean(y)) { + return unequal(x, +y); + } + + throw new math.error.UnsupportedTypeError('unequal', x, y); + }; + }; + + +/***/ }, +/* 48 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + + toNumber = util.number.toNumber, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isInteger = util.number.isInteger; + + /** + * Calculate the extended greatest common divisor for two values. + * + * xgcd(a, b) + * + * @param {Number | Boolean} a An integer number + * @param {Number | Boolean} b An integer number + * @return {Array} An array containing 3 integers [div, m, n] + * where div = gcd(a, b) and a*m + b*n = div + * + * @see http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + */ + math.xgcd = function xgcd(a, b) { + if (arguments.length == 2) { + // two arguments + if (isNumber(a) && isNumber(b)) { + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function xgcd must be integer numbers'); + } + + return _xgcd(a, b); + } + + // TODO: implement BigNumber support for xgcd + + // downgrade bignumbers to numbers + if (a instanceof BigNumber) { + return xgcd(toNumber(a), b); + } + if (b instanceof BigNumber) { + return xgcd(a, toNumber(b)); + } + + if (isBoolean(a)) { + return xgcd(+a, b); + } + if (isBoolean(b)) { + return xgcd(a, +b); + } + + throw new math.error.UnsupportedTypeError('xgcd', a, b); + } + + // zero or one argument + throw new SyntaxError('Function xgcd expects two arguments'); + }; + + /** + * Calculate xgcd for two numbers + * @param {Number} a + * @param {Number} b + * @private + */ + function _xgcd(a, b) { + //* + // source: http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + var t, // used to swap two variables + q, // quotient + r, // remainder + x = 0, lastx = 1, + y = 1, lasty = 0; + + while (b) { + q = Math.floor(a / b); + r = a % b; + + t = x; + x = lastx - q * x; + lastx = t; + + t = y; + y = lasty - q * y; + lasty = t; + + a = b; + b = r; + } + + if (a < 0) { + return [-a, a ? -lastx : 0, -lasty]; + } + else { + return [a, a ? lastx : 0, lasty]; + } + } + }; + + +/***/ }, +/* 49 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isCollection = collection.isCollection, + isComplex = Complex.isComplex; + + /** + * Compute the argument of a complex value. + * If x = a + bi, the argument is computed as atan2(b, a). + * + * arg(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Complex | Array | Matrix | Boolean} x + * @return {Number | Array | Matrix} res + */ + math.arg = function arg(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('arg', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.atan2(0, x); + } + + if (isComplex(x)) { + return Math.atan2(x.im, x.re); + } + + if (isCollection(x)) { + return collection.deepMap(x, arg); + } + + if (isBoolean(x)) { + return arg(+x); + } + + if (x instanceof BigNumber) { + // downgrade to Number + // TODO: implement BigNumber support + return arg(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('arg', x); + }; + }; + + +/***/ }, +/* 50 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + object = util.object, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isCollection =collection.isCollection, + isComplex = Complex.isComplex; + + /** + * Compute the complex conjugate of a complex value. + * If x = a+bi, the complex conjugate is a-bi. + * + * conj(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x + * @return {Number | BigNumber | Complex | Array | Matrix} res + */ + math.conj = function conj(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('conj', arguments.length, 1); + } + + if (isNumber(x)) { + return x; + } + + if (x instanceof BigNumber) { + return new BigNumber(x); + } + + if (isComplex(x)) { + return new Complex(x.re, -x.im); + } + + if (isCollection(x)) { + return collection.deepMap(x, conj); + } + + if (isBoolean(x)) { + return +x; + } + + // return a clone of the value for non-complex values + return object.clone(x); + }; + }; + + +/***/ }, +/* 51 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + object = util.object, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isCollection = collection.isCollection, + isComplex = Complex.isComplex; + + /** + * Get the real part of a complex number. + * + * re(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x + * @return {Number | BigNumber | Array | Matrix} re + */ + math.re = function re(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('re', arguments.length, 1); + } + + if (isNumber(x)) { + return x; + } + + if (x instanceof BigNumber) { + return new BigNumber(x); + } + + if (isComplex(x)) { + return x.re; + } + + if (isCollection(x)) { + return collection.deepMap(x, re); + } + + if (isBoolean(x)) { + return +x; + } + + // return a clone of the value itself for all non-complex values + return object.clone(x); + }; + }; + + +/***/ }, +/* 52 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isCollection =collection.isCollection, + isComplex = Complex.isComplex; + + /** + * Get the imaginary part of a complex number. + * + * im(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | BigNumber | Complex | Array | Matrix | Boolean} x + * @return {Number | BigNumber | Array | Matrix} im + */ + math.im = function im(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('im', arguments.length, 1); + } + + if (isNumber(x)) { + return 0; + } + + if (x instanceof BigNumber) { + return new BigNumber(0); + } + + if (isComplex(x)) { + return x.im; + } + + if (isCollection(x)) { + return collection.deepMap(x, im); + } + + if (isBoolean(x)) { + return 0; + } + + // return 0 for all non-complex values + return 0; + }; + }; + + +/***/ }, +/* 53 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isCollection = collection.isCollection, + isNumber = util.number.isNumber, + isString = util.string.isString, + isBoolean = util['boolean'].isBoolean; + + // extend BigNumber with a function clone + if (typeof BigNumber.prototype.clone !== 'function') { + /** + * Clone a bignumber + * @return {BigNumber} clone + */ + BigNumber.prototype.clone = function clone () { + return new BigNumber(this); + }; + } + + /** + * Create a big number, which can store numbers with higher precision than + * a JavaScript Number. + * When value is a matrix, all elements will be converted to bignumber. + * + * @param {Number | String | Array | Matrix} [value] Value for the big number, + * 0 by default. + */ + math.bignumber = function bignumber(value) { + if (arguments.length > 1) { + throw new math.error.ArgumentsError('bignumber', arguments.length, 0, 1); + } + + if ((value instanceof BigNumber) || isNumber(value) || isString(value)) { + return new BigNumber(value); + } + + if (isBoolean(value)) { + return new BigNumber(+value); + } + + if (isCollection(value)) { + return collection.deepMap(value, bignumber); + } + + if (arguments.length == 0) { + return new BigNumber(0); + } + + throw new math.error.UnsupportedTypeError('bignumber', value); + }; + }; + + +/***/ }, +/* 54 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isCollection = collection.isCollection, + isNumber = util.number.isNumber, + isString = util.string.isString; + + /** + * Create a boolean or convert a string or number to a boolean. + * In case of a number, true is returned for non-zero numbers, and false in + * case of zero. + * Strings can be 'true' or 'false', or can contain a number. + * When value is a matrix, all elements will be converted to boolean. + * @param {String | Number | Boolean | Array | Matrix} value + * @return {Boolean | Array | Matrix} bool + */ + math['boolean'] = function bool (value) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('boolean', arguments.length, 0, 1); + } + + if (value === 'true' || value === true) { + return true; + } + + if (value === 'false' || value === false) { + return false; + } + + if (value instanceof Boolean) { + return value ? true : false; + } + + if (isNumber(value)) { + return (value !== 0); + } + + if (value instanceof BigNumber) { + return !value.isZero(); + } + + if (isString(value)) { + // try case insensitive + var lcase = value.toLowerCase(); + if (lcase === 'true') { + return true; + } + else if (lcase === 'false') { + return false; + } + + // test whether value is a valid number + var num = Number(value); + if (value != '' && !isNaN(num)) { + return (num !== 0); + } + } + + if (isCollection(value)) { + return collection.deepMap(value, bool); + } + + throw new SyntaxError(value.toString() + ' is no valid boolean'); + }; + }; + + +/***/ }, +/* 55 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isCollection = collection.isCollection, + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + isString = util.string.isString, + isComplex = Complex.isComplex; + + /** + * Create a complex value or convert a value to a complex value. + * + * The method accepts the following arguments: + * complex() creates a complex value with zero + * as real and imaginary part. + * complex(re : number, im : string) creates a complex value with provided + * values for real and imaginary part. + * complex(re : number) creates a complex value with provided + * real value and zero imaginary part. + * complex(complex : Complex) clones the provided complex value. + * complex(arg : string) parses a string into a complex value. + * complex(array : Array) converts the elements of the array + * or matrix element wise into a + * complex value. + * + * Example usage: + * var a = math.complex(3, -4); // 3 - 4i + * a.re = 5; // a = 5 - 4i + * var i = a.im; // -4; + * var b = math.complex('2 + 6i'); // 2 + 6i + * var c = math.complex(); // 0 + 0i + * var d = math.add(a, b); // 5 + 2i + * + * @param {* | Array | Matrix} [args] + * @return {Complex | Array | Matrix} value + */ + math.complex = function complex(args) { + switch (arguments.length) { + case 0: + // no parameters. Set re and im zero + return new Complex(0, 0); + break; + + case 1: + // parse string into a complex number + var arg = arguments[0]; + + if (isNumber(arg)) { + return new Complex(arg, 0); + } + + if (arg instanceof BigNumber) { + // convert to Number + return new Complex(toNumber(arg), 0); + } + + if (isComplex(arg)) { + // create a clone + return arg.clone(); + } + + if (isString(arg)) { + var c = Complex.parse(arg); + if (c) { + return c; + } + else { + throw new SyntaxError('String "' + arg + '" is no valid complex number'); + } + } + + if (isCollection(arg)) { + return collection.deepMap(arg, complex); + } + + throw new TypeError( + 'Two numbers or a single string expected in function complex'); + break; + + case 2: + // re and im provided + var re = arguments[0], + im = arguments[1]; + + // convert re to number + if (re instanceof BigNumber) { + re = toNumber(re); + } + + // convert im to number + if (im instanceof BigNumber) { + im = toNumber(im); + } + + if (isNumber(re) && isNumber(im)) { + return new Complex(re, im); + } + else { + throw new TypeError( + 'Two numbers or a single string expected in function complex'); + } + + break; + + default: + throw new math.error.ArgumentsError('complex', arguments.length, 0, 2); + } + }; + }; + + +/***/ }, +/* 56 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Index = require(9), + + toNumber = util.number.toNumber; + + /** + * Create an index. An Index can store ranges having start, step, and end + * for multiple dimensions. + * Matrix.get, Matrix.set, and math.subset accept an Index as input. + * + * Usage: + * var index = math.index(range1, range2, ...); + * + * Where each range can be any of: + * An array [start, end] + * An array [start, end, step] + * A number + * null, this will create select the whole dimension + * + * The parameters start, end, and step must be integer numbers. + * + * @param {...*} ranges + */ + math.index = function matrix(ranges) { + var i = new Index(); + + // downgrade BigNumber to Number + var args = Array.prototype.slice.apply(arguments).map(function (arg) { + if (arg instanceof BigNumber) { + return toNumber(arg); + } + else if (Array.isArray(arg)) { + return arg.map(function (elem) { + return (elem instanceof BigNumber) ? toNumber (elem) : elem; + }); + } + else { + return arg; + } + }); + + Index.apply(i, args); + return i; + }; + }; + + +/***/ }, +/* 57 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Matrix = require(10); + + /** + * Create a matrix. The function creates a new math.type.Matrix object. + * + * The method accepts the following arguments: + * matrix() creates an empty matrix + * matrix(data) creates a matrix with initial data. + * + * Example usage: + * var m = matrix([[1, 2], [3, 4]); + * m.size(); // [2, 2] + * m.resize([3, 2], 5); + * m.valueOf(); // [[1, 2], [3, 4], [5, 5]] + * m.get([1, 0]) // 3 + * + * @param {Array | Matrix} [data] A multi dimensional array + * @return {Matrix} matrix + */ + math.matrix = function matrix(data) { + if (arguments.length > 1) { + throw new math.error.ArgumentsError('matrix', arguments.length, 0, 1); + } + + return new Matrix(data); + }; + }; + + +/***/ }, +/* 58 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isCollection = collection.isCollection, + toNumber = util.number.toNumber, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString; + + /** + * Create a number or convert a string to a number. + * When value is a matrix, all elements will be converted to number. + * @param {String | Number | Boolean | Array | Matrix} [value] + * @return {Number | Array | Matrix} num + */ + math.number = function number (value) { + switch (arguments.length) { + case 0: + return 0; + + case 1: + if (isCollection(value)) { + return collection.deepMap(value, number); + } + + if (value instanceof BigNumber) { + return toNumber(value); + } + + if (isString(value)) { + var num = Number(value); + if (isNaN(num)) { + num = Number(value.valueOf()); + } + if (isNaN(num)) { + throw new SyntaxError(value.toString() + ' is no valid number'); + } + return num; + } + + if (isBoolean(value)) { + return value + 0; + } + + if (isNumber(value)) { + return value; + } + + throw new math.error.UnsupportedTypeError('number', value); + + default: + throw new math.error.ArgumentsError('number', arguments.length, 0, 1); + } + }; + }; + + +/***/ }, +/* 59 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Parser = require(5); + + /** + * Create a parser. The function creates a new math.expression.Parser object. + * + * parser() + * + * Example usage: + * var parser = new math.parser(); + * + * // evaluate expressions + * var a = parser.eval('sqrt(3^2 + 4^2)'); // 5 + * var b = parser.eval('sqrt(-4)'); // 2i + * var c = parser.eval('2 inch in cm'); // 5.08 cm + * var d = parser.eval('cos(45 deg)'); // 0.7071067811865476 + * + * // define variables and functions + * parser.eval('x = 7 / 2'); // 3.5 + * parser.eval('x + 3'); // 6.5 + * parser.eval('function f(x, y) = x^y'); // f(x, y) + * parser.eval('f(2, 3)'); // 8 + * + * // get and set variables and functions + * var x = parser.get('x'); // 7 + * var f = parser.get('f'); // function + * var g = f(3, 2); // 9 + * parser.set('h', 500); + * var i = parser.eval('h / 2'); // 250 + * parser.set('hello', function (name) { + * return 'hello, ' + name + '!'; + * }); + * parser.eval('hello("user")'); // "hello, user!" + * + * // clear defined functions and variables + * parser.clear(); + * + * @return {Parser} Parser + */ + math.parser = function parser() { + return new Parser(math); + }; + }; + + +/***/ }, +/* 60 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + /** + * Wrap any value in a Selector, allowing to perform chained operations on + * the value. + * + * All methods available in the math.js library can be called upon the selector, + * and then will be evaluated with the value itself as first argument. + * The selector can be closed by executing selector.done(), which will return + * the final value. + * + * Example usage: + * math.select(3) + * .add(4) + * .subtract(2) + * .done(); // 5 + * math.select( [[1, 2], [3, 4]] ) + * .set([1, 1], 8) + * .multiply(3) + * .done(); // [[24, 6], [9, 12]] + * + * The Selector has a number of special functions: + * - done() Finalize the chained operation and return the selectors value. + * - valueOf() The same as done() + * - toString() Executes math.format() onto the selectors value, returning + * a string representation of the value. + * - get(...) Get a subselection of the selectors value. Only applicable when + * the value has a method get, for example when value is a Matrix + * or Array. + * - set(...) Replace a subselection of the selectors value. Only applicable + * when the value has a method get, for example when value is a + * Matrix or Array. + * + * @param {*} value + * @return {math.chaining.Selector} selector + */ + math.select = function select(value) { + // TODO: check number of arguments + return new math.chaining.Selector(value); + }; + }; + + +/***/ }, +/* 61 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + collection = require(13), + + number = util.number, + isNumber = util.number.isNumber, + isCollection = collection.isCollection; + + /** + * Create a string or convert any object into a string. + * Elements of Arrays and Matrices are processed element wise + * @param {* | Array | Matrix} [value] + * @return {String | Array | Matrix} str + */ + math.string = function string (value) { + switch (arguments.length) { + case 0: + return ''; + + case 1: + if (isNumber(value)) { + return number.format(value); + } + + if (isCollection(value)) { + return collection.deepMap(value, string); + } + + if (value === null) { + return 'null'; + } + + return value.toString(); + + default: + throw new math.error.ArgumentsError('string', arguments.length, 0, 1); + } + }; + }; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Unit = require(11), + collection = require(13), + + isCollection = collection.isCollection, + toNumber = util.number.toNumber, + isString = util.string.isString; + + /** + * Create a unit. Depending on the passed arguments, the function + * will create and return a new math.type.Unit object. + * When a matrix is provided, all elements will be converted to units. + * + * The method accepts the following arguments: + * unit(unit : string) + * unit(value : number, unit : string) + * + * Example usage: + * var a = math.unit(5, 'cm'); // 50 mm + * var b = math.unit('23 kg'); // 23 kg + * var c = math.in(a, math.unit('m'); // 0.05 m + * + * @param {* | Array | Matrix} args + * @return {Unit | Array | Matrix} value + */ + math.unit = function unit(args) { + switch(arguments.length) { + case 1: + // parse a string + var arg = arguments[0]; + + if (arg instanceof Unit) { + // create a clone of the unit + return arg.clone(); + } + + if (isString(arg)) { + if (Unit.isPlainUnit(arg)) { + return new Unit(null, arg); // a pure unit + } + + var u = Unit.parse(arg); // a unit with value, like '5cm' + if (u) { + return u; + } + + throw new SyntaxError('String "' + arg + '" is no valid unit'); + } + + if (isCollection(args)) { + return collection.deepMap(args, unit); + } + + throw new TypeError('A string or a number and string expected in function unit'); + break; + + case 2: + // a number and a unit + + if (arguments[0] instanceof BigNumber) { + // convert value to number + return new Unit(toNumber(arguments[0]), arguments[1]); + } + else { + return new Unit(arguments[0], arguments[1]); + } + break; + + default: + throw new math.error.ArgumentsError('unit', arguments.length, 1, 2); + } + }; + }; + + +/***/ }, +/* 63 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Matrix = require(10), + collection = require(13), + + object = util.object, + array = util.array, + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + isCollection = collection.isCollection; + + /** + * Concatenate two or more matrices + * Usage: + * math.concat(A, B, C, ...) + * math.concat(A, B, C, ..., dim) + * + * Where the optional dim is the zero-based number of the dimension to be + * concatenated. + * + * @param {... Array | Matrix} args + * @return {Array | Matrix} res + */ + math.concat = function concat (args) { + var i, + len = arguments.length, + dim = -1, // zero-based dimension + prevDim, + asMatrix = false, + matrices = []; // contains multi dimensional arrays + + for (i = 0; i < len; i++) { + var arg = arguments[i]; + + // test whether we need to return a Matrix (if not we return an Array) + if (arg instanceof Matrix) { + asMatrix = true; + } + + if ((i == len - 1) && isNumber(arg)) { + // last argument contains the dimension on which to concatenate + prevDim = dim; + dim = arg; + + if (!isInteger(dim) || dim < 0) { + throw new TypeError('Dimension number must be a positive integer ' + + '(dim = ' + dim + ')'); + } + + if (i > 0 && dim > prevDim) { + throw new RangeError('Dimension out of range ' + + '(' + dim + ' > ' + prevDim + ')'); + } + } + else if (isCollection(arg)) { + // this is a matrix or array + var matrix = object.clone(arg).valueOf(); + var size = array.size(arg.valueOf()); + matrices[i] = matrix; + prevDim = dim; + dim = size.length - 1; + + // verify whether each of the matrices has the same number of dimensions + if (i > 0 && dim != prevDim) { + throw new RangeError('Dimension mismatch ' + + '(' + prevDim + ' != ' + dim + ')'); + } + } + else { + throw new math.error.UnsupportedTypeError('concat', arg); + } + } + + if (matrices.length == 0) { + throw new SyntaxError('At least one matrix expected'); + } + + var res = matrices.shift(); + while (matrices.length) { + res = _concat(res, matrices.shift(), dim, 0); + } + + return asMatrix ? new Matrix(res) : res; + }; + + /** + * Recursively concatenate two matrices. + * The contents of the matrices is not cloned. + * @param {Array} a Multi dimensional array + * @param {Array} b Multi dimensional array + * @param {Number} concatDim The dimension on which to concatenate (zero-based) + * @param {Number} dim The current dim (zero-based) + * @return {Array} c The concatenated matrix + * @private + */ + function _concat(a, b, concatDim, dim) { + if (dim < concatDim) { + // recurse into next dimension + if (a.length != b.length) { + throw new Error('Dimensions mismatch (' + a.length + ' != ' + b.length + ')'); + } + + var c = []; + for (var i = 0; i < a.length; i++) { + c[i] = _concat(a[i], b[i], concatDim, dim + 1); + } + return c; + } + else { + // concatenate this dimension + return a.concat(b); + } + } + }; + + +/***/ }, +/* 64 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Matrix = require(10), + + object = util.object, + array = util.array, + string = util.string; + + /** + * @constructor det + * Calculate the determinant of a matrix + * + * det(x) + * + * @param {Array | Matrix} x + * @return {Number} determinant + */ + math.det = function det (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('det', arguments.length, 1); + } + + var size = array.size(x.valueOf()); + switch (size.length) { + case 0: + // scalar + return object.clone(x); + break; + + case 1: + // vector + if (size[0] == 1) { + return object.clone(x.valueOf()[0]); + } + else { + throw new RangeError('Matrix must be square ' + + '(size: ' + string.format(size) + ')'); + } + break; + + case 2: + // two dimensional array + var rows = size[0]; + var cols = size[1]; + if (rows == cols) { + return _det(x.valueOf(), rows, cols); + } + else { + throw new RangeError('Matrix must be square ' + + '(size: ' + string.format(size) + ')'); + } + break; + + default: + // multi dimensional array + throw new RangeError('Matrix must be two dimensional ' + + '(size: ' + string.format(size) + ')'); + } + }; + + /** + * Calculate the determinant of a matrix + * @param {Array[]} matrix A square, two dimensional matrix + * @param {Number} rows Number of rows of the matrix (zero-based) + * @param {Number} cols Number of columns of the matrix (zero-based) + * @returns {Number} det + * @private + */ + function _det (matrix, rows, cols) { + if (rows == 1) { + // this is a 1 x 1 matrix + return matrix[0][0]; + } + else if (rows == 2) { + // this is a 2 x 2 matrix + // the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12 + return math.subtract( + math.multiply(matrix[0][0], matrix[1][1]), + math.multiply(matrix[1][0], matrix[0][1]) + ); + } + else { + // this is an n x n matrix + var d = 1; + var lead = 0; + for (var r = 0; r < rows; r++) { + if (lead >= cols) { + break; + } + var i = r; + // Find the pivot element. + while (matrix[i][lead] == 0) { + i++; + if (i == rows) { + i = r; + lead++; + if (lead == cols) { + // We found the last pivot. + if (object.deepEqual(matrix, eye(rows).valueOf())) { + return math.round(d, 6); + } else { + return 0; + } + } + } + } + if (i != r) { + // Swap rows i and r, which negates the determinant. + for (var a = 0; a < cols; a++) { + var temp = matrix[i][a]; + matrix[i][a] = matrix[r][a]; + matrix[r][a] = temp; + } + d *= -1; + } + // Scale row r and the determinant simultaneously. + var div = matrix[r][lead]; + for (var a = 0; a < cols; a++) { + matrix[r][a] = matrix[r][a] / div; + } + d *= div; + // Back-substitute upwards. + for (var j = 0; j < rows; j++) { + if (j != r) { + // Taking linear combinations does not change the det. + var c = matrix[j][lead]; + for (var a = 0; a < cols; a++) { + matrix[j][a] = matrix[j][a] - matrix[r][a] * c; + } + } + } + lead++; // Now looking for a pivot further right. + } + // If reduction did not result in the identity, the matrix is singular. + if (object.deepEqual(matrix, math.eye(rows).valueOf())) { + return math.round(d, 6); + } else { + return 0; + } + } + } + }; + + +/***/ }, +/* 65 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + Matrix = require(10), + collection = require(13), + + object = util.object, + isArray = util.array.isArray, + isNumber = util.number.isNumber, + isInteger = util.number.isInteger; + + /** + * Create a diagonal matrix or retrieve the diagonal of a matrix + * + * diag(v) + * diag(v, k) + * diag(X) + * diag(X, k) + * + * TODO: more documentation on diag + * + * @param {Matrix | Array} x + * @param {Number} [k] + * @return {Matrix | Array} matrix + */ + math.diag = function diag (x, k) { + var data, vector, i, iMax; + + if (arguments.length != 1 && arguments.length != 2) { + throw new math.error.ArgumentsError('diag', arguments.length, 1, 2); + } + + if (k) { + if (!isNumber(k) || !isInteger(k)) { + throw new TypeError ('Second parameter in function diag must be an integer'); + } + } + else { + k = 0; + } + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; + + // check type of input + if (x instanceof Matrix) { + // nice, nothing to do + } + else if (isArray(x)) { + // convert to matrix + x = new Matrix(x); + } + else { + throw new TypeError ('First parameter in function diag must be a Matrix or Array'); + } + + var s = x.size(); + switch (s.length) { + case 1: + // x is a vector. create diagonal matrix + vector = x.valueOf(); + var matrix = new Matrix(); + var defaultValue = 0; + matrix.resize([vector.length + kSub, vector.length + kSuper], defaultValue); + data = matrix.valueOf(); + iMax = vector.length; + for (i = 0; i < iMax; i++) { + data[i + kSub][i + kSuper] = object.clone(vector[i]); + } + return (settings.matrix === 'array') ? matrix.valueOf() : matrix; + break; + + case 2: + // x is a matrix get diagonal from matrix + vector = []; + data = x.valueOf(); + iMax = Math.min(s[0] - kSub, s[1] - kSuper); + for (i = 0; i < iMax; i++) { + vector[i] = object.clone(data[i + kSub][i + kSuper]); + } + return (settings.matrix === 'array') ? vector : new Matrix(vector); + break; + + default: + throw new RangeError('Matrix for function diag must be 2 dimensional'); + } + }; + }; + + +/***/ }, +/* 66 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Matrix = require(10), + collection = require(13), + + toNumber = util.number.toNumber, + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + isArray = Array.isArray; + + /** + * Create a 2-dimensional identity matrix with size m x n or n x n + * + * eye(n) + * eye(m, n) + * eye([m, n]) + * + * TODO: more documentation on eye + * + * @param {...Number | Matrix | Array} size + * @return {Matrix | Array | Number} matrix + */ + math.eye = function eye (size) { + var args = collection.argsToArray(arguments), + asMatrix = (size instanceof Matrix) ? true : + (isArray(size) ? false : (settings.matrix === 'matrix')); + + + if (args.length == 0) { + // return an empty array + return asMatrix ? new Matrix() : []; + } + else if (args.length == 1) { + // change to a 2-dimensional square + args[1] = args[0]; + } + else if (args.length > 2) { + // error in case of an n-dimensional size + throw new math.error.ArgumentsError('eye', args.length, 0, 2); + } + + var asBigNumber = args[0] instanceof BigNumber, + rows = args[0], + cols = args[1]; + + if (rows instanceof BigNumber) { + rows = toNumber(rows); + } + if (cols instanceof BigNumber) { + cols = toNumber(cols); + } + + if (!isNumber(rows) || !isInteger(rows) || rows < 1) { + throw new Error('Parameters in function eye must be positive integers'); + } + if (cols) { + if (!isNumber(cols) || !isInteger(cols) || cols < 1) { + throw new Error('Parameters in function eye must be positive integers'); + } + } + + // create and args the matrix + var matrix = new Matrix(); + var one = asBigNumber ? new BigNumber(1) : 1; + var defaultValue = asBigNumber ? new BigNumber(0) : 0; + matrix.resize(args.map(toNumber), defaultValue); + + // fill in ones on the diagonal + var minimum = math.min(args); + var data = matrix.valueOf(); + for (var d = 0; d < minimum; d++) { + data[d][d] = one; + } + + return asMatrix ? matrix : matrix.valueOf(); + }; + }; + + +/***/ }, +/* 67 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var string = require(218), + + Matrix = require(10), + collection = require(13); + + /** + * Calculate the inverse of a matrix + * + * inv(x) + * + * TODO: more documentation on inv + * + * @param {Number | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} inv + */ + math.inv = function inv (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('inv', arguments.length, 1); + } + var size = math.size(x).valueOf(); + switch (size.length) { + case 0: + // scalar + return math.divide(1, x); + break; + + case 1: + // vector + if (size[0] == 1) { + if (x instanceof Matrix) { + return new Matrix([ + math.divide(1, x.valueOf()[0]) + ]); + } + else { + return [ + math.divide(1, x[0]) + ]; + } + } + else { + throw new RangeError('Matrix must be square ' + + '(size: ' + string.format(size) + ')'); + } + break; + + case 2: + // two dimensional array + var rows = size[0]; + var cols = size[1]; + if (rows == cols) { + if (x instanceof Matrix) { + return new Matrix( + _inv(x.valueOf(), rows, cols) + ); + } + else { + // return an Array + return _inv(x, rows, cols); + } + } + else { + throw new RangeError('Matrix must be square ' + + '(size: ' + string.format(size) + ')'); + } + break; + + default: + // multi dimensional array + throw new RangeError('Matrix must be two dimensional ' + + '(size: ' + string.format(size) + ')'); + } + }; + + /** + * Calculate the inverse of a square matrix + * @param {Array[]} matrix A square matrix + * @param {Number} rows Number of rows + * @param {Number} cols Number of columns, must equal rows + * @return {Array[]} inv Inverse matrix + * @private + */ + function _inv (matrix, rows, cols){ + var r, s, f, value, temp; + + if (rows == 1) { + // this is a 1 x 1 matrix + value = matrix[0][0]; + if (value == 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + return [[ + math.divide(1, value) + ]]; + } + else if (rows == 2) { + // this is a 2 x 2 matrix + var d = math.det(matrix); + if (d == 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + return [ + [ + math.divide(matrix[1][1], d), + math.divide(math.unary(matrix[0][1]), d) + ], + [ + math.divide(math.unary(matrix[1][0]), d), + math.divide(matrix[0][0], d) + ] + ]; + } + else { + // this is a matrix of 3 x 3 or larger + // calculate inverse using gauss-jordan elimination + // http://en.wikipedia.org/wiki/Gaussian_elimination + // http://mathworld.wolfram.com/MatrixInverse.html + // http://math.uww.edu/~mcfarlat/inverse.htm + + // make a copy of the matrix (only the arrays, not of the elements) + var A = matrix.concat(); + for (r = 0; r < rows; r++) { + A[r] = A[r].concat(); + } + + // create an identity matrix which in the end will contain the + // matrix inverse + var B = math.eye(rows).valueOf(); + + // loop over all columns, and perform row reductions + for (var c = 0; c < cols; c++) { + // element Acc should be non zero. if not, swap content + // with one of the lower rows + r = c; + while (r < rows && A[r][c] == 0) { + r++; + } + if (r == rows || A[r][c] == 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + if (r != c) { + temp = A[c]; A[c] = A[r]; A[r] = temp; + temp = B[c]; B[c] = B[r]; B[r] = temp; + } + + // eliminate non-zero values on the other rows at column c + var Ac = A[c], + Bc = B[c]; + for (r = 0; r < rows; r++) { + var Ar = A[r], + Br = B[r]; + if(r != c) { + // eliminate value at column c and row r + if (Ar[c] != 0) { + f = math.divide(math.unary(Ar[c]), Ac[c]); + + // add (f * row c) to row r to eliminate the value + // at column c + for (s = c; s < cols; s++) { + Ar[s] = math.add(Ar[s], math.multiply(f, Ac[s])); + } + for (s = 0; s < cols; s++) { + Br[s] = math.add(Br[s], math.multiply(f, Bc[s])); + } + } + } + else { + // normalize value at Acc to 1, + // divide each value on row r with the value at Acc + f = Ac[c]; + for (s = c; s < cols; s++) { + Ar[s] = math.divide(Ar[s], f); + } + for (s = 0; s < cols; s++) { + Br[s] = math.divide(Br[s], f); + } + } + } + } + return B; + } + } + }; + + +/***/ }, +/* 68 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Matrix = require(10), + collection = require(13), + + array = util.array, + + toNumber = util.number.toNumber, + isArray = Array.isArray; + + /** + * Create a matrix filled with ones + * + * ones(m) + * ones(m, n) + * ones([m, n]) + * ones([m, n, p, ...]) + * + * @param {...Number | Array} size + * @return {Array | Matrix | Number} matrix + */ + math.ones = function ones (size) { + var args = collection.argsToArray(arguments); + var asMatrix = (size instanceof Matrix) ? true : + (isArray(size) ? false : (settings.matrix === 'matrix')); + + if (args.length == 0) { + // output an empty matrix + return asMatrix ? new Matrix() : []; + } + else { + // output an array or matrix + var res = []; + var defaultValue = (args[0] instanceof BigNumber) ? new BigNumber(1) : 1; + res = array.resize(res, args.map(toNumber), defaultValue); + + return asMatrix ? new Matrix(res) : res; + } + }; + }; + + +/***/ }, +/* 69 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Matrix = require(10), + collection = require(13), + + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isNumber = util.number.isNumber, + toNumber = util.number.toNumber, + toBigNumber = util.number.toBigNumber; + + /** + * Create an array from a range. + * By default, the range end is excluded. This can be customized by providing + * an extra parameter `includeEnd`. + * + * The method accepts the following arguments + * range(str [, includeEnd]) Create a range from a string, + * where the string contains the + * start, optional step, and end, + * separated by a colon. + * range(start, end [, includeEnd]) Create a range with start and + * end and a step size of 1. + * range(start, end, step [, includeEnd]) Create a range with start, step, + * and end. + * + * Where: + * {String} str + * {Number | BigNumber} start Start of the range + * {Number | BigNumber} end End of the range, excluded by default, + * included when parameter includeEnd=true + * {Number | BigNumber} step=1 Step size. + * {boolean} includeEnd=false Option to specify whether to include + * the end or not. + * + * Example usage: + * math.range(2, 6); // [2,3,4,5] + * math.range(2, -3, -1); // [2,1,0,-1,-2] + * math.range('2:1:6'); // [2,3,4,5] + * math.range(2, 6, true); // [2,3,4,5,6] + * + * @param {...*} args + * @return {Array | Matrix} range + */ + math.range = function range(args) { + var params = Array.prototype.slice.call(arguments), + start, + end, + step, + includeEnd = false; + + // read the includeEnd parameter + if (isBoolean(params[params.length - 1])) { + includeEnd = params.pop() ? true : false; + } + + switch (params.length) { + case 1: + // range(str) + // parse string into a range + if (isString(params[0])) { + var r = _parse(params[0]); + if (!r){ + throw new SyntaxError('String "' + r + '" is no valid range'); + } + + start = r.start; + end = r.end; + step = r.step; + } + else { + throw new TypeError( + 'Two or three numbers or a single string expected in function range'); + } + break; + + case 2: + // range(str, end) + // range(start, end) + start = params[0]; + end = params[1]; + step = 1; + break; + + case 3: + // range(start, end, step) + start = params[0]; + end = params[1]; + step = params[2]; + break; + + default: + throw new math.error.ArgumentsError('range', arguments.length, 2, 4); + } + + // verify type of parameters + if (!isNumber(start) && !(start instanceof BigNumber)) { + throw new TypeError('Parameter start must be a number'); + } + if (!isNumber(end) && !(end instanceof BigNumber)) { + throw new TypeError('Parameter end must be a number'); + } + if (!isNumber(step) && !(step instanceof BigNumber)) { + throw new TypeError('Parameter step must be a number'); + } + if (!isBoolean(includeEnd)) { + throw new TypeError('Parameter includeEnd must be a boolean'); + } + + // go big + if (start instanceof BigNumber || end instanceof BigNumber || step instanceof BigNumber) { + // create a range with big numbers + var asBigNumber = true; + + // convert start, end, step to BigNumber + if (!(start instanceof BigNumber)) { + start = toBigNumber(start); + } + if (!(end instanceof BigNumber)) { + end = toBigNumber(end); + } + if (!(step instanceof BigNumber)) { + step = toBigNumber(step); + } + + if (!(start instanceof BigNumber) || !(end instanceof BigNumber) || !(step instanceof BigNumber)) { + // not all values can be converted to big number :( + // fall back to numbers + asBigNumber = false; + start = toNumber(start); + end = toNumber(end); + step = toNumber(step); + } + } + + // generate the range + var fn = asBigNumber ? + (includeEnd ? _bigRangeInc : _bigRange) : + (includeEnd ? _rangeInc : _range); + var array = fn(start, end, step); + + // return as array or matrix + return (settings.matrix === 'array') ? array : new Matrix(array); + }; + + /** + * Create a range with numbers. End is excluded + * @param {Number} start + * @param {Number} end + * @param {Number} step + * @returns {Array} range + * @private + */ + function _range (start, end, step) { + var array = [], + x = start; + if (step > 0) { + while (x < end) { + array.push(x); + x += step; + } + } + else if (step < 0) { + while (x > end) { + array.push(x); + x += step; + } + } + + return array; + } + + /** + * Create a range with numbers. End is included + * @param {Number} start + * @param {Number} end + * @param {Number} step + * @returns {Array} range + * @private + */ + function _rangeInc (start, end, step) { + var array = [], + x = start; + if (step > 0) { + while (x <= end) { + array.push(x); + x += step; + } + } + else if (step < 0) { + while (x >= end) { + array.push(x); + x += step; + } + } + + return array; + } + + /** + * Create a range with big numbers. End is excluded + * @param {BigNumber} start + * @param {BigNumber} end + * @param {BigNumber} step + * @returns {Array} range + * @private + */ + function _bigRange (start, end, step) { + var array = [], + x = start.clone(), + zero = new BigNumber(0); + if (step.gt(zero)) { + while (x.lt(end)) { + array.push(x); + x = x.plus(step); + } + } + else if (step.lt(zero)) { + while (x.gt(end)) { + array.push(x); + x = x.plus(step); + } + } + + return array; + } + + /** + * Create a range with big numbers. End is included + * @param {BigNumber} start + * @param {BigNumber} end + * @param {BigNumber} step + * @returns {Array} range + * @private + */ + function _bigRangeInc (start, end, step) { + var array = [], + x = start.clone(), + zero = new BigNumber(0); + if (step.gt(zero)) { + while (x.lte(end)) { + array.push(x); + x = x.plus(step); + } + } + else if (step.lt(zero)) { + while (x.gte(end)) { + array.push(x); + x = x.plus(step); + } + } + + return array; + } + + /** + * Parse a string into a range, + * The string contains the start, optional step, and end, separated by a colon. + * If the string does not contain a valid range, null is returned. + * For example str='0:2:11'. + * @param {String} str + * @return {Object | null} range Object containing properties start, end, step + * @private + */ + function _parse (str) { + var args = str.split(':'), + nums = null; + + if (settings.number === 'bignumber') { + // bignumber + try { + nums = args.map(function (arg) { + return new BigNumber(arg); + }); + } + catch (err) { + return null; + } + } + else { + // number + nums = args.map(function (arg) { + return parseFloat(arg); + }); + + var invalid = nums.some(function (num) { + return isNaN(num); + }); + if(invalid) { + return null; + } + } + + switch (nums.length) { + case 2: + return { + start: nums[0], + end: nums[1], + step: 1 + }; + + case 3: + return { + start: nums[0], + end: nums[2], + step: nums[1] + }; + + default: + return null; + } + } + + }; + + +/***/ }, +/* 70 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Matrix = require(10), + + array = util.array, + clone = util.object.clone, + isString = util.string.isString, + toNumber = util.number.toNumber, + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + isArray = array.isArray; + + /** + * Resize a matrix + * + * resize(x, size) + * resize(x, size, defaultValue) + * + * @param {* | Array | Matrix} x + * @param {Array | Matrix} size One dimensional array with numbers + * @param {Number | String} [defaultValue] Undefined by default, except in + * case of a string, in that case + * defaultValue = ' ' + * @return {* | Array | Matrix} res + */ + math.resize = function resize (x, size, defaultValue) { + if (arguments.length != 2 && arguments.length != 3) { + throw new math.error.ArgumentsError('resize', arguments.length, 2, 3); + } + + var asMatrix = (x instanceof Matrix) ? true : isArray(x) ? false : (settings.matrix !== 'array'); + + if (x instanceof Matrix) { + x = x.valueOf(); // get Array + } + if (size instanceof Matrix) { + size = size.valueOf(); // get Array + } + + if (size.length && size[0] instanceof BigNumber) { + // convert bignumbers to numbers + size = size.map(toNumber); + } + + if (isString(x)) { + return _resizeString(x, size, defaultValue); + } + else { + if (size.length == 0) { + // output a scalar + while (isArray(x)) { + x = x[0]; + } + + return clone(x); + } + else { + // output an array/matrix + if (!isArray(x)) { + x = [x]; + } + x = clone(x); + + var res = array.resize(x, size, defaultValue); + return asMatrix ? new Matrix(res) : res; + } + } + }; + + /** + * Resize a string + * @param {String} str + * @param {Number[]} size + * @param {string} defaultChar + * @private + */ + function _resizeString(str, size, defaultChar) { + if (defaultChar !== undefined) { + if (!isString(defaultChar) || defaultChar.length !== 1) { + throw new TypeError('Single character expected as defaultValue'); + } + } + else { + defaultChar = ' '; + } + + if (size.length !== 1) { + throw new Error('Dimension mismatch: (' + size.length + ' != 1)'); + } + var len = size[0]; + if (!isNumber(len) || !isInteger(len)) { + throw new TypeError('Size must contain numbers'); + } + + if (str.length > len) { + return str.substring(0, len); + } + else if (str.length < len) { + var res = str; + for (var i = 0, ii = len - str.length; i < ii; i++) { + res += defaultChar; + } + return res; + } + else { + return str; + } + } + }; + + +/***/ }, +/* 71 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + Matrix = require(10), + + array = util.array, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit; + + /** + * Calculate the size of a matrix or scalar + * + * size(x) + * + * @param {Boolean | Number | Complex | Unit | String | Array | Matrix} x + * @return {Array | Matrix} res + */ + math.size = function size (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('size', arguments.length, 1); + } + + var asArray = (settings.matrix === 'array'); + + if (isNumber(x) || isComplex(x) || isUnit(x) || isBoolean(x) || + x == null || x instanceof BigNumber) { + return asArray ? [] : new Matrix([]); + } + + if (isString(x)) { + return asArray ? [x.length] : new Matrix([x.length]); + } + + if (Array.isArray(x)) { + return array.size(x); + } + + if (x instanceof Matrix) { + return new Matrix(x.size()); + } + + throw new math.error.UnsupportedTypeError('size', x); + }; + }; + + +/***/ }, +/* 72 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Matrix = require(10), + + object = util.object, + array = util.array, + isArray = Array.isArray; + + /** + * Remove singleton dimensions from a matrix + * + * squeeze(x) + * + * @param {Matrix | Array} x + * @return {Matrix | Array} res + */ + math.squeeze = function squeeze (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('squeeze', arguments.length, 1); + } + + if (isArray(x)) { + return array.squeeze(object.clone(x)); + } + else if (x instanceof Matrix) { + var res = array.squeeze(x.toArray()); + return isArray(res) ? new Matrix(res) : res; + } + else { + // scalar + return object.clone(x); + } + }; + }; + + +/***/ }, +/* 73 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Matrix = require(10), + Index = require(9), + + array = util.array, + isString = util.string.isString, + isArray = Array.isArray; + + /** + * Get or set a subset of a matrix or string + * + * Usage: + * // retrieve subset: + * var subset = math.subset(value, index) + * + * // replace subset: + * var value = math.subset(value, index, replacement [, defaultValue]) + * + * Where: + * {Array | Matrix | String} value An array, matrix, or string + * {Index} index An index containing ranges for each + * dimension + * {*} replacement An array, matrix, or scalar + * {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @param args + * @return res + */ + math.subset = function subset (args) { + switch (arguments.length) { + case 2: // get subset + return _getSubset(arguments[0], arguments[1]); + + // intentional fall through + case 3: // set subset + case 4: // set subset with default value + return _setSubset(arguments[0], arguments[1], arguments[2], arguments[3]); + + default: // wrong number of arguments + throw new math.error.ArgumentsError('subset', arguments.length, 2, 4); + } + }; + + /** + * Retrieve a subset of an value such as an Array, Matrix, or String + * @param {Array | Matrix | String} value Object from which to get a subset + * @param {Index} index An index containing ranges for each + * dimension + * @returns {Array | Matrix | *} subset + * @private + */ + function _getSubset(value, index) { + var m, subset; + + if (isArray(value)) { + m = new Matrix(value); + subset = m.subset(index); + return subset.valueOf(); + } + else if (value instanceof Matrix) { + return value.subset(index); + } + else if (isString(value)) { + return _getSubstring(value, index); + } + else { + throw new math.error.UnsupportedTypeError('subset', value); + } + } + + /** + * Retrieve a subset of a string + * @param {String} str String from which to get a substring + * @param {Index} index An index containing ranges for each dimension + * @returns {string} substring + * @private + */ + function _getSubstring(str, index) { + if (!(index instanceof Index)) { + // TODO: better error message + throw new TypeError('Index expected'); + } + if (index.size().length != 1) { + throw new RangeError('Dimension mismatch (' + index.size().length + ' != 1)'); + } + + var range = index.range(0); + + var substr = ''; + var strLen = str.length; + range.forEach(function (v) { + array.validateIndex(v, strLen); + substr += str.charAt(v); + }); + + return substr; + } + + /** + * Replace a subset in an value such as an Array, Matrix, or String + * @param {Array | Matrix | String} value Object to be replaced + * @param {Index} index An index containing ranges for each + * dimension + * @param {Array | Matrix | *} replacement + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @returns {*} result + * @private + */ + function _setSubset(value, index, replacement, defaultValue) { + var m; + + if (isArray(value)) { + m = new Matrix(math.clone(value)); + m.subset(index, replacement, defaultValue); + return m.valueOf(); + } + else if (value instanceof Matrix) { + return value.clone().subset(index, replacement, defaultValue); + } + else if (isString(value)) { + return _setSubstring(value, index, replacement, defaultValue); + } + else { + throw new math.error.UnsupportedTypeError('subset', value); + } + } + + /** + * Replace a substring in a string + * @param {String} str String to be replaced + * @param {Index} index An index containing ranges for each dimension + * @param {String} replacement Replacement string + * @param {String} [defaultValue] Default value to be uses when resizing + * the string. is ' ' by default + * @returns {string} result + * @private + */ + function _setSubstring(str, index, replacement, defaultValue) { + if (!(index instanceof Index)) { + // TODO: better error message + throw new TypeError('Index expected'); + } + if (index.size().length != 1) { + throw new RangeError('Dimension mismatch (' + index.size().length + ' != 1)'); + } + if (defaultValue !== undefined) { + if (!isString(defaultValue) || defaultValue.length !== 1) { + throw new TypeError('Single character expected as defaultValue'); + } + } + else { + defaultValue = ' '; + } + + var range = index.range(0); + var len = range.size()[0]; + + if (len != replacement.length) { + throw new RangeError('Dimension mismatch ' + + '(' + range.size()[0] + ' != ' + replacement.length + ')'); + } + + // copy the string into an array with characters + var strLen = str.length; + var chars = []; + for (var i = 0; i < strLen; i++) { + chars[i] = str.charAt(i); + } + + range.forEach(function (v, i) { + array.validateIndex(v); + chars[v] = replacement.charAt(i); + }); + + // initialize undefined characters with a space + if (chars.length > strLen) { + for (i = strLen - 1, len = chars.length; i < len; i++) { + if (!chars[i]) { + chars[i] = defaultValue; + } + } + } + + return chars.join(''); + } + }; + + +/***/ }, +/* 74 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Matrix = require(10), + collection = require(13), + + object = util.object, + string = util.string; + + /** + * Create the transpose of a matrix + * + * transpose(x) + * + * @param {Array | Matrix} x + * @return {Array | Matrix} transpose + */ + math.transpose = function transpose (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('transpose', arguments.length, 1); + } + + var size = math.size(x).valueOf(); + switch (size.length) { + case 0: + // scalar + return object.clone(x); + break; + + case 1: + // vector + return object.clone(x); + break; + + case 2: + // two dimensional array + var rows = size[1], + cols = size[0], + asMatrix = (x instanceof Matrix), + data = x.valueOf(), + transposed = [], + transposedRow, + clone = object.clone; + + if (rows === 0) { + // whoops + throw new RangeError('Cannot transpose a 2D matrix with no rows' + + '(size: ' + string.format(size) + ')'); + } + + for (var r = 0; r < rows; r++) { + transposedRow = transposed[r] = []; + for (var c = 0; c < cols; c++) { + transposedRow[c] = clone(data[c][r]); + } + } + if (cols == 0) { + transposed[0] = []; + } + + return asMatrix ? new Matrix(transposed) : transposed; + break; + + default: + // multi dimensional array + throw new RangeError('Matrix must be two dimensional ' + + '(size: ' + string.format(size) + ')'); + } + }; + }; + + +/***/ }, +/* 75 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var util = require(117), + + BigNumber = require(220), + Matrix = require(10), + collection = require(13), + + array = util.array, + toNumber = util.number.toNumber, + isArray = Array.isArray; + + /** + * create a matrix filled with zeros + * + * zeros(m) + * zeros(m, n) + * zeros([m, n]) + * zeros([m, n, p, ...]) + * + * @param {...Number | Array} size + * @return {Array | Matrix | Number} matrix + */ + math.zeros = function zeros (size) { + var args = collection.argsToArray(arguments); + var asMatrix = (size instanceof Matrix) ? true : + (isArray(size) ? false : (settings.matrix === 'matrix')); + + if (args.length == 0) { + // output an empty matrix + return asMatrix ? new Matrix() : []; + } + else { + // output an array or matrix + var res = []; + var defaultValue = (args[0] instanceof BigNumber) ? new BigNumber(0) : 0; + res = array.resize(res, args.map(toNumber), defaultValue); + + return asMatrix ? new Matrix(res) : res; + } + }; + }; + + +/***/ }, +/* 76 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isInteger = util.number.isInteger, + isCollection = collection.isCollection; + + /** + * Compute the factorial of a value + * + * n! + * factorial(n) + * + * Factorial only supports an integer value as argument. + * For matrices, the function is evaluated element wise. + * + * @Param {Number | BigNumber | Array | Matrix} n + * @return {Number | BigNumber | Array | Matrix} res + */ + math.factorial = function factorial (n) { + var value, res; + + if (arguments.length != 1) { + throw new math.error.ArgumentsError('factorial', arguments.length, 1); + } + + if (isNumber(n)) { + if (!isInteger(n) || n < 0) { + throw new TypeError('Positive integer value expected in function factorial'); + } + + value = n - 1; + res = n; + while (value > 1) { + res *= value; + value--; + } + + if (res == 0) { + res = 1; // 0! is per definition 1 + } + + return res; + } + + if (n instanceof BigNumber) { + if (!(isPositiveInteger(n))) { + throw new TypeError('Positive integer value expected in function factorial'); + } + + var one = new BigNumber(1); + + value = n.minus(one); + res = n; + while (value.gt(one)) { + res = res.times(value); + value = value.minus(one); + } + + if (res.equals(0)) { + res = one; // 0! is per definition 1 + } + + return res; + } + + if (isBoolean(n)) { + return 1; // factorial(1) = 1, factorial(0) = 1 + } + + if (isCollection(n)) { + return collection.deepMap(n, factorial); + } + + throw new math.error.UnsupportedTypeError('factorial', n); + }; + + /** + * Test whether BigNumber n is a positive integer + * @param {BigNumber} n + * @returns {boolean} isPositiveInteger + */ + var isPositiveInteger = function(n) { + return n.round().equals(n) && n.gte(0); + }; + }; + + +/***/ }, +/* 77 */ +/***/ function(module, exports, require) { + + module.exports = function (math, settings) { + var Matrix = require(10), + collection = require(13); + + // TODO: implement BigNumber support for random + + /** + * Return a random number between 0 and 1 + * + * random() + * + * @return {Number} res + */ + + // Each distribution is a function that takes no argument and when called returns + // a number between 0 and 1. + var distributions = { + + uniform: function() { + return Math.random; + }, + + // Implementation of normal distribution using Box-Muller transform + // ref : http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform + // We take : mean = 0.5, standard deviation = 1/6 + // so that 99.7% values are in [0, 1]. + normal: function() { + return function() { + var u1, u2, + picked = -1; + // We reject values outside of the interval [0, 1] + // TODO: check if it is ok to do that? + while (picked < 0 || picked > 1) { + u1 = Math.random(); + u2 = Math.random(); + picked = 1/6 * Math.pow(-2 * Math.log(u1), 0.5) * Math.cos(2 * Math.PI * u2) + 0.5; + } + return picked; + } + } + }; + + /** + * Create a distribution object. + * @param {String} name Name of a distribution. + * Choose from 'uniform', 'normal'. + * @return {Object} distribution A distribution object containing functions: + * random([size, min, max]) + * randomInt([min, max]) + * pickRandom(array) + */ + math.distribution = function(name) { + if (!distributions.hasOwnProperty(name)) + throw new Error('unknown distribution ' + name); + + var args = Array.prototype.slice.call(arguments, 1), + distribution = distributions[name].apply(this, args); + + return (function(distribution) { + + // This is the public API for all distributions + var randFunctions = { + + random: function(arg1, arg2, arg3) { + var size, min, max; + if (arguments.length > 3) { + throw new math.error.ArgumentsError('random', arguments.length, 0, 3); + + // `random(max)` or `random(size)` + } else if (arguments.length === 1) { + if (Array.isArray(arg1)) + size = arg1; + else + max = arg1; + // `random(min, max)` or `random(size, max)` + } else if (arguments.length === 2) { + if (Array.isArray(arg1)) + size = arg1; + else { + min = arg1; + max = arg2; + } + // `random(size, min, max)` + } else { + size = arg1; + min = arg2; + max = arg3; + } + + if (max === undefined) max = 1; + if (min === undefined) min = 0; + if (size !== undefined) { + var res = _randomDataForMatrix(size, min, max, _random); + return (settings.matrix === 'array') ? res : new Matrix(res); + } + else return _random(min, max); + }, + + randomInt: function(arg1, arg2, arg3) { + var size, min, max; + if (arguments.length > 3 || arguments.length < 1) + throw new math.error.ArgumentsError('randomInt', arguments.length, 1, 3); + + // `randomInt(max)` + else if (arguments.length === 1) max = arg1; + // `randomInt(min, max)` or `randomInt(size, max)` + else if (arguments.length === 2) { + if (Object.prototype.toString.call(arg1) === '[object Array]') + size = arg1; + else { + min = arg1; + max = arg2; + } + // `randomInt(size, min, max)` + } else { + size = arg1; + min = arg2; + max = arg3; + } + + if (min === undefined) min = 0; + if (size !== undefined) { + var res = _randomDataForMatrix(size, min, max, _randomInt); + return (settings.matrix === 'array') ? res : new Matrix(res); + } + else return _randomInt(min, max); + }, + + pickRandom: function(possibles) { + if (arguments.length !== 1) { + throw new math.error.ArgumentsError('pickRandom', arguments.length, 1); + } + if (!Array.isArray(possibles)) { + throw new math.error.UnsupportedTypeError('pickRandom', possibles); + } + + // TODO: add support for matrices + return possibles[Math.floor(Math.random() * possibles.length)]; + } + + }; + + var _random = function(min, max) { + return min + distribution() * (max - min); + }; + + var _randomInt = function(min, max) { + return Math.floor(min + distribution() * (max - min)); + }; + + // This is a function for generating a random matrix recursively. + var _randomDataForMatrix = function(size, min, max, randFunc) { + var data = [], length, i; + size = size.slice(0); + + if (size.length > 1) { + for (i = 0, length = size.shift(); i < length; i++) + data.push(_randomDataForMatrix(size, min, max, randFunc)); + } else { + for (i = 0, length = size.shift(); i < length; i++) + data.push(randFunc(min, max)); + } + + return data; + }; + + return randFunctions; + + })(distribution); + + }; + + // Default random functions use uniform distribution + // TODO: put random functions in separate files? + var uniformRandFunctions = math.distribution('uniform'); + math.random = uniformRandFunctions.random; + math.randomInt = uniformRandFunctions.randomInt; + math.pickRandom = uniformRandFunctions.pickRandom; + }; + + +/***/ }, +/* 78 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + toBigNumber = util.number.toBigNumber; + + /** + * Compute the number of permutations of n items taken k at a time + * + * permutations(n) + * permutations(n, k) + * + * permutations only takes integer arguments + * the following condition must be enforced: k <= n + * + * @Param {Number | BigNumber} n + * @Param {Number | BigNumber} k + * @return {Number | BigNumber} permutations + */ + math.permutations = function permutations (n, k) { + var result, i; + + var arity = arguments.length; + if (arity > 2) { + throw new math.error.ArgumentsError('permutations', arguments.length, 2); + } + + if (isNumber(n)) { + if (!isInteger(n) || n < 0) { + throw new TypeError('Positive integer value expected in function permutations'); + } + + // Permute n objects + if (arity == 1) { + return math.factorial(n); + } + + // Permute n objects, k at a time + if (arity == 2) { + if (isNumber(k)) { + if (!isInteger(k) || k < 0) { + throw new TypeError('Positive integer value expected in function permutations'); + } + if (k > n) { + throw new TypeError('second argument k must be less than or equal to first argument n'); + } + + result = 1; + for (i = n - k + 1; i <= n; i++) { + result = result * i; + } + return result; + } + } + } + + if (n instanceof BigNumber) { + if (k === undefined && isPositiveInteger(n)) { + return math.factorial(n); + } + + // make sure k is a BigNumber as well + // not all numbers can be converted to BigNumber + k = toBigNumber(k); + + if (!(k instanceof BigNumber) || !isPositiveInteger(n) || !isPositiveInteger(k)) { + throw new TypeError('Positive integer value expected in function permutations'); + } + if (k.gt(n)) { + throw new TypeError('second argument k must be less than or equal to first argument n'); + } + + result = new BigNumber(1); + for (i = n.minus(k).plus(1); i.lte(n); i = i.plus(1)) { + result = result.times(i); + } + return result; + } + + throw new math.error.UnsupportedTypeError('permutations', n); + }; + + /** + * Test whether BigNumber n is a positive integer + * @param {BigNumber} n + * @returns {boolean} isPositiveInteger + */ + var isPositiveInteger = function(n) { + return n.round().equals(n) && n.gte(0); + }; + }; + + +/***/ }, +/* 79 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + collection = require(13), + + isNumber = util.number.isNumber, + isInteger = util.number.isInteger, + toBigNumber = util.number.toBigNumber; + + /** + * Compute the number of combinations of n items taken k at a time + * + * combinations(n, k) + * + * combinations only takes integer arguments + * the following condition must be enforced: k <= n + * + * @Param {Number | BigNumber} n + * @Param {Number | BigNumber} k + * @return {Number | BigNumber} combinations + */ + math.combinations = function combinations (n, k) { + var max, result, i,ii; + + var arity = arguments.length; + if (arity != 2) { + throw new math.error.ArgumentsError('combinations', arguments.length, 2); + } + + if (isNumber(n)) { + if (!isInteger(n) || n < 0) { + throw new TypeError('Positive integer value enpected in function combinations'); + } + if (k > n) { + throw new TypeError('k must be less than or equal to n'); + } + + max = Math.max(k, n - k); + result = 1; + for (i = 1; i <= n - max; i++) { + result = result * (max + i) / i; + } + return result; + } + + if (n instanceof BigNumber) { + // make sure k is a BigNumber as well + // not all numbers can be converted to BigNumber + k = toBigNumber(k); + + if (!(k instanceof BigNumber) || !isPositiveInteger(n) || !isPositiveInteger(k)) { + throw new TypeError('Positive integer value expected in function combinations'); + } + if (k.gt(n)) { + throw new TypeError('k must be less than n in function combinations'); + } + + max = n.minus(k); + if (k.lt(max)) max = k; + result = new BigNumber(1); + for (i = new BigNumber(1), ii = n.minus(max); i.lte(ii); i = i.plus(1)) { + result = result.times(max.plus(i)).dividedBy(i); + } + return result; + } + + throw new math.error.UnsupportedTypeError('combinations', n); + }; + + /** + * Test whether BigNumber n is a positive integer + * @param {BigNumber} n + * @returns {boolean} isPositiveInteger + */ + var isPositiveInteger = function(n) { + return n.round().equals(n) && n.gte(0); + }; + }; + + +/***/ }, +/* 80 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Matrix = require(10), + collection = require(13), + + isCollection = collection.isCollection; + + /** + * Compute the minimum value of a list of values. + * In case of a multi dimensional array, the minimum of the flattened array + * will be calculated. When dim is provided, the maximum over the selected + * dimension will be calculated. + * + * min(a, b, c, ...) + * min(A) + * min(A, dim) + * + * @param {... *} args A single matrix or multiple scalar values + * @return {*} res + */ + math.min = function min(args) { + if (arguments.length == 0) { + throw new SyntaxError('Function min requires one or more parameters (0 provided)'); + } + + if (isCollection(args)) { + if (arguments.length == 1) { + // min([a, b, c, d, ...]) + return _min(args); + } + else if (arguments.length == 2) { + // min([a, b, c, d, ...], dim) + return collection.reduce(arguments[0], arguments[1], _getsmaller); + } + else { + throw new SyntaxError('Wrong number of parameters'); + } + } + else { + // min(a, b, c, d, ...) + return _min(arguments); + } + }; + + function _getsmaller(x, y){ + if( math.smaller(x,y) ) + return x; + else + return y; + } + + /** + * Recursively calculate the minimum value in an n-dimensional array + * @param {Array} array + * @return {Number} min + * @private + */ + function _min(array) { + var min = null; + + collection.deepForEach(array, function (value) { + if (min === null || math.smaller(value, min)) { + min = value; + } + }); + + if (min === null) { + throw new Error('Cannot calculate min of an empty array'); + } + + return min; + } + }; + + +/***/ }, +/* 81 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Matrix = require(10), + collection = require(13), + + isCollection = collection.isCollection; + + /** + * Compute the maximum value of a list of values + * In case of a multi dimensional array, the maximum of the flattened array + * will be calculated. When dim is provided, the maximum over the selected + * dimension will be calculated. + * + * max(a, b, c, ...) + * max(A) + * max(A, dim) + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} res + */ + math.max = function max(args) { + if (arguments.length == 0) { + throw new SyntaxError('Function max requires one or more parameters (0 provided)'); + } + + if (isCollection(args)) { + if (arguments.length == 1) { + // max([a, b, c, d, ...]) + return _max(args); + } + else if (arguments.length == 2) { + // max([a, b, c, d, ...], dim) + return collection.reduce(arguments[0], arguments[1], _getlarger); + } + else { + throw new SyntaxError('Wrong number of parameters'); + } + } + else { + // max(a, b, c, d, ...) + return _max(arguments); + } + }; + + function _getlarger(x, y){ + if( math.larger(x,y) ) + return x; + else + return y; + } + + /** + * Recursively calculate the maximum value in an n-dimensional array + * @param {Array} array + * @return {Number} max + * @private + */ + function _max(array) { + var max = null; + + collection.deepForEach(array, function (value) { + if (max === null || math.larger(value, max)) { + max = value; + } + }); + + if (max === null) { + throw new Error('Cannot calculate max of an empty array'); + } + + return max; + } + }; + + +/***/ }, +/* 82 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Matrix = require(10), + collection = require(13), + + isCollection = collection.isCollection; + + /** + * Compute the mean value of a list of values + * In case of a multi dimensional array, the mean of the flattened array + * will be calculated. When dim is provided, the maximum over the selected + * dimension will be calculated. + * + * mean(a, b, c, ...) + * mean(A) + * mean(A, dim) + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} res + */ + math.mean = function mean(args) { + if (arguments.length == 0) { + throw new SyntaxError('Function mean requires one or more parameters (0 provided)'); + } + + if (isCollection(args)) { + if (arguments.length == 1) { + // mean([a, b, c, d, ...]) + return _mean(args); + } + else if (arguments.length == 2) { + // mean([a, b, c, d, ...], dim) + return _nmean(arguments[0], arguments[1]); + } + else { + throw new SyntaxError('Wrong number of parameters'); + } + } + else { + // mean(a, b, c, d, ...) + return _mean(arguments); + } + }; + + /** + * Calculate the mean value in an n-dimensional array, returning a + * n-1 dimensional array + * @param {Array} array + * @param {Number} dim + * @return {Number} mean + * @private + */ + function _nmean(array, dim){ + var sum; + sum = collection.reduce(array, dim, math.add); + return math.divide(sum, size(array)[dim]); + }; + + /** + * Recursively calculate the mean value in an n-dimensional array + * @param {Array} array + * @return {Number} mean + * @private + */ + function _mean(array) { + var sum = 0; + var num = 0; + + collection.deepForEach(array, function (value) { + sum = math.add(sum, value); + num++; + }); + + if (num === 0) { + throw new Error('Cannot calculate mean of an empty array'); + } + + return math.divide(sum, num); + } + }; + + +/***/ }, +/* 83 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the inverse cosine of a value + * + * acos(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/InverseCosine.html + */ + math.acos = function acos(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('acos', arguments.length, 1); + } + + if (isNumber(x)) { + if (x >= -1 && x <= 1) { + return Math.acos(x); + } + else { + return acos(new Complex(x, 0)); + } + } + + if (isComplex(x)) { + // acos(z) = 0.5*pi + i*log(iz + sqrt(1-z^2)) + var temp1 = new Complex( + x.im * x.im - x.re * x.re + 1.0, + -2.0 * x.re * x.im + ); + var temp2 = math.sqrt(temp1); + var temp3; + if (temp2 instanceof Complex) { + temp3 = new Complex( + temp2.re - x.im, + temp2.im + x.re + ) + } + else { + temp3 = new Complex( + temp2 - x.im, + x.re + ) + } + var temp4 = math.log(temp3); + + // 0.5*pi = 1.5707963267948966192313216916398 + if (temp4 instanceof Complex) { + return new Complex( + 1.57079632679489661923 - temp4.im, + temp4.re + ); + } + else { + return new Complex( + 1.57079632679489661923, + temp4 + ); + } + } + + if (isCollection(x)) { + return collection.deepMap(x, acos); + } + + if (isBoolean(x)) { + return Math.acos(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return acos(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('acos', x); + }; + }; + + +/***/ }, +/* 84 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the inverse sine of a value + * + * asin(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/InverseSine.html + */ + math.asin = function asin(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('asin', arguments.length, 1); + } + + if (isNumber(x)) { + if (x >= -1 && x <= 1) { + return Math.asin(x); + } + else { + return asin(new Complex(x, 0)); + } + } + + if (isComplex(x)) { + // asin(z) = -i*log(iz + sqrt(1-z^2)) + var re = x.re; + var im = x.im; + var temp1 = new Complex( + im * im - re * re + 1.0, + -2.0 * re * im + ); + + var temp2 = math.sqrt(temp1); + var temp3; + if (temp2 instanceof Complex) { + temp3 = new Complex( + temp2.re - im, + temp2.im + re + ); + } + else { + temp3 = new Complex( + temp2 - im, + re + ); + } + + var temp4 = math.log(temp3); + + if (temp4 instanceof Complex) { + return new Complex(temp4.im, -temp4.re); + } + else { + return new Complex(0, -temp4); + } + } + + if (isCollection(x)) { + return collection.deepMap(x, asin); + } + + if (isBoolean(x)) { + return Math.asin(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return asin(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('asin', x); + }; + }; + + +/***/ }, +/* 85 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Calculate the inverse tangent of a value + * + * atan(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/InverseTangent.html + */ + math.atan = function atan(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('atan', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.atan(x); + } + + if (isComplex(x)) { + // atan(z) = 1/2 * i * (ln(1-iz) - ln(1+iz)) + var re = x.re; + var im = x.im; + var den = re * re + (1.0 - im) * (1.0 - im); + + var temp1 = new Complex( + (1.0 - im * im - re * re) / den, + (-2.0 * re) / den + ); + var temp2 = math.log(temp1); + + if (temp2 instanceof Complex) { + return new Complex( + -0.5 * temp2.im, + 0.5 * temp2.re + ); + } + else { + return new Complex( + 0, + 0.5 * temp2 + ); + } + } + + if (isCollection(x)) { + return collection.deepMap(x, atan); + } + + if (isBoolean(x)) { + return Math.atan(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return atan(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('atan', x); + }; + }; + + +/***/ }, +/* 86 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + collection = require(13), + + toNumber = util.number.toNumber, + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isCollection = collection.isCollection; + + /** + * Computes the principal value of the arc tangent of y/x in radians + * + * atan2(y, x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Array | Matrix} y + * @param {Number | Boolean | Complex | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/InverseTangent.html + */ + math.atan2 = function atan2(y, x) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('atan2', arguments.length, 2); + } + + if (isNumber(y)) { + if (isNumber(x)) { + return Math.atan2(y, x); + } + /* TODO: support for complex computation of atan2 + else if (isComplex(x)) { + return Math.atan2(y.re, x.re); + } + */ + } + else if (isComplex(y)) { + if (isNumber(x)) { + return Math.atan2(y.re, x); + } + /* TODO: support for complex computation of atan2 + else if (isComplex(x)) { + return Math.atan2(y.re, x.re); + } + */ + } + + if (isCollection(y) || isCollection(x)) { + return collection.deepMap2(y, x, atan2); + } + + if (isBoolean(y)) { + return atan2(+y, x); + } + if (isBoolean(x)) { + return atan2(y, +x); + } + + // TODO: implement bignumber support + if (y instanceof BigNumber) { + return atan2(toNumber(y), x); + } + if (x instanceof BigNumber) { + return atan2(y, toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('atan2', y, x); + }; + }; + + +/***/ }, +/* 87 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the cosine of a value + * + * cos(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/Cosine.html + */ + math.cos = function cos(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('cos', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.cos(x); + } + + if (isComplex(x)) { + // cos(z) = (exp(iz) + exp(-iz)) / 2 + return new Complex( + 0.5 * Math.cos(x.re) * (Math.exp(-x.im) + Math.exp(x.im)), + 0.5 * Math.sin(x.re) * (Math.exp(-x.im) - Math.exp(x.im)) + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function cos is no angle'); + } + return Math.cos(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, cos); + } + + if (isBoolean(x)) { + return Math.cos(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return cos(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('cos', x); + }; + }; + + +/***/ }, +/* 88 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the cotangent of a value. cot(x) is defined as 1 / tan(x) + * + * cot(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.cot = function cot(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('cot', arguments.length, 1); + } + + if (isNumber(x)) { + return 1 / Math.tan(x); + } + + if (isComplex(x)) { + var den = Math.exp(-4.0 * x.im) - + 2.0 * Math.exp(-2.0 * x.im) * Math.cos(2.0 * x.re) + 1.0; + + return new Complex( + 2.0 * Math.exp(-2.0 * x.im) * Math.sin(2.0 * x.re) / den, + (Math.exp(-4.0 * x.im) - 1.0) / den + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function cot is no angle'); + } + return 1 / Math.tan(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, cot); + } + + if (isBoolean(x)) { + return cot(+x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return cot(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('cot', x); + }; + }; + + +/***/ }, +/* 89 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the cosecant of a value, csc(x) = 1/sin(x) + * + * csc(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.csc = function csc(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('csc', arguments.length, 1); + } + + if (isNumber(x)) { + return 1 / Math.sin(x); + } + + if (isComplex(x)) { + // csc(z) = 1/sin(z) = (2i) / (exp(iz) - exp(-iz)) + var den = 0.25 * (Math.exp(-2.0 * x.im) + Math.exp(2.0 * x.im)) - + 0.5 * Math.cos(2.0 * x.re); + + return new Complex ( + 0.5 * Math.sin(x.re) * (Math.exp(-x.im) + Math.exp(x.im)) / den, + 0.5 * Math.cos(x.re) * (Math.exp(-x.im) - Math.exp(x.im)) / den + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function csc is no angle'); + } + return 1 / Math.sin(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, csc); + } + + if (isBoolean(x)) { + return csc(+x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return csc(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('csc', x); + }; + }; + + +/***/ }, +/* 90 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the secant of a value, sec(x) = 1/cos(x) + * + * sec(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + */ + math.sec = function sec(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('sec', arguments.length, 1); + } + + if (isNumber(x)) { + return 1 / Math.cos(x); + } + + if (isComplex(x)) { + // sec(z) = 1/cos(z) = 2 / (exp(iz) + exp(-iz)) + var den = 0.25 * (Math.exp(-2.0 * x.im) + Math.exp(2.0 * x.im)) + + 0.5 * Math.cos(2.0 * x.re); + return new Complex( + 0.5 * Math.cos(x.re) * (Math.exp(-x.im) + Math.exp( x.im)) / den, + 0.5 * Math.sin(x.re) * (Math.exp( x.im) - Math.exp(-x.im)) / den + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function sec is no angle'); + } + return 1 / Math.cos(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, sec); + } + + if (isBoolean(x)) { + return sec(+x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return sec(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('sec', x); + }; + }; + + +/***/ }, +/* 91 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the sine of a value + * + * sin(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/Sine.html + */ + math.sin = function sin(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('sin', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.sin(x); + } + + if (isComplex(x)) { + return new Complex( + 0.5 * Math.sin(x.re) * (Math.exp(-x.im) + Math.exp( x.im)), + 0.5 * Math.cos(x.re) * (Math.exp( x.im) - Math.exp(-x.im)) + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function sin is no angle'); + } + return Math.sin(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, sin); + } + + if (isBoolean(x)) { + return Math.sin(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return sin(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('sin', x); + }; + }; + + +/***/ }, +/* 92 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + collection = require(13), + + isNumber = util.number.isNumber, + isBoolean = util['boolean'].isBoolean, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Calculate the tangent of a value + * + * tan(x) + * + * For matrices, the function is evaluated element wise. + * + * @param {Number | Boolean | Complex | Unit | Array | Matrix} x + * @return {Number | Complex | Array | Matrix} res + * + * @see http://mathworld.wolfram.com/Tangent.html + */ + math.tan = function tan(x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('tan', arguments.length, 1); + } + + if (isNumber(x)) { + return Math.tan(x); + } + + if (isComplex(x)) { + var den = Math.exp(-4.0 * x.im) + + 2.0 * Math.exp(-2.0 * x.im) * Math.cos(2.0 * x.re) + + 1.0; + + return new Complex( + 2.0 * Math.exp(-2.0 * x.im) * Math.sin(2.0 * x.re) / den, + (1.0 - Math.exp(-4.0 * x.im)) / den + ); + } + + if (isUnit(x)) { + if (!x.hasBase(Unit.BASE_UNITS.ANGLE)) { + throw new TypeError ('Unit in function tan is no angle'); + } + return Math.tan(x.value); + } + + if (isCollection(x)) { + return collection.deepMap(x, tan); + } + + if (isBoolean(x)) { + return Math.tan(x); + } + + if (x instanceof BigNumber) { + // TODO: implement BigNumber support + // downgrade to Number + return tan(util.number.toNumber(x)); + } + + throw new math.error.UnsupportedTypeError('tan', x); + }; + }; + + +/***/ }, +/* 93 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Unit = require(11), + collection = require(13), + + isString = util.string.isString, + isUnit = Unit.isUnit, + isCollection = collection.isCollection; + + /** + * Change the unit of a value. + * + * x to unit + * to(x, unit) + * + * For matrices, the function is evaluated element wise. + * + * @param {Unit | Array | Matrix} x + * @param {Unit | Array | Matrix} unit + * @return {Unit | Array | Matrix} res + */ + math.to = function to(x, unit) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('to', arguments.length, 2); + } + + if (isUnit(x)) { + if (isUnit(unit) || isString(unit)) { + return x.to(unit); + } + } + + // TODO: add support for string, in that case, convert to unit + + if (isCollection(x) || isCollection(unit)) { + return collection.deepMap2(x, unit, to); + } + + throw new math.error.UnsupportedTypeError('to', x, unit); + }; + }; + + +/***/ }, +/* 94 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var object = require(2); + + /** + * Clone an object + * + * clone(x) + * + * @param {*} x + * @return {*} clone + */ + math.clone = function clone (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('clone', arguments.length, 1); + } + + return object.clone(x); + }; + }; + + +/***/ }, +/* 95 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var string = require(218); + + /** + * Format a value of any type into a string. + * + * Syntax: + * + * format(value) + * format(value, options) + * format(value, precision) + * format(value, fn) + * + * Where: + * + * {*} value The value to be formatted + * {Object} options An object with formatting options. Available options: + * {String} notation + * Number notation. Choose from: + * 'fixed' Always use regular number notation. + * For example '123.40' and '14000000' + * 'exponential' Always use exponential notation. + * For example '1.234e+2' and '1.4e+7' + * 'auto' (default) Regular number notation for numbers + * having an absolute value between + * `lower` and `upper` bounds, and uses + * exponential notation elsewhere. + * Lower bound is included, upper bound + * is excluded. + * For example '123.4' and '1.4e7'. + * {Number} precision A number between 0 and 16 to round + * the digits of the number. + * In case of notations 'exponential' and + * 'auto', `precision` defines the total + * number of significant digits returned + * and is undefined by default. + * In case of notation 'fixed', + * `precision` defines the number of + * significant digits after the decimal + * point, and is 0 by default. + * {Object} exponential An object containing two parameters, + * {Number} lower and {Number} upper, + * used by notation 'auto' to determine + * when to return exponential notation. + * Default values are `lower=1e-3` and + * `upper=1e5`. + * Only applicable for notation `auto`. + * {Function} fn A custom formatting function. Can be used to override the + * built-in notations. Function `fn` is called with `value` as + * parameter and must return a string. Is useful for example to + * format all values inside a matrix in a particular way. + * + * Examples: + * + * format(6.4); // '6.4' + * format(1240000); // '1.24e6' + * format(1/3); // '0.3333333333333333' + * format(1/3, 3); // '0.333' + * format(21385, 2); // '21000' + * format(12.071, {notation: 'fixed'}); // '12' + * format(2.3, {notation: 'fixed', precision: 2}); // '2.30' + * format(52.8, {notation: 'exponential'}); // '5.28e+1' + * + * @param {*} value Value to be stringified + * @param {Object | Function | Number} [options] + * @return {String} str The formatted value + */ + math.format = function format (value, options) { + var num = arguments.length; + if (num !== 1 && num !== 2) { + throw new math.error.ArgumentsError('format', num, 1, 2); + } + + return string.format(value, options); + }; + }; + + +/***/ }, +/* 96 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var util = require(117), + + Complex = require(7), + Unit = require(11), + + isNumber = util.number.isNumber, + isString = util.string.isString, + isComplex = Complex.isComplex, + isUnit = Unit.isUnit; + + /** + * Import functions from an object or a file + * @param {function | String | Object} object + * @param {Object} [options] Available options: + * {Boolean} override + * If true, existing functions will be + * overwritten. False by default. + * {Boolean} wrap + * If true (default), the functions will + * be wrapped in a wrapper function which + * converts data types like Matrix to + * primitive data types like Array. + * The wrapper is needed when extending + * math.js with libraries which do not + * support the math.js data types. + */ + // TODO: return status information + math['import'] = function math_import(object, options) { + var name; + var opts = { + override: false, + wrap: true + }; + if (options && options instanceof Object) { + util.object.extend(opts, options); + } + + if (isString(object)) { + // a string with a filename + if (true) { + // load the file using require + var _module = require(219)(object); + math_import(_module); + } + else { + throw new Error('Cannot load file: require not available.'); + } + } + else if (isSupportedType(object)) { + // a single function + name = object.name; + if (name) { + if (opts.override || math[name] === undefined) { + _import(name, object, opts); + } + } + else { + throw new Error('Cannot import an unnamed function or object'); + } + } + else if (object instanceof Object) { + // a map with functions + for (name in object) { + if (object.hasOwnProperty(name)) { + var value = object[name]; + if (isSupportedType(value)) { + _import(name, value, opts); + } + else { + math_import(value); + } + } + } + } + }; + + /** + * Add a property to the math namespace and create a chain proxy for it. + * @param {String} name + * @param {*} value + * @param {Object} options See import for a description of the options + * @private + */ + function _import(name, value, options) { + if (options.override || math[name] === undefined) { + // add to math namespace + if (options.wrap && typeof value === 'function') { + // create a wrapper around the function + math[name] = function () { + var args = []; + for (var i = 0, len = arguments.length; i < len; i++) { + args[i] = arguments[i].valueOf(); + } + return value.apply(math, args); + }; + } + else { + // just create a link to the function or value + math[name] = value; + } + + // create a proxy for the Selector + math.chaining.Selector.createProxy(name, value); + } + } + + /** + * Check whether given object is a supported type + * @param object + * @return {Boolean} + * @private + */ + function isSupportedType(object) { + return (typeof object == 'function') || + isNumber(object) || isString(object) || + isComplex(object) || isUnit(object); + // TODO: add boolean? + } + }; + + +/***/ }, +/* 97 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var isMatrix = require(10).isMatrix; + + /** + * Create a new matrix or array with the results of the callback function executed on + * each entry of the matrix/array. + * @param {Matrix/array} x The container to iterate on. + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @return {Matrix/array} container + */ + math.map = function (x, callback) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('map', arguments.length, 2); + } + + if (Array.isArray(x)) { + return _mapArray(x, callback); + } else if (isMatrix(x)) { + return x.map(callback); + } else { + throw new math.error.UnsupportedTypeError('map', x); + } + }; + + function _mapArray (arrayIn, callback) { + var index = []; + var recurse = function (value, dim) { + if (Array.isArray(value)) { + return value.map(function (child, i) { + index[dim] = i; + return recurse(child, dim + 1); + }); + } + else { + return callback(value, index, arrayIn); + } + }; + + return recurse(arrayIn, 0); + }; + }; + + +/***/ }, +/* 98 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var string = require(218), + + isString = string.isString; + + /** + * Interpolate values into a string template. + * math.print(template, values) + * math.print(template, values, precision) + * + * Example usage: + * + * // the following outputs: 'The value of pi is 3.141592654' + * math.format('The value of pi is $pi', {pi: math.pi}, 10); + * + * // the following outputs: 'hello Mary! The date is 2013-03-23' + * math.format('Hello $user.name! The date is $date', { + * user: { + * name: 'Mary', + * }, + * date: new Date().toISOString().substring(0, 10) + * }); + * + * @param {String} template + * @param {Object} values + * @param {Number} [precision] Number of digits to format numbers. + * If not provided, the value will not be rounded. + * @return {String} str + */ + math.print = function print (template, values, precision) { + var num = arguments.length; + if (num != 2 && num != 3) { + throw new math.error.ArgumentsError('print', num, 2, 3); + } + + if (!isString(template)) { + throw new TypeError('String expected as first parameter in function format'); + } + if (!(values instanceof Object)) { + throw new TypeError('Object expected as second parameter in function format'); + } + + // format values into a string + return template.replace(/\$([\w\.]+)/g, function (original, key) { + var keys = key.split('.'); + var value = values[keys.shift()]; + while (keys.length && value !== undefined) { + var k = keys.shift(); + value = k ? value[k] : value + '.'; + } + + if (value !== undefined) { + if (!isString(value)) { + return math.format(value, precision); + } + else { + return value; + } + } + + return original; + } + ); + }; + }; + + +/***/ }, +/* 99 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var types = require(217), + + BigNumber = require(220), + Complex = require(7), + Matrix = require(10), + Unit = require(11), + Index = require(9), + Range = require(8), + Help = require(12); + + /** + * Determine the type of a variable + * + * typeof(x) + * + * @param {*} x + * @return {String} type Lower case type, for example 'number', 'string', + * 'array'. + */ + math['typeof'] = function _typeof (x) { + if (arguments.length != 1) { + throw new math.error.ArgumentsError('typeof', arguments.length, 1); + } + + // JavaScript types + var type = types.type(x); + + // math.js types + if (type === 'object') { + if (x instanceof Complex) return 'complex'; + if (x instanceof BigNumber) return 'bignumber'; + if (x instanceof Matrix) return 'matrix'; + if (x instanceof Unit) return 'unit'; + if (x instanceof Index) return 'index'; + if (x instanceof Range) return 'range'; + if (x instanceof Help) return 'matrix'; + + if (x instanceof math.chaining.Selector) return 'selector'; + } + + return type; + }; + }; + + +/***/ }, +/* 100 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var isMatrix = require(10).isMatrix; + + /** + * Execute a callback method on each entry of the matrix or the array. + * @param {Matrix/array} x The container to iterate on. + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix/array being traversed. + */ + math.forEach = function (x, callback) { + if (arguments.length != 2) { + throw new math.error.ArgumentsError('forEach', arguments.length, 2); + } + + if (Array.isArray(x)) { + return _forEachArray(x, callback); + } else if (isMatrix(x)) { + return x.forEach(callback); + } else { + throw new math.error.UnsupportedTypeError('forEach', x); + } + }; + + function _forEachArray (array, callback) { + var index = []; + var recurse = function (value, dim) { + if (Array.isArray(value)) { + value.forEach(function (child, i) { + index[dim] = i; // zero-based index + recurse(child, dim + 1); + }); + } + else { + callback(value, index, array); + } + }; + recurse(array, 0); + }; + + }; + +/***/ }, +/* 101 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var Complex = require(7); + + math.pi = Math.PI; + math.e = Math.E; + math.tau = Math.PI * 2; + math.i = new Complex(0, 1); + + math['Infinity'] = Infinity; + math['NaN'] = NaN; + math['true'] = true; + math['false'] = false; + + // uppercase constants (for compatibility with built-in Math) + math.E = Math.E; + math.LN2 = Math.LN2; + math.LN10 = Math.LN10; + math.LOG2E = Math.LOG2E; + math.LOG10E = Math.LOG10E; + math.PI = Math.PI; + math.SQRT1_2 = Math.SQRT1_2; + math.SQRT2 = Math.SQRT2; + }; + + +/***/ }, +/* 102 */ +/***/ function(module, exports, require) { + + module.exports = function (math) { + var string = require(218); + + /** + * @constructor Selector + * Wrap any value in a Selector, allowing to perform chained operations on + * the value. + * + * All methods available in the math.js library can be called upon the selector, + * and then will be evaluated with the value itself as first argument. + * The selector can be closed by executing selector.done(), which will return + * the final value. + * + * The Selector has a number of special functions: + * - done() Finalize the chained operation and return the + * selectors value. + * - valueOf() The same as done() + * - toString() Returns a string representation of the selectors value. + * + * @param {*} [value] + */ + function Selector (value) { + if (!(this instanceof Selector)) { + throw new SyntaxError( + 'Selector constructor must be called with the new operator'); + } + + if (value instanceof Selector) { + this.value = value.value; + } + else { + this.value = value; + } + } + + /** + * Close the selector. Returns the final value. + * Does the same as method valueOf() + * @returns {*} value + */ + Selector.prototype.done = function () { + return this.value; + }; + + /** + * Close the selector. Returns the final value. + * Does the same as method done() + * @returns {*} value + */ + Selector.prototype.valueOf = function () { + return this.value; + }; + + /** + * Get a string representation of the value in the selector + * @returns {String} + */ + Selector.prototype.toString = function () { + return string.format(this.value); + }; + + /** + * Create a proxy method for the selector + * @param {String} name + * @param {*} value The value or function to be proxied + */ + function createProxy(name, value) { + var slice = Array.prototype.slice; + if (typeof value === 'function') { + // a function + Selector.prototype[name] = function () { + var args = [this.value].concat(slice.call(arguments, 0)); + return new Selector(value.apply(this, args)); + } + } + else { + // a constant + Selector.prototype[name] = new Selector(value); + } + } + + Selector.createProxy = createProxy; + + /** + * initialise the Chain prototype with all functions and constants in math + */ + for (var prop in math) { + if (math.hasOwnProperty(prop) && prop) { + createProxy(prop, math[prop]); + } + } + + return Selector; + }; + + +/***/ }, +/* 103 */ +/***/ function(module, exports, require) { + + var Node = require(109), + object = require(2), + string = require(218), + collection = require(13), + Matrix = require(10); + + /** + * @constructor ArrayNode + * @extends {Node} + * Holds an 1-dimensional array with nodes + * @param {Array} nodes 1 dimensional array with nodes + */ + function ArrayNode(nodes) { + this.nodes = nodes || []; + } + + ArrayNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @private + */ + ArrayNode.prototype._compile = function (defs) { + var asMatrix = (defs.math.config().matrix !== 'array'); + + var nodes = this.nodes.map(function (node) { + return node._compile(defs); + }); + + return (asMatrix ? 'math.matrix([' : '[') + + nodes.join(',') + + (asMatrix ? '])' : ']'); + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + ArrayNode.prototype.find = function (filter) { + var results = []; + + // check itself + if (this.match(filter)) { + results.push(this); + } + + // search in all nodes + var nodes = this.nodes; + for (var r = 0, rows = nodes.length; r < rows; r++) { + var nodes_r = nodes[r]; + for (var c = 0, cols = nodes_r.length; c < cols; c++) { + results = results.concat(nodes_r[c].find(filter)); + } + } + + return results; + }; + + /** + * Get string representation + * @return {String} str + * @override + */ + ArrayNode.prototype.toString = function() { + return string.format(this.nodes); + }; + + module.exports = ArrayNode; + + +/***/ }, +/* 104 */ +/***/ function(module, exports, require) { + + var Node = require(109); + + /** + * @constructor AssignmentNode + * @extends {Node} + * Define a symbol, like "a = 3.2" + * + * @param {String} name Symbol name + * @param {Node} expr The expression defining the symbol + */ + function AssignmentNode(name, expr) { + this.name = name; + this.expr = expr; + } + + AssignmentNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @private + */ + AssignmentNode.prototype._compile = function (defs) { + return 'scope["' + this.name + '"] = ' + this.expr._compile(defs) + ''; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + AssignmentNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in expression + if (this.expr) { + nodes = nodes.concat(this.expr.find(filter)); + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} + */ + AssignmentNode.prototype.toString = function() { + return this.name + ' = ' + this.expr.toString(); + }; + + module.exports = AssignmentNode; + +/***/ }, +/* 105 */ +/***/ function(module, exports, require) { + + var Node = require(109); + + /** + * @constructor BlockNode + * @extends {Node} + * Holds a set with nodes + */ + function BlockNode() { + this.params = []; + } + + BlockNode.prototype = new Node(); + + /** + * Add a parameter + * @param {Node} node + * @param {Boolean} [visible] true by default + */ + BlockNode.prototype.add = function (node, visible) { + var index = this.params.length; + this.params[index] = { + node: node, + visible: (visible != undefined) ? visible : true + }; + }; + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + BlockNode.prototype._compile = function (defs) { + var params = this.params.map(function (param) { + var js = param.node._compile(defs); + if (param.visible) { + return 'results.push(' + js + ');'; + } + else { + return js + ';'; + } + }); + + return '(function () {' + + 'var results = [];' + + params.join('') + + 'return results;' + + '})()'; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + BlockNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in parameters + var params = this.params; + if (params) { + for (var i = 0, len = params.length; i < len; i++) { + nodes = nodes.concat(params[i].node.find(filter)); + } + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} str + * @override + */ + BlockNode.prototype.toString = function() { + return this.params.map(function (param) { + return param.node.toString() + (param.visible ? '' : ';'); + }).join('\n'); + }; + + module.exports = BlockNode; + + +/***/ }, +/* 106 */ +/***/ function(module, exports, require) { + + var Node = require(109), + Complex = require(7), + BigNumber = require(220), + string = require(218), + isString = string.isString; + + /** + * @constructor ConstantNode + * @extends {Node} + * @param {String} type Choose from 'number', 'string', 'complex', 'boolean', + * 'undefined', 'null' + * @param {String} value Value is an uninterpreted string containing the value + */ + function ConstantNode(type, value) { + if (!isString(type)) { + throw new TypeError('Constant type must be a string') + } + + if (!isString(value)) { + throw new TypeError('Constant value must be a string') + } + + this.type = type; + this.value = value; + } + + ConstantNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + ConstantNode.prototype._compile = function (defs) { + switch (this.type) { + case 'number': + if (defs.math.config().number === 'bignumber') { + return 'math.bignumber("' + this.value + '")'; + } + else { + // remove leading zeros like '003.2' + return this.value.replace(/^(0*)[0-9]/, function (match, zeros) { + return match.substring(zeros.length); + }); + } + + case 'string': + return '"' + this.value + '"'; + + case 'complex': + return 'math.complex(0, ' + this.value + ')'; + + case 'boolean': + return this.value; + + case 'undefined': + return this.value; + + case 'null': + return this.value; + + default: + throw new TypeError('Unsupported type of constant "' + this.type + '"'); + } + }; + + /** + * Get string representation + * @return {String} str + */ + ConstantNode.prototype.toString = function() { + switch (this.type) { + case 'string': + return '"' + this.value + '"'; + + case 'complex': + return this.value + 'i'; + + default: + return this.value; + } + }; + + module.exports = ConstantNode; + + +/***/ }, +/* 107 */ +/***/ function(module, exports, require) { + + var number= require(221), + + Node = require(109), + RangeNode = require(112), + SymbolNode = require(113), + + BigNumber = require(220), + Index = require(9), + Range = require(8), + + isNumber = number.isNumber, + toNumber = number.toNumber; + + /** + * @constructor IndexNode + * get a subset of a matrix + * @param {Node} object + * @param {Node[]} ranges + */ + function IndexNode (object, ranges) { + this.object = object; + this.ranges = ranges; + } + + IndexNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + IndexNode.prototype._compile = function (defs) { + return this.compileSubset(defs); + }; + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the + * compiled expression + * @param {String} [replacement] If provided, the function returns + * "math.subset(obj, math.index(...), replacement)" + * Else, the function returns + * "math.subset(obj, math.index(...))" + * @return {String} js + * @returns {string} + */ + IndexNode.prototype.compileSubset = function compileIndex (defs, replacement) { + // check whether any of the ranges expressions uses the context symbol 'end' + var filter = { + type: SymbolNode, + properties: { + name: 'end' + } + }; + var rangesUseEnd = this.ranges.map(function (range) { + return range.find(filter).length > 0; + }); + + // TODO: implement support for bignumber (currently bignumbers are silently + // reduced to numbers when changing the value to zero-based) + + // TODO: Optimization: when the range values are ConstantNodes, + // we can beforehand resolve the zero-based value + + var ranges = this.ranges.map(function(range, i) { + var useEnd = rangesUseEnd[i]; + if (range instanceof RangeNode) { + if (useEnd) { + // resolve end and create range (change from one based to zero based) + return '(function (scope) {' + + ' scope = Object.create(scope); ' + + ' scope["end"] = size[' + i + '];' + + ' var step = ' + (range.step ? range.step._compile(defs) : '1') + ';' + + ' return [' + + ' ' + range.start._compile(defs) + ' - 1, ' + + ' ' + range.end._compile(defs) + ' - (step > 0 ? 0 : 2), ' + + ' step' + + ' ];' + + '})(scope)'; + } + else { + // create range (change from one based to zero based) + return '(function () {' + + ' var step = ' + (range.step ? range.step._compile(defs) : '1') + ';' + + ' return [' + + ' ' + range.start._compile(defs) + ' - 1, ' + + ' ' + range.end._compile(defs) + ' - (step > 0 ? 0 : 2), ' + + ' step' + + ' ];' + + '})()'; + } + } + else { + if (useEnd) { + // resolve the parameter 'end', adjust the index value to zero-based + return '(function (scope) {' + + ' scope = Object.create(scope); ' + + ' scope["end"] = size[' + i + '];' + + ' return ' + range._compile(defs) + ' - 1;' + + '})(scope)' + } + else { + // just evaluate the expression, and change from one-based to zero-based + return range._compile(defs) + ' - 1'; + } + } + }); + + // if some parameters use the 'end' parameter, we need to calculate the size + var someUseEnd = ranges.some(function (useEnd) { + return useEnd; + }); + if (someUseEnd) { + return '(function () {' + + ' var obj = ' + this.object._compile(defs) + ';' + + ' var size = math.size(obj).valueOf();' + + ' return math.subset(' + + ' obj, ' + + ' math.index(' + ranges.join(', ') + ')' + + ' ' + (replacement ? (', ' + replacement) : '') + + ' );' + + '})()'; + } + else { + return 'math.subset(' + + this.object._compile(defs) + ',' + + 'math.index(' + ranges.join(', ') + + (replacement ? (', ' + replacement) : '') + + ')'; + } + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter options + * @returns {Node[]} nodes + */ + IndexNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search object + if (this.object) { + nodes = nodes.concat(this.object.find(filter)); + } + + // search in parameters + var ranges = this.ranges; + if (ranges) { + for (var i = 0, len = ranges.length; i < len; i++) { + nodes = nodes.concat(ranges[i].find(filter)); + } + } + + return nodes; + }; + + /** + * Get the name of the object linked to this IndexNode + * @return {string} name + */ + IndexNode.prototype.objectName = function objectName () { + return this.object.name; + }; + + /** + * Get string representation + * @return {String} str + */ + IndexNode.prototype.toString = function() { + // format the parameters like "[1, 0:5]" + var str = this.object ? this.object.toString() : ''; + if (this.ranges) { + str += '[' + this.ranges.join(', ') + ']'; + } + return str; + }; + + module.exports = IndexNode; + +/***/ }, +/* 108 */ +/***/ function(module, exports, require) { + + var Node = require(109); + + /** + * @constructor FunctionNode + * @extends {Node} + * Function assignment + * + * @param {String} name Function name + * @param {String[]} args Function arguments + * @param {Node} expr The function expression + */ + function FunctionNode(name, args, expr) { + this.name = name; + this.args = args; + this.expr = expr; + } + + FunctionNode.prototype = new Node(); + + /** + * Evaluate the function assignment + * @return {function} fn + */ + // TODO: cleanup + FunctionNode.prototype._eval = function() { + // put the definition in the scope + this.scope.set(this.name, this.fn); + + return this.fn; + }; + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + FunctionNode.prototype._compile = function (defs) { + + // TODO: validate whether name and all arguments are strings + + return 'scope["' + this.name + '"] = ' + + ' (function (scope) {' + + ' scope = Object.create(scope); ' + + ' var fn = function ' + this.name + '(' + this.args.join(',') + ') {' + + ' if (arguments.length != ' + this.args.length + ') {' + + ' throw new SyntaxError("Wrong number of arguments in function ' + this.name + ' (" + arguments.length + " provided, ' + this.args.length + ' expected)");' + + ' }' + + this.args.map(function (variable, index) { + return 'scope["' + variable + '"] = arguments[' + index + '];'; + }).join('') + + ' return ' + this.expr._compile(defs) + '' + + ' };' + + ' fn.syntax = "' + this.name + '(' + this.args.join(', ') + ')";' + + ' return fn;' + + ' })(scope);'; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + FunctionNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in expression + if (this.expr) { + nodes = nodes.concat(this.expr.find(filter)); + } + + return nodes; + }; + + /** + * get string representation + * @return {String} str + */ + FunctionNode.prototype.toString = function() { + return 'function ' + this.name + + '(' + this.args.join(', ') + ') = ' + + this.expr.toString(); + }; + + module.exports = FunctionNode; + + +/***/ }, +/* 109 */ +/***/ function(module, exports, require) { + + /** + * Node + */ + function Node() {} + + /** + * Evaluate the node + * @return {*} result + */ + // TODO: cleanup deprecated code one day. Deprecated since version 0.19.0 + Node.prototype.eval = function () { + throw new Error('Node.eval is deprecated. ' + + 'Use Node.compile(math).eval([scope]) instead.'); + }; + + /** + * Compile the node to javascript code + * @param {Object} math math.js instance + * @return {{eval: function}} expr Returns an object with a function 'eval', + * which can be invoked as expr.eval([scope]), + * where scope is an optional object with + * variables. + */ + Node.prototype.compile = function (math) { + if (typeof math !== 'object') { + throw new TypeError('Object expected as parameter math'); + } + + // definitions globally available inside the closure of the compiled expressions + var defs = { + math: math + }; + + var code = this._compile(defs); + + var defsCode = Object.keys(defs).map(function (name) { + return ' var ' + name + ' = defs["' + name + '"];'; + }); + + var factoryCode = + defsCode.join(' ') + + 'return {' + + ' "eval": function (scope) {' + + ' scope = scope || {};' + + ' return ' + code + ';' + + ' }' + + '};'; + + var factory = new Function ('defs', factoryCode); + return factory(defs); + }; + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * and constants globally available inside the closure + * of the compiled expression + * @return {String} js + * @private + */ + Node.prototype._compile = function (defs) { + throw new Error('Cannot compile a Node interface'); + }; + + /** + * Find any node in the node tree matching given filter. For example, to + * find all nodes of type SymbolNode having name 'x': + * + * var results = Node.find({ + * type: SymbolNode, + * properties: { + * name: 'x' + * } + * }); + * + * @param {Object} filter Available parameters: + * {Function} type + * {Object} properties + * @return {Node[]} nodes An array with nodes matching given filter criteria + */ + Node.prototype.find = function (filter) { + return this.match(filter) ? [this] : []; + }; + + /** + * Test if this object matches given filter + * @param {Object} filter Available parameters: + * {Function} type + * {Object} properties + * @return {Boolean} matches True if there is a match + */ + Node.prototype.match = function (filter) { + var match = true; + + if (filter) { + if (filter.type && !(this instanceof filter.type)) { + match = false; + } + if (match && filter.properties) { + for (var prop in filter.properties) { + if (filter.properties.hasOwnProperty(prop)) { + if (this[prop] != filter.properties[prop]) { + match = false; + break; + } + } + } + } + } + + return match; + }; + + /** + * Get string representation + * @return {String} + */ + Node.prototype.toString = function() { + return ''; + }; + + module.exports = Node; + + +/***/ }, +/* 110 */ +/***/ function(module, exports, require) { + + var Node = require(109); + + /** + * @constructor OperatorNode + * @extends {Node} + * An operator with two arguments, like 2+3 + * + * @param {String} op Operator name, for example '+' + * @param {String} fn Function name, for example 'add' + * @param {Node[]} params Parameters + */ + function OperatorNode (op, fn, params) { + this.op = op; + this.fn = fn; + this.params = params; + } + + OperatorNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + OperatorNode.prototype._compile = function (defs) { + if (!(this.fn in defs.math)) { + throw new Error('Function ' + this.fn + ' missing in provided namespace "math"'); + } + + var params = this.params.map(function (param) { + return param._compile(defs); + }); + return 'math.' + this.fn + '(' + params.join(', ') + ')'; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + OperatorNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in parameters + var params = this.params; + if (params) { + for (var i = 0, len = params.length; i < len; i++) { + nodes = nodes.concat(params[i].find(filter)); + } + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} str + */ + OperatorNode.prototype.toString = function() { + var params = this.params; + + switch (params.length) { + case 1: + if (this.op == '-') { + // special case: unary minus + return '-' + params[0].toString(); + } + else { + // for example '5!' + return params[0].toString() + this.op; + } + + case 2: // for example '2+3' + var lhs = params[0].toString(); + if (params[0] instanceof OperatorNode) { + lhs = '(' + lhs + ')'; + } + var rhs = params[1].toString(); + if (params[1] instanceof OperatorNode) { + rhs = '(' + rhs + ')'; + } + return lhs + ' ' + this.op + ' ' + rhs; + + default: // this should occur. format as a function call + return this.op + '(' + this.params.join(', ') + ')'; + } + }; + + module.exports = OperatorNode; + + +/***/ }, +/* 111 */ +/***/ function(module, exports, require) { + + var number= require(221), + + Node = require(109), + RangeNode = require(112), + SymbolNode = require(113), + + BigNumber = require(220), + Index = require(9), + Range = require(8), + + isNumber = number.isNumber, + toNumber = number.toNumber; + + /** + * @constructor ParamsNode + * @extends {Node} + * invoke a list with parameters on a node + * @param {Node} object + * @param {Node[]} params + */ + function ParamsNode (object, params) { + this.object = object; + this.params = params; + } + + ParamsNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + ParamsNode.prototype._compile = function (defs) { + // TODO: implement support for matrix indexes and ranges + var params = this.params.map(function (param) { + return param._compile(defs); + }); + + return this.object._compile(defs) + '(' + params.join(', ') + ')'; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + ParamsNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search object + if (this.object) { + nodes = nodes.concat(this.object.find(filter)); + } + + // search in parameters + var params = this.params; + if (params) { + for (var i = 0, len = params.length; i < len; i++) { + nodes = nodes.concat(params[i].find(filter)); + } + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} str + */ + ParamsNode.prototype.toString = function() { + // format the parameters like "(2, 4.2)" + var str = this.object ? this.object.toString() : ''; + if (this.params) { + str += '(' + this.params.join(', ') + ')'; + } + return str; + }; + + module.exports = ParamsNode; + + +/***/ }, +/* 112 */ +/***/ function(module, exports, require) { + + var number = require(221), + Node = require(109), + + BigNumber = require(220), + Range = require(8), + Matrix = require(10), + + toNumber = number.toNumber; + + /** + * @constructor RangeNode + * @extends {Node} + * create a range + * @param {Node[]} params Array [start, end] or [start, end, step] + */ + function RangeNode (params) { + if (params.length != 2 && params.length != 3) { + throw new SyntaxError('Wrong number of arguments. ' + + 'Expected [start, end] or [start, end, step]'); + } + + this.start = params[0]; // included lower-bound + this.end = params[1]; // included upper-bound + this.step = params[2]; // optional step + } + + RangeNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + RangeNode.prototype._compile = function (defs) { + return 'math.range(' + + this.start._compile(defs) + ', ' + + this.end._compile(defs) + ', ' + + (this.step ? (this.step._compile(defs) + ', ') : '') + + 'true)'; // parameter includeEnd = true + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + RangeNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in parameters + if (this.start) { + nodes = nodes.concat(this.start.find(filter)); + } + if (this.step) { + nodes = nodes.concat(this.step.find(filter)); + } + if (this.end) { + nodes = nodes.concat(this.end.find(filter)); + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} str + */ + RangeNode.prototype.toString = function() { + // format the range like "start:step:end" + var str = this.start.toString(); + if (this.step) { + str += ':' + this.step.toString(); + } + str += ':' + this.end.toString(); + + return str; + }; + + module.exports = RangeNode; + + +/***/ }, +/* 113 */ +/***/ function(module, exports, require) { + + var Node = require(109), + Unit = require(11); + + /** + * @constructor SymbolNode + * @extends {Node} + * A symbol node can hold and resolve a symbol + * @param {String} name + * @extends {Node} + */ + function SymbolNode(name) { + this.name = name; + } + + SymbolNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + SymbolNode.prototype._compile = function (defs) { + // add a function to the definitions + defs['undef'] = undef; + defs['Unit'] = Unit; + + return '(' + + 'scope["' + this.name + '"] !== undefined ? scope["' + this.name + '"] : ' + + 'math["' + this.name + '"] !== undefined ? math["' + this.name + '"] : ' + + (Unit.isPlainUnit(this.name) ? + 'new Unit(null, "' + this.name + '")' : + 'undef("' + this.name + '")') + + ')'; + }; + + /** + * Throws an error 'Undefined symbol {name}' + * @param {String} name + */ + function undef (name) { + throw new Error('Undefined symbol ' + name); + } + + /** + * Get string representation + * @return {String} str + * @override + */ + SymbolNode.prototype.toString = function() { + return this.name; + }; + + module.exports = SymbolNode; + + +/***/ }, +/* 114 */ +/***/ function(module, exports, require) { + + var Node = require(109), + + BigNumber = require(220), + Complex = require(7), + Unit = require(11), + + number = require(221), + toNumber = number.toNumber; + + /** + * @constructor UnitNode + * @extends {Node} + * Construct a unit, like '3 cm' + * @param {Node} value + * @param {String} unit Unit name, for example 'meter' 'kg' + */ + function UnitNode (value, unit) { + this.value = value; + this.unit = unit; + } + + UnitNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + UnitNode.prototype._compile = function (defs) { + return 'math.unit(' + this.value._compile(defs) + ', "' + this.unit + '")'; + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + UnitNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // check value + nodes = nodes.concat(this.value.find(filter)); + + return nodes; + }; + + /** + * Get string representation + * @return {String} str + */ + UnitNode.prototype.toString = function() { + return this.value + ' ' + this.unit; + }; + + module.exports = UnitNode; + + +/***/ }, +/* 115 */ +/***/ function(module, exports, require) { + + var number= require(221), + + Node = require(109), + RangeNode = require(112), + IndexNode = require(107), + SymbolNode = require(113), + + BigNumber = require(220), + Index = require(9), + Range = require(8), + + isNumber = number.isNumber, + toNumber = number.toNumber; + + /** + * @constructor UpdateNode + * @extends {Node} + * Update a symbol value, like a(2,3) = 4.5 + * + * @param {IndexNode} index IndexNode containing symbol and ranges + * @param {Node} expr The expression defining the symbol + */ + function UpdateNode(index, expr) { + if (!(index instanceof IndexNode)) { + throw new TypeError('index mus be an IndexNode'); + } + + this.index = index; + this.expr = expr; + } + + UpdateNode.prototype = new Node(); + + /** + * Compile the node to javascript code + * @param {Object} defs Object which can be used to define functions + * or constants globally available for the compiled + * expression + * @return {String} js + * @private + */ + UpdateNode.prototype._compile = function (defs) { + return 'scope["' + this.index.objectName() + '\"] = ' + + this.index.compileSubset(defs, this.expr._compile(defs)); + }; + + /** + * Find all nodes matching given filter + * @param {Object} filter See Node.find for a description of the filter settings + * @returns {Node[]} nodes + */ + UpdateNode.prototype.find = function (filter) { + var nodes = []; + + // check itself + if (this.match(filter)) { + nodes.push(this); + } + + // search in parameters + var ranges = this.ranges; + if (ranges) { + for (var i = 0, len = ranges.length; i < len; i++) { + nodes = nodes.concat(ranges[i].find(filter)); + } + } + + // search in expression + if (this.expr) { + nodes = nodes.concat(this.expr.find(filter)); + } + + return nodes; + }; + + /** + * Get string representation + * @return {String} + */ + UpdateNode.prototype.toString = function() { + return this.index.toString() + ' = ' + this.expr.toString(); + }; + + module.exports = UpdateNode; + + +/***/ }, +/* 116 */ +/***/ function(module, exports, require) { + + /** + * Custom node handlers, + * (can be added to the exports object) + */ + + // TODO: remove use of global handlers + + +/***/ }, +/* 117 */ +/***/ function(module, exports, require) { + + exports.array = require(222); + exports['boolean'] = require(223); + exports.number = require(221); + exports.object = require(2); + exports.string = require(218); + exports.types = require(217); + + +/***/ }, +/* 118 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'e', + 'category': 'Constants', + 'syntax': [ + 'e' + ], + 'description': 'Euler\'s number, the base of the natural logarithm. Approximately equal to 2.71828', + 'examples': [ + 'e', + 'e ^ 2', + 'exp(2)', + 'log(e)' + ], + 'seealso': ['exp'] + }; + + +/***/ }, +/* 119 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'false', + 'category': 'Constants', + 'syntax': [ + 'false' + ], + 'description': 'Boolean value false', + 'examples': [ + 'false' + ], + 'seealso': ['true'] + }; + + +/***/ }, +/* 120 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'i', + 'category': 'Constants', + 'syntax': [ + 'i' + ], + 'description': 'Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.', + 'examples': [ + 'i', + 'i * i', + 'sqrt(-1)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 121 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'Infinity', + 'category': 'Constants', + 'syntax': [ + 'Infinity' + ], + 'description': 'Infinity, a number which is larger than the maximum number that can be handled by a floating point number.', + 'examples': [ + 'Infinity', + '1 / 0' + ], + 'seealso': [] + }; + + +/***/ }, +/* 122 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'LN2', + 'category': 'Constants', + 'syntax': [ + 'LN2' + ], + 'description': 'Returns the natural logarithm of 2, approximately equal to 0.693', + 'examples': [ + 'LN2', + 'log(2)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 123 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'LN10', + 'category': 'Constants', + 'syntax': [ + 'LN10' + ], + 'description': 'Returns the natural logarithm of 10, approximately equal to 2.302', + 'examples': [ + 'LN10', + 'log(10)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 124 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'LOG2E', + 'category': 'Constants', + 'syntax': [ + 'LOG2E' + ], + 'description': 'Returns the base-2 logarithm of E, approximately equal to 1.442', + 'examples': [ + 'LOG2E', + 'log(e, 2)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 125 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'LOG10E', + 'category': 'Constants', + 'syntax': [ + 'LOG10E' + ], + 'description': 'Returns the base-10 logarithm of E, approximately equal to 0.434', + 'examples': [ + 'LOG10E', + 'log(e, 10)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 126 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'NaN', + 'category': 'Constants', + 'syntax': [ + 'NaN' + ], + 'description': 'Not a number', + 'examples': [ + 'NaN', + '0 / 0' + ], + 'seealso': [] + }; + + +/***/ }, +/* 127 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'pi', + 'category': 'Constants', + 'syntax': [ + 'pi' + ], + 'description': 'The number pi is a mathematical constant that is the ratio of a circle\'s circumference to its diameter, and is approximately equal to 3.14159', + 'examples': [ + 'pi', + 'sin(pi/2)' + ], + 'seealso': ['tau'] + }; + + +/***/ }, +/* 128 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'SQRT1_2', + 'category': 'Constants', + 'syntax': [ + 'SQRT1_2' + ], + 'description': 'Returns the square root of 1/2, approximately equal to 0.707', + 'examples': [ + 'SQRT1_2', + 'sqrt(1/2)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 129 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'SQRT2', + 'category': 'Constants', + 'syntax': [ + 'SQRT2' + ], + 'description': 'Returns the square root of 2, approximately equal to 1.414', + 'examples': [ + 'SQRT2', + 'sqrt(2)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 130 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'tau', + 'category': 'Constants', + 'syntax': [ + 'pi' + ], + 'description': 'Tau is the ratio constant of a circle\'s circumference to radius, equal to 2 * pi, approximately 6.2832.', + 'examples': [ + 'tau', + '2 * pi' + ], + 'seealso': ['pi'] + }; + + +/***/ }, +/* 131 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'true', + 'category': 'Constants', + 'syntax': [ + 'true' + ], + 'description': 'Boolean value true', + 'examples': [ + 'true' + ], + 'seealso': ['false'] + }; + + +/***/ }, +/* 132 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'abs', + 'category': 'Arithmetic', + 'syntax': [ + 'abs(x)' + ], + 'description': 'Compute the absolute value.', + 'examples': [ + 'abs(3.5)', + 'abs(-4.2)' + ], + 'seealso': ['sign'] + }; + + +/***/ }, +/* 133 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'add', + 'category': 'Operators', + 'syntax': [ + 'x + y', + 'add(x, y)' + ], + 'description': 'Add two values.', + 'examples': [ + '2.1 + 3.6', + 'ans - 3.6', + '3 + 2i', + '"hello" + " world"', + '3 cm + 2 inch' + ], + 'seealso': [ + 'subtract' + ] + }; + + +/***/ }, +/* 134 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'ceil', + 'category': 'Arithmetic', + 'syntax': [ + 'ceil(x)' + ], + 'description': + 'Round a value towards plus infinity.If x is complex, both real and imaginary part are rounded towards plus infinity.', + 'examples': [ + 'ceil(3.2)', + 'ceil(3.8)', + 'ceil(-4.2)' + ], + 'seealso': ['floor', 'fix', 'round'] + }; + + +/***/ }, +/* 135 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'cube', + 'category': 'Arithmetic', + 'syntax': [ + 'cube(x)' + ], + 'description': 'Compute the cube of a value. The cube of x is x * x * x.', + 'examples': [ + 'cube(2)', + '2^3', + '2 * 2 * 2' + ], + 'seealso': [ + 'multiply', + 'square', + 'pow' + ] + }; + + +/***/ }, +/* 136 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'divide', + 'category': 'Operators', + 'syntax': [ + 'x / y', + 'divide(x, y)' + ], + 'description': 'Divide two values.', + 'examples': [ + '2 / 3', + 'ans * 3', + '4.5 / 2', + '3 + 4 / 2', + '(3 + 4) / 2', + '18 km / 4.5' + ], + 'seealso': [ + 'multiply' + ] + }; + + +/***/ }, +/* 137 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'edivide', + 'category': 'Operators', + 'syntax': [ + 'x ./ y', + 'edivide(x, y)' + ], + 'description': 'divide two values element wise.', + 'examples': [ + 'a = [1, 2, 3; 4, 5, 6]', + 'b = [2, 1, 1; 3, 2, 5]', + 'a ./ b' + ], + 'seealso': [ + 'multiply', + 'emultiply', + 'divide' + ] + }; + + +/***/ }, +/* 138 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'emultiply', + 'category': 'Operators', + 'syntax': [ + 'x .* y', + 'emultiply(x, y)' + ], + 'description': 'multiply two values element wise.', + 'examples': [ + 'a = [1, 2, 3; 4, 5, 6]', + 'b = [2, 1, 1; 3, 2, 5]', + 'a .* b' + ], + 'seealso': [ + 'multiply', + 'divide', + 'edivide' + ] + }; + + +/***/ }, +/* 139 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'epow', + 'category': 'Operators', + 'syntax': [ + 'x .^ y', + 'epow(x, y)' + ], + 'description': + 'Calculates the power of x to y element wise.', + 'examples': [ + 'a = [1, 2, 3; 4, 5, 6]', + 'a .^ 2' + ], + 'seealso': [ + 'pow' + ] + }; + + +/***/ }, +/* 140 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'equal', + 'category': 'Operators', + 'syntax': [ + 'x == y', + 'equal(x, y)' + ], + 'description': + 'Check equality of two values. Returns 1 if the values are equal, and 0 if not.', + 'examples': [ + '2+2 == 3', + '2+2 == 4', + 'a = 3.2', + 'b = 6-2.8', + 'a == b', + '50cm == 0.5m' + ], + 'seealso': [ + 'unequal', 'smaller', 'larger', 'smallereq', 'largereq' + ] + }; + + +/***/ }, +/* 141 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'exp', + 'category': 'Arithmetic', + 'syntax': [ + 'exp(x)' + ], + 'description': 'Calculate the exponent of a value.', + 'examples': [ + 'exp(1.3)', + 'e ^ 1.3', + 'log(exp(1.3))', + 'x = 2.4', + '(exp(i*x) == cos(x) + i*sin(x)) # Euler\'s formula' + ], + 'seealso': [ + 'square', + 'multiply', + 'log' + ] + }; + + +/***/ }, +/* 142 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'fix', + 'category': 'Arithmetic', + 'syntax': [ + 'fix(x)' + ], + 'description': + 'Round a value towards zero.If x is complex, both real and imaginary part are rounded towards zero.', + 'examples': [ + 'fix(3.2)', + 'fix(3.8)', + 'fix(-4.2)', + 'fix(-4.8)' + ], + 'seealso': ['ceil', 'floor', 'round'] + }; + + +/***/ }, +/* 143 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'floor', + 'category': 'Arithmetic', + 'syntax': [ + 'floor(x)' + ], + 'description': + 'Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.', + 'examples': [ + 'floor(3.2)', + 'floor(3.8)', + 'floor(-4.2)' + ], + 'seealso': ['ceil', 'fix', 'round'] + }; + + +/***/ }, +/* 144 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'gcd', + 'category': 'Arithmetic', + 'syntax': [ + 'gcd(a, b)', + 'gcd(a, b, c, ...)' + ], + 'description': 'Compute the greatest common divisor.', + 'examples': [ + 'gcd(8, 12)', + 'gcd(-4, 6)', + 'gcd(25, 15, -10)' + ], + 'seealso': [ 'lcm', 'xgcd' ] + }; + + +/***/ }, +/* 145 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'larger', + 'category': 'Operators', + 'syntax': [ + 'x > y', + 'larger(x, y)' + ], + 'description': + 'Check if value x is larger than y. Returns 1 if x is larger than y, and 0 if not.', + 'examples': [ + '2 > 3', + '5 > 2*2', + 'a = 3.3', + 'b = 6-2.8', + '(a > b)', + '(b < a)', + '5 cm > 2 inch' + ], + 'seealso': [ + 'equal', 'unequal', 'smaller', 'smallereq', 'largereq' + ] + }; + + +/***/ }, +/* 146 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'largereq', + 'category': 'Operators', + 'syntax': [ + 'x >= y', + 'largereq(x, y)' + ], + 'description': + 'Check if value x is larger or equal to y. Returns 1 if x is larger or equal to y, and 0 if not.', + 'examples': [ + '2 > 1+1', + '2 >= 1+1', + 'a = 3.2', + 'b = 6-2.8', + '(a > b)' + ], + 'seealso': [ + 'equal', 'unequal', 'smallereq', 'smaller', 'largereq' + ] + }; + + +/***/ }, +/* 147 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'lcm', + 'category': 'Arithmetic', + 'syntax': [ + 'lcm(x, y)' + ], + 'description': 'Compute the least common multiple.', + 'examples': [ + 'lcm(4, 6)', + 'lcm(6, 21)', + 'lcm(6, 21, 5)' + ], + 'seealso': [ 'gcd' ] + }; + + +/***/ }, +/* 148 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'log', + 'category': 'Arithmetic', + 'syntax': [ + 'log(x)', + 'log(x, base)' + ], + 'description': 'Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).', + 'examples': [ + 'log(3.5)', + 'a = log(2.4)', + 'exp(a)', + '10 ^ 3', + 'log(1000, 10)', + 'log(1000) / log(10)', + 'b = logb(1024, 2)', + '2 ^ b' + ], + 'seealso': [ + 'exp', + 'log10' + ] + }; + +/***/ }, +/* 149 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'log10', + 'category': 'Arithmetic', + 'syntax': [ + 'log10(x)' + ], + 'description': 'Compute the 10-base logarithm of a value.', + 'examples': [ + 'log10(1000)', + '10 ^ 3', + 'log10(0.01)', + 'log(1000) / log(10)', + 'log(1000, 10)' + ], + 'seealso': [ + 'exp', + 'log' + ] + }; + + +/***/ }, +/* 150 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'mod', + 'category': 'Operators', + 'syntax': [ + 'x % y', + 'x mod y', + 'mod(x, y)' + ], + 'description': + 'Calculates the modulus, the remainder of an integer division.', + 'examples': [ + '7 % 3', + '11 % 2', + '10 mod 4', + 'function isOdd(x) = x % 2', + 'isOdd(2)', + 'isOdd(3)' + ], + 'seealso': [] + }; + + +/***/ }, +/* 151 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'multiply', + 'category': 'Operators', + 'syntax': [ + 'x * y', + 'multiply(x, y)' + ], + 'description': 'multiply two values.', + 'examples': [ + '2.1 * 3.6', + 'ans / 3.6', + '2 * 3 + 4', + '2 * (3 + 4)', + '3 * 2.1 km' + ], + 'seealso': [ + 'divide' + ] + }; + + +/***/ }, +/* 152 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'pow', + 'category': 'Operators', + 'syntax': [ + 'x ^ y', + 'pow(x, y)' + ], + 'description': + 'Calculates the power of x to y, x^y.', + 'examples': [ + '2^3 = 8', + '2*2*2', + '1 + e ^ (pi * i)' + ], + 'seealso': [ + 'unequal', 'smaller', 'larger', 'smallereq', 'largereq' + ] + }; + + +/***/ }, +/* 153 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'round', + 'category': 'Arithmetic', + 'syntax': [ + 'round(x)', + 'round(x, n)' + ], + 'description': + 'round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.', + 'examples': [ + 'round(3.2)', + 'round(3.8)', + 'round(-4.2)', + 'round(-4.8)', + 'round(pi, 3)', + 'round(123.45678, 2)' + ], + 'seealso': ['ceil', 'floor', 'fix'] + }; + + +/***/ }, +/* 154 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'sign', + 'category': 'Arithmetic', + 'syntax': [ + 'sign(x)' + ], + 'description': + 'Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.', + 'examples': [ + 'sign(3.5)', + 'sign(-4.2)', + 'sign(0)' + ], + 'seealso': [ + 'abs' + ] + }; + + +/***/ }, +/* 155 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'smaller', + 'category': 'Operators', + 'syntax': [ + 'x < y', + 'smaller(x, y)' + ], + 'description': + 'Check if value x is smaller than value y. Returns 1 if x is smaller than y, and 0 if not.', + 'examples': [ + '2 < 3', + '5 < 2*2', + 'a = 3.3', + 'b = 6-2.8', + '(a < b)', + '5 cm < 2 inch' + ], + 'seealso': [ + 'equal', 'unequal', 'larger', 'smallereq', 'largereq' + ] + }; + + +/***/ }, +/* 156 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'smallereq', + 'category': 'Operators', + 'syntax': [ + 'x <= y', + 'smallereq(x, y)' + ], + 'description': + 'Check if value x is smaller or equal to value y. Returns 1 if x is smaller than y, and 0 if not.', + 'examples': [ + '2 < 1+1', + '2 <= 1+1', + 'a = 3.2', + 'b = 6-2.8', + '(a < b)' + ], + 'seealso': [ + 'equal', 'unequal', 'larger', 'smaller', 'largereq' + ] + }; + + +/***/ }, +/* 157 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'sqrt', + 'category': 'Arithmetic', + 'syntax': [ + 'sqrt(x)' + ], + 'description': + 'Compute the square root value. If x = y * y, then y is the square root of x.', + 'examples': [ + 'sqrt(25)', + '5 * 5', + 'sqrt(-1)' + ], + 'seealso': [ + 'square', + 'multiply' + ] + }; + + +/***/ }, +/* 158 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'square', + 'category': 'Arithmetic', + 'syntax': [ + 'square(x)' + ], + 'description': + 'Compute the square of a value. The square of x is x * x.', + 'examples': [ + 'square(3)', + 'sqrt(9)', + '3^2', + '3 * 3' + ], + 'seealso': [ + 'multiply', + 'pow', + 'sqrt', + 'cube' + ] + }; + + +/***/ }, +/* 159 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'subtract', + 'category': 'Operators', + 'syntax': [ + 'x - y', + 'subtract(x, y)' + ], + 'description': 'subtract two values.', + 'examples': [ + '5.3 - 2', + 'ans + 2', + '2/3 - 1/6', + '2 * 3 - 3', + '2.1 km - 500m' + ], + 'seealso': [ + 'add' + ] + }; + + +/***/ }, +/* 160 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'unary', + 'category': 'Operators', + 'syntax': [ + '-x', + 'unary(x)' + ], + 'description': + 'Inverse the sign of a value.', + 'examples': [ + '-4.5', + '-(-5.6)' + ], + 'seealso': [ + 'add', 'subtract' + ] + }; + + +/***/ }, +/* 161 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'unequal', + 'category': 'Operators', + 'syntax': [ + 'x != y', + 'unequal(x, y)' + ], + 'description': + 'Check unequality of two values. Returns 1 if the values are unequal, and 0 if they are equal.', + 'examples': [ + '2+2 != 3', + '2+2 != 4', + 'a = 3.2', + 'b = 6-2.8', + 'a != b', + '50cm != 0.5m', + '5 cm != 2 inch' + ], + 'seealso': [ + 'equal', 'smaller', 'larger', 'smallereq', 'largereq' + ] + }; + + +/***/ }, +/* 162 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'xgcd', + 'category': 'Arithmetic', + 'syntax': [ + 'xgcd(a, b)' + ], + 'description': 'Calculate the extended greatest common divisor for two values', + 'examples': [ + 'xgcd(8, 12)', + 'gcd(8, 12)', + 'xgcd(36163, 21199)' + ], + 'seealso': [ 'gcd', 'lcm' ] + }; + + +/***/ }, +/* 163 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'arg', + 'category': 'Complex', + 'syntax': [ + 'arg(x)' + ], + 'description': + 'Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).', + 'examples': [ + 'arg(2 + 2i)', + 'atan2(3, 2)', + 'arg(2 - 3i)' + ], + 'seealso': [ + 're', + 'im', + 'conj', + 'abs' + ] + }; + + +/***/ }, +/* 164 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'conj', + 'category': 'Complex', + 'syntax': [ + 'conj(x)' + ], + 'description': + 'Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.', + 'examples': [ + 'conj(2 + 3i)', + 'conj(2 - 3i)', + 'conj(-5.2i)' + ], + 'seealso': [ + 're', + 'im', + 'abs', + 'arg' + ] + }; + + +/***/ }, +/* 165 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 're', + 'category': 'Complex', + 'syntax': [ + 're(x)' + ], + 'description': 'Get the real part of a complex number.', + 'examples': [ + 're(2 + 3i)', + 'im(2 + 3i)', + 're(-5.2i)', + 're(2.4)' + ], + 'seealso': [ + 'im', + 'conj', + 'abs', + 'arg' + ] + }; + + +/***/ }, +/* 166 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'im', + 'category': 'Complex', + 'syntax': [ + 'im(x)' + ], + 'description': 'Get the imaginary part of a complex number.', + 'examples': [ + 'im(2 + 3i)', + 're(2 + 3i)', + 'im(-5.2i)', + 'im(2.4)' + ], + 'seealso': [ + 're', + 'conj', + 'abs', + 'arg' + ] + }; + + +/***/ }, +/* 167 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'bignumber', + 'category': 'Type', + 'syntax': [ + 'bignumber(x)' + ], + 'description': + 'Create a big number from a number or string.', + 'examples': [ + '0.1 + 0.2', + 'bignumber(0.1) + bignumber(0.2)', + 'bignumber("7.2")', + 'bignumber("7.2e500")', + 'bignumber([0.1, 0.2, 0.3])' + ], + 'seealso': [ + 'boolean', 'complex', 'index', 'matrix', 'string', 'unit' + ] + }; + + +/***/ }, +/* 168 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'boolean', + 'category': 'Type', + 'syntax': [ + 'x', + 'boolean(x)' + ], + 'description': + 'Convert a string or number into a boolean.', + 'examples': [ + 'boolean(0)', + 'boolean(1)', + 'boolean(3)', + 'boolean("true")', + 'boolean("false")', + 'boolean([1, 0, 1, 1])' + ], + 'seealso': [ + 'bignumber', 'complex', 'index', 'matrix', 'number', 'string', 'unit' + ] + }; + + +/***/ }, +/* 169 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'complex', + 'category': 'Type', + 'syntax': [ + 'complex()', + 'complex(re, im)', + 'complex(string)' + ], + 'description': + 'Create a complex number.', + 'examples': [ + 'complex()', + 'complex(2, 3)', + 'complex("7 - 2i")' + ], + 'seealso': [ + 'bignumber', 'boolean', 'index', 'matrix', 'number', 'string', 'unit' + ] + }; + + +/***/ }, +/* 170 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'index', + 'category': 'Type', + 'syntax': [ + '[start]', + '[start:end]', + '[start:step:end]', + '[start1, start 2, ...]', + '[start1:end1, start2:end2, ...]', + '[start1:step1:end1, start2:step2:end2, ...]' + ], + 'description': + 'Create an index to get or replace a subset of a matrix', + 'examples': [ + '[]', + '[1, 2, 3]', + 'A = [1, 2, 3; 4, 5, 6]', + 'A[1, :]', + 'A[1, 2] = 50', + 'A[0:2, 0:2] = ones(2, 2)' + ], + 'seealso': [ + 'bignumber', 'boolean', 'complex', 'matrix,', 'number', 'range', 'string', 'unit' + ] + }; + + +/***/ }, +/* 171 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'matrix', + 'category': 'Type', + 'syntax': [ + '[]', + '[a1, b1, ...; a2, b2, ...]', + 'matrix()', + 'matrix([...])' + ], + 'description': + 'Create a matrix.', + 'examples': [ + '[]', + '[1, 2, 3]', + '[1, 2, 3; 4, 5, 6]', + 'matrix()', + 'matrix([3, 4])' + ], + 'seealso': [ + 'bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit' + ] + }; + + +/***/ }, +/* 172 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'number', + 'category': 'Type', + 'syntax': [ + 'x', + 'number(x)' + ], + 'description': + 'Create a number or convert a string or boolean into a number.', + 'examples': [ + '2', + '2e3', + '4.05', + 'number(2)', + 'number("7.2")', + 'number(true)', + 'number([true, false, true, true])' + ], + 'seealso': [ + 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'string', 'unit' + ] + }; + + +/***/ }, +/* 173 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'string', + 'category': 'Type', + 'syntax': [ + '"text"', + 'string(x)' + ], + 'description': + 'Create a string or convert a value to a string', + 'examples': [ + '"Hello World!"', + 'string(4.2)', + 'string(3 + 2i)' + ], + 'seealso': [ + 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'unit' + ] + }; + + +/***/ }, +/* 174 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'unit', + 'category': 'Type', + 'syntax': [ + 'value unit', + 'unit(value, unit)', + 'unit(string)' + ], + 'description': + 'Create a unit.', + 'examples': [ + '5.5 mm', + '3 inch', + 'unit(7.1, "kilogram")', + 'unit("23 deg")' + ], + 'seealso': [ + 'bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'string' + ] + }; + + +/***/ }, +/* 175 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'eval', + 'category': 'Expression', + 'syntax': [ + 'eval(expression)', + 'eval([expr1, expr2, expr3, ...])' + ], + 'description': 'Evaluate an expression or an array with expressions.', + 'examples': [ + 'eval("2 + 3")', + 'eval("sqrt(" + 4 + ")")' + ], + 'seealso': [] + }; + + +/***/ }, +/* 176 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'help', + 'category': 'Expression', + 'syntax': [ + 'help(object)', + 'help(string)' + ], + 'description': 'Display documentation on a function or data type.', + 'examples': [ + 'help(sqrt)', + 'help("complex")' + ], + 'seealso': [] + }; + + +/***/ }, +/* 177 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'concat', + 'category': 'Matrix', + 'syntax': [ + 'concat(a, b, c, ...)', + 'concat(a, b, c, ..., dim)' + ], + 'description': 'Concatenate matrices. By default, the matrices are concatenated by the first dimension. The dimension on which to concatenate can be provided as last argument.', + 'examples': [ + 'a = [1, 2; 5, 6]', + 'b = [3, 4; 7, 8]', + 'concat(a, b)', + '[a, b]', + 'concat(a, b, 2)', + '[a; b]' + ], + 'seealso': [ + 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 178 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'det', + 'category': 'Matrix', + 'syntax': [ + 'det(x)' + ], + 'description': 'Calculate the determinant of a matrix', + 'examples': [ + 'det([1, 2; 3, 4])', + 'det([-2, 2, 3; -1, 1, 3; 2, 0, -1])' + ], + 'seealso': [ + 'concat', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 179 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'diag', + 'category': 'Matrix', + 'syntax': [ + 'diag(x)', + 'diag(x, k)' + ], + 'description': 'Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned.When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.', + 'examples': [ + 'diag(1:3)', + 'diag(1:3, 1)', + 'a = [1, 2, 3; 4, 5, 6; 7, 8, 9]', + 'diag(a)' + ], + 'seealso': [ + 'concat', 'det', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 180 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'eye', + 'category': 'Matrix', + 'syntax': [ + 'eye(n)', + 'eye(m, n)', + 'eye([m, n])', + 'eye' + ], + 'description': 'Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.', + 'examples': [ + 'eye(3)', + 'eye(3, 5)', + 'a = [1, 2, 3; 4, 5, 6]', + 'eye(size(a))' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 181 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'inv', + 'category': 'Matrix', + 'syntax': [ + 'inv(x)' + ], + 'description': 'Calculate the inverse of a matrix', + 'examples': [ + 'inv([1, 2; 3, 4])', + 'inv(4)', + '1 / 4' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 182 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'ones', + 'category': 'Matrix', + 'syntax': [ + 'ones(m)', + 'ones(m, n)', + 'ones(m, n, p, ...)', + 'ones([m])', + 'ones([m, n])', + 'ones([m, n, p, ...])', + 'ones' + ], + 'description': 'Create a matrix containing ones.', + 'examples': [ + 'ones(3)', + 'ones(3, 5)', + 'ones([2,3]) * 4.5', + 'a = [1, 2, 3; 4, 5, 6]', + 'ones(size(a))' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 183 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'range', + 'category': 'Type', + 'syntax': [ + 'start:end', + 'start:step:end', + 'range(start, end)', + 'range(start, end, step)', + 'range(string)' + ], + 'description': + 'Create a range. Lower bound of the range is included, upper bound is excluded.', + 'examples': [ + '1:5', + '3:-1:-3', + 'range(3, 7)', + 'range(0, 12, 2)', + 'range("4:10")', + 'a = [1, 2, 3, 4; 5, 6, 7, 8]', + 'a[1:2, 1:2]' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'size', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 184 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'resize', + 'category': 'Matrix', + 'syntax': [ + 'resize(x, size)', + 'resize(x, size, defaultValue)' + ], + 'description': 'Resize a matrix.', + 'examples': [ + 'resize([1,2,3,4,5], [3])', + 'resize([1,2,3], [5], 0)', + 'resize(2, [2, 3], 0)', + 'resize("hello", [8], "!")' + ], + 'seealso': [ + 'size', 'subset', 'squeeze' + ] + }; + + +/***/ }, +/* 185 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'size', + 'category': 'Matrix', + 'syntax': [ + 'size(x)' + ], + 'description': 'Calculate the size of a matrix.', + 'examples': [ + 'size(2.3)', + 'size("hello world")', + 'a = [1, 2; 3, 4; 5, 6]', + 'size(a)', + 'size(1:6)' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'squeeze', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 186 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'squeeze', + 'category': 'Matrix', + 'syntax': [ + 'squeeze(x)' + ], + 'description': 'Remove singleton dimensions from a matrix.', + 'examples': [ + 'a = zeros(1,3,2)', + 'size(squeeze(a))', + 'b = zeros(3,1,1)', + 'size(squeeze(b))' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'subset', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 187 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'subset', + 'category': 'Matrix', + 'syntax': [ + 'value(index)', + 'value(index) = replacement', + 'subset(value, [index])', + 'subset(value, [index], replacement)' + ], + 'description': 'Get or set a subset of a matrix or string. ' + + 'Indexes are one-based. ' + + 'Both the ranges lower-bound and upper-bound are included.', + 'examples': [ + 'd = [1, 2; 3, 4]', + 'e = []', + 'e[1, 1:2] = [5, 6]', + 'e[2, :] = [7, 8]', + 'f = d * e', + 'f[2, 1]', + 'f[:, 1]' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros' + ] + }; + + +/***/ }, +/* 188 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'transpose', + 'category': 'Matrix', + 'syntax': [ + 'x\'', + 'transpose(x)' + ], + 'description': 'Transpose a matrix', + 'examples': [ + 'a = [1, 2, 3; 4, 5, 6]', + 'a\'', + 'transpose(a)' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'zeros' + ] + }; + + +/***/ }, +/* 189 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'zeros', + 'category': 'Matrix', + 'syntax': [ + 'zeros(m)', + 'zeros(m, n)', + 'zeros(m, n, p, ...)', + 'zeros([m])', + 'zeros([m, n])', + 'zeros([m, n, p, ...])', + 'zeros' + ], + 'description': 'Create a matrix containing zeros.', + 'examples': [ + 'zeros(3)', + 'zeros(3, 5)', + 'a = [1, 2, 3; 4, 5, 6]', + 'zeros(size(a))' + ], + 'seealso': [ + 'concat', 'det', 'diag', 'eye', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose' + ] + }; + + +/***/ }, +/* 190 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'combinations', + 'category': 'Probability', + 'syntax': [ + 'combinations(n, k)' + ], + 'description': 'Compute the number of combinations of n items taken k at a time', + 'examples': [ + 'combinations(7, 5)' + ], + 'seealso': ['permutations', 'factorial'] + }; + + +/***/ }, +/* 191 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'distribution', + 'category': 'Probability', + 'syntax': [ + 'distribution(name)', + 'distribution(name, arg1, arg2, ...)' + ], + 'description': + 'Create a distribution object of a specific type. ' + + 'A distribution object contains functions `random([size,] [min,] [max])`, ' + + '`randomInt([size,] [min,] [max])`, and `pickRandom(array)`. ' + + 'Available types of distributions: "uniform", "normal". ' + + 'Note that the function distribution is currently not available via the expression parser.', + 'examples': [ + ], + 'seealso': ['random', 'randomInt'] + }; + + +/***/ }, +/* 192 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'factorial', + 'category': 'Probability', + 'syntax': [ + 'n!', + 'factorial(n)' + ], + 'description': 'Compute the factorial of a value', + 'examples': [ + '5!', + '5*4*3*2*1', + '3!' + ], + 'seealso': [] + }; + + +/***/ }, +/* 193 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'permutations', + 'category': 'Probability', + 'syntax': [ + 'permutations(n)', + 'permutations(n, k)' + ], + 'description': 'Compute the number of permutations of n items taken k at a time', + 'examples': [ + 'permutations(5)', + 'permutations(5, 4)' + ], + 'seealso': ['combinations', 'factorial'] + }; + + +/***/ }, +/* 194 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'pickRandom', + 'category': 'Probability', + 'syntax': [ + 'pickRandom(array)' + ], + 'description': + 'Pick a random entry from a given array.', + 'examples': [ + 'pickRandom(0:10)', + 'pickRandom([1, 3, 1, 6])' + ], + 'seealso': ['distribution', 'random', 'randomInt'] + }; + + +/***/ }, +/* 195 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'random', + 'category': 'Probability', + 'syntax': [ + 'random()', + 'random(max)', + 'random(min, max)', + 'random(size)', + 'random(size, max)', + 'random(size, min, max)' + ], + 'description': + 'Return a random number.', + 'examples': [ + 'random()', + 'random(10, 20)', + 'random([2, 3])' + ], + 'seealso': ['distribution', 'pickRandom', 'randomInt'] + }; + + +/***/ }, +/* 196 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'randInt', + 'category': 'Probability', + 'syntax': [ + 'randInt()', + 'randInt(max)', + 'randInt(min, max)', + 'randInt(size)', + 'randInt(size, max)', + 'randInt(size, min, max)' + ], + 'description': + 'Return a random integer number', + 'examples': [ + 'randInt()', + 'randInt(10, 20)', + 'randInt([2, 3], 10)' + ], + 'seealso': ['distribution', 'pickRandom', 'random'] + }; + +/***/ }, +/* 197 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'min', + 'category': 'Statistics', + 'syntax': [ + 'min(a, b, c, ...)', + 'min(A)', + 'min(A, dim)' + ], + 'description': 'Compute the minimum value of a list of values.', + 'examples': [ + 'min(2, 3, 4, 1)', + 'min([2, 3, 4, 1])', + 'min([2, 5; 4, 3], 0)', + 'min([2, 5; 4, 3], 1)', + 'min(2.7, 7.1, -4.5, 2.0, 4.1)', + 'max(2.7, 7.1, -4.5, 2.0, 4.1)' + ], + 'seealso': [ + //'sum', + //'prod', + //'avg', + //'var', + //'std', + 'max', + 'mean', + //'median', + 'min' + ] + }; + + +/***/ }, +/* 198 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'mean', + 'category': 'Statistics', + 'syntax': [ + 'mean(a, b, c, ...)', + 'mean(A)', + 'mean(A, dim)' + ], + 'description': 'Compute the arithmetic mean of a list of values.', + 'examples': [ + 'mean(2, 3, 4, 1)', + 'mean([2, 3, 4, 1])', + 'mean([2, 5; 4, 3], 0)', + 'mean([2, 5; 4, 3], 1)', + 'mean([1.0, 2.7, 3.2, 4.0])' + ], + 'seealso': [ + //'sum', + //'prod', + //'avg', + //'var', + //'std', + 'max', + 'min' + //'median' + ] + }; + + +/***/ }, +/* 199 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'max', + 'category': 'Statistics', + 'syntax': [ + 'max(a, b, c, ...)', + 'max(A)', + 'max(A, dim)' + ], + 'description': 'Compute the maximum value of a list of values.', + 'examples': [ + 'max(2, 3, 4, 1)', + 'max([2, 3, 4, 1])', + 'max([2, 5; 4, 3], 0)', + 'max([2, 5; 4, 3], 1)', + 'max(2.7, 7.1, -4.5, 2.0, 4.1)', + 'min(2.7, 7.1, -4.5, 2.0, 4.1)' + ], + 'seealso': [ + //'sum', + //'prod', + //'avg', + //'var', + //'std', + 'mean', + //'median', + 'min' + ] + }; + + +/***/ }, +/* 200 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'acos', + 'category': 'Trigonometry', + 'syntax': [ + 'acos(x)' + ], + 'description': 'Compute the inverse cosine of a value in radians.', + 'examples': [ + 'acos(0.5)', + 'acos(cos(2.3))' + ], + 'seealso': [ + 'cos', + 'acos', + 'asin' + ] + }; + + +/***/ }, +/* 201 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'asin', + 'category': 'Trigonometry', + 'syntax': [ + 'asin(x)' + ], + 'description': 'Compute the inverse sine of a value in radians.', + 'examples': [ + 'asin(0.5)', + 'asin(sin(2.3))' + ], + 'seealso': [ + 'sin', + 'acos', + 'asin' + ] + }; + + +/***/ }, +/* 202 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'atan', + 'category': 'Trigonometry', + 'syntax': [ + 'atan(x)' + ], + 'description': 'Compute the inverse tangent of a value in radians.', + 'examples': [ + 'atan(0.5)', + 'atan(tan(2.3))' + ], + 'seealso': [ + 'tan', + 'acos', + 'asin' + ] + }; + + +/***/ }, +/* 203 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'atan2', + 'category': 'Trigonometry', + 'syntax': [ + 'atan2(y, x)' + ], + 'description': + 'Computes the principal value of the arc tangent of y/x in radians.', + 'examples': [ + 'atan2(2, 2) / pi', + 'angle = 60 deg in rad', + 'x = cos(angle)', + 'y = sin(angle)', + 'atan2(y, x)' + ], + 'seealso': [ + 'sin', + 'cos', + 'tan' + ] + }; + + +/***/ }, +/* 204 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'cos', + 'category': 'Trigonometry', + 'syntax': [ + 'cos(x)' + ], + 'description': 'Compute the cosine of x in radians.', + 'examples': [ + 'cos(2)', + 'cos(pi / 4) ^ 2', + 'cos(180 deg)', + 'cos(60 deg)', + 'sin(0.2)^2 + cos(0.2)^2' + ], + 'seealso': [ + 'acos', + 'sin', + 'tan' + ] + }; + + +/***/ }, +/* 205 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'cot', + 'category': 'Trigonometry', + 'syntax': [ + 'cot(x)' + ], + 'description': 'Compute the cotangent of x in radians. Defined as 1/tan(x)', + 'examples': [ + 'cot(2)', + '1 / tan(2)' + ], + 'seealso': [ + 'sec', + 'csc', + 'tan' + ] + }; + + +/***/ }, +/* 206 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'csc', + 'category': 'Trigonometry', + 'syntax': [ + 'csc(x)' + ], + 'description': 'Compute the cosecant of x in radians. Defined as 1/sin(x)', + 'examples': [ + 'csc(2)', + '1 / sin(2)' + ], + 'seealso': [ + 'sec', + 'cot', + 'sin' + ] + }; + + +/***/ }, +/* 207 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'sec', + 'category': 'Trigonometry', + 'syntax': [ + 'sec(x)' + ], + 'description': 'Compute the secant of x in radians. Defined as 1/cos(x)', + 'examples': [ + 'sec(2)', + '1 / cos(2)' + ], + 'seealso': [ + 'cot', + 'csc', + 'cos' + ] + }; + + +/***/ }, +/* 208 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'sin', + 'category': 'Trigonometry', + 'syntax': [ + 'sin(x)' + ], + 'description': 'Compute the sine of x in radians.', + 'examples': [ + 'sin(2)', + 'sin(pi / 4) ^ 2', + 'sin(90 deg)', + 'sin(30 deg)', + 'sin(0.2)^2 + cos(0.2)^2' + ], + 'seealso': [ + 'asin', + 'cos', + 'tan' + ] + }; + + +/***/ }, +/* 209 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'tan', + 'category': 'Trigonometry', + 'syntax': [ + 'tan(x)' + ], + 'description': 'Compute the tangent of x in radians.', + 'examples': [ + 'tan(0.5)', + 'sin(0.5) / cos(0.5)', + 'tan(pi / 4)', + 'tan(45 deg)' + ], + 'seealso': [ + 'atan', + 'sin', + 'cos' + ] + }; + + +/***/ }, +/* 210 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'to', + 'category': 'Units', + 'syntax': [ + 'x to unit', + 'to(x, unit)' + ], + 'description': 'Change the unit of a value.', + 'examples': [ + '5 inch in cm', + '3.2kg in g', + '16 bytes in bits' + ], + 'seealso': [] + }; + + +/***/ }, +/* 211 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'clone', + 'category': 'Utils', + 'syntax': [ + 'clone(x)' + ], + 'description': 'Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices', + 'examples': [ + 'clone(3.5)', + 'clone(2 - 4i)', + 'clone(45 deg)', + 'clone([1, 2; 3, 4])', + 'clone("hello world")' + ], + 'seealso': [] + }; + + +/***/ }, +/* 212 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'map', + 'category': 'Utils', + 'syntax': [ + 'map(x, callback)' + ], + 'description': 'Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.', + 'examples': [ + 'map([1, 2, 3], function(val) { return math.max(val, 1.5) })' + ], + 'seealso': [] + }; + + +/***/ }, +/* 213 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'forEach', + 'category': 'Utils', + 'syntax': [ + 'forEach(x, callback)' + ], + 'description': 'Iterates over all elements of a matrix/array, and executes the given callback.', + 'examples': [ + 'forEach([1, 2, 3], function(val) { console.log(val) })' + ], + 'seealso': [] + }; + + +/***/ }, +/* 214 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'format', + 'category': 'Utils', + 'syntax': [ + 'format(value)', + 'format(value, precision)' + ], + 'description': 'Format a value of any type as string.', + 'examples': [ + 'format(2.3)', + 'format(3 - 4i)', + 'format([])', + 'format(pi, 3)' + ], + 'seealso': ['print'] + }; + + +/***/ }, +/* 215 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'import', + 'category': 'Utils', + 'syntax': [ + 'import(string)' + ], + 'description': 'Import functions from a file.', + 'examples': [ + 'import("numbers")', + 'import("./mylib.js")' + ], + 'seealso': [] + }; + + +/***/ }, +/* 216 */ +/***/ function(module, exports, require) { + + module.exports = { + 'name': 'typeof', + 'category': 'Utils', + 'syntax': [ + 'typeof(x)' + ], + 'description': 'Get the type of a variable.', + 'examples': [ + 'typeof(3.5)', + 'typeof(2 - 4i)', + 'typeof(45 deg)', + 'typeof("hello world")' + ], + 'seealso': [] + }; + + +/***/ }, +/* 217 */ +/***/ function(module, exports, require) { + + /** + * Determine the type of a variable + * + * typeof(x) + * + * @param {*} x + * @return {String} type Lower case type, for example 'number', 'string', + * 'array', 'date'. + */ + exports.type = function type (x) { + var type = typeof x; + + if (type === 'object') { + if (x === null) { + return 'null'; + } + if (x instanceof Boolean) { + return 'boolean'; + } + if (x instanceof Number) { + return 'number'; + } + if (x instanceof String) { + return 'string'; + } + if (Array.isArray(x)) { + return 'array'; + } + if (x instanceof Date) { + return 'date'; + } + } + + return type; + }; + + +/***/ }, +/* 218 */ +/***/ function(module, exports, require) { + + var number = require(221), + BigNumber = require(220); + + /** + * Test whether value is a String + * @param {*} value + * @return {Boolean} isString + */ + exports.isString = function isString(value) { + return (value instanceof String) || (typeof value == 'string'); + }; + + /** + * Check if a text ends with a certain string. + * @param {String} text + * @param {String} search + */ + exports.endsWith = function endsWith(text, search) { + var start = text.length - search.length; + var end = text.length; + return (text.substring(start, end) === search); + }; + + /** + * Format a value of any type into a string. + * + * Usage: + * math.format(value) + * math.format(value, precision) + * + * If value is a function, the returned string is 'function' unless the function + * has a property `description`, in that case this properties value is returned. + * + * Example usage: + * math.format(2/7); // '0.2857142857142857' + * math.format(math.pi, 3); // '3.14' + * math.format(new Complex(2, 3)); // '2 + 3i' + * math.format('hello'); // '"hello"' + * + * @param {*} value Value to be stringified + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @return {String} str + */ + exports.format = function format(value, options) { + if (number.isNumber(value) || value instanceof BigNumber) { + return number.format(value, options); + } + + if (Array.isArray(value)) { + return formatArray(value, options); + } + + if (exports.isString(value)) { + return '"' + value + '"'; + } + + if (typeof value === 'function') { + return value.syntax ? value.syntax + '' : 'function'; + } + + if (value instanceof Object) { + if (typeof value.format === 'function') { + return value.format(options); + } + else { + return value.toString(); + } + } + + return String(value); + }; + + /** + * Recursively format an n-dimensional matrix + * Example output: "[[1, 2], [3, 4]]" + * @param {Array} array + * @param {Object | Number | Function} [options] Formatting options. See + * lib/util/number:format for a + * description of the available + * options. + * @returns {String} str + */ + function formatArray (array, options) { + if (Array.isArray(array)) { + var str = '['; + var len = array.length; + for (var i = 0; i < len; i++) { + if (i != 0) { + str += ', '; + } + str += formatArray(array[i], options); + } + str += ']'; + return str; + } + else { + return exports.format(array, options); + } + } + + +/***/ }, +/* 219 */ +/***/ function(module, exports, require) { + + var map = { + "./clone": 94, + "./clone.js": 94, + "./forEach": 100, + "./forEach.js": 100, + "./format": 95, + "./format.js": 95, + "./import": 96, + "./import.js": 96, + "./map": 97, + "./map.js": 97, + "./print": 98, + "./print.js": 98, + "./typeof": 99, + "./typeof.js": 99 + }; + function webpackContext(req) { + return require(webpackContextResolve(req)); + }; + function webpackContextResolve(req) { + return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }()); + }; + webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); + }; + webpackContext.resolve = webpackContextResolve; + module.exports = webpackContext; + + +/***/ }, +/* 220 */ +/***/ function(module, exports, require) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/* bignumber.js v1.3.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ + + /*jslint ass: true, bitwise: true, eqeq: true, plusplus: true, sub: true, white: true, maxerr: 500 */ + /*global module, define */ + + ;(function ( global ) { + 'use strict'; + + /* + bignumber.js v1.3.0 + A JavaScript library for arbitrary-precision arithmetic. + https://github.com/MikeMcl/bignumber.js + Copyright (c) 2012 Michael Mclaughlin + MIT Expat Licence + */ + + /*********************************** DEFAULTS ************************************/ + + /* + * The default values below must be integers within the stated ranges (inclusive). + * Most of these values can be changed during run-time using BigNumber.config(). + */ + + /* + * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, + * MAX_EXP, and the argument to toFixed, toPrecision and toExponential, beyond + * which an exception is thrown (if ERRORS is true). + */ + var MAX = 1E9, // 0 to 1e+9 + + // Limit of magnitude of exponent argument to toPower. + MAX_POWER = 1E6, // 1 to 1e+6 + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + /* + * The rounding mode used when rounding to the above decimal places, and when + * using toFixed, toPrecision and toExponential, and round (default value). + * UP 0 Away from zero. + * DOWN 1 Towards zero. + * CEIL 2 Towards +Infinity. + * FLOOR 3 Towards -Infinity. + * HALF_UP 4 Towards nearest neighbour. If equidistant, up. + * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + */ + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -MAX, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + MAX_EXP = MAX, // 1 to MAX + + // Whether BigNumber Errors are ever thrown. + // CHANGE parseInt to parseFloat if changing ERRORS to false. + ERRORS = true, // true or false + parse = parseInt, // parseInt or parseFloat + + /***********************************************************************************/ + + P = BigNumber.prototype, + DIGITS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', + outOfRange, + id = 0, + isValid = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + trim = String.prototype.trim || function () {return this.replace(/^\s+|\s+$/g, '')}, + ONE = BigNumber(1); + + + // CONSTRUCTOR - orig = n; - if ( b === e && isValid.test(n) ) { - - // Determine sign. - x['s'] = n.charAt(0) == '-' ? ( n = n.slice(1), -1 ) : 1; + /* + * The exported function. + * Create and return a new instance of a BigNumber object. + * + * n {number|string|BigNumber} A numeric value. + * [b] {number} The base of n. Integer, 2 to 64 inclusive. + */ + function BigNumber( n, b ) { + var e, i, isNum, digits, valid, orig, + x = this; - // Either n is not a valid BigNumber or a base has been specified. - } else { - - // Enable exponential notation to be used with base 10 argument. - // Ensure return value is rounded to DECIMAL_PLACES as with other bases. - if ( b == 10 ) { + // Enable constructor usage without new. + if ( !(x instanceof BigNumber) ) { + return new BigNumber( n, b ) + } + + // Duplicate. + if ( n instanceof BigNumber ) { + id = 0; + + // e is undefined. + if ( b !== e ) { + n += '' + } else { + x['s'] = n['s']; + x['e'] = n['e']; + x['c'] = ( n = n['c'] ) ? n.slice() : n; + return; + } + } + + // If number, check if minus zero. + if ( typeof n != 'string' ) { + n = ( isNum = typeof n == 'number' || + Object.prototype.toString.call(n) == '[object Number]' ) && + n === 0 && 1 / n < 0 ? '-0' : n + ''; + } - return setMode( n, DECIMAL_PLACES, ROUNDING_MODE ); - } + orig = n; - n = trim.call(n).replace( /^\+(?!-)/, '' ); + if ( b === e && isValid.test(n) ) { + + // Determine sign. + x['s'] = n.charAt(0) == '-' ? ( n = n.slice(1), -1 ) : 1; - x['s'] = n.charAt(0) == '-' ? ( n = n.replace( /^-(?!-)/, '' ), -1 ) : 1; + // Either n is not a valid BigNumber or a base has been specified. + } else { + + // Enable exponential notation to be used with base 10 argument. + // Ensure return value is rounded to DECIMAL_PLACES as with other bases. + if ( b == 10 ) { - if ( b != null ) { + return setMode( n, DECIMAL_PLACES, ROUNDING_MODE ); + } - if ( ( b == (b | 0) || !ERRORS ) && - !( outOfRange = !( b >= 2 && b < 65 ) ) ) { + n = trim.call(n).replace( /^\+(?!-)/, '' ); - digits = '[' + DIGITS.slice( 0, b = b | 0 ) + ']+'; + x['s'] = n.charAt(0) == '-' ? ( n = n.replace( /^-(?!-)/, '' ), -1 ) : 1; - // Before non-decimal number validity test and base conversion - // remove the `.` from e.g. '1.', and replace e.g. '.1' with '0.1'. - n = n.replace( /\.$/, '' ).replace( /^\./, '0.' ); + if ( b != null ) { - // Any number in exponential form will fail due to the e+/-. - if ( valid = new RegExp( - '^' + digits + '(?:\\.' + digits + ')?$', b < 37 ? 'i' : '' ).test(n) ) { + if ( ( b == (b | 0) || !ERRORS ) && + !( outOfRange = !( b >= 2 && b < 65 ) ) ) { - if ( isNum ) { + digits = '[' + DIGITS.slice( 0, b = b | 0 ) + ']+'; - if ( n.replace( /^0\.0*|\./, '' ).length > 15 ) { + // Before non-decimal number validity test and base conversion + // remove the `.` from e.g. '1.', and replace e.g. '.1' with '0.1'. + n = n.replace( /\.$/, '' ).replace( /^\./, '0.' ); - // 'new BigNumber() number type has more than 15 significant digits: {n}' - ifExceptionsThrow( orig, 0 ); - } + // Any number in exponential form will fail due to the e+/-. + if ( valid = new RegExp( + '^' + digits + '(?:\\.' + digits + ')?$', b < 37 ? 'i' : '' ).test(n) ) { - // Prevent later check for length on converted number. - isNum = !isNum; - } - n = convert( n, 10, b, x['s'] ); + if ( isNum ) { - } else if ( n != 'Infinity' && n != 'NaN' ) { + if ( n.replace( /^0\.0*|\./, '' ).length > 15 ) { - // 'new BigNumber() not a base {b} number: {n}' - ifExceptionsThrow( orig, 1, b ); - n = 'NaN'; - } - } else { + // 'new BigNumber() number type has more than 15 significant digits: {n}' + ifExceptionsThrow( orig, 0 ); + } - // 'new BigNumber() base not an integer: {b}' - // 'new BigNumber() base out of range: {b}' - ifExceptionsThrow( b, 2 ); + // Prevent later check for length on converted number. + isNum = !isNum; + } + n = convert( n, 10, b, x['s'] ); - // Ignore base. - valid = isValid.test(n); - } - } else { - valid = isValid.test(n); - } + } else if ( n != 'Infinity' && n != 'NaN' ) { - if ( !valid ) { + // 'new BigNumber() not a base {b} number: {n}' + ifExceptionsThrow( orig, 1, b ); + n = 'NaN'; + } + } else { - // Infinity/NaN - x['c'] = x['e'] = null; + // 'new BigNumber() base not an integer: {b}' + // 'new BigNumber() base out of range: {b}' + ifExceptionsThrow( b, 2 ); - // NaN - if ( n != 'Infinity' ) { + // Ignore base. + valid = isValid.test(n); + } + } else { + valid = isValid.test(n); + } - // No exception on NaN. - if ( n != 'NaN' ) { + if ( !valid ) { - // 'new BigNumber() not a number: {n}' - ifExceptionsThrow( orig, 3 ); - } - x['s'] = null; - } - id = 0; + // Infinity/NaN + x['c'] = x['e'] = null; - return; - } - } + // NaN + if ( n != 'Infinity' ) { - // Decimal point? - if ( ( e = n.indexOf('.') ) > -1 ) { - n = n.replace( '.', '' ); - } + // No exception on NaN. + if ( n != 'NaN' ) { - // Exponential form? - if ( ( i = n.search( /e/i ) ) > 0 ) { + // 'new BigNumber() not a number: {n}' + ifExceptionsThrow( orig, 3 ); + } + x['s'] = null; + } + id = 0; - // Determine exponent. - if ( e < 0 ) { - e = i; - } - e += +n.slice( i + 1 ); - n = n.substring( 0, i ); - - } else if ( e < 0 ) { - - // Integer. - e = n.length; - } - - // Determine leading zeros. - for ( i = 0; n.charAt(i) == '0'; i++ ) { - } - - b = n.length; - - // Disallow numbers with over 15 significant digits if number type. - if ( isNum && b > 15 && n.slice(i).length > 15 ) { - - // 'new BigNumber() number type has more than 15 significant digits: {n}' - ifExceptionsThrow( orig, 0 ); - } - id = 0; - - // Overflow? - if ( ( e -= i + 1 ) > MAX_EXP ) { - - // Infinity. - x['c'] = x['e'] = null; - - // Zero or underflow? - } else if ( i == b || e < MIN_EXP ) { - - // Zero. - x['c'] = [ x['e'] = 0 ]; - } else { - - // Determine trailing zeros. - for ( ; n.charAt(--b) == '0'; ) { - } - - x['e'] = e; - x['c'] = []; - - // Convert string to array of digits (without leading and trailing zeros). - for ( e = 0; i <= b; x['c'][e++] = +n.charAt(i++) ) { - } - } - } - - - // CONSTRUCTOR PROPERTIES/METHODS - - - BigNumber['ROUND_UP'] = 0; - BigNumber['ROUND_DOWN'] = 1; - BigNumber['ROUND_CEIL'] = 2; - BigNumber['ROUND_FLOOR'] = 3; - BigNumber['ROUND_HALF_UP'] = 4; - BigNumber['ROUND_HALF_DOWN'] = 5; - BigNumber['ROUND_HALF_EVEN'] = 6; - BigNumber['ROUND_HALF_CEIL'] = 7; - BigNumber['ROUND_HALF_FLOOR'] = 8; - - - /* - * Configure infrequently-changing library-wide settings. - * - * Accept an object or an argument list, with one or many of the following - * properties or parameters respectively: - * [ DECIMAL_PLACES [, ROUNDING_MODE [, EXPONENTIAL_AT [, RANGE [, ERRORS ]]]]] - * - * E.g. - * BigNumber.config(20, 4) is equivalent to - * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) - * Ignore properties/parameters set to null or undefined. - * - * Return an object with the properties current values. - */ - BigNumber['config'] = function () { - var v, p, - i = 0, - r = {}, - a = arguments, - o = a[0], - c = 'config', - inRange = function ( n, lo, hi ) { - return !( ( outOfRange = n < lo || n > hi ) || - parse(n) != n && n !== 0 ); - }, - has = o && typeof o == 'object' - ? function () {if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null} - : function () {if ( a.length > i ) return ( v = a[i++] ) != null}; - - // [DECIMAL_PLACES] {number} Integer, 0 to MAX inclusive. - if ( has( p = 'DECIMAL_PLACES' ) ) { - - if ( inRange( v, 0, MAX ) ) { - DECIMAL_PLACES = v | 0; - } else { - - // 'config() DECIMAL_PLACES not an integer: {v}' - // 'config() DECIMAL_PLACES out of range: {v}' - ifExceptionsThrow( v, p, c ); - } - } - r[p] = DECIMAL_PLACES; - - // [ROUNDING_MODE] {number} Integer, 0 to 8 inclusive. - if ( has( p = 'ROUNDING_MODE' ) ) { - - if ( inRange( v, 0, 8 ) ) { - ROUNDING_MODE = v | 0; - } else { - - // 'config() ROUNDING_MODE not an integer: {v}' - // 'config() ROUNDING_MODE out of range: {v}' - ifExceptionsThrow( v, p, c ); - } - } - r[p] = ROUNDING_MODE; - - /* - * [EXPONENTIAL_AT] {number|number[]} Integer, -MAX to MAX inclusive or - * [ integer -MAX to 0 inclusive, 0 to MAX inclusive ]. - */ - if ( has( p = 'EXPONENTIAL_AT' ) ) { - - if ( inRange( v, -MAX, MAX ) ) { - TO_EXP_NEG = -( TO_EXP_POS = ~~( v < 0 ? -v : +v ) ); - } else if ( !outOfRange && v && inRange( v[0], -MAX, 0 ) && - inRange( v[1], 0, MAX ) ) { - TO_EXP_NEG = ~~v[0]; - TO_EXP_POS = ~~v[1]; - } else { - - // 'config() EXPONENTIAL_AT not an integer or not [integer, integer]: {v}' - // 'config() EXPONENTIAL_AT out of range or not [negative, positive: {v}' - ifExceptionsThrow( v, p, c, 1 ); - } - } - r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; - - /* - * [RANGE][ {number|number[]} Non-zero integer, -MAX to MAX inclusive or - * [ integer -MAX to -1 inclusive, integer 1 to MAX inclusive ]. - */ - if ( has( p = 'RANGE' ) ) { - - if ( inRange( v, -MAX, MAX ) && ~~v ) { - MIN_EXP = -( MAX_EXP = ~~( v < 0 ? -v : +v ) ); - } else if ( !outOfRange && v && inRange( v[0], -MAX, -1 ) && - inRange( v[1], 1, MAX ) ) { - MIN_EXP = ~~v[0], MAX_EXP = ~~v[1]; - } else { - - // 'config() RANGE not a non-zero integer or not [integer, integer]: {v}' - // 'config() RANGE out of range or not [negative, positive: {v}' - ifExceptionsThrow( v, p, c, 1, 1 ); - } - } - r[p] = [ MIN_EXP, MAX_EXP ]; - - // [ERRORS] {boolean|number} true, false, 1 or 0. - if ( has( p = 'ERRORS' ) ) { - - if ( v === !!v || v === 1 || v === 0 ) { - parse = ( outOfRange = id = 0, ERRORS = !!v ) - ? parseInt - : parseFloat; - } else { - - // 'config() ERRORS not a boolean or binary digit: {v}' - ifExceptionsThrow( v, p, c, 0, 0, 1 ); - } - } - r[p] = ERRORS; - - return r; - }; - - - // PRIVATE FUNCTIONS - - - // Assemble error messages. Throw BigNumber Errors. - function ifExceptionsThrow( arg, i, j, isArray, isRange, isErrors) { - - if ( ERRORS ) { - var error, - method = ['new BigNumber', 'cmp', 'div', 'eq', 'gt', 'gte', 'lt', - 'lte', 'minus', 'mod', 'plus', 'times', 'toFr' - ][ id ? id < 0 ? -id : id : 1 / id < 0 ? 1 : 0 ] + '()', - message = outOfRange ? ' out of range' : ' not a' + - ( isRange ? ' non-zero' : 'n' ) + ' integer'; - - message = ( [ - method + ' number type has more than 15 significant digits', - method + ' not a base ' + j + ' number', - method + ' base' + message, - method + ' not a number' ][i] || - j + '() ' + i + ( isErrors - ? ' not a boolean or binary digit' - : message + ( isArray - ? ' or not [' + ( outOfRange - ? ' negative, positive' - : ' integer, integer' ) + ' ]' - : '' ) ) ) + ': ' + arg; - - outOfRange = id = 0; - error = new Error(message); - error['name'] = 'BigNumber Error'; - - throw error; - } - } - - - /* - * Convert a numeric string of baseIn to a numeric string of baseOut. - */ - function convert( nStr, baseOut, baseIn, sign ) { - var e, dvs, dvd, nArr, fracArr, fracBN; - - // Convert string of base bIn to an array of numbers of baseOut. - // Eg. strToArr('255', 10) where baseOut is 16, returns [15, 15]. - // Eg. strToArr('ff', 16) where baseOut is 10, returns [2, 5, 5]. - function strToArr( str, bIn ) { - var j, - i = 0, - strL = str.length, - arrL, - arr = [0]; - - for ( bIn = bIn || baseIn; i < strL; i++ ) { - - for ( arrL = arr.length, j = 0; j < arrL; arr[j] *= bIn, j++ ) { - } - - for ( arr[0] += DIGITS.indexOf( str.charAt(i) ), j = 0; - j < arr.length; - j++ ) { - - if ( arr[j] > baseOut - 1 ) { - - if ( arr[j + 1] == null ) { - arr[j + 1] = 0; - } - arr[j + 1] += arr[j] / baseOut ^ 0; - arr[j] %= baseOut; - } - } - } - - return arr.reverse(); - } - - // Convert array to string. - // E.g. arrToStr( [9, 10, 11] ) becomes '9ab' (in bases above 11). - function arrToStr( arr ) { - var i = 0, - arrL = arr.length, - str = ''; - - for ( ; i < arrL; str += DIGITS.charAt( arr[i++] ) ) { - } - - return str; - } - - if ( baseIn < 37 ) { - nStr = nStr.toLowerCase(); - } - - /* - * If non-integer convert integer part and fraction part separately. - * Convert the fraction part as if it is an integer than use division to - * reduce it down again to a value less than one. - */ - if ( ( e = nStr.indexOf( '.' ) ) > -1 ) { - - /* - * Calculate the power to which to raise the base to get the number - * to divide the fraction part by after it has been converted as an - * integer to the required base. - */ - e = nStr.length - e - 1; - - // Use toFixed to avoid possible exponential notation. - dvs = strToArr( new BigNumber(baseIn)['pow'](e)['toF'](), 10 ); - - nArr = nStr.split('.'); - - // Convert the base of the fraction part (as integer). - dvd = strToArr( nArr[1] ); - - // Convert the base of the integer part. - nArr = strToArr( nArr[0] ); - - // Result will be a BigNumber with a value less than 1. - fracBN = divide( dvd, dvs, dvd.length - dvs.length, sign, baseOut, - // Is least significant digit of integer part an odd number? - nArr[nArr.length - 1] & 1 ); - - fracArr = fracBN['c']; - - // e can be <= 0 ( if e == 0, fracArr is [0] or [1] ). - if ( e = fracBN['e'] ) { - - // Append zeros according to the exponent of the result. - for ( ; ++e; fracArr.unshift(0) ) { - } - - // Append the fraction part to the converted integer part. - nStr = arrToStr(nArr) + '.' + arrToStr(fracArr); - - // fracArr is [1]. - // Fraction digits rounded up, so increment last digit of integer part. - } else if ( fracArr[0] ) { - - if ( nArr[ e = nArr.length - 1 ] < baseOut - 1 ) { - ++nArr[e]; - nStr = arrToStr(nArr); - } else { - nStr = new BigNumber( arrToStr(nArr), - baseOut )['plus'](ONE)['toS'](baseOut); - } - - // fracArr is [0]. No fraction digits. - } else { - nStr = arrToStr(nArr); - } - } else { - - // Simple integer. Convert base. - nStr = arrToStr( strToArr(nStr) ); - } - - return nStr; - } - - - // Perform division in the specified base. Called by div and convert. - function divide( dvd, dvs, exp, s, base, isOdd ) { - var dvsL, dvsT, next, cmp, remI, - dvsZ = dvs.slice(), - dvdI = dvsL = dvs.length, - dvdL = dvd.length, - rem = dvd.slice( 0, dvsL ), - remL = rem.length, - quo = new BigNumber(ONE), - qc = quo['c'] = [], - qi = 0, - dig = DECIMAL_PLACES + ( quo['e'] = exp ) + 1; - - quo['s'] = s; - s = dig < 0 ? 0 : dig; - - // Add zeros to make remainder as long as divisor. - for ( ; remL++ < dvsL; rem.push(0) ) { - } - - // Create version of divisor with leading zero. - dvsZ.unshift(0); - - do { - - // 'next' is how many times the divisor goes into the current remainder. - for ( next = 0; next < base; next++ ) { - - // Compare divisor and remainder. - if ( dvsL != ( remL = rem.length ) ) { - cmp = dvsL > remL ? 1 : -1; - } else { - for ( remI = -1, cmp = 0; ++remI < dvsL; ) { - - if ( dvs[remI] != rem[remI] ) { - cmp = dvs[remI] > rem[remI] ? 1 : -1; - break; - } - } - } - - // Subtract divisor from remainder (if divisor < remainder). - if ( cmp < 0 ) { - - // Remainder cannot be more than one digit longer than divisor. - // Equalise lengths using divisor with extra leading zero? - for ( dvsT = remL == dvsL ? dvs : dvsZ; remL; ) { - - if ( rem[--remL] < dvsT[remL] ) { - - for ( remI = remL; - remI && !rem[--remI]; - rem[remI] = base - 1 ) { - } - --rem[remI]; - rem[remL] += base; - } - rem[remL] -= dvsT[remL]; - } - for ( ; !rem[0]; rem.shift() ) { - } - } else { - break; - } - } - - // Add the 'next' digit to the result array. - qc[qi++] = cmp ? next : ++next; - - // Update the remainder. - rem[0] && cmp - ? ( rem[remL] = dvd[dvdI] || 0 ) - : ( rem = [ dvd[dvdI] ] ); - - } while ( ( dvdI++ < dvdL || rem[0] != null ) && s-- ); - - // Leading zero? Do not remove if result is simply zero (qi == 1). - if ( !qc[0] && qi != 1 ) { - - // There can't be more than one zero. - --quo['e']; - qc.shift(); - } - - // Round? - if ( qi > dig ) { - rnd( quo, DECIMAL_PLACES, base, isOdd, rem[0] != null ); - } - - // Overflow? - if ( quo['e'] > MAX_EXP ) { - - // Infinity. - quo['c'] = quo['e'] = null; - - // Underflow? - } else if ( quo['e'] < MIN_EXP ) { - - // Zero. - quo['c'] = [quo['e'] = 0]; - } - - return quo; - } - - - /* - * Return a string representing the value of BigNumber n in normal or - * exponential notation rounded to the specified decimal places or - * significant digits. - * Called by toString, toExponential (exp 1), toFixed, and toPrecision (exp 2). - * d is the index (with the value in normal notation) of the digit that may be - * rounded up. - */ - function format( n, d, exp ) { - - // Initially, i is the number of decimal places required. - var i = d - (n = new BigNumber(n))['e'], - c = n['c']; - - // +-Infinity or NaN? - if ( !c ) { - return n['toS'](); - } - - // Round? - if ( c.length > ++d ) { - rnd( n, i, 10 ); - } - - // Recalculate d if toFixed as n['e'] may have changed if value rounded up. - i = c[0] == 0 ? i + 1 : exp ? d : n['e'] + i + 1; - - // Append zeros? - for ( ; c.length < i; c.push(0) ) { - } - i = n['e']; - - /* - * toPrecision returns exponential notation if the number of significant - * digits specified is less than the number of digits necessary to - * represent the integer part of the value in normal notation. - */ - return exp == 1 || exp == 2 && ( --d < i || i <= TO_EXP_NEG ) - - // Exponential notation. - ? ( n['s'] < 0 && c[0] ? '-' : '' ) + ( c.length > 1 - ? ( c.splice( 1, 0, '.' ), c.join('') ) - : c[0] ) + ( i < 0 ? 'e' : 'e+' ) + i - - // Normal notation. - : n['toS'](); - } - - - // Round if necessary. - // Called by divide, format, setMode and sqrt. - function rnd( x, dp, base, isOdd, r ) { - var xc = x['c'], - isNeg = x['s'] < 0, - half = base / 2, - i = x['e'] + dp + 1, - - // 'next' is the digit after the digit that may be rounded up. - next = xc[i], - - /* - * 'more' is whether there are digits after 'next'. - * E.g. - * 0.005 (e = -3) to be rounded to 0 decimal places (dp = 0) gives i = -2 - * The 'next' digit is zero, and there ARE 'more' digits after it. - * 0.5 (e = -1) dp = 0 gives i = 0 - * The 'next' digit is 5 and there are no 'more' digits after it. - */ - more = r || i < 0 || xc[i + 1] != null; - - r = ROUNDING_MODE < 4 - ? ( next != null || more ) && - ( ROUNDING_MODE == 0 || - ROUNDING_MODE == 2 && !isNeg || - ROUNDING_MODE == 3 && isNeg ) - : next > half || next == half && - ( ROUNDING_MODE == 4 || more || - - /* - * isOdd is used in base conversion and refers to the least significant - * digit of the integer part of the value to be converted. The fraction - * part is rounded by this method separately from the integer part. - */ - ROUNDING_MODE == 6 && ( xc[i - 1] & 1 || !dp && isOdd ) || - ROUNDING_MODE == 7 && !isNeg || - ROUNDING_MODE == 8 && isNeg ); - - if ( i < 1 || !xc[0] ) { - xc.length = 0; - xc.push(0); - - if ( r ) { - - // 1, 0.1, 0.01, 0.001, 0.0001 etc. - xc[0] = 1; - x['e'] = -dp; - } else { - - // Zero. - x['e'] = 0; - } - - return x; - } - - // Remove any digits after the required decimal places. - xc.length = i--; - - // Round up? - if ( r ) { - - // Rounding up may mean the previous digit has to be rounded up and so on. - for ( --base; ++xc[i] > base; ) { - xc[i] = 0; - - if ( !i-- ) { - ++x['e']; - xc.unshift(1); - } - } - } - - // Remove trailing zeros. - for ( i = xc.length; !xc[--i]; xc.pop() ) { - } - - return x; - } - - - // Round after setting the appropriate rounding mode. - // Handles ceil, floor and round. - function setMode( x, dp, rm ) { - var r = ROUNDING_MODE; - - ROUNDING_MODE = rm; - x = new BigNumber(x); - x['c'] && rnd( x, dp, 10 ); - ROUNDING_MODE = r; - - return x; - } - - - // PROTOTYPE/INSTANCE METHODS - - - /* - * Return a new BigNumber whose value is the absolute value of this BigNumber. - */ - P['abs'] = P['absoluteValue'] = function () { - var x = new BigNumber(this); - - if ( x['s'] < 0 ) { - x['s'] = 1; - } - - return x; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber - * rounded to a whole number in the direction of Infinity. - */ - P['ceil'] = function () { - return setMode( this, 0, 2 ); - }; - - - /* - * Return - * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), - * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), - * 0 if they have the same value, - * or null if the value of either is NaN. - */ - P['comparedTo'] = P['cmp'] = function ( y, b ) { - var a, - x = this, - xc = x['c'], - yc = ( id = -id, y = new BigNumber( y, b ) )['c'], - i = x['s'], - j = y['s'], - k = x['e'], - l = y['e']; - - // Either NaN? - if ( !i || !j ) { - return null; - } - - a = xc && !xc[0], b = yc && !yc[0]; - - // Either zero? - if ( a || b ) { - return a ? b ? 0 : -j : i; - } - - // Signs differ? - if ( i != j ) { - return i; - } - - // Either Infinity? - if ( a = i < 0, b = k == l, !xc || !yc ) { - return b ? 0 : !xc ^ a ? 1 : -1; - } - - // Compare exponents. - if ( !b ) { - return k > l ^ a ? 1 : -1; - } - - // Compare digit by digit. - for ( i = -1, - j = ( k = xc.length ) < ( l = yc.length ) ? k : l; - ++i < j; ) { - - if ( xc[i] != yc[i] ) { - return xc[i] > yc[i] ^ a ? 1 : -1; - } - } - // Compare lengths. - return k == l ? 0 : k > l ^ a ? 1 : -1; - }; - - - /* - * n / 0 = I - * n / N = N - * n / I = 0 - * 0 / n = 0 - * 0 / 0 = N - * 0 / N = N - * 0 / I = 0 - * N / n = N - * N / 0 = N - * N / N = N - * N / I = N - * I / n = I - * I / 0 = I - * I / N = N - * I / I = N - * - * Return a new BigNumber whose value is the value of this BigNumber - * divided by the value of BigNumber(y, b), rounded according to - * DECIMAL_PLACES and ROUNDING_MODE. - */ - P['dividedBy'] = P['div'] = function ( y, b ) { - var xc = this['c'], - xe = this['e'], - xs = this['s'], - yc = ( id = 2, y = new BigNumber( y, b ) )['c'], - ye = y['e'], - ys = y['s'], - s = xs == ys ? 1 : -1; - - // Either NaN/Infinity/0? - return !xe && ( !xc || !xc[0] ) || !ye && ( !yc || !yc[0] ) - - // Either NaN? - ? new BigNumber( !xs || !ys || - - // Both 0 or both Infinity? - ( xc ? yc && xc[0] == yc[0] : !yc ) - - // Return NaN. - ? NaN - - // x is 0 or y is Infinity? - : xc && xc[0] == 0 || !yc - - // Return +-0. - ? s * 0 - - // y is 0. Return +-Infinity. - : s / 0 ) - - : divide( xc, yc, xe - ye, s, 10 ); - }; - - - /* - * Return true if the value of this BigNumber is equal to the value of - * BigNumber(n, b), otherwise returns false. - */ - P['equals'] = P['eq'] = function ( n, b ) { - id = 3; - return this['cmp']( n, b ) === 0; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber - * rounded to a whole number in the direction of -Infinity. - */ - P['floor'] = function () { - return setMode( this, 0, 3 ); - }; - - - /* - * Return true if the value of this BigNumber is greater than the value of - * BigNumber(n, b), otherwise returns false. - */ - P['greaterThan'] = P['gt'] = function ( n, b ) { - id = 4; - return this['cmp']( n, b ) > 0; - }; - - - /* - * Return true if the value of this BigNumber is greater than or equal to - * the value of BigNumber(n, b), otherwise returns false. - */ - P['greaterThanOrEqualTo'] = P['gte'] = function ( n, b ) { - id = 5; - return ( b = this['cmp']( n, b ) ) == 1 || b === 0; - }; - - - /* - * Return true if the value of this BigNumber is a finite number, otherwise - * returns false. - */ - P['isFinite'] = P['isF'] = function () { - return !!this['c']; - }; - - - /* - * Return true if the value of this BigNumber is NaN, otherwise returns - * false. - */ - P['isNaN'] = function () { - return !this['s']; - }; - - - /* - * Return true if the value of this BigNumber is negative, otherwise - * returns false. - */ - P['isNegative'] = P['isNeg'] = function () { - return this['s'] < 0; - }; - - - /* - * Return true if the value of this BigNumber is 0 or -0, otherwise returns - * false. - */ - P['isZero'] = P['isZ'] = function () { - return !!this['c'] && this['c'][0] == 0; - }; - - - /* - * Return true if the value of this BigNumber is less than the value of - * BigNumber(n, b), otherwise returns false. - */ - P['lessThan'] = P['lt'] = function ( n, b ) { - id = 6; - return this['cmp']( n, b ) < 0; - }; - - - /* - * Return true if the value of this BigNumber is less than or equal to the - * value of BigNumber(n, b), otherwise returns false. - */ - P['lessThanOrEqualTo'] = P['lte'] = function ( n, b ) { - id = 7; - return ( b = this['cmp']( n, b ) ) == -1 || b === 0; - }; - - - /* - * n - 0 = n - * n - N = N - * n - I = -I - * 0 - n = -n - * 0 - 0 = 0 - * 0 - N = N - * 0 - I = -I - * N - n = N - * N - 0 = N - * N - N = N - * N - I = N - * I - n = I - * I - 0 = I - * I - N = N - * I - I = N - * - * Return a new BigNumber whose value is the value of this BigNumber minus - * the value of BigNumber(y, b). - */ - P['minus'] = function ( y, b ) { - var d, i, j, xLTy, - x = this, - a = x['s']; - - b = ( id = 8, y = new BigNumber( y, b ) )['s']; - - // Either NaN? - if ( !a || !b ) { - return new BigNumber(NaN); - } - - // Signs differ? - if ( a != b ) { - return y['s'] = -b, x['plus'](y); - } - - var xc = x['c'], - xe = x['e'], - yc = y['c'], - ye = y['e']; - - if ( !xe || !ye ) { - - // Either Infinity? - if ( !xc || !yc ) { - return xc ? ( y['s'] = -b, y ) : new BigNumber( yc ? x : NaN ); - } - - // Either zero? - if ( !xc[0] || !yc[0] ) { - - // y is non-zero? - return yc[0] - ? ( y['s'] = -b, y ) - - // x is non-zero? - : new BigNumber( xc[0] - ? x - - // Both are zero. - // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity - : ROUNDING_MODE == 3 ? -0 : 0 ); - } - } - - // Determine which is the bigger number. - // Prepend zeros to equalise exponents. - if ( xc = xc.slice(), a = xe - ye ) { - d = ( xLTy = a < 0 ) ? ( a = -a, xc ) : ( ye = xe, yc ); - - for ( d.reverse(), b = a; b--; d.push(0) ) { - } - d.reverse(); - } else { - - // Exponents equal. Check digit by digit. - j = ( ( xLTy = xc.length < yc.length ) ? xc : yc ).length; - - for ( a = b = 0; b < j; b++ ) { - - if ( xc[b] != yc[b] ) { - xLTy = xc[b] < yc[b]; - break; - } - } - } - - // x < y? Point xc to the array of the bigger number. - if ( xLTy ) { - d = xc, xc = yc, yc = d; - y['s'] = -y['s']; - } - - /* - * Append zeros to xc if shorter. No need to add zeros to yc if shorter - * as subtraction only needs to start at yc.length. - */ - if ( ( b = -( ( j = xc.length ) - yc.length ) ) > 0 ) { - - for ( ; b--; xc[j++] = 0 ) { - } - } - - // Subtract yc from xc. - for ( b = yc.length; b > a; ){ - - if ( xc[--b] < yc[b] ) { - - for ( i = b; i && !xc[--i]; xc[i] = 9 ) { - } - --xc[i]; - xc[b] += 10; - } - xc[b] -= yc[b]; - } - - // Remove trailing zeros. - for ( ; xc[--j] == 0; xc.pop() ) { - } - - // Remove leading zeros and adjust exponent accordingly. - for ( ; xc[0] == 0; xc.shift(), --ye ) { - } - - /* - * No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity - * when neither x or y are Infinity. - */ - - // Underflow? - if ( ye < MIN_EXP || !xc[0] ) { - - /* - * Following IEEE 754 (2008) 6.3, - * n - n = +0 but n - n = -0 when rounding towards -Infinity. - */ - if ( !xc[0] ) { - y['s'] = ROUNDING_MODE == 3 ? -1 : 1; - } - - // Result is zero. - xc = [ye = 0]; - } - - return y['c'] = xc, y['e'] = ye, y; - }; - - - /* - * n % 0 = N - * n % N = N - * 0 % n = 0 - * -0 % n = -0 - * 0 % 0 = N - * 0 % N = N - * N % n = N - * N % 0 = N - * N % N = N - * - * Return a new BigNumber whose value is the value of this BigNumber modulo - * the value of BigNumber(y, b). - */ - P['modulo'] = P['mod'] = function ( y, b ) { - var x = this, - xc = x['c'], - yc = ( id = 9, y = new BigNumber( y, b ) )['c'], - i = x['s'], - j = y['s']; - - // Is x or y NaN, or y zero? - b = !i || !j || yc && !yc[0]; - - if ( b || xc && !xc[0] ) { - return new BigNumber( b ? NaN : x ); - } - - x['s'] = y['s'] = 1; - b = y['cmp'](x) == 1; - x['s'] = i, y['s'] = j; - - return b - ? new BigNumber(x) - : ( i = DECIMAL_PLACES, j = ROUNDING_MODE, - DECIMAL_PLACES = 0, ROUNDING_MODE = 1, - x = x['div'](y), - DECIMAL_PLACES = i, ROUNDING_MODE = j, - this['minus']( x['times'](y) ) ); - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber - * negated, i.e. multiplied by -1. - */ - P['negated'] = P['neg'] = function () { - var x = new BigNumber(this); - - return x['s'] = -x['s'] || null, x; - }; - - - /* - * n + 0 = n - * n + N = N - * n + I = I - * 0 + n = n - * 0 + 0 = 0 - * 0 + N = N - * 0 + I = I - * N + n = N - * N + 0 = N - * N + N = N - * N + I = N - * I + n = I - * I + 0 = I - * I + N = N - * I + I = I - * - * Return a new BigNumber whose value is the value of this BigNumber plus - * the value of BigNumber(y, b). - */ - P['plus'] = function ( y, b ) { - var d, - x = this, - a = x['s']; - - b = ( id = 10, y = new BigNumber( y, b ) )['s']; - - // Either NaN? - if ( !a || !b ) { - return new BigNumber(NaN); - } - - // Signs differ? - if ( a != b ) { - return y['s'] = -b, x['minus'](y); - } - - var xe = x['e'], - xc = x['c'], - ye = y['e'], - yc = y['c']; - - if ( !xe || !ye ) { - - // Either Infinity? - if ( !xc || !yc ) { - - // Return +-Infinity. - return new BigNumber( a / 0 ); - } - - // Either zero? - if ( !xc[0] || !yc[0] ) { - - // y is non-zero? - return yc[0] - ? y - - // x is non-zero? - : new BigNumber( xc[0] - ? x - - // Both are zero. Return zero. - : a * 0 ); - } - } - - // Prepend zeros to equalise exponents. - // Note: Faster to use reverse then do unshifts. - if ( xc = xc.slice(), a = xe - ye ) { - d = a > 0 ? ( ye = xe, yc ) : ( a = -a, xc ); - - for ( d.reverse(); a--; d.push(0) ) { - } - d.reverse(); - } - - // Point xc to the longer array. - if ( xc.length - yc.length < 0 ) { - d = yc, yc = xc, xc = d; - } - - /* - * Only start adding at yc.length - 1 as the - * further digits of xc can be left as they are. - */ - for ( a = yc.length, b = 0; a; - b = ( xc[--a] = xc[a] + yc[a] + b ) / 10 ^ 0, xc[a] %= 10 ) { - } - - // No need to check for zero, as +x + +y != 0 && -x + -y != 0 - - if ( b ) { - xc.unshift(b); - - // Overflow? (MAX_EXP + 1 possible) - if ( ++ye > MAX_EXP ) { - - // Infinity. - xc = ye = null; - } - } - - // Remove trailing zeros. - for ( a = xc.length; xc[--a] == 0; xc.pop() ) { - } - - return y['c'] = xc, y['e'] = ye, y; - }; - - - /* - * Return a BigNumber whose value is the value of this BigNumber raised to - * the power e. If e is negative round according to DECIMAL_PLACES and - * ROUNDING_MODE. - * - * e {number} Integer, -MAX_POWER to MAX_POWER inclusive. - */ - P['toPower'] = P['pow'] = function ( e ) { - - // e to integer, avoiding NaN or Infinity becoming 0. - var i = e * 0 == 0 ? e | 0 : e, - x = new BigNumber(this), - y = new BigNumber(ONE); - - // Use Math.pow? - // Pass +-Infinity for out of range exponents. - if ( ( ( ( outOfRange = e < -MAX_POWER || e > MAX_POWER ) && - (i = e * 1 / 0) ) || - - /* - * Any exponent that fails the parse becomes NaN. - * - * Include 'e !== 0' because on Opera -0 == parseFloat(-0) is false, - * despite -0 === parseFloat(-0) && -0 == parseFloat('-0') is true. - */ - parse(e) != e && e !== 0 && !(i = NaN) ) && - - // 'pow() exponent not an integer: {e}' - // 'pow() exponent out of range: {e}' - !ifExceptionsThrow( e, 'exponent', 'pow' ) || - - // Pass zero to Math.pow, as any value to the power zero is 1. - !i ) { - - // i is +-Infinity, NaN or 0. - return new BigNumber( Math.pow( x['toS'](), i ) ); - } - - for ( i = i < 0 ? -i : i; ; ) { - - if ( i & 1 ) { - y = y['times'](x); - } - i >>= 1; - - if ( !i ) { - break; - } - x = x['times'](x); - } - - return e < 0 ? ONE['div'](y) : y; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber - * rounded to a maximum of dp decimal places using rounding mode rm, or to - * 0 and ROUNDING_MODE respectively if omitted. - * - * [dp] {number} Integer, 0 to MAX inclusive. - * [rm] {number} Integer, 0 to 8 inclusive. - */ - P['round'] = function ( dp, rm ) { - - dp = dp == null || ( ( ( outOfRange = dp < 0 || dp > MAX ) || - parse(dp) != dp ) && - - // 'round() decimal places out of range: {dp}' - // 'round() decimal places not an integer: {dp}' - !ifExceptionsThrow( dp, 'decimal places', 'round' ) ) - ? 0 - : dp | 0; - - rm = rm == null || ( ( ( outOfRange = rm < 0 || rm > 8 ) || - - // Include '&& rm !== 0' because with Opera -0 == parseFloat(-0) is false. - parse(rm) != rm && rm !== 0 ) && - - // 'round() mode not an integer: {rm}' - // 'round() mode out of range: {rm}' - !ifExceptionsThrow( rm, 'mode', 'round' ) ) - ? ROUNDING_MODE - : rm | 0; - - return setMode( this, dp, rm ); - }; - - - /* - * sqrt(-n) = N - * sqrt( N) = N - * sqrt(-I) = N - * sqrt( I) = I - * sqrt( 0) = 0 - * sqrt(-0) = -0 - * - * Return a new BigNumber whose value is the square root of the value of - * this BigNumber, rounded according to DECIMAL_PLACES and ROUNDING_MODE. - */ - P['squareRoot'] = P['sqrt'] = function () { - var n, r, re, t, - x = this, - c = x['c'], - s = x['s'], - e = x['e'], - dp = DECIMAL_PLACES, - rm = ROUNDING_MODE, - half = new BigNumber('0.5'); - - // Negative/NaN/Infinity/zero? - if ( s !== 1 || !c || !c[0] ) { - - return new BigNumber( !s || s < 0 && ( !c || c[0] ) - ? NaN - : c ? x : 1 / 0 ); - } - - // Initial estimate. - s = Math.sqrt( x['toS']() ); - ROUNDING_MODE = 1; - - /* - Math.sqrt underflow/overflow? - Pass x to Math.sqrt as integer, then adjust the exponent of the result. - */ - if ( s == 0 || s == 1 / 0 ) { - n = c.join(''); - - if ( !( n.length + e & 1 ) ) { - n += '0'; - } - r = new BigNumber( Math.sqrt(n) + '' ); - - // r may still not be finite. - if ( !r['c'] ) { - r['c'] = [1]; - } - r['e'] = ( ( ( e + 1 ) / 2 ) | 0 ) - ( e < 0 || e & 1 ); - } else { - r = new BigNumber( n = s.toString() ); - } - re = r['e']; - s = re + ( DECIMAL_PLACES += 4 ); - - if ( s < 3 ) { - s = 0; - } - e = s; - - // Newton-Raphson iteration. - for ( ; ; ) { - t = r; - r = half['times']( t['plus']( x['div'](t) ) ); - - if ( t['c'].slice( 0, s ).join('') === r['c'].slice( 0, s ).join('') ) { - c = r['c']; - - /* - The exponent of r may here be one less than the final result - exponent (re), e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust - s so the rounding digits are indexed correctly. - */ - s = s - ( n && r['e'] < re ); - - /* - The 4th rounding digit may be in error by -1 so if the 4 rounding - digits are 9999 or 4999 (i.e. approaching a rounding boundary) - continue the iteration. - */ - if ( c[s] == 9 && c[s - 1] == 9 && c[s - 2] == 9 && - ( c[s - 3] == 9 || n && c[s - 3] == 4 ) ) { - - /* - If 9999 on first run through, check to see if rounding up - gives the exact result as the nines may infinitely repeat. - */ - if ( n && c[s - 3] == 9 ) { - t = r['round']( dp, 0 ); - - if ( t['times'](t)['eq'](x) ) { - ROUNDING_MODE = rm; - DECIMAL_PLACES = dp; - - return t; - } - } - DECIMAL_PLACES += 4; - s += 4; - n = ''; - } else { - - /* - If the rounding digits are null, 0000 or 5000, check for an - exact result. If not, then there are further digits so - increment the 1st rounding digit to ensure correct rounding. - */ - if ( !c[e] && !c[e - 1] && !c[e - 2] && - ( !c[e - 3] || c[e - 3] == 5 ) ) { - - // Truncate to the first rounding digit. - if ( c.length > e - 2 ) { - c.length = e - 2; - } - - if ( !r['times'](r)['eq'](x) ) { - - while ( c.length < e - 3 ) { - c.push(0); - } - c[e - 3]++; - } - } - ROUNDING_MODE = rm; - rnd( r, DECIMAL_PLACES = dp, 10 ); - - return r; - } - } - } - }; - - - /* - * n * 0 = 0 - * n * N = N - * n * I = I - * 0 * n = 0 - * 0 * 0 = 0 - * 0 * N = N - * 0 * I = N - * N * n = N - * N * 0 = N - * N * N = N - * N * I = N - * I * n = I - * I * 0 = N - * I * N = N - * I * I = I - * - * Return a new BigNumber whose value is the value of this BigNumber times - * the value of BigNumber(y, b). - */ - P['times'] = function ( y, b ) { - var c, - x = this, - xc = x['c'], - yc = ( id = 11, y = new BigNumber( y, b ) )['c'], - i = x['e'], - j = y['e'], - a = x['s']; - - y['s'] = a == ( b = y['s'] ) ? 1 : -1; - - // Either NaN/Infinity/0? - if ( !i && ( !xc || !xc[0] ) || !j && ( !yc || !yc[0] ) ) { - - // Either NaN? - return new BigNumber( !a || !b || - - // x is 0 and y is Infinity or y is 0 and x is Infinity? - xc && !xc[0] && !yc || yc && !yc[0] && !xc - - // Return NaN. - ? NaN - - // Either Infinity? - : !xc || !yc - - // Return +-Infinity. - ? y['s'] / 0 - - // x or y is 0. Return +-0. - : y['s'] * 0 ); - } - y['e'] = i + j; - - if ( ( a = xc.length ) < ( b = yc.length ) ) { - c = xc, xc = yc, yc = c, j = a, a = b, b = j; - } - - for ( j = a + b, c = []; j--; c.push(0) ) { - } - - // Multiply! - for ( i = b - 1; i > -1; i-- ) { - - for ( b = 0, j = a + i; - j > i; - b = c[j] + yc[i] * xc[j - i - 1] + b, - c[j--] = b % 10 | 0, - b = b / 10 | 0 ) { - } - - if ( b ) { - c[j] = ( c[j] + b ) % 10; - } - } - - b && ++y['e']; - - // Remove any leading zero. - !c[0] && c.shift(); - - // Remove trailing zeros. - for ( j = c.length; !c[--j]; c.pop() ) { - } - - // No zero check needed as only x * 0 == 0 etc. - - // Overflow? - y['c'] = y['e'] > MAX_EXP - - // Infinity. - ? ( y['e'] = null ) - - // Underflow? - : y['e'] < MIN_EXP - - // Zero. - ? [ y['e'] = 0 ] - - // Neither. - : c; - - return y; - }; - - - /* - * Return a string representing the value of this BigNumber in exponential - * notation to dp fixed decimal places and rounded using ROUNDING_MODE if - * necessary. - * - * [dp] {number} Integer, 0 to MAX inclusive. - */ - P['toExponential'] = P['toE'] = function ( dp ) { - - return format( this, - ( dp == null || ( ( outOfRange = dp < 0 || dp > MAX ) || - - /* - * Include '&& dp !== 0' because with Opera -0 == parseFloat(-0) is - * false, despite -0 == parseFloat('-0') && 0 == -0 being true. - */ - parse(dp) != dp && dp !== 0 ) && - - // 'toE() decimal places not an integer: {dp}' - // 'toE() decimal places out of range: {dp}' - !ifExceptionsThrow( dp, 'decimal places', 'toE' ) ) && this['c'] - ? this['c'].length - 1 - : dp | 0, 1 ); - }; - - - /* - * Return a string representing the value of this BigNumber in normal - * notation to dp fixed decimal places and rounded using ROUNDING_MODE if - * necessary. - * - * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', - * but e.g. (-0.00001).toFixed(0) is '-0'. - * - * [dp] {number} Integer, 0 to MAX inclusive. - */ - P['toFixed'] = P['toF'] = function ( dp ) { - var n, str, d, - x = this; - - if ( !( dp == null || ( ( outOfRange = dp < 0 || dp > MAX ) || - parse(dp) != dp && dp !== 0 ) && - - // 'toF() decimal places not an integer: {dp}' - // 'toF() decimal places out of range: {dp}' - !ifExceptionsThrow( dp, 'decimal places', 'toF' ) ) ) { - d = x['e'] + ( dp | 0 ); - } - - n = TO_EXP_NEG, dp = TO_EXP_POS; - TO_EXP_NEG = -( TO_EXP_POS = 1 / 0 ); - - // Note: str is initially undefined. - if ( d == str ) { - str = x['toS'](); - } else { - str = format( x, d ); - - // (-0).toFixed() is '0', but (-0.1).toFixed() is '-0'. - // (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. - if ( x['s'] < 0 && x['c'] ) { - - // As e.g. -0 toFixed(3), will wrongly be returned as -0.000 from toString. - if ( !x['c'][0] ) { - str = str.replace(/^-/, ''); - - // As e.g. -0.5 if rounded to -0 will cause toString to omit the minus sign. - } else if ( str.indexOf('-') < 0 ) { - str = '-' + str; - } - } - } - TO_EXP_NEG = n, TO_EXP_POS = dp; - - return str; - }; - - - /* - * Return a string array representing the value of this BigNumber as a - * simple fraction with an integer numerator and an integer denominator. - * The denominator will be a positive non-zero value less than or equal to - * the specified maximum denominator. If a maximum denominator is not - * specified, the denominator will be the lowest value necessary to - * represent the number exactly. - * - * [maxD] {number|string|BigNumber} Integer >= 1 and < Infinity. - */ - P['toFraction'] = P['toFr'] = function ( maxD ) { - var q, frac, n0, d0, d2, n, e, - n1 = d0 = new BigNumber(ONE), - d1 = n0 = new BigNumber('0'), - x = this, - xc = x['c'], - exp = MAX_EXP, - dp = DECIMAL_PLACES, - rm = ROUNDING_MODE, - d = new BigNumber(ONE); - - // NaN, Infinity. - if ( !xc ) { - return x['toS'](); - } - - e = d['e'] = xc.length - x['e'] - 1; - - // If max denominator is undefined or null... - if ( maxD == null || - - // or NaN... - ( !( id = 12, n = new BigNumber(maxD) )['s'] || - - // or less than 1, or Infinity... - ( outOfRange = n['cmp'](n1) < 0 || !n['c'] ) || - - // or not an integer... - ( ERRORS && n['e'] < n['c'].length - 1 ) ) && - - // 'toFr() max denominator not an integer: {maxD}' - // 'toFr() max denominator out of range: {maxD}' - !ifExceptionsThrow( maxD, 'max denominator', 'toFr' ) || - - // or greater than the maxD needed to specify the value exactly... - ( maxD = n )['cmp'](d) > 0 ) { - - // d is e.g. 10, 100, 1000, 10000... , n1 is 1. - maxD = e > 0 ? d : n1; - } - - MAX_EXP = 1 / 0; - n = new BigNumber( xc.join('') ); - - for ( DECIMAL_PLACES = 0, ROUNDING_MODE = 1; ; ) { - q = n['div'](d); - d2 = d0['plus']( q['times'](d1) ); - - if ( d2['cmp'](maxD) == 1 ) { - break; - } - - d0 = d1, d1 = d2; - - n1 = n0['plus']( q['times']( d2 = n1 ) ); - n0 = d2; - - d = n['minus']( q['times']( d2 = d ) ); - n = d2; - } - - d2 = maxD['minus'](d0)['div'](d1); - n0 = n0['plus']( d2['times'](n1) ); - d0 = d0['plus']( d2['times'](d1) ); - - n0['s'] = n1['s'] = x['s']; - - DECIMAL_PLACES = e * 2; - ROUNDING_MODE = rm; - - // Determine which fraction is closer to x, n0 / d0 or n1 / d1? - frac = n1['div'](d1)['minus'](x)['abs']()['cmp']( - n0['div'](d0)['minus'](x)['abs']() ) < 1 - ? [ n1['toS'](), d1['toS']() ] - : [ n0['toS'](), d0['toS']() ]; - - return MAX_EXP = exp, DECIMAL_PLACES = dp, frac; - }; - - - /* - * Return a string representing the value of this BigNumber to sd significant - * digits and rounded using ROUNDING_MODE if necessary. - * If sd is less than the number of digits necessary to represent the integer - * part of the value in normal notation, then use exponential notation. - * - * sd {number} Integer, 1 to MAX inclusive. - */ - P['toPrecision'] = P['toP'] = function ( sd ) { - - /* - * ERRORS true: Throw if sd not undefined, null or an integer in range. - * ERRORS false: Ignore sd if not a number or not in range. - * Truncate non-integers. - */ - return sd == null || ( ( ( outOfRange = sd < 1 || sd > MAX ) || - parse(sd) != sd ) && - - // 'toP() precision not an integer: {sd}' - // 'toP() precision out of range: {sd}' - !ifExceptionsThrow( sd, 'precision', 'toP' ) ) - ? this['toS']() - : format( this, --sd | 0, 2 ); - }; - - - /* - * Return a string representing the value of this BigNumber in base b, or - * base 10 if b is omitted. If a base is specified, including base 10, - * round according to DECIMAL_PLACES and ROUNDING_MODE. - * If a base is not specified, and this BigNumber has a positive exponent - * that is equal to or greater than TO_EXP_POS, or a negative exponent equal - * to or less than TO_EXP_NEG, return exponential notation. - * - * [b] {number} Integer, 2 to 64 inclusive. - */ - P['toString'] = P['toS'] = function ( b ) { - var u, str, strL, - x = this, - xe = x['e']; - - // Infinity or NaN? - if ( xe === null ) { - str = x['s'] ? 'Infinity' : 'NaN'; - - // Exponential format? - } else if ( b === u && ( xe <= TO_EXP_NEG || xe >= TO_EXP_POS ) ) { - return format( x, x['c'].length - 1, 1 ); - } else { - str = x['c'].join(''); - - // Negative exponent? - if ( xe < 0 ) { - - // Prepend zeros. - for ( ; ++xe; str = '0' + str ) { - } - str = '0.' + str; - - // Positive exponent? - } else if ( strL = str.length, xe > 0 ) { - - if ( ++xe > strL ) { - - // Append zeros. - for ( xe -= strL; xe-- ; str += '0' ) { - } - } else if ( xe < strL ) { - str = str.slice( 0, xe ) + '.' + str.slice(xe); - } - - // Exponent zero. - } else { - if ( u = str.charAt(0), strL > 1 ) { - str = u + '.' + str.slice(1); - - // Avoid '-0' - } else if ( u == '0' ) { - return u; - } - } - - if ( b != null ) { - - if ( !( outOfRange = !( b >= 2 && b < 65 ) ) && - ( b == (b | 0) || !ERRORS ) ) { - str = convert( str, b | 0, 10, x['s'] ); - - // Avoid '-0' - if ( str == '0' ) { - return str; - } - } else { - - // 'toS() base not an integer: {b}' - // 'toS() base out of range: {b}' - ifExceptionsThrow( b, 'base', 'toS' ); - } - } - - } - - return x['s'] < 0 ? '-' + str : str; - }; - - - /* - * Return as toString, but do not accept a base argument. - */ - P['valueOf'] = function () { - return this['toS'](); - }; - - - // Add aliases for BigDecimal methods. - //P['add'] = P['plus']; - //P['subtract'] = P['minus']; - //P['multiply'] = P['times']; - //P['divide'] = P['div']; - //P['remainder'] = P['mod']; - //P['compareTo'] = P['cmp']; - //P['negate'] = P['neg']; - - - // EXPORT - - - // Node and other CommonJS-like environments that support module.exports. - if ( typeof module !== 'undefined' && module.exports ) { - module.exports = BigNumber; - - //AMD. - } else if ( typeof define == 'function' && define.amd ) { - define( function () { - return BigNumber; - }); + return; + } + } - //Browser. - } else { - global['BigNumber'] = BigNumber; - } + // Decimal point? + if ( ( e = n.indexOf('.') ) > -1 ) { + n = n.replace( '.', '' ); + } -})( this ); + // Exponential form? + if ( ( i = n.search( /e/i ) ) > 0 ) { -},{}]},{},[1]) -(1) -}); \ No newline at end of file + // Determine exponent. + if ( e < 0 ) { + e = i; + } + e += +n.slice( i + 1 ); + n = n.substring( 0, i ); + + } else if ( e < 0 ) { + + // Integer. + e = n.length; + } + + // Determine leading zeros. + for ( i = 0; n.charAt(i) == '0'; i++ ) { + } + + b = n.length; + + // Disallow numbers with over 15 significant digits if number type. + if ( isNum && b > 15 && n.slice(i).length > 15 ) { + + // 'new BigNumber() number type has more than 15 significant digits: {n}' + ifExceptionsThrow( orig, 0 ); + } + id = 0; + + // Overflow? + if ( ( e -= i + 1 ) > MAX_EXP ) { + + // Infinity. + x['c'] = x['e'] = null; + + // Zero or underflow? + } else if ( i == b || e < MIN_EXP ) { + + // Zero. + x['c'] = [ x['e'] = 0 ]; + } else { + + // Determine trailing zeros. + for ( ; n.charAt(--b) == '0'; ) { + } + + x['e'] = e; + x['c'] = []; + + // Convert string to array of digits (without leading and trailing zeros). + for ( e = 0; i <= b; x['c'][e++] = +n.charAt(i++) ) { + } + } + } + + + // CONSTRUCTOR PROPERTIES/METHODS + + + BigNumber['ROUND_UP'] = 0; + BigNumber['ROUND_DOWN'] = 1; + BigNumber['ROUND_CEIL'] = 2; + BigNumber['ROUND_FLOOR'] = 3; + BigNumber['ROUND_HALF_UP'] = 4; + BigNumber['ROUND_HALF_DOWN'] = 5; + BigNumber['ROUND_HALF_EVEN'] = 6; + BigNumber['ROUND_HALF_CEIL'] = 7; + BigNumber['ROUND_HALF_FLOOR'] = 8; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object or an argument list, with one or many of the following + * properties or parameters respectively: + * [ DECIMAL_PLACES [, ROUNDING_MODE [, EXPONENTIAL_AT [, RANGE [, ERRORS ]]]]] + * + * E.g. + * BigNumber.config(20, 4) is equivalent to + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * Ignore properties/parameters set to null or undefined. + * + * Return an object with the properties current values. + */ + BigNumber['config'] = function () { + var v, p, + i = 0, + r = {}, + a = arguments, + o = a[0], + c = 'config', + inRange = function ( n, lo, hi ) { + return !( ( outOfRange = n < lo || n > hi ) || + parse(n) != n && n !== 0 ); + }, + has = o && typeof o == 'object' + ? function () {if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null} + : function () {if ( a.length > i ) return ( v = a[i++] ) != null}; + + // [DECIMAL_PLACES] {number} Integer, 0 to MAX inclusive. + if ( has( p = 'DECIMAL_PLACES' ) ) { + + if ( inRange( v, 0, MAX ) ) { + DECIMAL_PLACES = v | 0; + } else { + + // 'config() DECIMAL_PLACES not an integer: {v}' + // 'config() DECIMAL_PLACES out of range: {v}' + ifExceptionsThrow( v, p, c ); + } + } + r[p] = DECIMAL_PLACES; + + // [ROUNDING_MODE] {number} Integer, 0 to 8 inclusive. + if ( has( p = 'ROUNDING_MODE' ) ) { + + if ( inRange( v, 0, 8 ) ) { + ROUNDING_MODE = v | 0; + } else { + + // 'config() ROUNDING_MODE not an integer: {v}' + // 'config() ROUNDING_MODE out of range: {v}' + ifExceptionsThrow( v, p, c ); + } + } + r[p] = ROUNDING_MODE; + + /* + * [EXPONENTIAL_AT] {number|number[]} Integer, -MAX to MAX inclusive or + * [ integer -MAX to 0 inclusive, 0 to MAX inclusive ]. + */ + if ( has( p = 'EXPONENTIAL_AT' ) ) { + + if ( inRange( v, -MAX, MAX ) ) { + TO_EXP_NEG = -( TO_EXP_POS = ~~( v < 0 ? -v : +v ) ); + } else if ( !outOfRange && v && inRange( v[0], -MAX, 0 ) && + inRange( v[1], 0, MAX ) ) { + TO_EXP_NEG = ~~v[0]; + TO_EXP_POS = ~~v[1]; + } else { + + // 'config() EXPONENTIAL_AT not an integer or not [integer, integer]: {v}' + // 'config() EXPONENTIAL_AT out of range or not [negative, positive: {v}' + ifExceptionsThrow( v, p, c, 1 ); + } + } + r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; + + /* + * [RANGE][ {number|number[]} Non-zero integer, -MAX to MAX inclusive or + * [ integer -MAX to -1 inclusive, integer 1 to MAX inclusive ]. + */ + if ( has( p = 'RANGE' ) ) { + + if ( inRange( v, -MAX, MAX ) && ~~v ) { + MIN_EXP = -( MAX_EXP = ~~( v < 0 ? -v : +v ) ); + } else if ( !outOfRange && v && inRange( v[0], -MAX, -1 ) && + inRange( v[1], 1, MAX ) ) { + MIN_EXP = ~~v[0], MAX_EXP = ~~v[1]; + } else { + + // 'config() RANGE not a non-zero integer or not [integer, integer]: {v}' + // 'config() RANGE out of range or not [negative, positive: {v}' + ifExceptionsThrow( v, p, c, 1, 1 ); + } + } + r[p] = [ MIN_EXP, MAX_EXP ]; + + // [ERRORS] {boolean|number} true, false, 1 or 0. + if ( has( p = 'ERRORS' ) ) { + + if ( v === !!v || v === 1 || v === 0 ) { + parse = ( outOfRange = id = 0, ERRORS = !!v ) + ? parseInt + : parseFloat; + } else { + + // 'config() ERRORS not a boolean or binary digit: {v}' + ifExceptionsThrow( v, p, c, 0, 0, 1 ); + } + } + r[p] = ERRORS; + + return r; + }; + + + // PRIVATE FUNCTIONS + + + // Assemble error messages. Throw BigNumber Errors. + function ifExceptionsThrow( arg, i, j, isArray, isRange, isErrors) { + + if ( ERRORS ) { + var error, + method = ['new BigNumber', 'cmp', 'div', 'eq', 'gt', 'gte', 'lt', + 'lte', 'minus', 'mod', 'plus', 'times', 'toFr' + ][ id ? id < 0 ? -id : id : 1 / id < 0 ? 1 : 0 ] + '()', + message = outOfRange ? ' out of range' : ' not a' + + ( isRange ? ' non-zero' : 'n' ) + ' integer'; + + message = ( [ + method + ' number type has more than 15 significant digits', + method + ' not a base ' + j + ' number', + method + ' base' + message, + method + ' not a number' ][i] || + j + '() ' + i + ( isErrors + ? ' not a boolean or binary digit' + : message + ( isArray + ? ' or not [' + ( outOfRange + ? ' negative, positive' + : ' integer, integer' ) + ' ]' + : '' ) ) ) + ': ' + arg; + + outOfRange = id = 0; + error = new Error(message); + error['name'] = 'BigNumber Error'; + + throw error; + } + } + + + /* + * Convert a numeric string of baseIn to a numeric string of baseOut. + */ + function convert( nStr, baseOut, baseIn, sign ) { + var e, dvs, dvd, nArr, fracArr, fracBN; + + // Convert string of base bIn to an array of numbers of baseOut. + // Eg. strToArr('255', 10) where baseOut is 16, returns [15, 15]. + // Eg. strToArr('ff', 16) where baseOut is 10, returns [2, 5, 5]. + function strToArr( str, bIn ) { + var j, + i = 0, + strL = str.length, + arrL, + arr = [0]; + + for ( bIn = bIn || baseIn; i < strL; i++ ) { + + for ( arrL = arr.length, j = 0; j < arrL; arr[j] *= bIn, j++ ) { + } + + for ( arr[0] += DIGITS.indexOf( str.charAt(i) ), j = 0; + j < arr.length; + j++ ) { + + if ( arr[j] > baseOut - 1 ) { + + if ( arr[j + 1] == null ) { + arr[j + 1] = 0; + } + arr[j + 1] += arr[j] / baseOut ^ 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + // Convert array to string. + // E.g. arrToStr( [9, 10, 11] ) becomes '9ab' (in bases above 11). + function arrToStr( arr ) { + var i = 0, + arrL = arr.length, + str = ''; + + for ( ; i < arrL; str += DIGITS.charAt( arr[i++] ) ) { + } + + return str; + } + + if ( baseIn < 37 ) { + nStr = nStr.toLowerCase(); + } + + /* + * If non-integer convert integer part and fraction part separately. + * Convert the fraction part as if it is an integer than use division to + * reduce it down again to a value less than one. + */ + if ( ( e = nStr.indexOf( '.' ) ) > -1 ) { + + /* + * Calculate the power to which to raise the base to get the number + * to divide the fraction part by after it has been converted as an + * integer to the required base. + */ + e = nStr.length - e - 1; + + // Use toFixed to avoid possible exponential notation. + dvs = strToArr( new BigNumber(baseIn)['pow'](e)['toF'](), 10 ); + + nArr = nStr.split('.'); + + // Convert the base of the fraction part (as integer). + dvd = strToArr( nArr[1] ); + + // Convert the base of the integer part. + nArr = strToArr( nArr[0] ); + + // Result will be a BigNumber with a value less than 1. + fracBN = divide( dvd, dvs, dvd.length - dvs.length, sign, baseOut, + // Is least significant digit of integer part an odd number? + nArr[nArr.length - 1] & 1 ); + + fracArr = fracBN['c']; + + // e can be <= 0 ( if e == 0, fracArr is [0] or [1] ). + if ( e = fracBN['e'] ) { + + // Append zeros according to the exponent of the result. + for ( ; ++e; fracArr.unshift(0) ) { + } + + // Append the fraction part to the converted integer part. + nStr = arrToStr(nArr) + '.' + arrToStr(fracArr); + + // fracArr is [1]. + // Fraction digits rounded up, so increment last digit of integer part. + } else if ( fracArr[0] ) { + + if ( nArr[ e = nArr.length - 1 ] < baseOut - 1 ) { + ++nArr[e]; + nStr = arrToStr(nArr); + } else { + nStr = new BigNumber( arrToStr(nArr), + baseOut )['plus'](ONE)['toS'](baseOut); + } + + // fracArr is [0]. No fraction digits. + } else { + nStr = arrToStr(nArr); + } + } else { + + // Simple integer. Convert base. + nStr = arrToStr( strToArr(nStr) ); + } + + return nStr; + } + + + // Perform division in the specified base. Called by div and convert. + function divide( dvd, dvs, exp, s, base, isOdd ) { + var dvsL, dvsT, next, cmp, remI, + dvsZ = dvs.slice(), + dvdI = dvsL = dvs.length, + dvdL = dvd.length, + rem = dvd.slice( 0, dvsL ), + remL = rem.length, + quo = new BigNumber(ONE), + qc = quo['c'] = [], + qi = 0, + dig = DECIMAL_PLACES + ( quo['e'] = exp ) + 1; + + quo['s'] = s; + s = dig < 0 ? 0 : dig; + + // Add zeros to make remainder as long as divisor. + for ( ; remL++ < dvsL; rem.push(0) ) { + } + + // Create version of divisor with leading zero. + dvsZ.unshift(0); + + do { + + // 'next' is how many times the divisor goes into the current remainder. + for ( next = 0; next < base; next++ ) { + + // Compare divisor and remainder. + if ( dvsL != ( remL = rem.length ) ) { + cmp = dvsL > remL ? 1 : -1; + } else { + for ( remI = -1, cmp = 0; ++remI < dvsL; ) { + + if ( dvs[remI] != rem[remI] ) { + cmp = dvs[remI] > rem[remI] ? 1 : -1; + break; + } + } + } + + // Subtract divisor from remainder (if divisor < remainder). + if ( cmp < 0 ) { + + // Remainder cannot be more than one digit longer than divisor. + // Equalise lengths using divisor with extra leading zero? + for ( dvsT = remL == dvsL ? dvs : dvsZ; remL; ) { + + if ( rem[--remL] < dvsT[remL] ) { + + for ( remI = remL; + remI && !rem[--remI]; + rem[remI] = base - 1 ) { + } + --rem[remI]; + rem[remL] += base; + } + rem[remL] -= dvsT[remL]; + } + for ( ; !rem[0]; rem.shift() ) { + } + } else { + break; + } + } + + // Add the 'next' digit to the result array. + qc[qi++] = cmp ? next : ++next; + + // Update the remainder. + rem[0] && cmp + ? ( rem[remL] = dvd[dvdI] || 0 ) + : ( rem = [ dvd[dvdI] ] ); + + } while ( ( dvdI++ < dvdL || rem[0] != null ) && s-- ); + + // Leading zero? Do not remove if result is simply zero (qi == 1). + if ( !qc[0] && qi != 1 ) { + + // There can't be more than one zero. + --quo['e']; + qc.shift(); + } + + // Round? + if ( qi > dig ) { + rnd( quo, DECIMAL_PLACES, base, isOdd, rem[0] != null ); + } + + // Overflow? + if ( quo['e'] > MAX_EXP ) { + + // Infinity. + quo['c'] = quo['e'] = null; + + // Underflow? + } else if ( quo['e'] < MIN_EXP ) { + + // Zero. + quo['c'] = [quo['e'] = 0]; + } + + return quo; + } + + + /* + * Return a string representing the value of BigNumber n in normal or + * exponential notation rounded to the specified decimal places or + * significant digits. + * Called by toString, toExponential (exp 1), toFixed, and toPrecision (exp 2). + * d is the index (with the value in normal notation) of the digit that may be + * rounded up. + */ + function format( n, d, exp ) { + + // Initially, i is the number of decimal places required. + var i = d - (n = new BigNumber(n))['e'], + c = n['c']; + + // +-Infinity or NaN? + if ( !c ) { + return n['toS'](); + } + + // Round? + if ( c.length > ++d ) { + rnd( n, i, 10 ); + } + + // Recalculate d if toFixed as n['e'] may have changed if value rounded up. + i = c[0] == 0 ? i + 1 : exp ? d : n['e'] + i + 1; + + // Append zeros? + for ( ; c.length < i; c.push(0) ) { + } + i = n['e']; + + /* + * toPrecision returns exponential notation if the number of significant + * digits specified is less than the number of digits necessary to + * represent the integer part of the value in normal notation. + */ + return exp == 1 || exp == 2 && ( --d < i || i <= TO_EXP_NEG ) + + // Exponential notation. + ? ( n['s'] < 0 && c[0] ? '-' : '' ) + ( c.length > 1 + ? ( c.splice( 1, 0, '.' ), c.join('') ) + : c[0] ) + ( i < 0 ? 'e' : 'e+' ) + i + + // Normal notation. + : n['toS'](); + } + + + // Round if necessary. + // Called by divide, format, setMode and sqrt. + function rnd( x, dp, base, isOdd, r ) { + var xc = x['c'], + isNeg = x['s'] < 0, + half = base / 2, + i = x['e'] + dp + 1, + + // 'next' is the digit after the digit that may be rounded up. + next = xc[i], + + /* + * 'more' is whether there are digits after 'next'. + * E.g. + * 0.005 (e = -3) to be rounded to 0 decimal places (dp = 0) gives i = -2 + * The 'next' digit is zero, and there ARE 'more' digits after it. + * 0.5 (e = -1) dp = 0 gives i = 0 + * The 'next' digit is 5 and there are no 'more' digits after it. + */ + more = r || i < 0 || xc[i + 1] != null; + + r = ROUNDING_MODE < 4 + ? ( next != null || more ) && + ( ROUNDING_MODE == 0 || + ROUNDING_MODE == 2 && !isNeg || + ROUNDING_MODE == 3 && isNeg ) + : next > half || next == half && + ( ROUNDING_MODE == 4 || more || + + /* + * isOdd is used in base conversion and refers to the least significant + * digit of the integer part of the value to be converted. The fraction + * part is rounded by this method separately from the integer part. + */ + ROUNDING_MODE == 6 && ( xc[i - 1] & 1 || !dp && isOdd ) || + ROUNDING_MODE == 7 && !isNeg || + ROUNDING_MODE == 8 && isNeg ); + + if ( i < 1 || !xc[0] ) { + xc.length = 0; + xc.push(0); + + if ( r ) { + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = 1; + x['e'] = -dp; + } else { + + // Zero. + x['e'] = 0; + } + + return x; + } + + // Remove any digits after the required decimal places. + xc.length = i--; + + // Round up? + if ( r ) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for ( --base; ++xc[i] > base; ) { + xc[i] = 0; + + if ( !i-- ) { + ++x['e']; + xc.unshift(1); + } + } + } + + // Remove trailing zeros. + for ( i = xc.length; !xc[--i]; xc.pop() ) { + } + + return x; + } + + + // Round after setting the appropriate rounding mode. + // Handles ceil, floor and round. + function setMode( x, dp, rm ) { + var r = ROUNDING_MODE; + + ROUNDING_MODE = rm; + x = new BigNumber(x); + x['c'] && rnd( x, dp, 10 ); + ROUNDING_MODE = r; + + return x; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P['abs'] = P['absoluteValue'] = function () { + var x = new BigNumber(this); + + if ( x['s'] < 0 ) { + x['s'] = 1; + } + + return x; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber + * rounded to a whole number in the direction of Infinity. + */ + P['ceil'] = function () { + return setMode( this, 0, 2 ); + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P['comparedTo'] = P['cmp'] = function ( y, b ) { + var a, + x = this, + xc = x['c'], + yc = ( id = -id, y = new BigNumber( y, b ) )['c'], + i = x['s'], + j = y['s'], + k = x['e'], + l = y['e']; + + // Either NaN? + if ( !i || !j ) { + return null; + } + + a = xc && !xc[0], b = yc && !yc[0]; + + // Either zero? + if ( a || b ) { + return a ? b ? 0 : -j : i; + } + + // Signs differ? + if ( i != j ) { + return i; + } + + // Either Infinity? + if ( a = i < 0, b = k == l, !xc || !yc ) { + return b ? 0 : !xc ^ a ? 1 : -1; + } + + // Compare exponents. + if ( !b ) { + return k > l ^ a ? 1 : -1; + } + + // Compare digit by digit. + for ( i = -1, + j = ( k = xc.length ) < ( l = yc.length ) ? k : l; + ++i < j; ) { + + if ( xc[i] != yc[i] ) { + return xc[i] > yc[i] ^ a ? 1 : -1; + } + } + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber + * divided by the value of BigNumber(y, b), rounded according to + * DECIMAL_PLACES and ROUNDING_MODE. + */ + P['dividedBy'] = P['div'] = function ( y, b ) { + var xc = this['c'], + xe = this['e'], + xs = this['s'], + yc = ( id = 2, y = new BigNumber( y, b ) )['c'], + ye = y['e'], + ys = y['s'], + s = xs == ys ? 1 : -1; + + // Either NaN/Infinity/0? + return !xe && ( !xc || !xc[0] ) || !ye && ( !yc || !yc[0] ) + + // Either NaN? + ? new BigNumber( !xs || !ys || + + // Both 0 or both Infinity? + ( xc ? yc && xc[0] == yc[0] : !yc ) + + // Return NaN. + ? NaN + + // x is 0 or y is Infinity? + : xc && xc[0] == 0 || !yc + + // Return +-0. + ? s * 0 + + // y is 0. Return +-Infinity. + : s / 0 ) + + : divide( xc, yc, xe - ye, s, 10 ); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of + * BigNumber(n, b), otherwise returns false. + */ + P['equals'] = P['eq'] = function ( n, b ) { + id = 3; + return this['cmp']( n, b ) === 0; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber + * rounded to a whole number in the direction of -Infinity. + */ + P['floor'] = function () { + return setMode( this, 0, 3 ); + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of + * BigNumber(n, b), otherwise returns false. + */ + P['greaterThan'] = P['gt'] = function ( n, b ) { + id = 4; + return this['cmp']( n, b ) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to + * the value of BigNumber(n, b), otherwise returns false. + */ + P['greaterThanOrEqualTo'] = P['gte'] = function ( n, b ) { + id = 5; + return ( b = this['cmp']( n, b ) ) == 1 || b === 0; + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise + * returns false. + */ + P['isFinite'] = P['isF'] = function () { + return !!this['c']; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise returns + * false. + */ + P['isNaN'] = function () { + return !this['s']; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise + * returns false. + */ + P['isNegative'] = P['isNeg'] = function () { + return this['s'] < 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise returns + * false. + */ + P['isZero'] = P['isZ'] = function () { + return !!this['c'] && this['c'][0] == 0; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of + * BigNumber(n, b), otherwise returns false. + */ + P['lessThan'] = P['lt'] = function ( n, b ) { + id = 6; + return this['cmp']( n, b ) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the + * value of BigNumber(n, b), otherwise returns false. + */ + P['lessThanOrEqualTo'] = P['lte'] = function ( n, b ) { + id = 7; + return ( b = this['cmp']( n, b ) ) == -1 || b === 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus + * the value of BigNumber(y, b). + */ + P['minus'] = function ( y, b ) { + var d, i, j, xLTy, + x = this, + a = x['s']; + + b = ( id = 8, y = new BigNumber( y, b ) )['s']; + + // Either NaN? + if ( !a || !b ) { + return new BigNumber(NaN); + } + + // Signs differ? + if ( a != b ) { + return y['s'] = -b, x['plus'](y); + } + + var xc = x['c'], + xe = x['e'], + yc = y['c'], + ye = y['e']; + + if ( !xe || !ye ) { + + // Either Infinity? + if ( !xc || !yc ) { + return xc ? ( y['s'] = -b, y ) : new BigNumber( yc ? x : NaN ); + } + + // Either zero? + if ( !xc[0] || !yc[0] ) { + + // y is non-zero? + return yc[0] + ? ( y['s'] = -b, y ) + + // x is non-zero? + : new BigNumber( xc[0] + ? x + + // Both are zero. + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + : ROUNDING_MODE == 3 ? -0 : 0 ); + } + } + + // Determine which is the bigger number. + // Prepend zeros to equalise exponents. + if ( xc = xc.slice(), a = xe - ye ) { + d = ( xLTy = a < 0 ) ? ( a = -a, xc ) : ( ye = xe, yc ); + + for ( d.reverse(), b = a; b--; d.push(0) ) { + } + d.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = ( ( xLTy = xc.length < yc.length ) ? xc : yc ).length; + + for ( a = b = 0; b < j; b++ ) { + + if ( xc[b] != yc[b] ) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if ( xLTy ) { + d = xc, xc = yc, yc = d; + y['s'] = -y['s']; + } + + /* + * Append zeros to xc if shorter. No need to add zeros to yc if shorter + * as subtraction only needs to start at yc.length. + */ + if ( ( b = -( ( j = xc.length ) - yc.length ) ) > 0 ) { + + for ( ; b--; xc[j++] = 0 ) { + } + } + + // Subtract yc from xc. + for ( b = yc.length; b > a; ){ + + if ( xc[--b] < yc[b] ) { + + for ( i = b; i && !xc[--i]; xc[i] = 9 ) { + } + --xc[i]; + xc[b] += 10; + } + xc[b] -= yc[b]; + } + + // Remove trailing zeros. + for ( ; xc[--j] == 0; xc.pop() ) { + } + + // Remove leading zeros and adjust exponent accordingly. + for ( ; xc[0] == 0; xc.shift(), --ye ) { + } + + /* + * No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + * when neither x or y are Infinity. + */ + + // Underflow? + if ( ye < MIN_EXP || !xc[0] ) { + + /* + * Following IEEE 754 (2008) 6.3, + * n - n = +0 but n - n = -0 when rounding towards -Infinity. + */ + if ( !xc[0] ) { + y['s'] = ROUNDING_MODE == 3 ? -1 : 1; + } + + // Result is zero. + xc = [ye = 0]; + } + + return y['c'] = xc, y['e'] = ye, y; + }; + + + /* + * n % 0 = N + * n % N = N + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * N % n = N + * N % 0 = N + * N % N = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo + * the value of BigNumber(y, b). + */ + P['modulo'] = P['mod'] = function ( y, b ) { + var x = this, + xc = x['c'], + yc = ( id = 9, y = new BigNumber( y, b ) )['c'], + i = x['s'], + j = y['s']; + + // Is x or y NaN, or y zero? + b = !i || !j || yc && !yc[0]; + + if ( b || xc && !xc[0] ) { + return new BigNumber( b ? NaN : x ); + } + + x['s'] = y['s'] = 1; + b = y['cmp'](x) == 1; + x['s'] = i, y['s'] = j; + + return b + ? new BigNumber(x) + : ( i = DECIMAL_PLACES, j = ROUNDING_MODE, + DECIMAL_PLACES = 0, ROUNDING_MODE = 1, + x = x['div'](y), + DECIMAL_PLACES = i, ROUNDING_MODE = j, + this['minus']( x['times'](y) ) ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber + * negated, i.e. multiplied by -1. + */ + P['negated'] = P['neg'] = function () { + var x = new BigNumber(this); + + return x['s'] = -x['s'] || null, x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus + * the value of BigNumber(y, b). + */ + P['plus'] = function ( y, b ) { + var d, + x = this, + a = x['s']; + + b = ( id = 10, y = new BigNumber( y, b ) )['s']; + + // Either NaN? + if ( !a || !b ) { + return new BigNumber(NaN); + } + + // Signs differ? + if ( a != b ) { + return y['s'] = -b, x['minus'](y); + } + + var xe = x['e'], + xc = x['c'], + ye = y['e'], + yc = y['c']; + + if ( !xe || !ye ) { + + // Either Infinity? + if ( !xc || !yc ) { + + // Return +-Infinity. + return new BigNumber( a / 0 ); + } + + // Either zero? + if ( !xc[0] || !yc[0] ) { + + // y is non-zero? + return yc[0] + ? y + + // x is non-zero? + : new BigNumber( xc[0] + ? x + + // Both are zero. Return zero. + : a * 0 ); + } + } + + // Prepend zeros to equalise exponents. + // Note: Faster to use reverse then do unshifts. + if ( xc = xc.slice(), a = xe - ye ) { + d = a > 0 ? ( ye = xe, yc ) : ( a = -a, xc ); + + for ( d.reverse(); a--; d.push(0) ) { + } + d.reverse(); + } + + // Point xc to the longer array. + if ( xc.length - yc.length < 0 ) { + d = yc, yc = xc, xc = d; + } + + /* + * Only start adding at yc.length - 1 as the + * further digits of xc can be left as they are. + */ + for ( a = yc.length, b = 0; a; + b = ( xc[--a] = xc[a] + yc[a] + b ) / 10 ^ 0, xc[a] %= 10 ) { + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + + if ( b ) { + xc.unshift(b); + + // Overflow? (MAX_EXP + 1 possible) + if ( ++ye > MAX_EXP ) { + + // Infinity. + xc = ye = null; + } + } + + // Remove trailing zeros. + for ( a = xc.length; xc[--a] == 0; xc.pop() ) { + } + + return y['c'] = xc, y['e'] = ye, y; + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber raised to + * the power e. If e is negative round according to DECIMAL_PLACES and + * ROUNDING_MODE. + * + * e {number} Integer, -MAX_POWER to MAX_POWER inclusive. + */ + P['toPower'] = P['pow'] = function ( e ) { + + // e to integer, avoiding NaN or Infinity becoming 0. + var i = e * 0 == 0 ? e | 0 : e, + x = new BigNumber(this), + y = new BigNumber(ONE); + + // Use Math.pow? + // Pass +-Infinity for out of range exponents. + if ( ( ( ( outOfRange = e < -MAX_POWER || e > MAX_POWER ) && + (i = e * 1 / 0) ) || + + /* + * Any exponent that fails the parse becomes NaN. + * + * Include 'e !== 0' because on Opera -0 == parseFloat(-0) is false, + * despite -0 === parseFloat(-0) && -0 == parseFloat('-0') is true. + */ + parse(e) != e && e !== 0 && !(i = NaN) ) && + + // 'pow() exponent not an integer: {e}' + // 'pow() exponent out of range: {e}' + !ifExceptionsThrow( e, 'exponent', 'pow' ) || + + // Pass zero to Math.pow, as any value to the power zero is 1. + !i ) { + + // i is +-Infinity, NaN or 0. + return new BigNumber( Math.pow( x['toS'](), i ) ); + } + + for ( i = i < 0 ? -i : i; ; ) { + + if ( i & 1 ) { + y = y['times'](x); + } + i >>= 1; + + if ( !i ) { + break; + } + x = x['times'](x); + } + + return e < 0 ? ONE['div'](y) : y; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber + * rounded to a maximum of dp decimal places using rounding mode rm, or to + * 0 and ROUNDING_MODE respectively if omitted. + * + * [dp] {number} Integer, 0 to MAX inclusive. + * [rm] {number} Integer, 0 to 8 inclusive. + */ + P['round'] = function ( dp, rm ) { + + dp = dp == null || ( ( ( outOfRange = dp < 0 || dp > MAX ) || + parse(dp) != dp ) && + + // 'round() decimal places out of range: {dp}' + // 'round() decimal places not an integer: {dp}' + !ifExceptionsThrow( dp, 'decimal places', 'round' ) ) + ? 0 + : dp | 0; + + rm = rm == null || ( ( ( outOfRange = rm < 0 || rm > 8 ) || + + // Include '&& rm !== 0' because with Opera -0 == parseFloat(-0) is false. + parse(rm) != rm && rm !== 0 ) && + + // 'round() mode not an integer: {rm}' + // 'round() mode out of range: {rm}' + !ifExceptionsThrow( rm, 'mode', 'round' ) ) + ? ROUNDING_MODE + : rm | 0; + + return setMode( this, dp, rm ); + }; + + + /* + * sqrt(-n) = N + * sqrt( N) = N + * sqrt(-I) = N + * sqrt( I) = I + * sqrt( 0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of + * this BigNumber, rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P['squareRoot'] = P['sqrt'] = function () { + var n, r, re, t, + x = this, + c = x['c'], + s = x['s'], + e = x['e'], + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if ( s !== 1 || !c || !c[0] ) { + + return new BigNumber( !s || s < 0 && ( !c || c[0] ) + ? NaN + : c ? x : 1 / 0 ); + } + + // Initial estimate. + s = Math.sqrt( x['toS']() ); + ROUNDING_MODE = 1; + + /* + Math.sqrt underflow/overflow? + Pass x to Math.sqrt as integer, then adjust the exponent of the result. + */ + if ( s == 0 || s == 1 / 0 ) { + n = c.join(''); + + if ( !( n.length + e & 1 ) ) { + n += '0'; + } + r = new BigNumber( Math.sqrt(n) + '' ); + + // r may still not be finite. + if ( !r['c'] ) { + r['c'] = [1]; + } + r['e'] = ( ( ( e + 1 ) / 2 ) | 0 ) - ( e < 0 || e & 1 ); + } else { + r = new BigNumber( n = s.toString() ); + } + re = r['e']; + s = re + ( DECIMAL_PLACES += 4 ); + + if ( s < 3 ) { + s = 0; + } + e = s; + + // Newton-Raphson iteration. + for ( ; ; ) { + t = r; + r = half['times']( t['plus']( x['div'](t) ) ); + + if ( t['c'].slice( 0, s ).join('') === r['c'].slice( 0, s ).join('') ) { + c = r['c']; + + /* + The exponent of r may here be one less than the final result + exponent (re), e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust + s so the rounding digits are indexed correctly. + */ + s = s - ( n && r['e'] < re ); + + /* + The 4th rounding digit may be in error by -1 so if the 4 rounding + digits are 9999 or 4999 (i.e. approaching a rounding boundary) + continue the iteration. + */ + if ( c[s] == 9 && c[s - 1] == 9 && c[s - 2] == 9 && + ( c[s - 3] == 9 || n && c[s - 3] == 4 ) ) { + + /* + If 9999 on first run through, check to see if rounding up + gives the exact result as the nines may infinitely repeat. + */ + if ( n && c[s - 3] == 9 ) { + t = r['round']( dp, 0 ); + + if ( t['times'](t)['eq'](x) ) { + ROUNDING_MODE = rm; + DECIMAL_PLACES = dp; + + return t; + } + } + DECIMAL_PLACES += 4; + s += 4; + n = ''; + } else { + + /* + If the rounding digits are null, 0000 or 5000, check for an + exact result. If not, then there are further digits so + increment the 1st rounding digit to ensure correct rounding. + */ + if ( !c[e] && !c[e - 1] && !c[e - 2] && + ( !c[e - 3] || c[e - 3] == 5 ) ) { + + // Truncate to the first rounding digit. + if ( c.length > e - 2 ) { + c.length = e - 2; + } + + if ( !r['times'](r)['eq'](x) ) { + + while ( c.length < e - 3 ) { + c.push(0); + } + c[e - 3]++; + } + } + ROUNDING_MODE = rm; + rnd( r, DECIMAL_PLACES = dp, 10 ); + + return r; + } + } + } + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber times + * the value of BigNumber(y, b). + */ + P['times'] = function ( y, b ) { + var c, + x = this, + xc = x['c'], + yc = ( id = 11, y = new BigNumber( y, b ) )['c'], + i = x['e'], + j = y['e'], + a = x['s']; + + y['s'] = a == ( b = y['s'] ) ? 1 : -1; + + // Either NaN/Infinity/0? + if ( !i && ( !xc || !xc[0] ) || !j && ( !yc || !yc[0] ) ) { + + // Either NaN? + return new BigNumber( !a || !b || + + // x is 0 and y is Infinity or y is 0 and x is Infinity? + xc && !xc[0] && !yc || yc && !yc[0] && !xc + + // Return NaN. + ? NaN + + // Either Infinity? + : !xc || !yc + + // Return +-Infinity. + ? y['s'] / 0 + + // x or y is 0. Return +-0. + : y['s'] * 0 ); + } + y['e'] = i + j; + + if ( ( a = xc.length ) < ( b = yc.length ) ) { + c = xc, xc = yc, yc = c, j = a, a = b, b = j; + } + + for ( j = a + b, c = []; j--; c.push(0) ) { + } + + // Multiply! + for ( i = b - 1; i > -1; i-- ) { + + for ( b = 0, j = a + i; + j > i; + b = c[j] + yc[i] * xc[j - i - 1] + b, + c[j--] = b % 10 | 0, + b = b / 10 | 0 ) { + } + + if ( b ) { + c[j] = ( c[j] + b ) % 10; + } + } + + b && ++y['e']; + + // Remove any leading zero. + !c[0] && c.shift(); + + // Remove trailing zeros. + for ( j = c.length; !c[--j]; c.pop() ) { + } + + // No zero check needed as only x * 0 == 0 etc. + + // Overflow? + y['c'] = y['e'] > MAX_EXP + + // Infinity. + ? ( y['e'] = null ) + + // Underflow? + : y['e'] < MIN_EXP + + // Zero. + ? [ y['e'] = 0 ] + + // Neither. + : c; + + return y; + }; + + + /* + * Return a string representing the value of this BigNumber in exponential + * notation to dp fixed decimal places and rounded using ROUNDING_MODE if + * necessary. + * + * [dp] {number} Integer, 0 to MAX inclusive. + */ + P['toExponential'] = P['toE'] = function ( dp ) { + + return format( this, + ( dp == null || ( ( outOfRange = dp < 0 || dp > MAX ) || + + /* + * Include '&& dp !== 0' because with Opera -0 == parseFloat(-0) is + * false, despite -0 == parseFloat('-0') && 0 == -0 being true. + */ + parse(dp) != dp && dp !== 0 ) && + + // 'toE() decimal places not an integer: {dp}' + // 'toE() decimal places out of range: {dp}' + !ifExceptionsThrow( dp, 'decimal places', 'toE' ) ) && this['c'] + ? this['c'].length - 1 + : dp | 0, 1 ); + }; + + + /* + * Return a string representing the value of this BigNumber in normal + * notation to dp fixed decimal places and rounded using ROUNDING_MODE if + * necessary. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Integer, 0 to MAX inclusive. + */ + P['toFixed'] = P['toF'] = function ( dp ) { + var n, str, d, + x = this; + + if ( !( dp == null || ( ( outOfRange = dp < 0 || dp > MAX ) || + parse(dp) != dp && dp !== 0 ) && + + // 'toF() decimal places not an integer: {dp}' + // 'toF() decimal places out of range: {dp}' + !ifExceptionsThrow( dp, 'decimal places', 'toF' ) ) ) { + d = x['e'] + ( dp | 0 ); + } + + n = TO_EXP_NEG, dp = TO_EXP_POS; + TO_EXP_NEG = -( TO_EXP_POS = 1 / 0 ); + + // Note: str is initially undefined. + if ( d == str ) { + str = x['toS'](); + } else { + str = format( x, d ); + + // (-0).toFixed() is '0', but (-0.1).toFixed() is '-0'. + // (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. + if ( x['s'] < 0 && x['c'] ) { + + // As e.g. -0 toFixed(3), will wrongly be returned as -0.000 from toString. + if ( !x['c'][0] ) { + str = str.replace(/^-/, ''); + + // As e.g. -0.5 if rounded to -0 will cause toString to omit the minus sign. + } else if ( str.indexOf('-') < 0 ) { + str = '-' + str; + } + } + } + TO_EXP_NEG = n, TO_EXP_POS = dp; + + return str; + }; + + + /* + * Return a string array representing the value of this BigNumber as a + * simple fraction with an integer numerator and an integer denominator. + * The denominator will be a positive non-zero value less than or equal to + * the specified maximum denominator. If a maximum denominator is not + * specified, the denominator will be the lowest value necessary to + * represent the number exactly. + * + * [maxD] {number|string|BigNumber} Integer >= 1 and < Infinity. + */ + P['toFraction'] = P['toFr'] = function ( maxD ) { + var q, frac, n0, d0, d2, n, e, + n1 = d0 = new BigNumber(ONE), + d1 = n0 = new BigNumber('0'), + x = this, + xc = x['c'], + exp = MAX_EXP, + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE, + d = new BigNumber(ONE); + + // NaN, Infinity. + if ( !xc ) { + return x['toS'](); + } + + e = d['e'] = xc.length - x['e'] - 1; + + // If max denominator is undefined or null... + if ( maxD == null || + + // or NaN... + ( !( id = 12, n = new BigNumber(maxD) )['s'] || + + // or less than 1, or Infinity... + ( outOfRange = n['cmp'](n1) < 0 || !n['c'] ) || + + // or not an integer... + ( ERRORS && n['e'] < n['c'].length - 1 ) ) && + + // 'toFr() max denominator not an integer: {maxD}' + // 'toFr() max denominator out of range: {maxD}' + !ifExceptionsThrow( maxD, 'max denominator', 'toFr' ) || + + // or greater than the maxD needed to specify the value exactly... + ( maxD = n )['cmp'](d) > 0 ) { + + // d is e.g. 10, 100, 1000, 10000... , n1 is 1. + maxD = e > 0 ? d : n1; + } + + MAX_EXP = 1 / 0; + n = new BigNumber( xc.join('') ); + + for ( DECIMAL_PLACES = 0, ROUNDING_MODE = 1; ; ) { + q = n['div'](d); + d2 = d0['plus']( q['times'](d1) ); + + if ( d2['cmp'](maxD) == 1 ) { + break; + } + + d0 = d1, d1 = d2; + + n1 = n0['plus']( q['times']( d2 = n1 ) ); + n0 = d2; + + d = n['minus']( q['times']( d2 = d ) ); + n = d2; + } + + d2 = maxD['minus'](d0)['div'](d1); + n0 = n0['plus']( d2['times'](n1) ); + d0 = d0['plus']( d2['times'](d1) ); + + n0['s'] = n1['s'] = x['s']; + + DECIMAL_PLACES = e * 2; + ROUNDING_MODE = rm; + + // Determine which fraction is closer to x, n0 / d0 or n1 / d1? + frac = n1['div'](d1)['minus'](x)['abs']()['cmp']( + n0['div'](d0)['minus'](x)['abs']() ) < 1 + ? [ n1['toS'](), d1['toS']() ] + : [ n0['toS'](), d0['toS']() ]; + + return MAX_EXP = exp, DECIMAL_PLACES = dp, frac; + }; + + + /* + * Return a string representing the value of this BigNumber to sd significant + * digits and rounded using ROUNDING_MODE if necessary. + * If sd is less than the number of digits necessary to represent the integer + * part of the value in normal notation, then use exponential notation. + * + * sd {number} Integer, 1 to MAX inclusive. + */ + P['toPrecision'] = P['toP'] = function ( sd ) { + + /* + * ERRORS true: Throw if sd not undefined, null or an integer in range. + * ERRORS false: Ignore sd if not a number or not in range. + * Truncate non-integers. + */ + return sd == null || ( ( ( outOfRange = sd < 1 || sd > MAX ) || + parse(sd) != sd ) && + + // 'toP() precision not an integer: {sd}' + // 'toP() precision out of range: {sd}' + !ifExceptionsThrow( sd, 'precision', 'toP' ) ) + ? this['toS']() + : format( this, --sd | 0, 2 ); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or + * base 10 if b is omitted. If a base is specified, including base 10, + * round according to DECIMAL_PLACES and ROUNDING_MODE. + * If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal + * to or less than TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to 64 inclusive. + */ + P['toString'] = P['toS'] = function ( b ) { + var u, str, strL, + x = this, + xe = x['e']; + + // Infinity or NaN? + if ( xe === null ) { + str = x['s'] ? 'Infinity' : 'NaN'; + + // Exponential format? + } else if ( b === u && ( xe <= TO_EXP_NEG || xe >= TO_EXP_POS ) ) { + return format( x, x['c'].length - 1, 1 ); + } else { + str = x['c'].join(''); + + // Negative exponent? + if ( xe < 0 ) { + + // Prepend zeros. + for ( ; ++xe; str = '0' + str ) { + } + str = '0.' + str; + + // Positive exponent? + } else if ( strL = str.length, xe > 0 ) { + + if ( ++xe > strL ) { + + // Append zeros. + for ( xe -= strL; xe-- ; str += '0' ) { + } + } else if ( xe < strL ) { + str = str.slice( 0, xe ) + '.' + str.slice(xe); + } + + // Exponent zero. + } else { + if ( u = str.charAt(0), strL > 1 ) { + str = u + '.' + str.slice(1); + + // Avoid '-0' + } else if ( u == '0' ) { + return u; + } + } + + if ( b != null ) { + + if ( !( outOfRange = !( b >= 2 && b < 65 ) ) && + ( b == (b | 0) || !ERRORS ) ) { + str = convert( str, b | 0, 10, x['s'] ); + + // Avoid '-0' + if ( str == '0' ) { + return str; + } + } else { + + // 'toS() base not an integer: {b}' + // 'toS() base out of range: {b}' + ifExceptionsThrow( b, 'base', 'toS' ); + } + } + + } + + return x['s'] < 0 ? '-' + str : str; + }; + + + /* + * Return as toString, but do not accept a base argument. + */ + P['valueOf'] = function () { + return this['toS'](); + }; + + + // Add aliases for BigDecimal methods. + //P['add'] = P['plus']; + //P['subtract'] = P['minus']; + //P['multiply'] = P['times']; + //P['divide'] = P['div']; + //P['remainder'] = P['mod']; + //P['compareTo'] = P['cmp']; + //P['negate'] = P['neg']; + + + // EXPORT + + + // Node and other CommonJS-like environments that support module.exports. + if ( typeof module !== 'undefined' && module.exports ) { + module.exports = BigNumber; + + //AMD. + } else if ( true ) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return BigNumber; + }.call(exports, require, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + //Browser. + } else { + global['BigNumber'] = BigNumber; + } + + })( this ); + + +/***/ }, +/* 221 */ +/***/ function(module, exports, require) { + + var BigNumber = require(220); + + /** + * Test whether value is a Number + * @param {*} value + * @return {Boolean} isNumber + */ + exports.isNumber = function isNumber(value) { + return (value instanceof Number) || (typeof value == 'number'); + }; + + /** + * Check if a number is integer + * @param {Number | Boolean} value + * @return {Boolean} isInteger + */ + exports.isInteger = function isInteger(value) { + return (value == Math.round(value)); + // Note: we use ==, not ===, as we can have Booleans as well + }; + + /** + * Calculate the sign of a number + * @param {Number} x + * @returns {*} + */ + exports.sign = function sign (x) { + if (x > 0) { + return 1; + } + else if (x < 0) { + return -1; + } + else { + return 0; + } + }; + + /** + * Convert a number to a formatted string representation. + * + * Syntax: + * + * format(value) + * format(value, options) + * format(value, precision) + * format(value, fn) + * + * Where: + * + * {Number} value The value to be formatted + * {Object} options An object with formatting options. Available options: + * {String} notation + * Number notation. Choose from: + * 'fixed' Always use regular number notation. + * For example '123.40' and '14000000' + * 'exponential' Always use exponential notation. + * For example '1.234e+2' and '1.4e+7' + * 'auto' (default) Regular number notation for numbers + * having an absolute value between + * `lower` and `upper` bounds, and uses + * exponential notation elsewhere. + * Lower bound is included, upper bound + * is excluded. + * For example '123.4' and '1.4e7'. + * {Number} precision A number between 0 and 16 to round + * the digits of the number. + * In case of notations 'exponential' and + * 'auto', `precision` defines the total + * number of significant digits returned + * and is undefined by default. + * In case of notation 'fixed', + * `precision` defines the number of + * significant digits after the decimal + * point, and is 0 by default. + * {Object} exponential An object containing two parameters, + * {Number} lower and {Number} upper, + * used by notation 'auto' to determine + * when to return exponential notation. + * Default values are `lower=1e-3` and + * `upper=1e5`. + * Only applicable for notation `auto`. + * {Function} fn A custom formatting function. Can be used to override the + * built-in notations. Function `fn` is called with `value` as + * parameter and must return a string. Is useful for example to + * format all values inside a matrix in a particular way. + * + * Examples: + * + * format(6.4); // '6.4' + * format(1240000); // '1.24e6' + * format(1/3); // '0.3333333333333333' + * format(1/3, 3); // '0.333' + * format(21385, 2); // '21000' + * format(12.071, {notation: 'fixed'}); // '12' + * format(2.3, {notation: 'fixed', precision: 2}); // '2.30' + * format(52.8, {notation: 'exponential'}); // '5.28e+1' + * + * @param {Number | BigNumber} value + * @param {Object | Function | Number} [options] + * @return {String} str The formatted value + */ + exports.format = function format(value, options) { + if (typeof options === 'function') { + // handle format(value, fn) + return options(value); + } + + // handle special cases + if (value === Infinity) { + return 'Infinity'; + } + else if (value === -Infinity) { + return '-Infinity'; + } + else if (isNaN(value)) { + return 'NaN'; + } + + // default values for options + var notation = 'auto'; + var precision = undefined; + + if (options !== undefined) { + // determine notation from options + if (options.notation) { + notation = options.notation; + } + + // determine precision from options + if (options) { + if (exports.isNumber(options)) { + precision = options; + } + else if (options.precision) { + precision = options.precision; + } + } + } + + // handle the various notations + switch (notation) { + case 'fixed': + return exports.toFixed(value, precision); + + // TODO: notation 'scientific' is deprecated since version 0.16.0, remove this some day + case 'scientific': + throw new Error('Format notation "scientific" is deprecated. Use "exponential" instead.'); + + case 'exponential': + return exports.toExponential(value, precision); + + case 'auto': + // determine lower and upper bound for exponential notation. + // TODO: implement support for upper and lower to be BigNumbers themselves + var lower = 1e-3; + var upper = 1e5; + if (options && options.exponential) { + if (options.exponential.lower !== undefined) { + lower = options.exponential.lower; + } + if (options.exponential.upper !== undefined) { + upper = options.exponential.upper; + } + } + else if (options && options.scientific) { + // TODO: 'options.scientific' is deprecated since version 0.16.0, remove this some day + throw new Error('options.scientific is deprecated, use options.exponential instead.'); + } + + // adjust BigNumber configuration + var isBigNumber = value instanceof BigNumber; + if (isBigNumber) { + var oldScientific = BigNumber.config().EXPONENTIAL_AT; + BigNumber.config({ + EXPONENTIAL_AT: [ + Math.round(Math.log(lower) / Math.LN10), + Math.round(Math.log(upper) / Math.LN10) + ] + }); + } + + // handle special case zero + if (_isZero(value)) { + return '0'; + } + + // determine whether or not to output exponential notation + var str; + if (_isBetween(value, lower, upper)) { + // normal number notation + if (isBigNumber) { + str = new BigNumber(value.toPrecision(precision)).toString(); + } + else { // Number + // Note: IE7 does not allow value.toPrecision(undefined) + var valueStr = precision ? + value.toPrecision(Math.min(precision, 21)) : + value.toPrecision(); + str = parseFloat(valueStr) + ''; + } + } + else { + // exponential notation + str = exports.toExponential(value, precision); + } + + // restore BigNumber configuration + if (isBigNumber) { + BigNumber.config({EXPONENTIAL_AT: oldScientific}); + } + + // remove trailing zeros after the decimal point + return str.replace(/((\.\d*?)(0+))($|e)/, function () { + var digits = arguments[2]; + var e = arguments[4]; + return (digits !== '.') ? digits + e : e; + }); + + default: + throw new Error('Unknown notation "' + notation + '". ' + + 'Choose "auto", "exponential", or "fixed".'); + } + }; + + /** + * Test whether a value is zero + * @param {Number | BigNumber} value + * @return {boolean} isZero + * @private + */ + function _isZero (value) { + return (value instanceof BigNumber) ? value.isZero() : (value === 0); + } + + /** + * Test whether a value is inside a range: + * + * lower >= value < upper + * + * @param {Number | BigNumber} value + * @param {Number} lower Included lower bound + * @param {Number} upper Excluded upper bound + * @return {boolean} isBetween + * @private + */ + function _isBetween(value, lower, upper) { + var abs; + if (value instanceof BigNumber) { + abs = value.abs(); + return (abs.gte(lower) && abs.lt(upper)); + } + else { + abs = Math.abs(value); + return (abs >= lower && abs < upper); + } + } + + /** + * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3' + * @param {Number | BigNumber} value + * @param {Number} [precision] Number of digits in formatted output. + * If not provided, the maximum available digits + * is used. + * @returns {string} str + */ + exports.toExponential = function toExponential (value, precision) { + if (precision !== undefined) { + if (value instanceof BigNumber) { + return value.toExponential(precision - 1); + } + else { // Number + return value.toExponential(Math.min(precision - 1, 20)); + } + } + else { + return value.toExponential(); + } + }; + + /** + * Format a number with fixed notation. + * @param {Number | BigNumber} value + * @param {Number} [precision=0] Optional number of decimals after the + * decimal point. Zero by default. + */ + exports.toFixed = function toFixed (value, precision) { + if (value instanceof BigNumber) { + return value.toFixed(precision || 0); + // Note: the (precision || 0) is needed as the toFixed of BigNumber has an + // undefined default precision instead of 0. + } + else { // Number + return value.toFixed(Math.min(precision, 20)); + } + }; + + /** + * Count the number of significant digits of a number. + * + * For example: + * 2.34 returns 3 + * 0.0034 returns 2 + * 120.5e+3 returns 4 + * + * @param {Number} value + * @return {Number} digits Number of significant digits + */ + exports.digits = function digits (value) { + return value + .toExponential() + .replace(/e[\+\-0-9]*$/, '') // remove exponential notation + .replace( /^0\.0*|\./, '') // remove decimal point and leading zeros + .length + }; + + /** + * Convert a Number in to a BigNumber. If the number has 15 or mor significant + * digits, the Number cannot be converted to BigNumber and will return the + * original number. + * @param {Number} number + * @return {BigNumber | Number} bignumber + */ + exports.toBigNumber = function toBigNumber (number) { + if (exports.digits(number) > 15) { + return number; + } + else { + return new BigNumber(number); + } + }; + + /** + * Convert a BigNumber into a Number. If the number is out of range, it will + * get the value Infinity or 0. + * @param {BigNumber} bignumber + * @return {Number} number + */ + exports.toNumber = function toNumber (bignumber) { + return parseFloat(bignumber.valueOf()); + }; + + +/***/ }, +/* 222 */ +/***/ function(module, exports, require) { + + var number = require(221), + string = require(218), + object = require(2), + types = require(217), + isArray = Array.isArray; + + /** + * Calculate the size of a multi dimensional array. + * @param {Array} x + * @Return {Number[]} size + * @private + */ + function _size(x) { + var size = []; + + while (isArray(x)) { + size.push(x.length); + x = x[0]; + } + + return size; + } + + /** + * Calculate the size of a multi dimensional array. + * All elements in the array are checked for matching dimensions using the + * method validate + * @param {Array} x + * @Return {Number[]} size + * @throws RangeError + */ + exports.size = function size (x) { + // calculate the size + var s = _size(x); + + // verify the size + exports.validate(x, s); + // TODO: don't validate here? only in a Matrix constructor? + + return s; + }; + + /** + * Recursively validate whether each element in a multi dimensional array + * has a size corresponding to the provided size array. + * @param {Array} array Array to be validated + * @param {Number[]} size Array with the size of each dimension + * @param {Number} dim Current dimension + * @throws RangeError + * @private + */ + function _validate(array, size, dim) { + var i; + var len = array.length; + + if (len != size[dim]) { + throw new RangeError('Dimension mismatch (' + len + ' != ' + size[dim] + ')'); + } + + if (dim < size.length - 1) { + // recursively validate each child array + var dimNext = dim + 1; + for (i = 0; i < len; i++) { + var child = array[i]; + if (!isArray(child)) { + throw new RangeError('Dimension mismatch ' + + '(' + (size.length - 1) + ' < ' + size.length + ')'); + } + _validate(array[i], size, dimNext); + } + } + else { + // last dimension. none of the childs may be an array + for (i = 0; i < len; i++) { + if (isArray(array[i])) { + throw new RangeError('Dimension mismatch ' + + '(' + (size.length + 1) + ' > ' + size.length + ')'); + } + } + } + } + + /** + * Validate whether each element in a multi dimensional array has + * a size corresponding to the provided size array. + * @param {Array} array Array to be validated + * @param {Number[]} size Array with the size of each dimension + * @throws RangeError + */ + exports.validate = function validate(array, size) { + var isScalar = (size.length == 0); + if (isScalar) { + // scalar + if (isArray(array)) { + throw new RangeError('Dimension mismatch (' + array.length + ' != 0)'); + } + } + else { + // array + _validate(array, size, 0); + } + }; + + /** + * Test whether index is an integer number with index >= 0 and index < length + * @param {*} index Zero-based index + * @param {Number} [length] Length of the array + */ + exports.validateIndex = function validateIndex (index, length) { + if (!number.isNumber(index) || !number.isInteger(index)) { + throw new TypeError('Index must be an integer (value: ' + index + ')'); + } + if (index < 0) { + throw new RangeError('Index out of range (' + index + ' < 0)'); + } + if (length !== undefined && index >= length) { + throw new RangeError('Index out of range (' + index + ' > ' + (length - 1) + ')'); + } + }; + + /** + * Resize a multi dimensional array. The resized array is returned. + * @param {Array} array Array to be resized + * @param {Array.} size Array with the size of each dimension + * @param {*} [defaultValue] Value to be filled in in new entries, + * undefined by default + * @return {Array} array The resized array + */ + exports.resize = function resize(array, size, defaultValue) { + // TODO: add support for scalars, having size=[] ? + + // check the type of the arguments + if (!isArray(array) || !isArray(size)) { + throw new TypeError('Array expected'); + } + if (size.length === 0) { + throw new Error('Resizing to scalar is not supported'); + } + + // check whether size contains positive integers + size.forEach(function (value) { + if (!number.isNumber(value) || !number.isInteger(value) || value < 0) { + throw new TypeError('Invalid size, must contain positive integers ' + + '(size: ' + string.format(size) + ')'); + } + }); + + // count the current number of dimensions + var dims = 1; + var elem = array[0]; + while (isArray(elem)) { + dims++; + elem = elem[0]; + } + + // adjust the number of dimensions when needed + while (dims < size.length) { // add dimensions + array = [array]; + dims++; + } + while (dims > size.length) { // remove dimensions + array = array[0]; + dims--; + } + + // recursively resize the array + _resize(array, size, 0, defaultValue); + + return array; + }; + + /** + * Recursively resize a multi dimensional array + * @param {Array} array Array to be resized + * @param {Number[]} size Array with the size of each dimension + * @param {Number} dim Current dimension + * @param {*} [defaultValue] Value to be filled in in new entries, + * undefined by default. + * @private + */ + function _resize (array, size, dim, defaultValue) { + if (!isArray(array)) { + throw Error('Array expected'); + } + + var i, elem, + oldLen = array.length, + newLen = size[dim], + minLen = Math.min(oldLen, newLen); + + // apply new length + array.length = newLen; + + if (dim < size.length - 1) { + // non-last dimension + var dimNext = dim + 1; + + // resize existing child arrays + for (i = 0; i < minLen; i++) { + // resize child array + elem = array[i]; + _resize(elem, size, dimNext, defaultValue); + } + + // create new child arrays + for (i = minLen; i < newLen; i++) { + // get child array + elem = []; + array[i] = elem; + + // resize new child array + _resize(elem, size, dimNext, defaultValue); + } + } + else { + // last dimension + if(defaultValue !== undefined) { + // fill new elements with the default value + for (i = oldLen; i < newLen; i++) { + array[i] = object.clone(defaultValue); + } + } + } + } + + /** + * Squeeze a multi dimensional array + * @param {Array} array + * @return {Array} array + * @private + */ + exports.squeeze = function squeeze(array) { + while(isArray(array) && array.length === 1) { + array = array[0]; + } + + return array; + }; + + /** + * Unsqueeze a multi dimensional array: add dimensions when missing + * @param {Array} array + * @param {Number} dims Number of desired dimensions + * @return {Array} array + * @private + */ + exports.unsqueeze = function unsqueeze(array, dims) { + var size = exports.size(array); + + for (var i = 0, ii = (dims - size.length); i < ii; i++) { + array = [array]; + } + + return array; + }; + + /** + * Test whether an object is an array + * @param {*} value + * @return {Boolean} isArray + */ + exports.isArray = isArray; + +/***/ }, +/* 223 */ +/***/ function(module, exports, require) { + + /** + * Test whether value is a Boolean + * @param {*} value + * @return {Boolean} isBoolean + */ + exports.isBoolean = function isBoolean(value) { + return (value instanceof Boolean) || (typeof value == 'boolean'); + }; + + +/***/ } +/******/ ]) \ No newline at end of file diff --git a/dist/math.map b/dist/math.map new file mode 100644 index 000000000..336b7ef50 --- /dev/null +++ b/dist/math.map @@ -0,0 +1 @@ +{"version":3,"file":"math.map","sources":["./dist/math.js"],"names":["root","fn","modules","exports","module","define","amd","this","require","moduleId","installedModules","id","loaded","call","cache","p","mathjs","settings","Object","create","Error","math","_settings","matrix","number","config","BigNumber","object","deepExtend","decimals","DECIMAL_PLACES","defaultType","precision","current","clone","expression","node","parse","Scope","Parser","docs","type","Complex","Range","Index","Matrix","Unit","Help","collection","chaining","Selector","x","undefined","Array","isArray","map","value","m","key","hasOwnProperty","TypeError","extend","a","b","prop","constructor","deepEqual","i","len","length","ArrayNode","AssignmentNode","BlockNode","ConstantNode","IndexNode","FunctionNode","Node","OperatorNode","ParamsNode","RangeNode","SymbolNode","UnitNode","UpdateNode","handlers","expr","arguments","SyntaxError","isString","parseStart","deepMap","elem","first","index","c","charAt","next","nextPreview","getToken","token_type","TOKENTYPE","NULL","token","DELIMITER","c2","DELIMITERS","isDigitDot","isAlpha","isDigit","NAMED_DELIMITERS","SYMBOL","UNKNOWN","createSyntaxError","NUMBER","skipNewlines","parseBlock","createError","block","visible","parseAns","add","parseFunctionAssignment","name","parseAssignment","args","parseRange","valid","params","forEach","param","parseBitwiseConditions","push","step","parseComparison","operators","parseConditions","==","!=","<",">","<=",">=","parseAddSubtract","to","in","parseMultiplyDivide","+","-","parseUnit","*",".*","/","./","%","mod","symbol","parseUnary","parsePow","leftNode","nodes","ops","parseLeftHandOperators","pop","parseNodeHandler","!","'","handler","parseSymbol","parseParams","parseString","bracket","str","tPrev","parseMatrix","array","rows","cols","row","parseRow","r","parseNumber","parseParentheses","parseEnd","col","createErrorMessage","message","util","toNumber","string",",","(",")","[","]","\"","\n",";","^",".^","=",":","scope","_parse","prototype","compile","eval","get","set","remove","clear","e","E","LN2","LN10","LOG2E","LOG10E","NaN","pi","PI","SQRT1_2","SQRT2","tau","abs","ceil","cube","divide","edivide","emultiply","epow","equal","exp","fix","floor","gcd","larger","largereq","lcm","log","log10","multiply","pow","round","sign","smaller","smallereq","sqrt","square","subtract","unary","unequal","xgcd","arg","conj","re","im","bignumber","complex","unit","help","concat","det","diag","eye","inv","ones","range","resize","size","squeeze","subset","transpose","zeros","combinations","distribution","factorial","permutations","pickRandom","random","randomInt","min","mean","max","acos","asin","atan","atan2","cos","cot","csc","sec","sin","tan","format","isNumber","skipWhitespace","text","revert","oldIndex","parseComplex","cnext","isComplex","Number","separator","second","substring","equals","other","options","strRe","strIm","toString","start","end","parseFloat","split","nums","invalid","some","num","isNaN","isRange","diff","Math","callback","obj","toArray","valueOf","_ranges","ii","_createRange","isInteger","validateIndex","isIndex","ranges","apply","values","dim","isScalar","strings","join","data","_data","preprocess","types","_size","_get","RangeError","submatrix","_getSubmatrix","shift","dims","last","child","_set","defaultValue","sSize","iSize","unshift","_fit","_setSubmatrix","dataIndex","subIndex","newSize","changed","isMatrix","replacement","index_i","me","recurse","res","_findUnit","prefix","UNIT_NONE","PREFIX_NONE","_normalize","fixPrefix","UNITS","endsWith","prefixLen","prefixName","prefixes","isUnit","offset","_unnormalize","prefixValue","isPlainUnit","hasBase","base","equalBase","plainUnit","_bestPrefix","bestPrefix","absValue","bestDiff","scientific","PREFIXES","NONE","SHORT","da","h","k","M","G","T","P","Z","Y","d","u","n","f","z","y","LONG","deca","hecto","kilo","mega","giga","tera","peta","exa","zetta","yotta","deci","centi","milli","micro","nano","pico","femto","atto","zepto","yocto","SQUARED","CUBIC","BINARY_SHORT","Ki","Mi","Gi","Ti","Pi","Ei","Zi","Yi","BINARY_LONG","kibi","mebi","gibi","tebi","pebi","exi","zebi","yobi","BASE_UNITS","LENGTH","MASS","TIME","CURRENT","TEMPERATURE","LUMINOUS_INTENSITY","AMOUNT_OF_SUBSTANCE","FORCE","SURFACE","VOLUME","ANGLE","BIT","BASE_UNIT_NONE","meter","inch","foot","yard","mile","link","rod","chain","angstrom","ft","yd","mi","li","rd","ch","mil","m2","sqin","sqft","sqyd","sqmi","sqrd","sqch","sqmil","m3","L","l","litre","cuin","cuft","cuyd","teaspoon","tablespoon","minim","fluiddram","fluidounce","gill","cc","cup","pint","quart","gallon","beerbarrel","oilbarrel","hogshead","fldr","floz","gi","cp","pt","qt","gal","bbl","obl","g","gram","ton","tonne","grain","dram","ounce","poundmass","hundredweight","stick","gr","dr","oz","lbm","cwt","s","minute","hour","day","rad","deg","grad","cycle","A","ampere","K","degC","degF","degR","kelvin","celsius","fahrenheit","rankine","mol","mole","cd","candela","N","newton","lbf","poundforce","bits","B","bytes","PLURALS","meters","inches","feet","yards","miles","links","rods","chains","angstroms","litres","teaspoons","tablespoons","minims","fluiddrams","fluidounces","gills","cups","pints","quarts","gallons","beerbarrels","oilbarrels","hogsheads","grams","tons","tonnes","grains","drams","ounces","poundmasses","hundredweights","sticks","seconds","minutes","hours","days","radians","degrees","gradients","cycles","amperes","moles","plural","lt","liter","liters","lb","doc","isHelp","desc","category","description","syntax","examples","parser","seealso","toJSON","_reduce","mat","ret","val","tran","_switch","j","I","J","tmp","argsToArray","slice","isCollection","deepMap2","array1","array2","reduce","deepForEach","error","UnsupportedTypeError","value1","type1","splice","stack","ArgumentsError","count","search","String","isBoolean","toBigNumber","plus","times","_divideComplex","den","div","eq","isNegative","gt","gte","t","prod","_mod","_multiplyMatrixMatrix","result","_multiplyVectorMatrix","_multiplyMatrixVector","_multiplyVectorVector","dot","_multiplyComplex","sizeX","sizeY","powComplex","temp1","temp2","px","roundNumber","cmp","lte","minus","neg","_xgcd","q","lastx","lasty","bool","Boolean","isZero","lcase","toLowerCase","select","_concat","concatDim","prevDim","asMatrix","matrices","_det","lead","temp","vector","iMax","kSuper","kSub","asBigNumber","one","minimum","_inv","Ac","Bc","Ar","Br","_range","_rangeInc","_bigRange","zero","_bigRangeInc","err","includeEnd","_resizeString","defaultChar","asArray","_getSubset","_getSubstring","substr","strLen","v","_setSubset","_setSubstring","chars","transposedRow","transposed","isPositiveInteger","distributions","uniform","normal","u1","u2","picked","randFunctions","arg1","arg2","arg3","_randomDataForMatrix","_random","_randomInt","possibles","randFunc","uniformRandFunctions","arity","dividedBy","_getsmaller","_min","_getlarger","_max","_nmean","sum","_mean","temp3","temp4","_import","override","wrap","createProxy","isSupportedType","math_import","opts","_module","_mapArray","arrayIn","print","template","replace","original","keys","_forEachArray","Infinity","done","_compile","defs","find","filter","results","match","nodes_r","js","compileSubset","properties","rangesUseEnd","useEnd","someUseEnd","objectName","_eval","variable","code","defsCode","factoryCode","factory","Function","op","lhs","rhs","undef","Date","formatArray","webpackContext","req","webpackContextResolve","./clone","./clone.js","./forEach","./forEach.js","./format","./format.js","./import","./import.js","./map","./map.js","./print","./print.js","./typeof","./typeof.js","resolve","__WEBPACK_AMD_DEFINE_RESULT__","global","isNum","digits","orig","isValid","test","setMode","ROUNDING_MODE","trim","ERRORS","outOfRange","ifExceptionsThrow","DIGITS","RegExp","convert","indexOf","MAX_EXP","MIN_EXP","isErrors","method","nStr","baseOut","baseIn","strToArr","bIn","arrL","strL","arr","reverse","arrToStr","dvs","dvd","nArr","fracArr","fracBN","ONE","isOdd","dvsL","dvsT","remI","dvsZ","dvdI","dvdL","rem","remL","quo","qc","qi","dig","rnd","TO_EXP_NEG","dp","xc","isNeg","half","more","rm","MAX","MAX_POWER","TO_EXP_POS","parseInt","o","inRange","lo","hi","has","yc","xe","xs","ye","ys","xLTy","maxD","frac","n0","d0","d2","n1","d1","sd","_isZero","_isBetween","lower","upper","notation","toFixed","toExponential","exponential","isBigNumber","oldScientific","EXPONENTIAL_AT","toPrecision","valueStr","_validate","dimNext","_resize","oldLen","newLen","minLen","validate","unsqueeze"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;CA2BA,SAA2CA,GAC1C,MAAO,UAAuDC,GAC7D,MAAO,UAAmDC,GACnC,gBAAZC,UAA0C,gBAAXC,QACxCA,OAAOD,QAAUF,EAAGC,GACK,kBAAXG,SAAyBA,OAAOC,IAC9CD,OAAO,WAAa,MAAOJ,GAAGC,KACJ,gBAAZC,SACdA,QAAgB,OAAIF,EAAGC,GAEvBF,EAAa,OAAIC,EAAGC,MAGrBK,MACO,SAASL,GAQT,QAASM,GAAQC,GAEhB,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUN,EAGnC,IAAIC,GAASM,EAAiBD,IAC7BN,WACAQ,GAAIF,EACJG,QAAQ,EAUT,OANAV,GAAQO,GAAUI,KAAKT,EAAOD,GAAUC,EAAQA,EAAOD,GAAUK,GAGjEJ,EAAOQ,QAAS,EAGTR,EAAOD,GAzBf,GAAIA,GAAU,UAGVO,IAqCJ,OAVAF,GAAQN,QAAUA,EAGlBM,EAAQM,MAAQJ,EAGhBF,EAAQO,EAAI,GAILP,EAAQ,MAKnB,SAASJ,EAAQD,EAASK,GAE/BJ,EAAOD,QAAUK,EAAQ,IAKpB,SAASJ,EAAQD,EAASK,GAqB/B,QAASQ,GAAQC,GAEf,GAA6B,kBAAlBC,QAAOC,OAChB,KAAM,IAAIC,OAAM,gHAKlB,IAAIC,MAGAC,GAEFC,OAAQ,SAGRC,OAAQ,SAyMV,OA1LAH,GAAKI,OAAS,SAAiBR,GAC7B,GAAIS,GAAYlB,EAAQ,IAExB,IAAIS,EAAU,CAWZ,GATAU,EAAOC,WAAWN,EAAWL,GAEzBA,EAASY,UACXH,EAAUD,QACRK,eAAgBb,EAASY,WAKzBZ,EAASO,QAAUP,EAASO,OAAOO,YACrC,KAAM,IAAIX,OAAM,oEAKlB,IAAIH,EAASO,QAAUP,EAASO,OAAOQ,UACrC,KAAM,IAAIZ,OAAM,oEAKlB,IAAIH,EAASM,QAAUN,EAASM,OAAOQ,YACrC,KAAM,IAAIX,OAAM,oEAKlB,IAAIH,EAASM,QAAUN,EAASM,OAAO,WACrC,KAAM,IAAIH,OAAM,iEAMpB,GAAIa,GAAUN,EAAOO,MAAMZ,EAE3B,OADAW,GAAQJ,SAAWH,EAAUD,SAASK,eAC/BG,GAITZ,EAAKI,OAAOR,GAGZI,EAAKc,cACLd,EAAKc,WAAWC,KAAO5B,EAAQ,GAC/Ba,EAAKc,WAAWE,MAAQ7B,EAAQ,GAChCa,EAAKc,WAAWG,MAAQ,WACtB,KAAM,IAAIlB,OAAM,sDAElBC,EAAKc,WAAWI,OAAS/B,EAAQ,GACjCa,EAAKc,WAAWK,KAAOhC,EAAQ,GAG/Ba,EAAKoB,QACLpB,EAAKoB,KAAKf,UAAYlB,EAAQ,KAC9Ba,EAAKoB,KAAKC,QAAUlC,EAAQ,GAC5Ba,EAAKoB,KAAKE,MAAQnC,EAAQ,GAC1Ba,EAAKoB,KAAKG,MAAQpC,EAAQ,GAC1Ba,EAAKoB,KAAKI,OAASrC,EAAQ,IAC3Ba,EAAKoB,KAAKK,KAAOtC,EAAQ,IACzBa,EAAKoB,KAAKM,KAAOvC,EAAQ,IAEzBa,EAAK2B,WAAaxC,EAAQ,IAG1BA,EAAQ,IAAIa,GAGZb,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAGlBd,EAAQ,IAAIa,EAAMC,GAClBd,EAAQ,I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CZE,QACE,UAEFD,YAAe,qCACfE,UACE,WACA,UACA,gBACA,UACA,uDAEFE,SACE,SACA,WACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,UAEFD,YACI,qGACJE,UACE,WACA,WACA,YACA,aAEFE,SAAY,OAAQ,QAAS,WAM1B,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,aACZE,QACE,YAEFD,YACI,yHACJE,UACE,aACA,aACA,eAEFE,SAAY,OAAQ,MAAO,WAMxB,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,YACA,qBAEFD,YAAe,uCACfE,UACE,aACA,aACA,oBAEFE,SAAa,MAAO,UAMjB,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,YACZE,QACE,QACA,gBAEFD,YACI,oFACJE,UACE,QACA,UACA,UACA,YACA,UACA,UACA,iBAEFE,SACE,QAAS,UAAW,UAAW,YAAa,cAO3C,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,WACR+e,SAAY,YACZE,QACE,SACA,kBAEFD,YACI,kGACJE,UACE,UACA,WACA,UACA,YACA,WAEFE,SACE,QAAS,UAAW,YAAa,UAAW,cAO3C,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,aAEFD,YAAe,qCACfE,UACE,YACA,aACA,iBAEFE,SAAa,SAMV,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,SACA,gBAEFD,YAAe,8NACfE,UACE,WACA,eACA,SACA,SACA,gBACA,sBACA,oBACA,SAEFE,SACE,MACA,WAMC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,aACZE,QACE,YAEFD,YAAe,4CACfE,UACE,cACA,SACA,cACA,sBACA,iBAEFE,SACE,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,YACZE,QACE,QACA,UACA,aAEFD,YACI,gEACJE,UACE,QACA,SACA,WACA,4BACA,WACA,YAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,WACR+e,SAAY,YACZE,QACE,QACA,kBAEFD,YAAe,uBACfE,UACE,YACA,YACA,YACA,cACA,cAEFE,SACE,YAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,YACZE,QACE,QACA,aAEFD,YACI,uCACJE,UACE,UACA,QACA,oBAEFE,SACE,UAAW,UAAW,SAAU,YAAa,cAO5C,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,aACZE,QACE,WACA,eAEFD,YACI,4LACJE,UACE,aACA,aACA,cACA,cACA,eACA,uBAEFE,SAAY,OAAQ,QAAS,SAM1B,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,aACZE,QACE,WAEFD,YACI,iGACJE,UACE,YACA,aACA,WAEFE,SACE,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,YACZE,QACE,QACA,iBAEFD,YACI,4FACJE,UACE,QACA,UACA,UACA,YACA,UACA,iBAEFE,SACE,QAAS,UAAW,SAAU,YAAa,cAO1C,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,YACR+e,SAAY,YACZE,QACE,SACA,mBAEFD,YACI,mGACJE,UACE,UACA,WACA,UACA,YACA,WAEFE,SACE,QAAS,UAAW,SAAU,UAAW,cAOxC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,aACZE,QACE,WAEFD,YACI,+EACJE,UACE,WACA,QACA,YAEFE,SACE,SACA,cAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,aACZE,QACE,aAEFD,YACI,2DACJE,UACE,YACA,UACA,MACA,SAEFE,SACE,WACA,MACA,OACA,UAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,WACR+e,SAAY,YACZE,QACE,QACA,kBAEFD,YAAe,uBACfE,UACE,UACA,UACA,YACA,YACA,iBAEFE,SACE,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,YACZE,QACE,KACA,YAEFD,YACI,+BACJE,UACE,OACA,WAEFE,SACE,MAAO,cAON,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,YACZE,QACE,SACA,iBAEFD,YACI,gGACJE,UACE,WACA,WACA,UACA,YACA,SACA,eACA,kBAEFE,SACE,QAAS,UAAW,SAAU,YAAa,cAO1C,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,aACZE,QACE,cAEFD,YAAe,gEACfE,UACE,cACA,aACA,sBAEFE,SAAa,MAAO,SAMjB,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,UACZE,QACE,UAEFD,YACI,iGACJE,UACE,cACA,cACA,eAEFE,SACE,KACA,KACA,OACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,UACZE,QACE,WAEFD,YACI,gGACJE,UACE,eACA,eACA,eAEFE,SACE,KACA,KACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,KACR+e,SAAY,UACZE,QACE,SAEFD,YAAe,yCACfE,UACE,aACA,aACA,YACA,WAEFE,SACE,KACA,OACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,KACR+e,SAAY,UACZE,QACE,SAEFD,YAAe,8CACfE,UACE,aACA,aACA,YACA,WAEFE,SACE,KACA,OACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,YACR+e,SAAY,OACZE,QACE,gBAEFD,YACI,+CACJE,UACE,YACA,kCACA,mBACA,uBACA,8BAEFE,SACE,UAAW,UAAW,QAAS,SAAU,SAAU,UAOlD,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,OACZE,QACE,IACA,cAEFD,YACI,6CACJE,UACE,aACA,aACA,aACA,kBACA,mBACA,yBAEFE,SACE,YAAa,UAAW,QAAS,SAAU,SAAU,SAAU,UAO9D,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,OACZE,QACE,YACA,kBACA,mBAEFD,YACI,2BACJE,UA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mCACfE,UACE,KACA,YACA,MAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,eACR+e,SAAY,cACZE,QACE,kBACA,sBAEFD,YAAe,kEACfE,UACE,kBACA,sBAEFE,SAAY,eAAgB,eAMzB,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,aACR+e,SAAY,cACZE,QACE,qBAEFD,YACI,0CACJE,UACE,mBACA,4BAEFE,SAAY,eAAgB,SAAU,eAMnC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,cACZE,QACE,WACA,cACA,mBACA,eACA,oBACA,0BAEFD,YACI,0BACJE,UACE,WACA,iBACA,kBAEFE,SAAY,eAAgB,aAAc,eAMvC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,cACZE,QACE,YACA,eACA,oBACA,gBACA,qBACA,2BAEFD,YACI,iCACJE,UACE,YACA,kBACA,uBAEFE,SAAY,eAAgB,aAAc,YAKvC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,oBACA,SACA,eAEFD,YAAe,iDACfE,UACE,kBACA,oBACA,uBACA,uBACA,gCACA,iCAEFE,SAME,MACA,OAEA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,aACZE,QACE,qBACA,UACA,gBAEFD,YAAe,mDACfE,UACE,mBACA,qBACA,wBACA,wBACA,8BAEFE,SAMC,MACC,SAQC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,aACZE,QACE,oBACA,SACA,eAEFD,YAAe,iDACfE,UACE,kBACA,oBACA,uBACA,uBACA,gCACA,iCAEFE,SAME,OAEA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,eACZE,QACE,WAEFD,YAAe,oDACfE,UACE,YACA,kBAEFE,SACE,MACA,OACA,UAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,eACZE,QACE,WAEFD,YAAe,kDACfE,UACE,YACA,kBAEFE,SACE,MACA,OACA,UAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,OACR+e,SAAY,eACZE,QACE,WAEFD,YAAe,qDACfE,UACE,YACA,kBAEFE,SACE,MACA,OACA,UAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,eACZE,QACE,eAEFD,YACI,qEACJE,UACE,mBACA,wBACA,iBACA,iBACA,eAEFE,SACE,MACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,sCACfE,UACE,SACA,kBACA,eACA,cACA,2BAEFE,SACE,OACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,6DACfE,UACE,SACA,cAEFE,SACE,MACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,4DACfE,UACE,SACA,cAEFE,SACE,MACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,0DACfE,UACE,SACA,cAEFE,SACE,MACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,oCACfE,UACE,SACA,kBACA,cACA,cACA,2BAEFE,SACE,OACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,eACZE,QACE,UAEFD,YAAe,uCACfE,UACE,WACA,sBACA,cACA,eAEFE,SACE,OACA,MACA,SAOC,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,KACR+e,SAAY,QACZE,QACE,YACA,eAEFD,YAAe,8BACfE,UACE,eACA,aACA,oBAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,QACR+e,SAAY,QACZE,QACE,YAEFD,YAAe,sFACfE,UACE,aACA,gBACA,gBACA,sBACA,wBAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,MACR+e,SAAY,QACZE,QACE,oBAEFD,YAAe,qHACfE,UACE,+DAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,UACR+e,SAAY,QACZE,QACE,wBAEFD,YAAe,iFACfE,UACE,0DAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,QACZE,QACE,gBACA,4BAEFD,YAAe,wCACfE,UACE,cACA,iBACA,aACA,iBAEFE,SAAY,WAMT,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,QACZE,QACE,kBAEFD,YAAe,gCACfE,UACE,oBACA,wBAEFE,aAMG,SAASzmB,GAEdA,EAAOD,SACLsH,KAAQ,SACR+e,SAAY,QACZE,QACE,aAEFD,YAAe,8BACfE,UACE,cACA,iBACA,iBACA,yBAEFE,aAMG,SAASzmB,EAAQD,GAWtBA,EAAQsC,KAAO,QAASA,GAAMU,GAC5B,GAAIV,SAAcU,EAElB,IAAa,WAATV,EAAmB,CACrB,GAAU,OAANU,EACF,MAAO,MAET,IAAIA,YAAa6nB,SACf,MAAO,SAET,IAAI7nB,YAAayP,QACf,MAAO,QAET,IAAIzP,YAAaulB,QACf,MAAO,QAET,IAAIrlB,MAAMC,QAAQH,GAChB,MAAO,OAET,IAAIA,YAAaivB,MACf,MAAO,OAIX,MAAO3vB,KAMJ,SAASrC,EAAQD,EAASK,GAuF/B,QAAS6xB,GAAaxnB,EAAOqI,GAC3B,GAAI7P,MAAMC,QAAQuH,GAAQ,CAGxB,IAAK,GAFDH,GAAM,IACNtG,EAAMyG,EAAMxG,OACPF,EAAI,EAAOC,EAAJD,EAASA,IACd,GAALA,IACFuG,GAAO,MAETA,GAAO2nB,EAAYxnB,EAAM1G,GAAI+O,EAG/B,OADAxI,IAAO,IAIP,MAAOvK,GAAQgS,OAAOtH,EAAOqI,GAnGjC,GAAI1R,GAAShB,EAAQ,KACjBkB,EAAYlB,EAAQ,IAOxBL,GAAQoF,SAAW,SAAkB/B,GACnC,MAAQA,aAAiBklB,SAA4B,gBAATllB,IAQ9CrD,EAAQqX,SAAW,SAAkBlF,EAAMmW,GACzC,GAAInV,GAAQhB,EAAKjO,OAASokB,EAAOpkB,OAC7BkP,EAAMjB,EAAKjO,MACf,OAAQiO,GAAKS,UAAUO,EAAOC,KAASkV,GA0BzCtoB,EAAQgS,OAAS,SAAgB3O,EAAO0P,GACtC,MAAI1R,GAAO4Q,SAAS5O,IAAUA,YAAiB9B,GACtCF,EAAO2Q,OAAO3O,EAAO0P,GAG1B7P,MAAMC,QAAQE,GACT6uB,EAAY7uB,EAAO0P,GAGxB/S,EAAQoF,SAAS/B,GACZ,IAAMA,EAAQ,IAGF,kBAAVA,GACFA,EAAMkjB,OAASljB,EAAMkjB,OAAS,GAAK,WAGxCljB,YAAiBtC,QACS,kBAAjBsC,GAAM2O,OACR3O,EAAM2O,OAAOe,GAGb1P,EAAM6P,WAIVqV,OAAOllB,KAkCX,SAASpD,EAAQD,EAASK,GAkB/B,QAAS8xB,GAAeC,GACvB,MAAO/xB,GAAQgyB,EAAsBD,IAEtC,QAASC,GAAsBD,GAC9B,MAAOhvB,GAAIgvB,IAAS,WAAa,KAAM,IAAInxB,OAAM,uBAAyBmxB,EAAM,SApBjF,GAAIhvB,IACHkvB,UAAW,GACXC,aAAc,GACdC,YAAa,IACbC,eAAgB,IAChBC,WAAY,GACZC,cAAe,GACfC,WAAY,GACZC,cAAe,GACfC,QAAS,GACTC,WAAY,GACZC,UAAW,GACXC,aAAc,GACdC,WAAY,GACZC,cAAe,GAQhBhB,GAAe/B,KAAO,WACrB,MAAOrvB,QAAOqvB,KAAKhtB,IAEpB+uB,EAAeiB,QAAUf,EACzBpyB,EAAOD,QAAUmyB,GAKZ,SAASlyB,EAAQD,EAASK,GAE/B,GAAIgzB,IAKH,SAAYC,GACT,YA2FA,SAAS/xB,GAAW8X,EAAGzV,GACnB,GAAIkJ,GAAG9I,EAAGuvB,EAAOC,EAAQ9rB,EAAO+rB,EAC5BzwB,EAAI5C,IAGR,MAAO4C,YAAazB,IAChB,MAAO,IAAIA,GAAW8X,EAAGzV,EAI7B,IAAKyV,YAAa9X,GAAY,CAI1B,GAHAf,EAAK,EAGAoD,IAAMkJ,EAMP,MAHA9J,GAAK,EAAIqW,EAAK,EACdrW,EAAK,EAAIqW,EAAK,OACdrW,EAAK,GAAMqW,EAAIA,EAAK,GAAMA,EAAEkO,QAAUlO,EAJtCA,IAAK,GAkBb,GARiB,gBAALA,KACRA,GAAMka,EAAoB,gBAALla,IACoB,mBAArCtY,OAAOwL,UAAU2G,SAASxS,KAAK2Y,KACrB,IAANA,GAAmB,EAAR,EAAIA,EAAQ,KAAOA,EAAI,IAG9Coa,EAAOpa,EAEFzV,IAAMkJ,GAAK4mB,EAAQC,KAAKta,GAGzBrW,EAAK,EAAmB,KAAfqW,EAAE1T,OAAO,IAAc0T,EAAIA,EAAEkO,MAAM,GAAI,IAAO,MAGpD,CAIH,GAAU,IAAL3jB,EAED,MAAOgwB,GAASva,EAAG1X,EAAgBkyB,EAsDvC,IAnDAxa,EAAIya,EAAKpzB,KAAK2Y,GAAG6W,QAAS,WAAY,IAEtCltB,EAAK,EAAmB,KAAfqW,EAAE1T,OAAO,IAAc0T,EAAIA,EAAE6W,QAAS,UAAW,IAAM,IAAO,EAE7D,MAALtsB,EAEMA,IAAU,EAAJA,IAAWmwB,IACnBC,IAAgBpwB,GAAK,GAAS,GAAJA,KAmC3BqwB,EAAmBrwB,EAAG,GAGtB8D,EAAQgsB,EAAQC,KAAKta,KApCrBma,EAAS,IAAMU,EAAO3M,MAAO,EAAG3jB,EAAQ,EAAJA,GAAU,KAI9CyV,EAAIA,EAAE6W,QAAS,MAAO,IAAKA,QAAS,MAAO,OAGtCxoB,EAAQ,GAAIysB,QACf,IAAMX,EAAS,SAAWA,EAAS,MAAW,GAAJ5vB,EAAS,IAAM,IAAK+vB,KAAKta,KAE5Dka,IAEIla,EAAE6W,QAAS,YAAa,IAAKhsB,OAAS,IAGvC+vB,EAAmBR,EAAM,GAI7BF,GAASA,GAEbla,EAAI+a,EAAS/a,EAAG,GAAIzV,EAAGZ,EAAK,IAEf,YAALqW,GAAwB,OAALA,IAG3B4a,EAAmBR,EAAM,EAAG7vB,GAC5ByV,EAAI,QAYZ3R,EAAQgsB,EAAQC,KAAKta,IAGnB3R,EAkBF,MAfA1E,GAAK,EAAIA,EAAK,EAAI,KAGR,YAALqW,IAGS,OAALA,GAGD4a,EAAmBR,EAAM,GAE7BzwB,EAAK,EAAI,WAEbxC,EAAK,GA4Bb,KArBOsM,EAAIuM,EAAEgb,QAAQ,MAAS,KAC1Bhb,EAAIA,EAAE6W,QAAS,IAAK,MAIjBlsB,EAAIqV,EAAEiP,OAAQ,OAAW,GAGnB,EAAJxb,IACDA,EAAI9I,GAER8I,IAAMuM,EAAEkO,MAAOvjB,EAAI,GACnBqV,EAAIA,EAAEzG,UAAW,EAAG5O,IAER,EAAJ8I,IAGRA,EAAIuM,EAAEnV,QAIJF,EAAI,EAAkB,KAAfqV,EAAE1T,OAAO3B,GAAWA,KAcjC,GAXAJ,EAAIyV,EAAEnV,OAGDqvB,GAAS3vB,EAAI,IAAMyV,EAAEkO,MAAMvjB,GAAGE,OAAS,IAGxC+vB,EAAmBR,EAAM,GAE7BjzB,EAAK,GAGEsM,GAAK9I,EAAI,GAAMswB,EAGlBtxB,EAAK,EAAIA,EAAK,EAAI,SAGf,IAAKgB,GAAKJ,GAAS2wB,EAAJznB,EAGlB9J,EAAK,GAAMA,EAAK,EAAI,OACjB,CAGH,KAAyB,KAAjBqW,EAAE1T,SAAS/B,KAOnB,IAJAZ,EAAK,EAAI8J,EACT9J,EAAK,KAGC8J,EAAI,EAAQlJ,GAALI,EAAQhB,EAAK,EAAE8J,MAAQuM,EAAE1T,OAAO3B,QA6IrD,QAASiwB,GAAmB1kB,EAAKvL,EAAGkjB,EAAG/jB,EAASyQ,EAAS4gB,GAErD,GAAKT,EAAS,CACV,GAAIjM,GACA2M,GAAU,gBAAiB,MAAO,MAAO,KAAM,KAAM,MAAO,KACvD,MAAO,QAAS,MAAO,OAAQ,QAAS,QACtCj0B,EAAU,EAALA,GAAUA,EAAKA,EAAc,EAAT,EAAIA,EAAS,EAAI,GAAM,KACvD6K,EAAU2oB,EAAa,gBAAkB,UACrCpgB,EAAU,YAAc,KAAQ,UAmBxC,MAjBAvI,KACIopB,EAAS,mDACTA,EAAS,eAAiBvN,EAAI,UAC9BuN,EAAS,QAAUppB,EACnBopB,EAAS,iBAAkBzwB,IACzBkjB,EAAI,MAAQljB,GAAMwwB,EACd,iCACAnpB,GAAYlI,EACV,aAAgB6wB,EACd,sBACA,qBAAwB,KAC1B,MAAW,KAAOzkB,EAE9BykB,EAAaxzB,EAAK,EAClBsnB,EAAQ,GAAI7mB,OAAMoK,GAClByc,EAAY,KAAI,kBAEVA,GAQd,QAASsM,GAASM,EAAMC,EAASC,EAAQ9lB,GAMrC,QAAS+lB,GAAUtqB,EAAKuqB,GACpB,GAAI5N,GAGA6N,EAFA/wB,EAAI,EACJgxB,EAAOzqB,EAAIrG,OAEX+wB,GAAO,EAEX,KAAMH,EAAMA,GAAOF,EAAYI,EAAJhxB,EAAUA,IAAM,CAEvC,IAAM+wB,EAAOE,EAAI/wB,OAAQgjB,EAAI,EAAO6N,EAAJ7N,EAAU+N,EAAI/N,IAAM4N,EAAK5N,KAGzD,IAAM+N,EAAI,IAAMf,EAAOG,QAAS9pB,EAAI5E,OAAO3B,IAAMkjB,EAAI,EAC/CA,EAAI+N,EAAI/wB,OACRgjB,IAEG+N,EAAI/N,GAAKyN,EAAU,IAED,MAAdM,EAAI/N,EAAI,KACT+N,EAAI/N,EAAI,GAAK,GAEjB+N,EAAI/N,EAAI,IAAM+N,EAAI/N,GAAKyN,EAAU,EACjCM,EAAI/N,IAAMyN,GAKtB,MAAOM,GAAIC,UAKf,QAASC,GAAUF,GAKf,IAJA,GAAIjxB,GAAI,EACJ+wB,EAAOE,EAAI/wB,OACXqG,EAAM,GAEEwqB,EAAJ/wB,EAAUuG,GAAO2pB,EAAOvuB,OAAQsvB,EAAIjxB,OAG5C,MAAOuG,GA7CX,GAAIuC,GAAGsoB,EAAKC,EAAKC,EAAMC,EAASC,CAyDhC,IATc,GAATZ,IACDF,EAAOA,EAAK1J,gBAQTle,EAAI4nB,EAAKL,QAAS,MAAU,GA4B/B,GArBAvnB,EAAI4nB,EAAKxwB,OAAS4I,EAAI,EAGtBsoB,EAAMP,EAAU,GAAItzB,GAAUqzB,GAAa,IAAE9nB,GAAQ,MAAK,IAE1DwoB,EAAOZ,EAAKphB,MAAM,KAGlB+hB,EAAMR,EAAUS,EAAK,IAGrBA,EAAOT,EAAUS,EAAK,IAGtBE,EAAS3nB,EAAQwnB,EAAKD,EAAKC,EAAInxB,OAASkxB,EAAIlxB,OAAQ4K,EAAM6lB,EAEhC,EAAxBW,EAAKA,EAAKpxB,OAAS,IAErBqxB,EAAUC,EAAU,EAGf1oB,EAAI0oB,EAAU,EAAI,CAGnB,OAAU1oB,EAAGyoB,EAAQtf,QAAQ,IAI7Bye,EAAOS,EAASG,GAAQ,IAAMH,EAASI,OAI/BA,GAAQ,GAEXD,EAAMxoB,EAAIwoB,EAAKpxB,OAAS,GAAMywB,EAAU,KACvCW,EAAKxoB,GACP4nB,EAAOS,EAASG,IAEhBZ,EAAO,GAAInzB,GAAW4zB,EAASG,GAC7BX,GAAgB,KAAEc,GAAU,IAAEd,GAKpCD,EAAOS,EAASG,OAKpBZ,GAAOS,EAAUN,EAASH,GAG9B,OAAOA,GAKX,QAAS7mB,GAAQwnB,EAAKD,EAAKlnB,EAAKmT,EAAGtJ,EAAM2d,GACrC,GAAIC,GAAMC,EAAMhwB,EAAMwkB,EAAKyL,EACvBC,EAAOV,EAAI7N,QACXwO,EAAOJ,EAAOP,EAAIlxB,OAClB8xB,EAAOX,EAAInxB,OACX+xB,EAAMZ,EAAI9N,MAAO,EAAGoO,GACpBO,EAAOD,EAAI/xB,OACXiyB,EAAM,GAAI50B,GAAUk0B,GACpBW,EAAKD,EAAO,KACZE,EAAK,EACLC,EAAM30B,GAAmBw0B,EAAO,EAAIjoB,GAAQ,CAMhD,KAJAioB,EAAO,EAAI9U,EACXA,EAAU,EAANiV,EAAU,EAAIA,EAGVJ,IAASP,EAAMM,EAAIluB,KAAK,IAIhC+tB,EAAK7f,QAAQ,EAEb,GAAG,CAGC,IAAMrQ,EAAO,EAAUmS,EAAPnS,EAAaA,IAAS,CAGlC,GAAK+vB,IAAUO,EAAOD,EAAI/xB,QACtBkmB,EAAMuL,EAAOO,EAAO,EAAI,OAExB,KAAML,EAAO,GAAIzL,EAAM,IAAKyL,EAAOF,GAE/B,GAAKP,EAAIS,IAASI,EAAIJ,GAAQ,CAC1BzL,EAAMgL,EAAIS,GAAQI,EAAIJ,GAAQ,EAAI,EAClC,OAMZ,KAAW,EAANzL,GAoBD,KAhBA,KAAMwL,EAAOM,GAAQP,EAAOP,EAAMU,EAAMI,GAAQ,CAE5C,GAAKD,IAAMC,GAAQN,EAAKM,GAAQ,CAE5B,IAAML,EAAOK,EACXL,IAASI,IAAMJ,GACbI,EAAIJ,GAAQ9d,EAAO,KAErBke,EAAIJ,GACNI,EAAIC,IAASne,EAEjBke,EAAIC,IAASN,EAAKM,GAEtB,MAASD,EAAI,GAAIA,EAAIxgB,UAQ7B2gB,EAAGC,KAAQjM,EAAMxkB,IAASA,EAG1BqwB,EAAI,IAAM7L,EACJ6L,EAAIC,GAAQb,EAAIU,IAAS,EACzBE,GAAQZ,EAAIU,WAEVA,IAASC,GAAkB,MAAVC,EAAI,KAAgB5U,IA4BjD,OAzBM+U,GAAG,IAAY,GAANC,MAGTF,EAAO,EACTC,EAAG3gB,SAIF4gB,EAAKC,GACNC,EAAKJ,EAAKx0B,EAAgBoW,EAAM2d,EAAiB,MAAVO,EAAI,IAI1CE,EAAO,EAAI7B,EAGZ6B,EAAO,EAAIA,EAAO,EAAI,KAGdA,EAAO,EAAI5B,IAGnB4B,EAAO,GAAKA,EAAO,EAAI,IAGpBA,EAYX,QAASnkB,GAAQqH,EAAGF,EAAGjL,GAGnB,GAAIlK,GAAImV,GAAKE,EAAI,GAAI9X,GAAU8X,IAAO,EAClC3T,EAAI2T,EAAK,CAGb,KAAM3T,EACF,MAAO2T,GAAO,KAYlB,KARK3T,EAAExB,SAAWiV,GACdod,EAAKld,EAAGrV,EAAG,IAIfA,EAAY,GAAR0B,EAAE,GAAU1B,EAAI,EAAIkK,EAAMiL,EAAIE,EAAK,EAAIrV,EAAI,EAGvC0B,EAAExB,OAASF,EAAG0B,EAAEqC,KAAK,IAS7B,MAPA/D,GAAIqV,EAAK,EAOK,GAAPnL,GAAmB,GAAPA,MAAgBiL,EAAInV,GAAUwyB,GAALxyB,IAGtCqV,EAAK,EAAI,GAAK3T,EAAE,GAAK,IAAM,KAASA,EAAExB,OAAS,GAC7CwB,EAAEwiB,OAAQ,EAAG,EAAG,KAAOxiB,EAAEqP,KAAK,KAChCrP,EAAE,KAAa,EAAJ1B,EAAQ,IAAM,MAASA,EAGpCqV,EAAO,MAMf,QAASkd,GAAKvzB,EAAGyzB,EAAI1e,EAAM2d,EAAO3qB,GAC9B,GAAI2rB,GAAK1zB,EAAK,EACV2zB,EAAQ3zB,EAAK,EAAI,EACjB4zB,EAAO7e,EAAO,EACd/T,EAAIhB,EAAK,EAAIyzB,EAAK,EAGlB7wB,EAAO8wB,EAAG1yB,GAUV6yB,EAAO9rB,GAAS,EAAJ/G,GAAsB,MAAb0yB,EAAG1yB,EAAI,EAmBhC,IAjBA+G,EAAoB,EAAhB8oB,GACU,MAARjuB,GAAgBixB,KACC,GAAjBhD,GACkB,GAAjBA,IAAuB8C,GACJ,GAAjB9C,GAAsB8C,GAC3B/wB,EAAOgxB,GAAQhxB,GAAQgxB,IACJ,GAAjB/C,GAAsBgD,GAOL,GAAjBhD,IAAoC,EAAZ6C,EAAG1yB,EAAI,KAAWyyB,GAAMf,IAC7B,GAAjB7B,IAAuB8C,GACJ,GAAjB9C,GAAsB8C,GAEvB,EAAJ3yB,IAAU0yB,EAAG,GAed,MAdAA,GAAGxyB,OAAS,EACZwyB,EAAG3uB,KAAK,GAEHgD,GAGD2rB,EAAG,GAAK,EACR1zB,EAAK,GAAKyzB,GAIVzzB,EAAK,EAAI,EAGNA,CAOX,IAHA0zB,EAAGxyB,OAASF,IAGP+G,EAGD,MAAQgN,IAAQ2e,EAAG1yB,GAAK+T,GACpB2e,EAAG1yB,GAAK,EAEFA,QACAhB,EAAK,EACP0zB,EAAGzgB,QAAQ,GAMvB,KAAMjS,EAAI0yB,EAAGxyB,QAASwyB,IAAK1yB,GAAI0yB,EAAG5sB,OAGlC,MAAO9G,GAMX,QAAS4wB,GAAS5wB,EAAGyzB,EAAIK,GACrB,GAAI/rB,GAAI8oB,CAOR,OALAA,GAAgBiD,EAChB9zB,EAAI,GAAIzB,GAAUyB,GAClBA,EAAK,GAAKuzB,EAAKvzB,EAAGyzB,EAAI,IACtB5C,EAAgB9oB,EAET/H,EArxBX,GAoDIgxB,GApDA+C,EAAM,IAGNC,EAAY,IAGZr1B,EAAiB,GAejBkyB,EAAgB,EAMhB2C,EAAa,GAIbS,EAAa,GAMb1C,GAAWwC,EAIXzC,EAAUyC,EAIVhD,GAAS,EACT7xB,EAAQg1B,SAIRle,EAAIzX,EAAUgL,UACd2nB,EAAS,mEAET1zB,EAAK,EACLkzB,EAAU,uCACVI,EAAOvL,OAAOhc,UAAUunB,MAAQ,WAAa,MAAO1zB,MAAK8vB,QAAQ,aAAc,KAC/EuF,EAAMl0B,EAAU,EAuMpBA,GAAoB,SAAI,EACxBA,EAAsB,WAAI,EAC1BA,EAAsB,WAAI,EAC1BA,EAAuB,YAAI,EAC3BA,EAAyB,cAAI,EAC7BA,EAA2B,gBAAI,EAC/BA,EAA2B,gBAAI,EAC/BA,EAA2B,gBAAI,EAC/BA,EAA4B,iBAAI,EAiBhCA,EAAkB,OAAI,WAClB,GAAI6rB,GAAGxsB,EACHoD,EAAI,EACJ+G,KACApH,EAAIuB,UACJiyB,EAAIxzB,EAAE,GACN+B,EAAI,SACJ0xB,EAAU,SAAW/d,EAAGge,EAAIC,GAC1B,SAAYtD,EAAiBqD,EAAJhe,GAAUA,EAAIie,IACrCp1B,EAAMmX,IAAMA,GAAW,IAANA,IAErBke,EAAMJ,GAAiB,gBAALA,GACd,WAAa,MAAKA,GAAE3zB,eAAe5C,GAA4B,OAAdwsB,EAAI+J,EAAEv2B,IAA1C,QACb,WAAa,MAAK+C,GAAEO,OAASF,EAA6B,OAAhBopB,EAAIzpB,EAAEK,MAAnC,OAsFrB,OAnFKuzB,GAAK32B,EAAI,oBAELw2B,EAAShK,EAAG,EAAG2J,GAChBp1B,EAAqB,EAAJyrB,EAKjB6G,EAAmB7G,EAAGxsB,EAAG8E,IAGjCqF,EAAEnK,GAAKe,EAGF41B,EAAK32B,EAAI,mBAELw2B,EAAShK,EAAG,EAAG,GAChByG,EAAoB,EAAJzG,EAKhB6G,EAAmB7G,EAAGxsB,EAAG8E,IAGjCqF,EAAEnK,GAAKizB,EAMF0D,EAAK32B,EAAI,oBAELw2B,EAAShK,GAAI2J,EAAKA,GACnBP,IAAgBS,KAAqB,EAAJ7J,GAASA,GAAKA,KACtC4G,GAAc5G,GAAKgK,EAAShK,EAAE,IAAK2J,EAAK,IACnDK,EAAShK,EAAE,GAAI,EAAG2J,IAChBP,IAAepJ,EAAE,GACjB6J,IAAe7J,EAAE,IAKjB6G,EAAmB7G,EAAGxsB,EAAG8E,EAAG,IAGpCqF,EAAEnK,IAAO41B,EAAYS,GAMhBM,EAAK32B,EAAI,WAELw2B,EAAShK,GAAI2J,EAAKA,MAAW3J,EAC9BmH,IAAaD,KAAkB,EAAJlH,GAASA,GAAKA,KAChC4G,GAAc5G,GAAKgK,EAAShK,EAAE,IAAK2J,EAAK,KACnDK,EAAShK,EAAE,GAAI,EAAG2J,IAChBxC,IAAYnH,EAAE,GAAIkH,IAAYlH,EAAE,IAKhC6G,EAAmB7G,EAAGxsB,EAAG8E,EAAG,EAAG,IAGvCqF,EAAEnK,IAAO2zB,EAASD,GAGbiD,EAAK32B,EAAI,YAELwsB,MAAQA,GAAW,IAANA,GAAiB,IAANA,GACf4G,EAAaxzB,EAAK,EAA5B0B,GAA+B6xB,IAAW3G,GACtC8J,SACA7jB,YAIJ4gB,EAAmB7G,EAAGxsB,EAAG8E,EAAG,EAAG,EAAG,IAG1CqF,EAAEnK,GAAKmzB,EAEAhpB,GAoaXiO,EAAO,IAAIA,EAAiB,cAAI,WAC5B,GAAIhW,GAAI,GAAIzB,GAAUnB,KAMtB,OAJK4C,GAAK,EAAI,IACVA,EAAK,EAAI,GAGNA,GAQXgW,EAAQ,KAAI,WACR,MAAO4a,GAASxzB,KAAM,EAAG,IAW7B4Y,EAAc,WAAIA,EAAO,IAAI,SAAWQ,EAAG5V,GACvC,GAAID,GACAX,EAAI5C,KACJs2B,EAAK1zB,EAAK,EACVw0B,GAAOh3B,GAAMA,EAAIgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,EAChDI,EAAIhB,EAAK,EACTkkB,EAAI1N,EAAK,EACTZ,EAAI5V,EAAK,EACT0b,EAAIlF,EAAK,CAGb,KAAMxV,IAAMkjB,EACR,MAAO,KAMX,IAHAvjB,EAAI+yB,IAAOA,EAAG,GAAI9yB,EAAI4zB,IAAOA,EAAG,GAG3B7zB,GAAKC,EACN,MAAOD,GAAIC,EAAI,GAAKsjB,EAAIljB,CAI5B,IAAKA,GAAKkjB,EACN,MAAOljB,EAIX,IAAKL,EAAQ,EAAJK,EAAOJ,EAAIgV,GAAK8F,GAAIgY,IAAOc,EAChC,MAAO5zB,GAAI,GAAK8yB,EAAK/yB,EAAI,EAAI,EAIjC,KAAMC,EACF,MAAOgV,GAAI8F,EAAI/a,EAAI,EAAI,EAI3B,KAAMK,EAAI,GACJkjB,GAAMtO,EAAI8d,EAAGxyB,SAAawa,EAAI8Y,EAAGtzB,QAAW0U,EAAI8F,IAC9C1a,EAAIkjB,GAER,GAAKwP,EAAG1yB,IAAMwzB,EAAGxzB,GACb,MAAO0yB,GAAG1yB,GAAKwzB,EAAGxzB,GAAKL,EAAI,EAAI,EAIvC,OAAOiV,IAAK8F,EAAI,EAAI9F,EAAI8F,EAAI/a,EAAI,EAAI,IAyBxCqV,EAAa,UAAIA,EAAO,IAAI,SAAWQ,EAAG5V,GACtC,GAAI8yB,GAAKt2B,KAAQ,EACbq3B,EAAKr3B,KAAQ,EACbs3B,EAAKt3B,KAAQ,EACbo3B,GAAOh3B,EAAK,EAAGgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,EAC9C+zB,EAAKne,EAAK,EACVoe,EAAKpe,EAAK,EACV6H,EAAIqW,GAAME,EAAK,EAAI,EAGvB,QAAQH,GAASf,GAAOA,EAAG,MAASiB,GAASH,GAAOA,EAAG,IAoBnD3pB,EAAQ6oB,EAAIc,EAAIC,EAAKE,EAAItW,EAAG,IAjB5B,GAAI9f,GAAYm2B,GAAOE,IAGrBlB,GAAKc,GAAMd,EAAG,IAAMc,EAAG,GAAMA,GAM3Bd,GAAe,GAATA,EAAG,KAAYc,EAGf,EAAJnW,EAGAA,EAAI,EATNjU,MAmBZ4L,EAAU,OAAIA,EAAM,GAAI,SAAWK,EAAGzV,GAElC,MADApD,GAAK,EAC0B,IAAxBJ,KAAU,IAAGiZ,EAAGzV,IAQ3BoV,EAAS,MAAI,WACT,MAAO4a,GAASxzB,KAAM,EAAG,IAQ7B4Y,EAAe,YAAIA,EAAM,GAAI,SAAWK,EAAGzV,GAEvC,MADApD,GAAK,EACEJ,KAAU,IAAGiZ,EAAGzV,GAAM,GAQjCoV,EAAwB,qBAAIA,EAAO,IAAI,SAAWK,EAAGzV,GAEjD,MADApD,GAAK,EACiC,IAA7BoD,EAAIxD,KAAU,IAAGiZ,EAAGzV,KAAoB,IAANA,GAQ/CoV,EAAY,SAAIA,EAAO,IAAI,WACvB,QAAS5Y,KAAQ,GAQrB4Y,EAAS,MAAI,WACT,OAAQ5Y,KAAQ,GAQpB4Y,EAAc,WAAIA,EAAS,MAAI,WAC3B,MAAO5Y,MAAQ,EAAI,GAQvB4Y,EAAU,OAAIA,EAAO,IAAI,WACrB,QAAS5Y,KAAQ,GAAqB,GAAhBA,KAAQ,EAAE,IAQpC4Y,EAAY,SAAIA,EAAM,GAAI,SAAWK,EAAGzV,GAEpC,MADApD,GAAK,EACEJ,KAAU,IAAGiZ,EAAGzV,GAAM,GAQjCoV,EAAqB,kBAAIA,EAAO,IAAI,SAAWK,EAAGzV,GAE9C,MADApD,GAAK,EACiC,KAA7BoD,EAAIxD,KAAU,IAAGiZ,EAAGzV,KAAqB,IAANA,GAwBhDoV,EAAS,MAAI,SAAWQ,EAAG5V,GACvB,GAAIuV,GAAGnV,EAAGkjB,EAAG2Q,EACT70B,EAAI5C,KACJuD,EAAIX,EAAK,CAKb,IAHAY,GAAMpD,EAAK,EAAGgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,GAGvCD,IAAMC,EACR,MAAO,IAAIrC,GAAU6L,IAIzB,IAAKzJ,GAAKC,EACN,MAAO4V,GAAK,GAAK5V,EAAGZ,EAAQ,KAAEwW,EAGlC,IAAIkd,GAAK1zB,EAAK,EACVy0B,EAAKz0B,EAAK,EACVw0B,EAAKhe,EAAK,EACVme,EAAKne,EAAK,CAEd,KAAMie,IAAOE,EAAK,CAGd,IAAMjB,IAAOc,EACT,MAAOd,IAAOld,EAAK,GAAK5V,EAAG4V,GAAM,GAAIjY,GAAWi2B,EAAKx0B,EAAIoK,IAI7D,KAAMspB,EAAG,KAAOc,EAAG,GAGf,MAAOA,GAAG,IACJhe,EAAK,GAAK5V,EAAG4V,GAGf,GAAIjY,GAAWm1B,EAAG,GAChB1zB,EAIiB,GAAjB6wB,GAAsB,EAAI,GAMxC,GAAK6C,EAAKA,EAAGnP,QAAS5jB,EAAI8zB,EAAKE,EAAK,CAGhC,IAFAxe,GAAM0e,EAAW,EAAJl0B,IAAYA,GAAKA,EAAG+yB,IAASiB,EAAKF,EAAID,GAE7Cre,EAAE+b,UAAWtxB,EAAID,EAAGC,IAAKuV,EAAEpR,KAAK,IAEtCoR,EAAE+b,cAMF,KAFAhO,IAAQ2Q,EAAOnB,EAAGxyB,OAASszB,EAAGtzB,QAAWwyB,EAAKc,GAAKtzB,OAE7CP,EAAIC,EAAI,EAAOsjB,EAAJtjB,EAAOA,IAEpB,GAAK8yB,EAAG9yB,IAAM4zB,EAAG5zB,GAAK,CAClBi0B,EAAOnB,EAAG9yB,GAAK4zB,EAAG5zB,EAClB,OAeZ,GATKi0B,IACD1e,EAAIud,EAAIA,EAAKc,EAAIA,EAAKre,EACtBK,EAAK,GAAKA,EAAK,IAOZ5V,KAASsjB,EAAIwP,EAAGxyB,QAAWszB,EAAGtzB,SAAa,EAE9C,KAAQN,IAAK8yB,EAAGxP,KAAO,GAK3B,IAAMtjB,EAAI4zB,EAAGtzB,OAAQN,EAAID,GAAI,CAEzB,GAAK+yB,IAAK9yB,GAAK4zB,EAAG5zB,GAAK,CAEnB,IAAMI,EAAIJ,EAAGI,IAAM0yB,IAAK1yB,GAAI0yB,EAAG1yB,GAAK,KAElC0yB,EAAG1yB,GACL0yB,EAAG9yB,IAAM,GAEb8yB,EAAG9yB,IAAM4zB,EAAG5zB,GAIhB,KAAmB,GAAX8yB,IAAKxP,GAASwP,EAAG5sB,OAIzB,KAAiB,GAAT4sB,EAAG,GAASA,EAAGjhB,UAAWkiB,GAuBlC,OAdUpD,EAALoD,IAAiBjB,EAAG,MAMfA,EAAG,KACLld,EAAK,EAAqB,GAAjBqa,EAAqB,GAAK,GAIvC6C,GAAMiB,EAAK,IAGRne,EAAK,EAAIkd,EAAIld,EAAK,EAAIme,EAAIne,GAkBrCR,EAAU,OAAIA,EAAO,IAAI,SAAWQ,EAAG5V,GACnC,GAAIZ,GAAI5C,KACJs2B,EAAK1zB,EAAK,EACVw0B,GAAOh3B,EAAK,EAAGgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,EAC9CI,EAAIhB,EAAK,EACTkkB,EAAI1N,EAAK,CAKb,OAFA5V,IAAKI,IAAMkjB,GAAKsQ,IAAOA,EAAG,GAErB5zB,GAAK8yB,IAAOA,EAAG,GACT,GAAIn1B,GAAWqC,EAAIwJ,IAAMpK,IAGpCA,EAAK,EAAIwW,EAAK,EAAI,EAClB5V,EAAmB,GAAf4V,EAAO,IAAExW,GACbA,EAAK,EAAIgB,EAAGwV,EAAK,EAAI0N,EAEdtjB,EACH,GAAIrC,GAAUyB,IACZgB,EAAIrC,EAAgBulB,EAAI2M,EAC1BlyB,EAAiB,EAAGkyB,EAAgB,EAClC7wB,EAAIA,EAAO,IAAEwW,GACX7X,EAAiBqC,EAAG6vB,EAAgB3M,EAClC9mB,KAAY,MAAG4C,EAAS,MAAEwW,OAQxCR,EAAW,QAAIA,EAAO,IAAI,WACtB,GAAIhW,GAAI,GAAIzB,GAAUnB,KAEtB,OAAO4C,GAAK,GAAKA,EAAK,GAAK,KAAMA,GAwBrCgW,EAAQ,KAAI,SAAWQ,EAAG5V,GACtB,GAAIuV,GACAnW,EAAI5C,KACJuD,EAAIX,EAAK,CAKb,IAHAY,GAAMpD,EAAK,GAAIgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,GAGxCD,IAAMC,EACR,MAAO,IAAIrC,GAAU6L,IAIzB,IAAKzJ,GAAKC,EACN,MAAO4V,GAAK,GAAK5V,EAAGZ,EAAS,MAAEwW,EAGnC,IAAIie,GAAKz0B,EAAK,EACV0zB,EAAK1zB,EAAK,EACV20B,EAAKne,EAAK,EACVge,EAAKhe,EAAK,CAEd,KAAMie,IAAOE,EAAK,CAGd,IAAMjB,IAAOc,EAGT,MAAO,IAAIj2B,GAAWoC,EAAI,EAI9B,KAAM+yB,EAAG,KAAOc,EAAG,GAGf,MAAOA,GAAG,GACNhe,EAGA,GAAIjY,GAAWm1B,EAAG,GAChB1zB,EAGI,EAAJW,GAMd,GAAK+yB,EAAKA,EAAGnP,QAAS5jB,EAAI8zB,EAAKE,EAAK,CAGhC,IAFAxe,EAAIxV,EAAI,GAAMg0B,EAAKF,EAAID,IAAS7zB,GAAKA,EAAG+yB,GAElCvd,EAAE+b,UAAWvxB,IAAKwV,EAAEpR,KAAK,IAE/BoR,EAAE+b,UAYN,IARKwB,EAAGxyB,OAASszB,EAAGtzB,OAAS,IACzBiV,EAAIqe,EAAIA,EAAKd,EAAIA,EAAKvd,GAOpBxV,EAAI6zB,EAAGtzB,OAAQN,EAAI,EAAGD,EACvBC,GAAM8yB,IAAK/yB,GAAK+yB,EAAG/yB,GAAK6zB,EAAG7zB,GAAKC,GAAM,GAAK,EAAG8yB,EAAG/yB,IAAM,IAiB5D,IAZKC,IACD8yB,EAAGzgB,QAAQrS,KAGJ+zB,EAAKrD,IAGRoC,EAAKiB,EAAK,OAKZh0B,EAAI+yB,EAAGxyB,OAAmB,GAAXwyB,IAAK/yB,GAAS+yB,EAAG5sB,OAGtC,MAAO0P,GAAK,EAAIkd,EAAIld,EAAK,EAAIme,EAAIne,GAWrCR,EAAW,QAAIA,EAAO,IAAI,SAAWlM,GAGjC,GAAI9I,GAAQ,EAAJ8I,GAAS,EAAQ,EAAJA,EAAQA,EACzB9J,EAAI,GAAIzB,GAAUnB,MAClBoZ,EAAI,GAAIjY,GAAUk0B,EAItB,MAAWzB,GAAkBgD,EAALlqB,GAAkBA,EAAIkqB,KAC3ChzB,EAAQ,EAAJ8I,EAAQ,IAQV5K,EAAM4K,IAAMA,GAAW,IAANA,KAAa9I,EAAIoJ,QAIhC6mB,EAAmBnnB,EAAG,WAAY,SAGhC9I,EAGL,MAAO,IAAIzC,GAAWuS,KAAKlF,IAAK5L,EAAO,MAAKgB,GAGhD,KAAMA,EAAQ,EAAJA,GAASA,EAAIA,EAEV,EAAJA,IACDwV,EAAIA,EAAS,MAAExW,IAEnBgB,IAAM,EAEAA,GAGNhB,EAAIA,EAAS,MAAEA,EAGnB,OAAW,GAAJ8J,EAAQ2oB,EAAS,IAAEjc,GAAKA,GAYnCR,EAAS,MAAI,SAAWyd,EAAIK,GAsBxB,MApBAL,GAAW,MAANA,KAAoBzC,EAAkB,EAALyC,GAAUA,EAAKM,IACnD70B,EAAMu0B,IAAOA,KAIVxC,EAAmBwC,EAAI,iBAAkB,SACtC,EACK,EAALA,EAERK,EAAW,MAANA,KAAoB9C,EAAkB,EAAL8C,GAAUA,EAAK,IAGnD50B,EAAM40B,IAAOA,GAAa,IAAPA,KAIhB7C,EAAmB6C,EAAI,OAAQ,SAC5BjD,EACK,EAALiD,EAEDlD,EAASxzB,KAAMq2B,EAAIK,IAe9B9d,EAAc,WAAIA,EAAQ,KAAI,WAC1B,GAAIK,GAAGtO,EAAG0E,EAAI0Z,EACVnmB,EAAI5C,KACJsF,EAAI1C,EAAK,EACTqe,EAAIre,EAAK,EACT8J,EAAI9J,EAAK,EACTyzB,EAAK90B,EACLm1B,EAAKjD,EACL+C,EAAO,GAAIr1B,GAAU,MAGzB,IAAW,IAAN8f,IAAY3b,IAAMA,EAAE,GAErB,MAAO,IAAInE,IAAY8f,GAAS,EAAJA,KAAY3b,GAAKA,EAAE,IAC3C0H,IACA1H,EAAI1C,EAAI,EAAI,EAoCpB,KAhCAqe,EAAIvN,KAAK7E,KAAMjM,EAAO,OACtB6wB,EAAgB,EAMN,GAALxS,GAAUA,GAAK,EAAI,GACpBhI,EAAI3T,EAAEqP,KAAK,IAEHsE,EAAEnV,OAAS4I,EAAI,IACnBuM,GAAK,KAETtO,EAAI,GAAIxJ,GAAWuS,KAAK7E,KAAKoK,GAAK,IAG5BtO,EAAK,IACPA,EAAK,GAAK,IAEdA,EAAK,IAAU+B,EAAI,GAAM,EAAM,IAAY,EAAJA,GAAa,EAAJA,IAEhD/B,EAAI,GAAIxJ,GAAW8X,EAAIgI,EAAEnO,YAE7BzD,EAAK1E,EAAK,EACVsW,EAAI5R,GAAO9N,GAAkB,GAEpB,EAAJ0f,IACDA,EAAI,GAERvU,EAAIuU,IAOA,GAHA8H,EAAIpe,EACJA,EAAI6rB,EAAY,MAAGzN,EAAQ,KAAGnmB,EAAO,IAAEmmB,KAElCA,EAAK,EAAE5B,MAAO,EAAGlG,GAAItM,KAAK,MAAQhK,EAAK,EAAEwc,MAAO,EAAGlG,GAAItM,KAAK,IAAM,CAenE,GAdArP,EAAIqF,EAAK,EAOTsW,GAAUhI,GAAKtO,EAAK,EAAI0E,EAOX,GAAR/J,EAAE2b,IAAuB,GAAZ3b,EAAE2b,EAAI,IAAuB,GAAZ3b,EAAE2b,EAAI,MACnB,GAAZ3b,EAAE2b,EAAI,IAAWhI,GAAiB,GAAZ3T,EAAE2b,EAAI,IAmB/B,CAOH,KAAM3b,EAAEoH,IAAOpH,EAAEoH,EAAI,IAAOpH,EAAEoH,EAAI,IACvBpH,EAAEoH,EAAI,IAAkB,GAAZpH,EAAEoH,EAAI,KAGpBpH,EAAExB,OAAS4I,EAAI,IAChBpH,EAAExB,OAAS4I,EAAI,GAGb/B,EAAS,MAAEA,GAAO,GAAE/H,KAAK,CAE3B,KAAQ0C,EAAExB,OAAS4I,EAAI,GACnBpH,EAAEqC,KAAK,EAEXrC,GAAEoH,EAAI,KAMd,MAHA+mB,GAAgBiD,EAChBP,EAAKxrB,EAAGpJ,EAAiB80B,EAAI,IAEtB1rB,EAvCP,GAAKsO,GAAiB,GAAZ3T,EAAE2b,EAAI,KACZ8H,EAAIpe,EAAS,MAAG0rB,EAAI,GAEftN,EAAS,MAAEA,GAAO,GAAEnmB,IAIrB,MAHA6wB,GAAgBiD,EAChBn1B,EAAiB80B,EAEVtN,CAGfxnB,IAAkB,EAClB0f,GAAK,EACLhI,EAAI,KAsDpBL,EAAS,MAAI,SAAWQ,EAAG5V,GACvB,GAAI8B,GACA1C,EAAI5C,KACJs2B,EAAK1zB,EAAK,EACVw0B,GAAOh3B,EAAK,GAAIgZ,EAAI,GAAIjY,GAAWiY,EAAG5V,IAAS,EAC/CI,EAAIhB,EAAK,EACTkkB,EAAI1N,EAAK,EACT7V,EAAIX,EAAK,CAKb,IAHAwW,EAAK,EAAI7V,IAAOC,EAAI4V,EAAK,GAAM,EAAI,MAG7BxV,GAAQ0yB,GAAOA,EAAG,MAASxP,GAAQsQ,GAAOA,EAAG,KAG/C,MAAO,IAAIj2B,IAAYoC,IAAMC,GAG3B8yB,IAAOA,EAAG,KAAOc,GAAMA,IAAOA,EAAG,KAAOd,EAGpCtpB,IAGCspB,GAAOc,EAMG,EAAThe,EAAK,EAHLA,EAAK,EAAI,EAWrB,KANAA,EAAK,EAAIxV,EAAIkjB,GAENvjB,EAAI+yB,EAAGxyB,SAAaN,EAAI4zB,EAAGtzB,UAC9BwB,EAAIgxB,EAAIA,EAAKc,EAAIA,EAAK9xB,EAAGwhB,EAAIvjB,EAAGA,EAAIC,EAAGA,EAAIsjB,GAGzCA,EAAIvjB,EAAIC,EAAG8B,KAAQwhB,IAAKxhB,EAAEqC,KAAK,IAIrC,IAAM/D,EAAIJ,EAAI,EAAGI,EAAI,GAAIA,IAAM,CAE3B,IAAMJ,EAAI,EAAGsjB,EAAIvjB,EAAIK,EACfkjB,EAAIljB,EACJJ,EAAI8B,EAAEwhB,GAAKsQ,EAAGxzB,GAAK0yB,EAAGxP,EAAIljB,EAAI,GAAKJ,EACnC8B,EAAEwhB,KAAOtjB,EAAI,GAAK,EAClBA,EAAIA,EAAI,GAAK,GAGdA,IACD8B,EAAEwhB,IAAOxhB,EAAEwhB,GAAKtjB,GAAM,IAU9B,IANAA,KAAO4V,EAAK,GAGX9T,EAAE,IAAMA,EAAE+P,QAGLyR,EAAIxhB,EAAExB,QAASwB,IAAIwhB,GAAIxhB,EAAEoE,OAoB/B,MAdA0P,GAAK,EAAIA,EAAK,EAAI8a,EAGZ9a,EAAK,EAAI,KAGXA,EAAK,EAAI+a,GAGL/a,EAAK,EAAI,GAGX9T,EAEC8T,GAWXR,EAAiB,cAAIA,EAAO,IAAI,SAAWyd,GAEvC,MAAOzkB,GAAQ5R,MACL,MAANq2B,KAAkBzC,EAAkB,EAALyC,GAAUA,EAAKM,IAM9C70B,EAAMu0B,IAAOA,GAAa,IAAPA,KAIhBxC,EAAmBwC,EAAI,iBAAkB,SAAar2B,KAAQ,EAC3DA,KAAQ,EAAE8D,OAAS,EACd,EAALuyB,EAAQ,IActBzd,EAAW,QAAIA,EAAO,IAAI,SAAWyd,GACjC,GAAIpd,GAAG9O,EAAK4O,EACRnW,EAAI5C,IAoCR,OAlCc,OAANq2B,KAAkBzC,EAAkB,EAALyC,GAAUA,EAAKM,IAClD70B,EAAMu0B,IAAOA,GAAa,IAAPA,KAIlBxC,EAAmBwC,EAAI,iBAAkB,SACxCtd,EAAInW,EAAK,GAAW,EAALyzB,IAGrBpd,EAAImd,EAAYC,EAAKQ,EACrBT,IAAgBS,EAAa,EAAI,GAG5B9d,GAAK5O,EACNA,EAAMvH,EAAO,OAEbuH,EAAMyH,EAAQhP,EAAGmW,GAIZnW,EAAK,EAAI,GAAKA,EAAK,IAGdA,EAAK,EAAE,GAIDuH,EAAI8pB,QAAQ,KAAO,IAC3B9pB,EAAM,IAAMA,GAJZA,EAAMA,EAAI2lB,QAAQ,KAAM,MAQpCsG,EAAand,EAAG4d,EAAaR,EAEtBlsB,GAcXyO,EAAc,WAAIA,EAAQ,KAAI,SAAW8e,GACrC,GAAIrN,GAAGsN,EAAMC,EAAIC,EAAIC,EAAI7e,EAAGvM,EACxBqrB,EAAKF,EAAK,GAAI12B,GAAUk0B,GACxB2C,EAAKJ,EAAK,GAAIz2B,GAAU,KACxByB,EAAI5C,KACJs2B,EAAK1zB,EAAK,EACVkL,EAAMomB,EACNmC,EAAK90B,EACLm1B,EAAKjD,EACL1a,EAAI,GAAI5X,GAAUk0B,EAGtB,KAAMiB,EACF,MAAO1zB,GAAO,KA+BlB,KA5BA8J,EAAIqM,EAAK,EAAIud,EAAGxyB,OAASlB,EAAK,EAAI,GAGrB,MAAR80B,MAGKt3B,EAAK,GAAI6Y,EAAI,GAAI9X,GAAUu2B,IAAW,IAGvC9D,EAAa3a,EAAO,IAAE8e,GAAM,IAAM9e,EAAK,IAGrC0a,GAAU1a,EAAK,EAAIA,EAAK,EAAEnV,OAAS,KAIlC+vB,EAAmB6D,EAAM,kBAAmB,UAGzCA,EAAOze,GAAS,IAAEF,GAAK,KAGlC2e,EAAOhrB,EAAI,EAAIqM,EAAIgf,GAGvB7D,EAAU,EAAI,EACdjb,EAAI,GAAI9X,GAAWm1B,EAAG3hB,KAAK,KAErBpT,EAAiB,EAAGkyB,EAAgB,EACtCpJ,EAAIpR,EAAO,IAAEF,GACb+e,EAAKD,EAAS,KAAGxN,EAAS,MAAE2N,IAEJ,GAAnBF,EAAQ,IAAEJ,IAIfG,EAAKG,EAAIA,EAAKF,EAEdC,EAAKH,EAAS,KAAGvN,EAAS,MAAGyN,EAAKC,IAClCH,EAAKE,EAEL/e,EAAIE,EAAS,MAAGoR,EAAS,MAAGyN,EAAK/e,IACjCE,EAAI6e,CAkBR,OAfAA,GAAKJ,EAAY,MAAEG,GAAS,IAAEG,GAC9BJ,EAAKA,EAAS,KAAGE,EAAU,MAAEC,IAC7BF,EAAKA,EAAS,KAAGC,EAAU,MAAEE,IAE7BJ,EAAM,EAAIG,EAAM,EAAIn1B,EAAK,EAEzBrB,EAAqB,EAAJmL,EACjB+mB,EAAgBiD,EAGhBiB,EAAOI,EAAQ,IAAEC,GAAW,MAAEp1B,GAAQ,MAAS,IAC7Cg1B,EAAQ,IAAEC,GAAW,MAAEj1B,GAAQ,OAAQ,GACnCm1B,EAAQ,MAAKC,EAAQ,QACrBJ,EAAQ,MAAKC,EAAQ,OAEpB3D,EAAUpmB,EAAKvM,EAAiB80B,EAAIsB,GAY/C/e,EAAe,YAAIA,EAAO,IAAI,SAAWqf,GAOrC,MAAa,OAANA,KAAoBrE,EAAkB,EAALqE,GAAUA,EAAKtB,IACrD70B,EAAMm2B,IAAOA,KAIVpE,EAAmBoE,EAAI,YAAa,OACjCj4B,KAAU,MACV4R,EAAQ5R,KAAa,IAALi4B,EAAQ,IAcpCrf,EAAY,SAAIA,EAAO,IAAI,SAAWpV,GAClC,GAAIwV,GAAG7O,EAAKyqB,EACRhyB,EAAI5C,KACJq3B,EAAKz0B,EAAK,CAGd,IAAY,OAAPy0B,EACDltB,EAAMvH,EAAK,EAAI,WAAa,UAGzB,CAAA,GAAKY,IAAMwV,IAAaod,GAANiB,GAAoBA,GAAMR,GAC/C,MAAOjlB,GAAQhP,EAAGA,EAAK,EAAEkB,OAAS,EAAG,EAKrC,IAHAqG,EAAMvH,EAAK,EAAE+R,KAAK,IAGR,EAAL0iB,EAAS,CAGV,OAAUA,EAAIltB,EAAM,IAAMA,GAE1BA,EAAM,KAAOA,MAGV,IAAKyqB,EAAOzqB,EAAIrG,OAAQuzB,EAAK,EAEhC,KAAOA,EAAKzC,EAGR,IAAMyC,GAAMzC,EAAMyC,IAAOltB,GAAO,SAEnByqB,GAALyC,IACRltB,EAAMA,EAAIgd,MAAO,EAAGkQ,GAAO,IAAMltB,EAAIgd,MAAMkQ,QAK/C,IAAKre,EAAI7O,EAAI5E,OAAO,GAAIqvB,EAAO,EAC3BzqB,EAAM6O,EAAI,IAAM7O,EAAIgd,MAAM,OAGvB,IAAU,KAALnO,EACR,MAAOA,EAIf,IAAU,MAALxV,EAED,IAAQowB,IAAgBpwB,GAAK,GAAS,GAAJA,KAC9BA,IAAU,EAAJA,IAAWmwB,EAWjBE,EAAmBrwB,EAAG,OAAQ,WAP9B,IAHA2G,EAAM6pB,EAAS7pB,EAAS,EAAJ3G,EAAO,GAAIZ,EAAK,GAGxB,KAAPuH,EACD,MAAOA,GAYvB,MAAOvH,GAAK,EAAI,EAAI,IAAMuH,EAAMA,GAOpCyO,EAAW,QAAI,WACX,MAAO5Y,MAAU,OAkBE,mBAAXH,IAA0BA,EAAOD,QACzCC,EAAOD,QAAUuB,GAIf8xB,EAAiC,WAC/B,MAAO9xB,IACTb,KAAKV,EAASK,EAASL,EAASC,KAA4CgD,SAAlCowB,IAAgDpzB,EAAOD,QAAUqzB,MAOjHjzB,OAKC,SAASH,EAAQD,EAASK,GAyO/B,QAASi4B,GAASj1B,GAChB,MAAQA,aAAiB9B,GAAa8B,EAAMynB,SAAsB,IAAVznB,EAc1D,QAASk1B,GAAWl1B,EAAOm1B,EAAOC,GAChC,GAAI/qB,EACJ,OAAIrK,aAAiB9B,IACnBmM,EAAMrK,EAAMqK,MACJA,EAAIwb,IAAIsP,IAAU9qB,EAAIoY,GAAG2S,KAGjC/qB,EAAMoG,KAAKpG,IAAIrK,GACPqK,GAAO8qB,GAAeC,EAAN/qB,GA9P5B,GAAInM,GAAYlB,EAAQ,IAOxBL,GAAQiS,SAAW,SAAkB5O,GACnC,MAAQA,aAAiBoP,SAA4B,gBAATpP,IAQ9CrD,EAAQsU,UAAY,SAAmBjR,GACrC,MAAQA,IAASyQ,KAAKjF,MAAMxL,IAS9BrD,EAAQ8O,KAAO,SAAe9L,GAC5B,MAAIA,GAAI,EACC,EAEI,EAAJA,EACA,GAGA,GAoEXhD,EAAQgS,OAAS,SAAgB3O,EAAO0P,GACtC,GAAuB,kBAAZA,GAET,MAAOA,GAAQ1P,EAIjB,IAAcitB,MAAVjtB,EACF,MAAO,UAEJ,IAAIA,KAAWitB,IAClB,MAAO,WAEJ,IAAI3c,MAAMtQ,GACb,MAAO,KAIT,IAAIq1B,GAAW,OACX72B,EAAYoB,MAoBhB,QAlBgBA,SAAZ8P,IAEEA,EAAQ2lB,WACVA,EAAW3lB,EAAQ2lB,UAIjB3lB,IACE/S,EAAQiS,SAASc,GACnBlR,EAAYkR,EAELA,EAAQlR,YACfA,EAAYkR,EAAQlR,aAMlB62B,GACN,IAAK,QACH,MAAO14B,GAAQ24B,QAAQt1B,EAAOxB,EAGhC,KAAK,aACH,KAAM,IAAIZ,OAAM,yEAElB,KAAK,cACH,MAAOjB,GAAQ44B,cAAcv1B,EAAOxB,EAEtC,KAAK,OAGH,GAAI22B,GAAQ,KACRC,EAAQ,GACZ,IAAI1lB,GAAWA,EAAQ8lB,YACa51B,SAA9B8P,EAAQ8lB,YAAYL,QACtBA,EAAQzlB,EAAQ8lB,YAAYL,OAEIv1B,SAA9B8P,EAAQ8lB,YAAYJ,QACtBA,EAAQ1lB,EAAQ8lB,YAAYJ,WAG3B,IAAI1lB,GAAWA,EAAQuF,WAE1B,KAAM,IAAIrX,OAAM,qEAIlB,IAAI63B,GAAcz1B,YAAiB9B,EACnC,IAAIu3B,EAAa,CACf,GAAIC,GAAgBx3B,EAAUD,SAAS03B,cACvCz3B,GAAUD,QACR03B,gBACEllB,KAAKjF,MAAMiF,KAAKrF,IAAI+pB,GAAS1kB,KAAK7G,MAClC6G,KAAKjF,MAAMiF,KAAKrF,IAAIgqB,GAAS3kB,KAAK7G,SAMxC,GAAIqrB,EAAQj1B,GACV,MAAO,GAIT,IAAIkH,EACJ,IAAIguB,EAAWl1B,EAAOm1B,EAAOC,GAE3B,GAAIK,EACFvuB,EAAM,GAAIhJ,GAAU8B,EAAM41B,YAAYp3B,IAAYqR,eAE/C,CAEH,GAAIgmB,GAAWr3B,EACXwB,EAAM41B,YAAYnlB,KAAK3C,IAAItP,EAAW,KACtCwB,EAAM41B,aACV1uB,GAAM8I,WAAW6lB,GAAY,OAK/B3uB,GAAMvK,EAAQ44B,cAAcv1B,EAAOxB,EASrC,OALIi3B,IACFv3B,EAAUD,QAAQ03B,eAAgBD,IAI7BxuB,EAAI2lB,QAAQ,sBAAuB,WACxC,GAAIsD,GAAStuB,UAAU,GACnB4H,EAAI5H,UAAU,EAClB,OAAmB,MAAXsuB,EAAkBA,EAAS1mB,EAAIA,GAG3C,SACE,KAAM,IAAI7L,OAAM,qBAAuBy3B,EAAW,kDA8CxD14B,EAAQ44B,cAAgB,SAAwBv1B,EAAOxB,GACrD,MAAkBoB,UAAdpB,EAEOwB,EAAMu1B,cADXv1B,YAAiB9B,GACQM,EAAY,EAGZiS,KAAK3C,IAAItP,EAAY,EAAG,KAI9CwB,EAAMu1B,iBAUjB54B,EAAQ24B,QAAU,SAAkBt1B,EAAOxB,GACzC,MACSwB,GAAMs1B,QADXt1B,YAAiB9B,GACEM,GAAa,EAKbiS,KAAK3C,IAAItP,EAAW,MAe7C7B,EAAQwzB,OAAS,SAAiBnwB,GAChC,MAAOA,GACFu1B,gBACA1I,QAAQ,eAAgB,IACxBA,QAAS,YAAa,IACtBhsB,QAUPlE,EAAQyoB,YAAc,SAAsBpnB,GAC1C,MAAIrB,GAAQwzB,OAAOnyB,GAAU,GACpBA,EAGA,GAAIE,GAAUF,IAUzBrB,EAAQuL,SAAW,SAAmBoE,GACpC,MAAO0D,YAAW1D,EAAUuE,aAMzB,SAASjU,EAAQD,EAASK,GAc/B,QAAS+U,GAAMpS,GAGb,IAFA,GAAIuN,MAEGpN,EAAQH,IACbuN,EAAKxI,KAAK/E,EAAEkB,QACZlB,EAAIA,EAAE,EAGR,OAAOuN,GA+BT,QAAS4oB,GAAUzuB,EAAO6F,EAAMqE,GAC9B,GAAI5Q,GACAC,EAAMyG,EAAMxG,MAEhB,IAAID,GAAOsM,EAAKqE,GACd,KAAM,IAAIU,YAAW,uBAAyBrR,EAAM,OAASsM,EAAKqE,GAAO,IAG3E,IAAIA,EAAMrE,EAAKrM,OAAS,EAAG,CAEzB,GAAIk1B,GAAUxkB,EAAM,CACpB,KAAK5Q,EAAI,EAAOC,EAAJD,EAASA,IAAK,CACxB,GAAI4R,GAAQlL,EAAM1G,EAClB,KAAKb,EAAQyS,GACX,KAAM,IAAIN,YAAW,wBACV/E,EAAKrM,OAAS,GAAK,MAAQqM,EAAKrM,OAAS,IAEtDi1B,GAAUzuB,EAAM1G,GAAIuM,EAAM6oB,QAK5B,KAAKp1B,EAAI,EAAOC,EAAJD,EAASA,IACnB,GAAIb,EAAQuH,EAAM1G,IAChB,KAAM,IAAIsR,YAAW,wBACV/E,EAAKrM,OAAS,GAAK,MAAQqM,EAAKrM,OAAS,KAwG5D,QAASm1B,GAAS3uB,EAAO6F,EAAMqE,EAAKkB,GAClC,IAAK3S,EAAQuH,GACX,KAAMzJ,OAAM,iBAGd,IAAI+C,GAAGuB,EACH+zB,EAAS5uB,EAAMxG,OACfq1B,EAAShpB,EAAKqE,GACd4kB,EAAS1lB,KAAK3C,IAAImoB,EAAQC,EAK9B,IAFA7uB,EAAMxG,OAASq1B,EAEX3kB,EAAMrE,EAAKrM,OAAS,EAAG,CAEzB,GAAIk1B,GAAUxkB,EAAM,CAGpB,KAAK5Q,EAAI,EAAOw1B,EAAJx1B,EAAYA,IAEtBuB,EAAOmF,EAAM1G,GACbq1B,EAAQ9zB,EAAMgL,EAAM6oB,EAAStjB,EAI/B,KAAK9R,EAAIw1B,EAAYD,EAAJv1B,EAAYA,IAE3BuB,KACAmF,EAAM1G,GAAKuB,EAGX8zB,EAAQ9zB,EAAMgL,EAAM6oB,EAAStjB,OAK/B,IAAoB7S,SAAjB6S,EAED,IAAK9R,EAAIs1B,EAAYC,EAAJv1B,EAAYA,IAC3B0G,EAAM1G,GAAKxC,EAAOO,MAAM+T,GA3NhC,GAAIzU,GAAShB,EAAQ,KACjBmL,EAASnL,EAAQ,KACjBmB,EAASnB,EAAQ,GAEjB8C,GADQ9C,EAAQ,KACN6C,MAAMC,QA2BpBnD,GAAQuQ,KAAO,SAAevN,GAE5B,GAAIqe,GAAIjM,EAAMpS,EAMd,OAHAhD,GAAQy5B,SAASz2B,EAAGqe,GAGbA,GAkDTrhB,EAAQy5B,SAAW,SAAkB/uB,EAAO6F,GAC1C,GAAIsE,GAA2B,GAAftE,EAAKrM,MACrB,IAAI2Q,GAEF,GAAI1R,EAAQuH,GACV,KAAM,IAAI4K,YAAW,uBAAyB5K,EAAMxG,OAAS,cAK/Di1B,GAAUzuB,EAAO6F,EAAM,IAS3BvQ,EAAQuU,cAAgB,SAAwB9O,EAAOvB,GACrD,IAAK7C,EAAO4Q,SAASxM,KAAWpE,EAAOiT,UAAU7O,GAC/C,KAAM,IAAIhC,WAAU,oCAAsCgC,EAAQ,IAEpE,IAAY,EAARA,EACF,KAAM,IAAI6P,YAAW,uBAAyB7P,EAAQ,QAExD,IAAexC,SAAXiB,GAAwBuB,GAASvB,EACnC,KAAM,IAAIoR,YAAW,uBAAyB7P,EAAQ,OAASvB,EAAS,GAAM,MAYlFlE,EAAQsQ,OAAS,SAAgB5F,EAAO6F,EAAMuF,GAI5C,IAAK3S,EAAQuH,KAAWvH,EAAQoN,GAC9B,KAAM,IAAI9M,WAAU,iBAEtB,IAAoB,IAAhB8M,EAAKrM,OACP,KAAM,IAAIjD,OAAM,sCAIlBsP,GAAK3I,QAAQ,SAAUvE,GACrB,IAAKhC,EAAO4Q,SAAS5O,KAAWhC,EAAOiT,UAAUjR,IAAkB,EAARA,EACzD,KAAM,IAAII,WAAU,uDACJ+H,EAAOwG,OAAOzB,GAAQ,MAO1C,KAFA,GAAImF,GAAO,EACPnQ,EAAOmF,EAAM,GACVvH,EAAQoC,IACbmQ,IACAnQ,EAAOA,EAAK,EAId,MAAOmQ,EAAOnF,EAAKrM,QACjBwG,GAASA,GACTgL,GAEF,MAAOA,EAAOnF,EAAKrM,QACjBwG,EAAQA,EAAM,GACdgL,GAMF,OAFA2jB,GAAQ3uB,EAAO6F,EAAM,EAAGuF,GAEjBpL,GA+DT1K,EAAQwQ,QAAU,SAAiB9F,GACjC,KAAMvH,EAAQuH,IAA2B,IAAjBA,EAAMxG,QAC5BwG,EAAQA,EAAM,EAGhB,OAAOA,IAUT1K,EAAQ05B,UAAY,SAAmBhvB,EAAOgL,GAG5C,IAAK,GAFDnF,GAAOvQ,EAAQuQ,KAAK7F,GAEf1G,EAAI,EAAGoQ,EAAMsB,EAAOnF,EAAKrM,OAAakQ,EAAJpQ,EAAQA,IACjD0G,GAASA,EAGX,OAAOA,IAQT1K,EAAQmD,QAAUA,GAIb,SAASlD,EAAQD,GAOtBA,EAAQwoB,UAAY,SAAmBnlB,GACrC,MAAQA,aAAiBwnB,UAA6B,iBAATxnB"} \ No newline at end of file diff --git a/dist/math.map.js b/dist/math.map.js deleted file mode 100644 index 857503d40..000000000 --- a/dist/math.map.js +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"math.map.js","sources":["./dist/math.js"],"names":["e","r","n","exports","module","define","amd","mathjs","this","i","t","o","id","loaded","call","modules","cache","p","Array","prototype","map","Error","matrix","number","config","deepExtend","decimals","DECIMAL_PLACES","defaultType","precision","clone","expression","node","Scope","Parser","docs","type","BigNumber","Complex","Range","Index","Matrix","Unit","Help","collection","chaining","Selector","isArray","Object","hasOwnProperty","TypeError","extend","constructor","deepEqual","length","u","f","c","A","s","slice","toString","O","test","charAt","l","g","d","T","replace","y","m","a","M","RegExp","indexOf","search","substring","b","w","name","reverse","toLowerCase","pow","toF","split","unshift","plus","S","toS","h","x","v","E","N","push","shift","splice","join","pop","parseInt","String","trim","ROUND_UP","ROUND_DOWN","ROUND_CEIL","ROUND_FLOOR","ROUND_HALF_UP","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_CEIL","ROUND_HALF_FLOOR","arguments","parseFloat","abs","absoluteValue","ceil","comparedTo","cmp","dividedBy","div","equals","eq","floor","greaterThan","gt","greaterThanOrEqualTo","gte","isFinite","isF","isNaN","isNegative","isNeg","isZero","isZ","lessThan","lt","lessThanOrEqualTo","lte","minus","modulo","mod","times","negated","neg","toPower","Math","round","squareRoot","sqrt","toExponential","toE","toFixed","toFraction","toFr","toPrecision","toP","valueOf","AssignmentNode","BlockNode","ConstantNode","UnitNode","FunctionNode","ArrayNode","Node","OperatorNode","ParamsNode","RangeNode","SymbolNode","UpdateNode","handlers","expr","scope","eval","set","find","match","concat","properties","params","visible","add","value","format","isString","endsWith","isNumber","syntax","Number","isInteger","sign","notation","exponential","lower","upper","scientific","EXPONENTIAL_AT","log","LN10","min","digits","toBigNumber","toNumber","unit","isPlainUnit","SyntaxError","re","im","string","isComplex","parse","array","object","types","RangeError","size","validate","validateIndex","resize","forEach","squeeze","unsqueeze","Boolean","Date","isBoolean","prefix","UNIT_NONE","_normalize","fixPrefix","prefixes","isUnit","offset","_unnormalize","hasBase","base","equalBase","to","_bestPrefix","NONE","SHORT","da","k","G","P","Z","Y","z","LONG","deca","hecto","kilo","mega","giga","tera","peta","exa","zetta","yotta","deci","centi","milli","micro","nano","pico","femto","atto","zepto","yocto","SQUARED","CUBIC","BINARY_SHORT","Ki","Mi","Gi","Ti","Pi","Ei","Zi","Yi","BINARY_LONG","kibi","mebi","gibi","tebi","pebi","exi","zebi","yobi","LENGTH","MASS","TIME","CURRENT","TEMPERATURE","LUMINOUS_INTENSITY","AMOUNT_OF_SUBSTANCE","FORCE","SURFACE","VOLUME","ANGLE","BIT","BASE_UNIT_NONE","PREFIXES","BASE_UNITS","UNITS","variables","fn","description","settings","nodes","argsToArray","apply","isCollection","deepMap","deepMap2","reduce","deepForEach","_data","_size","isScalar","get","range","max","isMatrix","subset","toArray","_ranges","isIndex","create","start","end","step","some","isRange","math","paramScopes","hasContextParams","toRange","_evalParams","parentScope","subScopes","symbols","createSubScope","has","remove","clear","clearCache","context","Infinity","LN2","LOG2E","LOG10E","NaN","pi","PI","SQRT1_2","SQRT2","tau","cube","divide","edivide","emultiply","epow","equal","exp","fix","gcd","larger","largereq","lcm","log10","multiply","smaller","smallereq","square","subtract","unary","unequal","xgcd","arg","conj","bignumber","complex","index","help","det","diag","eye","inv","ones","transpose","zeros","combinations","distribution","factorial","permutations","pickRandom","random","randomInt","mean","acos","asin","atan","atan2","cos","cot","csc","sec","sin","tan","category","examples","seealso","doc","isHelp","parser","toJSON","error","UnsupportedTypeError","message","ArgumentsError","cr","lr","fr","pr","ar","NULL","mr","DELIMITER","sr","ur","SYMBOL","UNKNOWN","_","NUMBER","$","K","Q","X","nr","er","ir","D","rr","==","!=","<",">","<=",">=","J","in","+","-","*",".*","/","./","%","tr","!","'","or","C","U","H","q","R","I","L","B","j","F","V","W",",","(",")","[","]","\"","\n",";","^",".^","=",":","res","select","uniform","normal","override","wrap","createProxy","./clone","./clone.js","./forEach","./forEach.js","./format","./format.js","./import","./import.js","./map","./map.js","./print","./print.js","./typeof","./typeof.js","keys","resolve","print","done"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;CA0BC,SAASA,GAAG,MAAO,UAASC,GAAG,MAAO,UAASC,GAAG,gBAAiBC,UAAS,gBAAiBC,QAAOA,OAAOD,QAAQF,EAAEC,GAAG,kBAAmBG,SAAQA,OAAOC,IAAID,OAAO,WAAW,MAAOJ,GAAEC,KAAK,gBAAiBC,SAAQA,QAAQI,OAAON,EAAEC,GAAGF,EAAEO,OAAON,EAAEC,MAAMM,MAAM,SAASR,GAAG,QAASC,GAAEQ,GAAG,GAAGC,EAAED,GAAG,MAAOC,GAAED,GAAGP,EAAG,IAAIS,GAAED,EAAED,IAAIN,WAAWS,GAAGH,EAAEI,QAAO,EAAI,OAAOb,GAAES,GAAGK,KAAKH,EAAET,GAAGS,EAAEA,EAAET,GAAGD,GAAGU,EAAEE,QAAO,EAAGF,EAAET,GAAG,GAAIA,GAAE,UAAUQ,IAAK,OAAOT,GAAEc,QAAQf,EAAEC,EAAEe,MAAMN,EAAET,EAAEgB,EAAE,GAAGhB,EAAE,MAAM,SAASD,EAAEC,EAAEC,GAAGF,EAAEG,QAAQD,EAAE,IAAI,SAASF,EAAEC,EAAEC,GAAG,QAASQ,GAAEV,GAAG,GAAG,kBAAmBkB,OAAMC,UAAUC,IAAI,KAAM,IAAIC,OAAM,mGAAoG,IAAIpB,MAAKS,GAAGY,OAAO,SAASC,OAAO,SAAU,OAAOtB,GAAEuB,OAAO,SAASxB,GAAG,GAAIC,GAAEC,EAAE,EAAG,IAAGF,EAAE,CAAC,GAAGS,EAAEgB,WAAWf,EAAEV,GAAGA,EAAE0B,UAAUzB,EAAEuB,QAAQG,eAAe3B,EAAE0B,WAAW1B,EAAEuB,QAAQvB,EAAEuB,OAAOK,YAAY,KAAM,IAAIP,OAAM,oEAAqE,IAAGrB,EAAEuB,QAAQvB,EAAEuB,OAAOM,UAAU,KAAM,IAAIR,OAAM,oEAAqE,IAAGrB,EAAEsB,QAAQtB,EAAEsB,OAAOM,YAAY,KAAM,IAAIP,OAAM,oEAAqE,IAAGrB,EAAEsB,QAAQtB,EAAEsB,OAAO,WAAW,KAAM,IAAID,OAAM,iEAAiE,GAAIV,GAAEF,EAAEqB,MAAMpB,EAAG,OAAOC,GAAEe,SAASzB,EAAEuB,SAASG,eAAehB,GAAGV,EAAEuB,OAAOxB,GAAGC,EAAE8B,cAAc9B,EAAE8B,WAAWC,KAAK9B,EAAE,GAAGD,EAAE8B,WAAWE,MAAM/B,EAAE,IAAID,EAAE8B,WAAWG,OAAOhC,EAAE,IAAID,EAAE8B,WAAWI,KAAKjC,EAAE,IAAID,EAAEmC,QAAQnC,EAAEmC,KAAKC,UAAUnC,EAAE,GAAGD,EAAEmC,KAAKE,QAAQpC,EAAE,IAAID,EAAEmC,KAAKG,MAAMrC,EAAE,IAAID,EAAEmC,KAAKI,MAAMtC,EAAE,IAAID,EAAEmC,KAAKK,OAAOvC,EAAE,IAAID,EAAEmC,KAAKM,KAAKxC,EAAE,IAAID,EAAEmC,KAAKO,KAAKzC,EAAE,KAAKD,EAAE2C,WAAW1C,EAAE,IAAIA,EAAE,KAAKD,GAAGC,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,EAAE,KAAKD,EAAES,GAAGR,E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"} \ No newline at end of file diff --git a/dist/math.min.js b/dist/math.min.js index 6d9c046cd..d3fd7a460 100644 --- a/dist/math.min.js +++ b/dist/math.min.js @@ -6,8 +6,8 @@ * It features real and complex numbers, units, matrices, a large set of * mathematical functions, and a flexible expression parser. * - * @version 0.18.0 - * @date 2014-01-18 + * @version 0.19.0-SNAPSHOT + * @date 2014-02-09 * * @license * Copyright (C) 2013-2014 Jos de Jong @@ -24,9 +24,8 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.mathjs=e()}}(function(){var e;return function n(e,t,r){function i(a,s){if(!t[a]){if(!e[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(o)return o(a,!0);throw new Error("Cannot find module '"+a+"'")}var c=t[a]={exports:{}};e[a][0].call(c.exports,function(n){var t=e[a][1][n];return i(t?t:n)},c,c.exports,n,e,t,r)}return t[a].exports}for(var o="function"==typeof require&&require,a=0;a y","larger(x, y)"],description:"Check if value x is larger than y. Returns 1 if x is larger than y, and 0 if not.",examples:["2 > 3","5 > 2*2","a = 3.3","b = 6-2.8","(a > b)","(b < a)","5 cm > 2 inch"],seealso:["equal","unequal","smaller","smallereq","largereq"]}},{}],33:[function(e,n){n.exports={name:"largereq",category:"Operators",syntax:["x >= y","largereq(x, y)"],description:"Check if value x is larger or equal to y. Returns 1 if x is larger or equal to y, and 0 if not.",examples:["2 > 1+1","2 >= 1+1","a = 3.2","b = 6-2.8","(a > b)"],seealso:["equal","unequal","smallereq","smaller","largereq"]}},{}],34:[function(e,n){n.exports={name:"lcm",category:"Arithmetic",syntax:["lcm(x, y)"],description:"Compute the least common multiple.",examples:["lcm(4, 6)","lcm(6, 21)","lcm(6, 21, 5)"],seealso:["gcd"]}},{}],35:[function(e,n){n.exports={name:"log",category:"Arithmetic",syntax:["log(x)","log(x, base)"],description:"Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).",examples:["log(3.5)","a = log(2.4)","exp(a)","10 ^ 3","log(1000, 10)","log(1000) / log(10)","b = logb(1024, 2)","2 ^ b"],seealso:["exp","log10"]}},{}],36:[function(e,n){n.exports={name:"log10",category:"Arithmetic",syntax:["log10(x)"],description:"Compute the 10-base logarithm of a value.",examples:["log10(1000)","10 ^ 3","log10(0.01)","log(1000) / log(10)","log(1000, 10)"],seealso:["exp","log"]}},{}],37:[function(e,n){n.exports={name:"mod",category:"Operators",syntax:["x % y","x mod y","mod(x, y)"],description:"Calculates the modulus, the remainder of an integer division.",examples:["7 % 3","11 % 2","10 mod 4","function isOdd(x) = x % 2","isOdd(2)","isOdd(3)"],seealso:[]}},{}],38:[function(e,n){n.exports={name:"multiply",category:"Operators",syntax:["x * y","multiply(x, y)"],description:"multiply two values.",examples:["2.1 * 3.6","ans / 3.6","2 * 3 + 4","2 * (3 + 4)","3 * 2.1 km"],seealso:["divide"]}},{}],39:[function(e,n){n.exports={name:"pow",category:"Operators",syntax:["x ^ y","pow(x, y)"],description:"Calculates the power of x to y, x^y.",examples:["2^3 = 8","2*2*2","1 + e ^ (pi * i)"],seealso:["unequal","smaller","larger","smallereq","largereq"]}},{}],40:[function(e,n){n.exports={name:"round",category:"Arithmetic",syntax:["round(x)","round(x, n)"],description:"round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.",examples:["round(3.2)","round(3.8)","round(-4.2)","round(-4.8)","round(pi, 3)","round(123.45678, 2)"],seealso:["ceil","floor","fix"]}},{}],41:[function(e,n){n.exports={name:"sign",category:"Arithmetic",syntax:["sign(x)"],description:"Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.",examples:["sign(3.5)","sign(-4.2)","sign(0)"],seealso:["abs"]}},{}],42:[function(e,n){n.exports={name:"smaller",category:"Operators",syntax:["x < y","smaller(x, y)"],description:"Check if value x is smaller than value y. Returns 1 if x is smaller than y, and 0 if not.",examples:["2 < 3","5 < 2*2","a = 3.3","b = 6-2.8","(a < b)","5 cm < 2 inch"],seealso:["equal","unequal","larger","smallereq","largereq"]}},{}],43:[function(e,n){n.exports={name:"smallereq",category:"Operators",syntax:["x <= y","smallereq(x, y)"],description:"Check if value x is smaller or equal to value y. Returns 1 if x is smaller than y, and 0 if not.",examples:["2 < 1+1","2 <= 1+1","a = 3.2","b = 6-2.8","(a < b)"],seealso:["equal","unequal","larger","smaller","largereq"]}},{}],44:[function(e,n){n.exports={name:"sqrt",category:"Arithmetic",syntax:["sqrt(x)"],description:"Compute the square root value. If x = y * y, then y is the square root of x.",examples:["sqrt(25)","5 * 5","sqrt(-1)"],seealso:["square","multiply"]}},{}],45:[function(e,n){n.exports={name:"square",category:"Arithmetic",syntax:["square(x)"],description:"Compute the square of a value. The square of x is x * x.",examples:["square(3)","sqrt(9)","3^2","3 * 3"],seealso:["multiply","pow","sqrt","cube"]}},{}],46:[function(e,n){n.exports={name:"subtract",category:"Operators",syntax:["x - y","subtract(x, y)"],description:"subtract two values.",examples:["5.3 - 2","ans + 2","2/3 - 1/6","2 * 3 - 3","2.1 km - 500m"],seealso:["add"]}},{}],47:[function(e,n){n.exports={name:"unary",category:"Operators",syntax:["-x","unary(x)"],description:"Inverse the sign of a value.",examples:["-4.5","-(-5.6)"],seealso:["add","subtract"]}},{}],48:[function(e,n){n.exports={name:"unequal",category:"Operators",syntax:["x != y","unequal(x, y)"],description:"Check unequality of two values. Returns 1 if the values are unequal, and 0 if they are equal.",examples:["2+2 != 3","2+2 != 4","a = 3.2","b = 6-2.8","a != b","50cm != 0.5m","5 cm != 2 inch"],seealso:["equal","smaller","larger","smallereq","largereq"]}},{}],49:[function(e,n){n.exports={name:"xgcd",category:"Arithmetic",syntax:["xgcd(a, b)"],description:"Calculate the extended greatest common divisor for two values",examples:["xgcd(8, 12)","gcd(8, 12)","xgcd(36163, 21199)"],seealso:["gcd","lcm"]}},{}],50:[function(e,n){n.exports={name:"arg",category:"Complex",syntax:["arg(x)"],description:"Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).",examples:["arg(2 + 2i)","atan2(3, 2)","arg(2 - 3i)"],seealso:["re","im","conj","abs"]}},{}],51:[function(e,n){n.exports={name:"conj",category:"Complex",syntax:["conj(x)"],description:"Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.",examples:["conj(2 + 3i)","conj(2 - 3i)","conj(-5.2i)"],seealso:["re","im","abs","arg"]}},{}],52:[function(e,n){n.exports={name:"im",category:"Complex",syntax:["im(x)"],description:"Get the imaginary part of a complex number.",examples:["im(2 + 3i)","re(2 + 3i)","im(-5.2i)","im(2.4)"],seealso:["re","conj","abs","arg"]}},{}],53:[function(e,n){n.exports={name:"re",category:"Complex",syntax:["re(x)"],description:"Get the real part of a complex number.",examples:["re(2 + 3i)","im(2 + 3i)","re(-5.2i)","re(2.4)"],seealso:["im","conj","abs","arg"]}},{}],54:[function(e,n){n.exports={name:"bignumber",category:"Type",syntax:["bignumber(x)"],description:"Create a big number from a number or string.",examples:["0.1 + 0.2","bignumber(0.1) + bignumber(0.2)",'bignumber("7.2")','bignumber("7.2e500")',"bignumber([0.1, 0.2, 0.3])"],seealso:["boolean","complex","index","matrix","string","unit"]}},{}],55:[function(e,n){n.exports={name:"boolean",category:"Type",syntax:["x","boolean(x)"],description:"Convert a string or number into a boolean.",examples:["boolean(0)","boolean(1)","boolean(3)",'boolean("true")','boolean("false")',"boolean([1, 0, 1, 1])"],seealso:["bignumber","complex","index","matrix","number","string","unit"]}},{}],56:[function(e,n){n.exports={name:"complex",category:"Type",syntax:["complex()","complex(re, im)","complex(string)"],description:"Create a complex number.",examples:["complex()","complex(2, 3)",'complex("7 - 2i")'],seealso:["bignumber","boolean","index","matrix","number","string","unit"]}},{}],57:[function(e,n){n.exports={name:"index",category:"Type",syntax:["[start]","[start:end]","[start:step:end]","[start1, start 2, ...]","[start1:end1, start2:end2, ...]","[start1:step1:end1, start2:step2:end2, ...]"],description:"Create an index to get or replace a subset of a matrix",examples:["[]","[1, 2, 3]","A = [1, 2, 3; 4, 5, 6]","A[1, :]","A[1, 2] = 50","A[0:2, 0:2] = ones(2, 2)"],seealso:["bignumber","boolean","complex","matrix,","number","range","string","unit"]}},{}],58:[function(e,n){n.exports={name:"matrix",category:"Type",syntax:["[]","[a1, b1, ...; a2, b2, ...]","matrix()","matrix([...])"],description:"Create a matrix.",examples:["[]","[1, 2, 3]","[1, 2, 3; 4, 5, 6]","matrix()","matrix([3, 4])"],seealso:["bignumber","boolean","complex","index","number","string","unit"]}},{}],59:[function(e,n){n.exports={name:"number",category:"Type",syntax:["x","number(x)"],description:"Create a number or convert a string or boolean into a number.",examples:["2","2e3","4.05","number(2)",'number("7.2")',"number(true)","number([true, false, true, true])"],seealso:["bignumber","boolean","complex","index","matrix","string","unit"]}},{}],60:[function(e,n){n.exports={name:"string",category:"Type",syntax:['"text"',"string(x)"],description:"Create a string or convert a value to a string",examples:['"Hello World!"',"string(4.2)","string(3 + 2i)"],seealso:["bignumber","boolean","complex","index","matrix","number","unit"]}},{}],61:[function(e,n){n.exports={name:"unit",category:"Type",syntax:["value unit","unit(value, unit)","unit(string)"],description:"Create a unit.",examples:["5.5 mm","3 inch",'unit(7.1, "kilogram")','unit("23 deg")'],seealso:["bignumber","boolean","complex","index","matrix","number","string"]}},{}],62:[function(e,n){n.exports={name:"eval",category:"Expression",syntax:["eval(expression)","eval([expr1, expr2, expr3, ...])"],description:"Evaluate an expression or an array with expressions.",examples:['eval("2 + 3")','eval("sqrt(" + 4 + ")")'],seealso:[]}},{}],63:[function(e,n){n.exports={name:"help",category:"Expression",syntax:["help(object)","help(string)"],description:"Display documentation on a function or data type.",examples:["help(sqrt)",'help("complex")'],seealso:[]}},{}],64:[function(e,n){n.exports={name:"concat",category:"Matrix",syntax:["concat(a, b, c, ...)","concat(a, b, c, ..., dim)"],description:"Concatenate matrices. By default, the matrices are concatenated by the first dimension. The dimension on which to concatenate can be provided as last argument.",examples:["a = [1, 2; 5, 6]","b = [3, 4; 7, 8]","concat(a, b)","[a, b]","concat(a, b, 2)","[a; b]"],seealso:["det","diag","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},{}],65:[function(e,n){n.exports={name:"det",category:"Matrix",syntax:["det(x)"],description:"Calculate the determinant of a matrix",examples:["det([1, 2; 3, 4])","det([-2, 2, 3; -1, 1, 3; 2, 0, -1])"],seealso:["concat","diag","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},{}],66:[function(e,n){n.exports={name:"diag",category:"Matrix",syntax:["diag(x)","diag(x, k)"],description:"Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned.When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.",examples:["diag(1:3)","diag(1:3, 1)","a = [1, 2, 3; 4, 5, 6; 7, 8, 9]","diag(a)"],seealso:["concat","det","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},{}],67:[function(e,n){n.exports={name:"eye",category:"Matrix",syntax:["eye(n)","eye(m, n)","eye([m, n])","eye"],description:"Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.",examples:["eye(3)","eye(3, 5)","a = [1, 2, 3; 4, 5, 6]","eye(size(a))"],seealso:["concat","det","diag","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},{}],68:[function(e,n){n.exports={name:"inv",category:"Matrix",syntax:["inv(x)"],description:"Calculate the inverse of a matrix",examples:["inv([1, 2; 3, 4])","inv(4)","1 / 4"],seealso:["concat","det","diag","eye","ones","range","size","squeeze","subset","transpose","zeros"]}},{}],69:[function(e,n){n.exports={name:"ones",category:"Matrix",syntax:["ones(m)","ones(m, n)","ones(m, n, p, ...)","ones([m])","ones([m, n])","ones([m, n, p, ...])","ones"],description:"Create a matrix containing ones.",examples:["ones(3)","ones(3, 5)","ones([2,3]) * 4.5","a = [1, 2, 3; 4, 5, 6]","ones(size(a))"],seealso:["concat","det","diag","eye","inv","range","size","squeeze","subset","transpose","zeros"]}},{}],70:[function(e,n){n.exports={name:"range",category:"Type",syntax:["start:end","start:step:end","range(start, end)","range(start, end, step)","range(string)"],description:"Create a range. Lower bound of the range is included, upper bound is excluded.",examples:["1:5","3:-1:-3","range(3, 7)","range(0, 12, 2)",'range("4:10")',"a = [1, 2, 3, 4; 5, 6, 7, 8]","a[1:2, 1:2]"],seealso:["concat","det","diag","eye","inv","ones","size","squeeze","subset","transpose","zeros"]}},{}],71:[function(e,n){n.exports={name:"resize",category:"Matrix",syntax:["resize(x, size)","resize(x, size, defaultValue)"],description:"Resize a matrix.",examples:["resize([1,2,3,4,5], [3])","resize([1,2,3], [5], 0)","resize(2, [2, 3], 0)",'resize("hello", [8], "!")'],seealso:["size","subset","squeeze"]}},{}],72:[function(e,n){n.exports={name:"size",category:"Matrix",syntax:["size(x)"],description:"Calculate the size of a matrix.",examples:["size(2.3)",'size("hello world")',"a = [1, 2; 3, 4; 5, 6]","size(a)","size(1:6)"],seealso:["concat","det","diag","eye","inv","ones","range","squeeze","subset","transpose","zeros"]}},{}],73:[function(e,n){n.exports={name:"squeeze",category:"Matrix",syntax:["squeeze(x)"],description:"Remove singleton dimensions from a matrix.",examples:["a = zeros(1,3,2)","size(squeeze(a))","b = zeros(3,1,1)","size(squeeze(b))"],seealso:["concat","det","diag","eye","inv","ones","range","size","subset","transpose","zeros"]}},{}],74:[function(e,n){n.exports={name:"subset",category:"Matrix",syntax:["value(index)","value(index) = replacement","subset(value, [index])","subset(value, [index], replacement)"],description:"Get or set a subset of a matrix or string. Indexes are one-based. Both the ranges lower-bound and upper-bound are included.",examples:["d = [1, 2; 3, 4]","e = []","e[1, 1:2] = [5, 6]","e[2, :] = [7, 8]","f = d * e","f[2, 1]","f[:, 1]"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","transpose","zeros"]}},{}],75:[function(e,n){n.exports={name:"transpose",category:"Matrix",syntax:["x'","transpose(x)"],description:"Transpose a matrix",examples:["a = [1, 2, 3; 4, 5, 6]","a'","transpose(a)"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","subset","zeros"]}},{}],76:[function(e,n){n.exports={name:"zeros",category:"Matrix",syntax:["zeros(m)","zeros(m, n)","zeros(m, n, p, ...)","zeros([m])","zeros([m, n])","zeros([m, n, p, ...])","zeros"],description:"Create a matrix containing zeros.",examples:["zeros(3)","zeros(3, 5)","a = [1, 2, 3; 4, 5, 6]","zeros(size(a))"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","subset","transpose"]}},{}],77:[function(e,n){n.exports={name:"combinations",category:"Probability",syntax:["combinations(n, k)"],description:"Compute the number of combinations of n items taken k at a time",examples:["combinations(7, 5)"],seealso:["permutations","factorial"]}},{}],78:[function(e,n){n.exports={name:"distribution",category:"Probability",syntax:["distribution(name)","distribution(name, arg1, arg2, ...)"],description:'Create a distribution object of a specific type. A distribution object contains functions `random([size,] [min,] [max])`, `randomInt([size,] [min,] [max])`, and `pickRandom(array)`. Available types of distributions: "uniform", "normal". Note that the function distribution is currently not available via the expression parser.',examples:[],seealso:["random","randomInt"]}},{}],79:[function(e,n){n.exports={name:"factorial",category:"Probability",syntax:["n!","factorial(n)"],description:"Compute the factorial of a value",examples:["5!","5*4*3*2*1","3!"],seealso:[]}},{}],80:[function(e,n){n.exports={name:"permutations",category:"Probability",syntax:["permutations(n)","permutations(n, k)"],description:"Compute the number of permutations of n items taken k at a time",examples:["permutations(5)","permutations(5, 4)"],seealso:["combinations","factorial"]}},{}],81:[function(e,n){n.exports={name:"pickRandom",category:"Probability",syntax:["pickRandom(array)"],description:"Pick a random entry from a given array.",examples:["pickRandom(0:10)","pickRandom([1, 3, 1, 6])"],seealso:["distribution","random","randomInt"]}},{}],82:[function(e,n){n.exports={name:"random",category:"Probability",syntax:["random()","random(max)","random(min, max)","random(size)","random(size, max)","random(size, min, max)"],description:"Return a random number.",examples:["random()","random(10, 20)","random([2, 3])"],seealso:["distribution","pickRandom","randomInt"]}},{}],83:[function(e,n){n.exports={name:"randInt",category:"Probability",syntax:["randInt()","randInt(max)","randInt(min, max)","randInt(size)","randInt(size, max)","randInt(size, min, max)"],description:"Return a random integer number",examples:["randInt()","randInt(10, 20)","randInt([2, 3], 10)"],seealso:["distribution","pickRandom","random"]}},{}],84:[function(e,n){n.exports={name:"max",category:"Statistics",syntax:["max(a, b, c, ...)","max(A)","max(A, dim)"],description:"Compute the maximum value of a list of values.",examples:["max(2, 3, 4, 1)","max([2, 3, 4, 1])","max([2, 5; 4, 3], 0)","max([2, 5; 4, 3], 1)","max(2.7, 7.1, -4.5, 2.0, 4.1)","min(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["mean","min"]}},{}],85:[function(e,n){n.exports={name:"mean",category:"Statistics",syntax:["mean(a, b, c, ...)","mean(A)","mean(A, dim)"],description:"Compute the arithmetic mean of a list of values.",examples:["mean(2, 3, 4, 1)","mean([2, 3, 4, 1])","mean([2, 5; 4, 3], 0)","mean([2, 5; 4, 3], 1)","mean([1.0, 2.7, 3.2, 4.0])"],seealso:["max","min"]}},{}],86:[function(e,n){n.exports={name:"min",category:"Statistics",syntax:["min(a, b, c, ...)","min(A)","min(A, dim)"],description:"Compute the minimum value of a list of values.",examples:["min(2, 3, 4, 1)","min([2, 3, 4, 1])","min([2, 5; 4, 3], 0)","min([2, 5; 4, 3], 1)","min(2.7, 7.1, -4.5, 2.0, 4.1)","max(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["max","mean","min"]}},{}],87:[function(e,n){n.exports={name:"acos",category:"Trigonometry",syntax:["acos(x)"],description:"Compute the inverse cosine of a value in radians.",examples:["acos(0.5)","acos(cos(2.3))"],seealso:["cos","acos","asin"]}},{}],88:[function(e,n){n.exports={name:"asin",category:"Trigonometry",syntax:["asin(x)"],description:"Compute the inverse sine of a value in radians.",examples:["asin(0.5)","asin(sin(2.3))"],seealso:["sin","acos","asin"]}},{}],89:[function(e,n){n.exports={name:"atan",category:"Trigonometry",syntax:["atan(x)"],description:"Compute the inverse tangent of a value in radians.",examples:["atan(0.5)","atan(tan(2.3))"],seealso:["tan","acos","asin"]}},{}],90:[function(e,n){n.exports={name:"atan2",category:"Trigonometry",syntax:["atan2(y, x)"],description:"Computes the principal value of the arc tangent of y/x in radians.",examples:["atan2(2, 2) / pi","angle = 60 deg in rad","x = cos(angle)","y = sin(angle)","atan2(y, x)"],seealso:["sin","cos","tan"]}},{}],91:[function(e,n){n.exports={name:"cos",category:"Trigonometry",syntax:["cos(x)"],description:"Compute the cosine of x in radians.",examples:["cos(2)","cos(pi / 4) ^ 2","cos(180 deg)","cos(60 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["acos","sin","tan"]}},{}],92:[function(e,n){n.exports={name:"cot",category:"Trigonometry",syntax:["cot(x)"],description:"Compute the cotangent of x in radians. Defined as 1/tan(x)",examples:["cot(2)","1 / tan(2)"],seealso:["sec","csc","tan"]}},{}],93:[function(e,n){n.exports={name:"csc",category:"Trigonometry",syntax:["csc(x)"],description:"Compute the cosecant of x in radians. Defined as 1/sin(x)",examples:["csc(2)","1 / sin(2)"],seealso:["sec","cot","sin"]}},{}],94:[function(e,n){n.exports={name:"sec",category:"Trigonometry",syntax:["sec(x)"],description:"Compute the secant of x in radians. Defined as 1/cos(x)",examples:["sec(2)","1 / cos(2)"],seealso:["cot","csc","cos"]}},{}],95:[function(e,n){n.exports={name:"sin",category:"Trigonometry",syntax:["sin(x)"],description:"Compute the sine of x in radians.",examples:["sin(2)","sin(pi / 4) ^ 2","sin(90 deg)","sin(30 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["asin","cos","tan"]}},{}],96:[function(e,n){n.exports={name:"tan",category:"Trigonometry",syntax:["tan(x)"],description:"Compute the tangent of x in radians.",examples:["tan(0.5)","sin(0.5) / cos(0.5)","tan(pi / 4)","tan(45 deg)"],seealso:["atan","sin","cos"]}},{}],97:[function(e,n){n.exports={name:"to",category:"Units",syntax:["x to unit","to(x, unit)"],description:"Change the unit of a value.",examples:["5 inch in cm","3.2kg in g","16 bytes in bits"],seealso:[]}},{}],98:[function(e,n){n.exports={name:"clone",category:"Utils",syntax:["clone(x)"],description:"Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices",examples:["clone(3.5)","clone(2 - 4i)","clone(45 deg)","clone([1, 2; 3, 4])",'clone("hello world")'],seealso:[]}},{}],99:[function(e,n){n.exports={name:"forEach",category:"Utils",syntax:["forEach(x, callback)"],description:"Iterates over all elements of a matrix/array, and executes the given callback.",examples:["forEach([1, 2, 3], function(val) { console.log(val) })"],seealso:[]}},{}],100:[function(e,n){n.exports={name:"format",category:"Utils",syntax:["format(value)","format(value, precision)"],description:"Format a value of any type as string.",examples:["format(2.3)","format(3 - 4i)","format([])","format(pi, 3)"],seealso:["print"]}},{}],101:[function(e,n){n.exports={name:"import",category:"Utils",syntax:["import(string)"],description:"Import functions from a file.",examples:['import("numbers")','import("./mylib.js")'],seealso:[]}},{}],102:[function(e,n){n.exports={name:"map",category:"Utils",syntax:["map(x, callback)"],description:"Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.",examples:["map([1, 2, 3], function(val) { return math.max(val, 1.5) })"],seealso:[]}},{}],103:[function(e,n){n.exports={name:"typeof",category:"Utils",syntax:["typeof(x)"],description:"Get the type of a variable.",examples:["typeof(3.5)","typeof(2 - 4i)","typeof(45 deg)",'typeof("hello world")'],seealso:[]}},{}],104:[function(e,n,t){t.e=e("./constants/e"),t.E=e("./constants/e"),t["false"]=e("./constants/false"),t.i=e("./constants/i"),t.Infinity=e("./constants/Infinity"),t.LN2=e("./constants/LN2"),t.LN10=e("./constants/LN10"),t.LOG2E=e("./constants/LOG2E"),t.LOG10E=e("./constants/LOG10E"),t.NaN=e("./constants/NaN"),t.pi=e("./constants/pi"),t.PI=e("./constants/pi"),t.SQRT1_2=e("./constants/SQRT1_2"),t.SQRT2=e("./constants/SQRT2"),t.tau=e("./constants/tau"),t["true"]=e("./constants/true"),t.abs=e("./function/arithmetic/abs"),t.add=e("./function/arithmetic/add"),t.ceil=e("./function/arithmetic/ceil"),t.cube=e("./function/arithmetic/cube"),t.divide=e("./function/arithmetic/divide"),t.edivide=e("./function/arithmetic/edivide"),t.emultiply=e("./function/arithmetic/emultiply"),t.epow=e("./function/arithmetic/epow"),t.equal=e("./function/arithmetic/equal"),t.exp=e("./function/arithmetic/exp"),t.fix=e("./function/arithmetic/fix"),t.floor=e("./function/arithmetic/floor"),t.gcd=e("./function/arithmetic/gcd"),t.larger=e("./function/arithmetic/larger"),t.largereq=e("./function/arithmetic/largereq"),t.lcm=e("./function/arithmetic/lcm"),t.log=e("./function/arithmetic/log"),t.log10=e("./function/arithmetic/log10"),t.mod=e("./function/arithmetic/mod"),t.multiply=e("./function/arithmetic/multiply"),t.pow=e("./function/arithmetic/pow"),t.round=e("./function/arithmetic/round"),t.sign=e("./function/arithmetic/sign"),t.smaller=e("./function/arithmetic/smaller"),t.smallereq=e("./function/arithmetic/smallereq"),t.sqrt=e("./function/arithmetic/sqrt"),t.square=e("./function/arithmetic/square"),t.subtract=e("./function/arithmetic/subtract"),t.unary=e("./function/arithmetic/unary"),t.unequal=e("./function/arithmetic/unequal"),t.xgcd=e("./function/arithmetic/xgcd"),t.arg=e("./function/complex/arg"),t.conj=e("./function/complex/conj"),t.re=e("./function/complex/re"),t.im=e("./function/complex/im"),t.bignumber=e("./function/construction/bignumber"),t["boolean"]=e("./function/construction/boolean"),t.complex=e("./function/construction/complex"),t.index=e("./function/construction/index"),t.matrix=e("./function/construction/matrix"),t.number=e("./function/construction/number"),t.string=e("./function/construction/string"),t.unit=e("./function/construction/unit"),t.eval=e("./function/expression/eval"),t.help=e("./function/expression/help"),t.concat=e("./function/matrix/concat"),t.det=e("./function/matrix/det"),t.diag=e("./function/matrix/diag"),t.eye=e("./function/matrix/eye"),t.inv=e("./function/matrix/inv"),t.ones=e("./function/matrix/ones"),t.range=e("./function/matrix/range"),t.resize=e("./function/matrix/resize"),t.size=e("./function/matrix/size"),t.squeeze=e("./function/matrix/squeeze"),t.subset=e("./function/matrix/subset"),t.transpose=e("./function/matrix/transpose"),t.zeros=e("./function/matrix/zeros"),t.combinations=e("./function/probability/combinations"),t.distribution=e("./function/probability/distribution"),t.factorial=e("./function/probability/factorial"),t.permutations=e("./function/probability/permutations"),t.pickRandom=e("./function/probability/pickRandom"),t.random=e("./function/probability/random"),t.randomInt=e("./function/probability/randomInt"),t.min=e("./function/statistics/min"),t.mean=e("./function/statistics/mean"),t.max=e("./function/statistics/max"),t.acos=e("./function/trigonometry/acos"),t.asin=e("./function/trigonometry/asin"),t.atan=e("./function/trigonometry/atan"),t.atan2=e("./function/trigonometry/atan2"),t.cos=e("./function/trigonometry/cos"),t.cot=e("./function/trigonometry/cot"),t.csc=e("./function/trigonometry/csc"),t.sec=e("./function/trigonometry/sec"),t.sin=e("./function/trigonometry/sin"),t.tan=e("./function/trigonometry/tan"),t.to=e("./function/units/to"),t.clone=e("./function/utils/clone"),t.map=e("./function/utils/map"),t.forEach=e("./function/utils/forEach"),t.format=e("./function/utils/format"),t["import"]=e("./function/utils/import"),t["typeof"]=e("./function/utils/typeof") -},{"./constants/Infinity":5,"./constants/LN10":6,"./constants/LN2":7,"./constants/LOG10E":8,"./constants/LOG2E":9,"./constants/NaN":10,"./constants/SQRT1_2":11,"./constants/SQRT2":12,"./constants/e":13,"./constants/false":14,"./constants/i":15,"./constants/pi":16,"./constants/tau":17,"./constants/true":18,"./function/arithmetic/abs":19,"./function/arithmetic/add":20,"./function/arithmetic/ceil":21,"./function/arithmetic/cube":22,"./function/arithmetic/divide":23,"./function/arithmetic/edivide":24,"./function/arithmetic/emultiply":25,"./function/arithmetic/epow":26,"./function/arithmetic/equal":27,"./function/arithmetic/exp":28,"./function/arithmetic/fix":29,"./function/arithmetic/floor":30,"./function/arithmetic/gcd":31,"./function/arithmetic/larger":32,"./function/arithmetic/largereq":33,"./function/arithmetic/lcm":34,"./function/arithmetic/log":35,"./function/arithmetic/log10":36,"./function/arithmetic/mod":37,"./function/arithmetic/multiply":38,"./function/arithmetic/pow":39,"./function/arithmetic/round":40,"./function/arithmetic/sign":41,"./function/arithmetic/smaller":42,"./function/arithmetic/smallereq":43,"./function/arithmetic/sqrt":44,"./function/arithmetic/square":45,"./function/arithmetic/subtract":46,"./function/arithmetic/unary":47,"./function/arithmetic/unequal":48,"./function/arithmetic/xgcd":49,"./function/complex/arg":50,"./function/complex/conj":51,"./function/complex/im":52,"./function/complex/re":53,"./function/construction/bignumber":54,"./function/construction/boolean":55,"./function/construction/complex":56,"./function/construction/index":57,"./function/construction/matrix":58,"./function/construction/number":59,"./function/construction/string":60,"./function/construction/unit":61,"./function/expression/eval":62,"./function/expression/help":63,"./function/matrix/concat":64,"./function/matrix/det":65,"./function/matrix/diag":66,"./function/matrix/eye":67,"./function/matrix/inv":68,"./function/matrix/ones":69,"./function/matrix/range":70,"./function/matrix/resize":71,"./function/matrix/size":72,"./function/matrix/squeeze":73,"./function/matrix/subset":74,"./function/matrix/transpose":75,"./function/matrix/zeros":76,"./function/probability/combinations":77,"./function/probability/distribution":78,"./function/probability/factorial":79,"./function/probability/permutations":80,"./function/probability/pickRandom":81,"./function/probability/random":82,"./function/probability/randomInt":83,"./function/statistics/max":84,"./function/statistics/mean":85,"./function/statistics/min":86,"./function/trigonometry/acos":87,"./function/trigonometry/asin":88,"./function/trigonometry/atan":89,"./function/trigonometry/atan2":90,"./function/trigonometry/cos":91,"./function/trigonometry/cot":92,"./function/trigonometry/csc":93,"./function/trigonometry/sec":94,"./function/trigonometry/sin":95,"./function/trigonometry/tan":96,"./function/units/to":97,"./function/utils/clone":98,"./function/utils/forEach":99,"./function/utils/format":100,"./function/utils/import":101,"./function/utils/map":102,"./function/utils/typeof":103}],105:[function(e,n){function t(e){this.nodes=e||[]}{var r=e("./Node"),i=(e("../../util/object"),e("../../util/string"));e("../../type/collection"),e("../../type/Matrix")}t.prototype=new r,t.prototype._compile=function(e){var n="array"!==e.math.config().matrix,t=this.nodes.map(function(n){return n._compile(e)});return(n?"math.matrix([":"[")+t.join(",")+(n?"])":"]")},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);for(var t=this.nodes,r=0,i=t.length;i>r;r++)for(var o=t[r],a=0,s=o.length;s>a;a++)n=n.concat(o[a].find(e));return n},t.prototype.toString=function(){return i.format(this.nodes)},n.exports=t},{"../../type/Matrix":211,"../../type/collection":214,"../../util/object":220,"../../util/string":221,"./Node":111}],106:[function(e,n){function t(e,n){this.name=e,this.expr=n}var r=e("./Node");t.prototype=new r,t.prototype._compile=function(e){return'scope["'+this.name+'"] = '+this.expr._compile(e)},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return this.name+" = "+this.expr.toString()},n.exports=t},{"./Node":111}],107:[function(e,n){function t(){this.params=[]}var r=e("./Node");t.prototype=new r,t.prototype.add=function(e,n){var t=this.params.length;this.params[t]={node:e,visible:void 0!=n?n:!0}},t.prototype._compile=function(e){var n=this.params.map(function(n){var t=n.node._compile(e);return n.visible?"results.push("+t+");":t+";"});return"(function () {var results = [];"+n.join("")+"return results;})()"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var t=this.params;if(t)for(var r=0,i=t.length;i>r;r++)n=n.concat(t[r].node.find(e));return n},t.prototype.toString=function(){return this.params.map(function(e){return e.node.toString()+(e.visible?"":";")}).join("\n")},n.exports=t},{"./Node":111}],108:[function(e,n){function t(e,n){if(!o(e))throw new TypeError("Constant type must be a string");if(!o(n))throw new TypeError("Constant value must be a string");this.type=e,this.value=n}var r=e("./Node"),i=(e("../../type/Complex"),e("bignumber.js"),e("../../util/string")),o=i.isString;t.prototype=new r,t.prototype._compile=function(e){switch(this.type){case"number":return"bignumber"===e.math.config().number?'math.bignumber("'+this.value+'")':this.value.replace(/^(0*)[0-9]/,function(e,n){return e.substring(n.length)});case"string":return'"'+this.value+'"';case"complex":return"math.complex(0, "+this.value+")";case"boolean":return this.value;case"undefined":return this.value;case"null":return this.value;default:throw new TypeError('Unsupported type of constant "'+this.type+'"')}},t.prototype.toString=function(){switch(this.type){case"string":return'"'+this.value+'"';case"complex":return this.value+"i";default:return this.value}},n.exports=t},{"../../type/Complex":208,"../../util/string":221,"./Node":111,"bignumber.js":223}],109:[function(e,n){function t(e,n,t){this.name=e,this.args=n,this.expr=t}var r=e("./Node");t.prototype=new r,t.prototype._eval=function(){return this.scope.set(this.name,this.fn),this.fn},t.prototype._compile=function(e){return'scope["'+this.name+'"] = (function (scope) { scope = Object.create(scope); var fn = function '+this.name+"("+this.args.join(",")+") { if (arguments.length != "+this.args.length+') { throw new SyntaxError("Wrong number of arguments in function '+this.name+' (" + arguments.length + " provided, '+this.args.length+' expected)"); }'+this.args.map(function(e,n){return'scope["'+e+'"] = arguments['+n+"];"}).join("")+" return "+this.expr._compile(e)+' }; fn.syntax = "'+this.name+"("+this.args.join(", ")+')"; return fn; })(scope);'},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return"function "+this.name+"("+this.args.join(", ")+") = "+this.expr.toString()},n.exports=t},{"./Node":111}],110:[function(e,n){function t(e,n){this.object=e,this.ranges=n}{var r=e("../../util/number.js"),i=e("./Node.js"),o=e("./RangeNode.js"),a=e("./SymbolNode.js");e("bignumber.js"),e("../../type/Index.js"),e("../../type/Range.js"),r.isNumber,r.toNumber}t.prototype=new i,t.prototype._compile=function(e){return this.compileSubset(e)},t.prototype.compileSubset=function(e,n){var t={type:a,properties:{name:"end"}},r=this.ranges.map(function(e){return e.find(t).length>0}),i=this.ranges.map(function(n,t){var i=r[t];return n instanceof o?i?'(function (scope) { scope = Object.create(scope); scope["end"] = size['+t+"]; var step = "+(n.step?n.step._compile(e):"1")+"; return [ "+n.start._compile(e)+" - 1, "+n.end._compile(e)+" - (step > 0 ? 0 : 2), step ];})(scope)":"(function () { var step = "+(n.step?n.step._compile(e):"1")+"; return [ "+n.start._compile(e)+" - 1, "+n.end._compile(e)+" - (step > 0 ? 0 : 2), step ];})()":i?'(function (scope) { scope = Object.create(scope); scope["end"] = size['+t+"]; return "+n._compile(e)+" - 1;})(scope)":n._compile(e)+" - 1"}),s=i.some(function(e){return e});return s?"(function () { var obj = "+this.object._compile(e)+"; var size = math.size(obj).valueOf(); return math.subset( obj, math.index("+i.join(", ")+") "+(n?", "+n:"")+" );})()":"math.subset("+this.object._compile(e)+",math.index("+i.join(", ")+(n?", "+n:"")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this),this.object&&(n=n.concat(this.object.find(e)));var t=this.ranges;if(t)for(var r=0,i=t.length;i>r;r++)n=n.concat(t[r].find(e));return n},t.prototype.objectName=function(){return this.object.name},t.prototype.toString=function(){var e=this.object?this.object.toString():"";return this.ranges&&(e+="["+this.ranges.join(", ")+"]"),e},n.exports=t},{"../../type/Index.js":210,"../../type/Range.js":212,"../../util/number.js":219,"./Node.js":111,"./RangeNode.js":114,"./SymbolNode.js":115,"bignumber.js":223}],111:[function(e,n){function t(){}t.prototype.eval=function(){throw new Error("Node.eval is deprecated. Use Node.compile(math).eval([scope]) instead.")},t.prototype.compile=function(e){if("object"!=typeof e)throw new TypeError("Object expected as parameter math");var n={math:e},t=this._compile(n),r=Object.keys(n).map(function(e){return" var "+e+' = defs["'+e+'"];'}),i=r.join(" ")+'return { "eval": function (scope) { scope = scope || {}; return '+t+"; }};",o=new Function("defs",i);return o(n)},t.prototype._compile=function(){throw new Error("Cannot compile a Node interface")},t.prototype.find=function(e){return this.match(e)?[this]:[]},t.prototype.match=function(e){var n=!0;if(e&&(!e.type||this instanceof e.type||(n=!1),n&&e.properties))for(var t in e.properties)if(e.properties.hasOwnProperty(t)&&this[t]!=e.properties[t]){n=!1;break}return n},t.prototype.toString=function(){return""},n.exports=t},{}],112:[function(e,n){function t(e,n,t){this.op=e,this.fn=n,this.params=t}var r=e("./Node");t.prototype=new r,t.prototype._compile=function(e){if(!(this.fn in e.math))throw new Error("Function "+this.fn+' missing in provided namespace "math"');var n=this.params.map(function(n){return n._compile(e)});return"math."+this.fn+"("+n.join(", ")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var t=this.params;if(t)for(var r=0,i=t.length;i>r;r++)n=n.concat(t[r].find(e));return n},t.prototype.toString=function(){var e=this.params;switch(e.length){case 1:return"-"==this.op?"-"+e[0].toString():e[0].toString()+this.op;case 2:var n=e[0].toString();e[0]instanceof t&&(n="("+n+")");var r=e[1].toString();return e[1]instanceof t&&(r="("+r+")"),n+" "+this.op+" "+r;default:return this.op+"("+this.params.join(", ")+")"}},n.exports=t},{"./Node":111}],113:[function(e,n){function t(e,n){this.object=e,this.params=n}{var r=e("../../util/number"),i=e("./Node");e("./RangeNode"),e("./SymbolNode"),e("bignumber.js"),e("../../type/Index"),e("../../type/Range"),r.isNumber,r.toNumber}t.prototype=new i,t.prototype._compile=function(e){var n=this.params.map(function(n){return n._compile(e)});return this.object._compile(e)+"("+n.join(", ")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this),this.object&&(n=n.concat(this.object.find(e)));var t=this.params;if(t)for(var r=0,i=t.length;i>r;r++)n=n.concat(t[r].find(e));return n},t.prototype.toString=function(){var e=this.object?this.object.toString():"";return this.params&&(e+="("+this.params.join(", ")+")"),e},n.exports=t},{"../../type/Index":210,"../../type/Range":212,"../../util/number":219,"./Node":111,"./RangeNode":114,"./SymbolNode":115,"bignumber.js":223}],114:[function(e,n){function t(e){if(2!=e.length&&3!=e.length)throw new SyntaxError("Wrong number of arguments. Expected [start, end] or [start, end, step]");this.start=e[0],this.end=e[1],this.step=e[2]}{var r=e("../../util/number"),i=e("./Node");e("bignumber.js"),e("../../type/Range"),e("../../type/Matrix"),r.toNumber}t.prototype=new i,t.prototype._compile=function(e){return"math.range("+this.start._compile(e)+", "+this.end._compile(e)+", "+(this.step?this.step._compile(e)+", ":"")+"true)"},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.start&&(n=n.concat(this.start.find(e))),this.step&&(n=n.concat(this.step.find(e))),this.end&&(n=n.concat(this.end.find(e))),n},t.prototype.toString=function(){var e=this.start.toString();return this.step&&(e+=":"+this.step.toString()),e+=":"+this.end.toString()},n.exports=t},{"../../type/Matrix":211,"../../type/Range":212,"../../util/number":219,"./Node":111,"bignumber.js":223}],115:[function(e,n){function t(e){this.name=e}function r(e){throw new Error("Undefined symbol "+e)}var i=e("./Node"),o=e("../../type/Unit");t.prototype=new i,t.prototype._compile=function(e){return e.undef=r,e.Unit=o,'(scope["'+this.name+'"] !== undefined ? scope["'+this.name+'"] : math["'+this.name+'"] !== undefined ? math["'+this.name+'"] : '+(o.isPlainUnit(this.name)?'new Unit(null, "'+this.name+'")':'undef("'+this.name+'")')+")"},t.prototype.toString=function(){return this.name},n.exports=t},{"../../type/Unit":213,"./Node":111}],116:[function(e,n){function t(e,n){this.value=e,this.unit=n}{var r=e("./Node"),i=(e("bignumber.js"),e("../../type/Complex"),e("../../type/Unit"),e("../../util/number"));i.toNumber}t.prototype=new r,t.prototype._compile=function(e){return"math.unit("+this.value._compile(e)+', "'+this.unit+'")'},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),n=n.concat(this.value.find(e))},t.prototype.toString=function(){return this.value+" "+this.unit},n.exports=t},{"../../type/Complex":208,"../../type/Unit":213,"../../util/number":219,"./Node":111,"bignumber.js":223}],117:[function(e,n){function t(e,n){if(!(e instanceof o))throw new TypeError("index mus be an IndexNode");this.index=e,this.expr=n}{var r=e("../../util/number"),i=e("./Node"),o=(e("./RangeNode"),e("./IndexNode"));e("./SymbolNode"),e("bignumber.js"),e("../../type/Index"),e("../../type/Range"),r.isNumber,r.toNumber}t.prototype=new i,t.prototype._compile=function(e){return'scope["'+this.index.objectName()+'"] = '+this.index.compileSubset(e,this.expr._compile(e))},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var t=this.ranges;if(t)for(var r=0,i=t.length;i>r;r++)n=n.concat(t[r].find(e));return this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return this.index.toString()+" = "+this.expr.toString()},n.exports=t},{"../../type/Index":210,"../../type/Range":212,"../../util/number":219,"./IndexNode":110,"./Node":111,"./RangeNode":114,"./SymbolNode":115,"bignumber.js":223}],118:[function(){},{}],119:[function(e,n,t){t.ArrayNode=e("./ArrayNode"),t.AssignmentNode=e("./AssignmentNode"),t.BlockNode=e("./BlockNode"),t.ConstantNode=e("./ConstantNode"),t.IndexNode=e("./IndexNode"),t.FunctionNode=e("./FunctionNode"),t.Node=e("./Node"),t.OperatorNode=e("./OperatorNode"),t.ParamsNode=e("./ParamsNode"),t.RangeNode=e("./RangeNode"),t.SymbolNode=e("./SymbolNode"),t.UnitNode=e("./UnitNode"),t.UpdateNode=e("./UpdateNode"),t.handlers=e("./handlers")},{"./ArrayNode":105,"./AssignmentNode":106,"./BlockNode":107,"./ConstantNode":108,"./FunctionNode":109,"./IndexNode":110,"./Node":111,"./OperatorNode":112,"./ParamsNode":113,"./RangeNode":114,"./SymbolNode":115,"./UnitNode":116,"./UpdateNode":117,"./handlers":118}],120:[function(e,n){function t(e){if(1!=arguments.length)throw new SyntaxError("Wrong number of arguments: 1 expected");if(F(e))return un=e||"",l();if(G(e)||e instanceof D)return H.deepMap(e,function(e){return un=e||"",l()});throw new TypeError("String or matrix expected")}function r(){cn=0,fn=un.charAt(0)}function i(){cn++,fn=un.charAt(cn)}function o(){return un.charAt(cn+1)}function a(){for(mn=on.NULL,ln="";" "==fn||" "==fn;)i();if("#"==fn)for(;"\n"!=fn&&""!=fn;)i();if(""==fn)return void(mn=on.DELIMITER);var e=fn+o();if(an[e])return mn=on.DELIMITER,ln=e,i(),void i();if(an[fn])return mn=on.DELIMITER,ln=fn,void i();if(!c(fn)){if(u(fn)){for(;u(fn)||f(fn);)ln+=fn,i();return void(mn=sn[ln]?on.DELIMITER:on.SYMBOL)}for(mn=on.UNKNOWN;""!=fn;)ln+=fn,i();throw B('Syntax error in part "'+ln+'"')}if(mn=on.NUMBER,"."==fn)ln+=fn,i(),f(fn)||(mn=on.UNKNOWN);else{for(;f(fn);)ln+=fn,i();"."==fn&&(ln+=fn,i())}for(;f(fn);)ln+=fn,i();if("E"==fn||"e"==fn)for(ln+=fn,i(),("+"==fn||"-"==fn)&&(ln+=fn,i()),f(fn)||(mn=on.UNKNOWN);f(fn);)ln+=fn,i()}function s(){for(;"\n"==ln;)a()}function u(e){return e>="a"&&"z">=e||e>="A"&&"Z">=e||"_"==e}function c(e){return e>="0"&&"9">=e||"."==e}function f(e){return e>="0"&&"9">=e}function l(){r(),a();var e;if(e=""==ln?new Q("undefined","undefined"):m(),""!=ln)throw mn==on.DELIMITER?P("Unknown operator "+ln):B('Unexpected part "'+ln+'"');return e}function m(){var e,n,t;for("\n"!=ln&&";"!=ln&&""!=ln&&(e=p());"\n"==ln||";"==ln;)n||(n=new W,e&&(t=";"!=ln,n.add(e,t))),a(),"\n"!=ln&&";"!=ln&&""!=ln&&(e=p(),t=";"!=ln,n.add(e,t));return n?n:(e||(e=p()),e)}function p(){var e=h(),n="ans";return new Y(n,e)}function h(){if(mn==on.SYMBOL&&"function"==ln)throw new Error('Deprecated keyword "function". Functions can now be assigned without it, like "f(x) = x^2".');return g()}function g(){var e,n,t,r=d();if("="==ln){if(r instanceof en)return e=r.name,a(),t=g(),new Y(e,t);if(r instanceof K)return a(),t=g(),new tn(r,t);if(r instanceof X){var i=!0;if(n=[],r.object instanceof en?(e=r.object.name,r.params.forEach(function(e,t){e instanceof en?n[t]=e.name:i=!1})):i=!1,i)return a(),t=g(),new Z(e,n,t)}throw B("Invalid left hand side of assignment operator =")}return r}function d(){var e,n=[];if(e=":"==ln?new Q("number","1"):x(),":"==ln){for(n.push(e);":"==ln;)a(),n.push(")"==ln||"]"==ln||","==ln||""==ln?new en("end"):x());if(n.length){if(3==n.length){var t=n[2];n[2]=n[1],n[1]=t}e=new J(n)}}return e}function x(){var e=y();return e}function y(){var e,n,t,r,i;for(e=b(),n={"==":"equal","!=":"unequal","<":"smaller",">":"larger","<=":"smallereq",">=":"largereq"};ln in n;)t=ln,r=n[t],a(),i=[e,b()],e=new $(t,r,i);return e}function b(){var e,n,t,r,i;for(e=v(),n={to:"to","in":"to"};ln in n;)t=ln,r=n[t],a(),i=[e,v()],e=new $(t,r,i);return e}function v(){var e,n,t,r,i;for(e=w(),n={"+":"add","-":"subtract"};ln in n;)t=ln,r=n[t],a(),i=[e,w()],e=new $(t,r,i);return e}function w(){var e,n,t,r,i;for(e=E(),n={"*":"multiply",".*":"emultiply","/":"divide","./":"edivide","%":"mod",mod:"mod"};ln in n;)t=ln,r=n[t],a(),i=[e,E()],e=new $(t,r,i);return e}function E(){var e,n;return e=N(),(mn==on.SYMBOL||"in"==ln)&&(n=ln,a(),e=new nn(e,n)),e}function N(){var e,n,t;return"-"==ln?(e=ln,n="unary",a(),t=[N()],new $(e,n,t)):j()}function j(){var e,n,t,r,i,o,s;for(t=[M()],r=[];"^"==ln||".^"==ln;)r.push(ln),a(),t.push(M());for(e=t.pop();t.length;)n=t.pop(),i=r.pop(),o="^"==i?"pow":"epow",s=[n,e],e=new $(i,o,s);return e}function M(){var e,n,t,r,i;for(e=C(),n={"!":"factorial","'":"transpose"};ln in n;)t=ln,r=n[t],a(),i=[e],e=new $(t,r,i);return e}function C(){var e,n;if(mn==on.SYMBOL&&rn[ln]){if(n=rn[ln],a(),"("==ln){if(e=[],a(),")"!=ln)for(e.push(d());","==ln;)a(),e.push(d());if(")"!=ln)throw B("Parenthesis ) expected");a()}return new n(e)}return A()}function A(){var e,n;return mn==on.SYMBOL||mn==on.DELIMITER&&ln in sn?(n=ln,a(),e=new en(n),O(e)):T()}function O(e){for(var n,t;"("==ln||"["==ln;){if(n=ln,t=[],a(),")"!=ln&&"]"!=ln)for(t.push(d());","==ln;)a(),t.push(d());if("("==n&&")"!=ln)throw B("Parenthesis ) expected");if("["==n&&"]"!=ln)throw B("Parenthesis ] expected");a(),e="("==n?new X(e,t):new K(e,t)}return e}function T(){var e,n,t;if('"'==ln){for(n="",t="";""!=fn&&('"'!=fn||"\\"==t);)n+=fn,t=fn,i();if(a(),'"'!=ln)throw B('End of string " expected');return a(),e=new Q("string",n),e=O(e)}return U()}function U(){var e,n,t,r;if("["==ln){if(a(),s(),"]"!=ln){var i=S();if(";"==ln){for(t=1,n=[i];";"==ln;)a(),s(),n[t]=S(),t++,s();if("]"!=ln)throw B("End of matrix ] expected");a(),r=n.length>0?n[0].length:0;for(var o=1;t>o;o++)if(n[o].length!=r)throw P("Number of columns must match ("+n[o].length+" != "+r+")");e=new V(n)}else{if("]"!=ln)throw B("End of matrix ] expected");a(),e=i}}else a(),e=new V([]);return e=O(e)}return q()}function S(){for(var e=[g()],n=1;","==ln;)a(),s(),e[n]=g(),n++,s();return new V(e)}function q(){var e,n;return mn==on.NUMBER?(n="."==ln?"0":ln,a(),"i"==ln||"I"==ln?(a(),e=new Q("complex",n)):e=new Q("number",n),e=O(e)):z()}function z(){var e;if("("==ln){if(a(),e=g(),")"!=ln)throw B("Parenthesis ) expected");return a(),e=O(e)}return R()}function R(){throw B(""==ln?"Unexpected end of expression":"Value expected")}function I(){return void 0}function _(){return cn-ln.length+1}function L(e){var n=I(),t=_();return void 0===n?void 0===t?e:e+" (char "+t+")":e+" (line "+n+", char "+t+")"}function B(e){return new SyntaxError(L(e))}function P(e){return new Error(L(e))}var k=e("../util/index"),F=(k.number.toNumber,k.string.isString),G=Array.isArray,D=(e("../type/Complex"),e("../type/Matrix")),H=(e("../type/Unit"),e("../type/collection")),V=e("./node/ArrayNode"),Y=e("./node/AssignmentNode"),W=e("./node/BlockNode"),Q=e("./node/ConstantNode"),Z=e("./node/FunctionNode"),K=e("./node/IndexNode"),$=e("./node/OperatorNode"),X=e("./node/ParamsNode"),J=e("./node/RangeNode"),en=e("./node/SymbolNode"),nn=e("./node/UnitNode"),tn=e("./node/UpdateNode"),rn=e("./node/handlers"),on={NULL:0,DELIMITER:1,NUMBER:2,SYMBOL:3,UNKNOWN:4},an={",":!0,"(":!0,")":!0,"[":!0,"]":!0,'"':!0,"\n":!0,";":!0,"+":!0,"-":!0,"*":!0,".*":!0,"/":!0,"./":!0,"%":!0,"^":!0,".^":!0,"!":!0,"'":!0,"=":!0,":":!0,"==":!0,"!=":!0,"<":!0,">":!0,"<=":!0,">=":!0},sn={mod:!0,to:!0,"in":!0},un="",cn=0,fn="",ln="",mn=on.NULL;n.exports=t},{"../type/Complex":208,"../type/Matrix":211,"../type/Unit":213,"../type/collection":214,"../util/index":218,"./node/ArrayNode":105,"./node/AssignmentNode":106,"./node/BlockNode":107,"./node/ConstantNode":108,"./node/FunctionNode":109,"./node/IndexNode":110,"./node/OperatorNode":112,"./node/ParamsNode":113,"./node/RangeNode":114,"./node/SymbolNode":115,"./node/UnitNode":116,"./node/UpdateNode":117,"./node/handlers":118}],121:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=(e("../../type/Matrix"),e("../../type/collection")),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.abs=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("abs",arguments.length,1);if(a(e))return Math.abs(e);if(u(e))return Math.sqrt(e.re*e.re+e.im*e.im);if(e instanceof r)return e.abs();if(c(e))return o.deepMap(e,f);if(s(e))return Math.abs(e);throw new n.error.UnsupportedTypeError("abs",e)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],122:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=(e("../../type/Matrix"),e("../../type/Unit")),a=e("../../type/collection"),s=t["boolean"].isBoolean,u=t.number.isNumber,c=t.number.toNumber,f=t.number.toBigNumber,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.add=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("add",arguments.length,2);if(u(e)){if(u(t))return e+t;if(m(t))return new i(e+t.re,t.im)}if(m(e)){if(m(t))return new i(e.re+t.re,e.im+t.im);if(u(t))return new i(e.re+t,e.im)}if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Units do not match");if(null==e.value)throw new Error("Unit on left hand side of operator + has an undefined value");if(null==t.value)throw new Error("Unit on right hand side of operator + has an undefined value");var o=e.clone();return o.value+=t.value,o.fixPrefix=!1,o}if(e instanceof r)return u(t)?t=f(t):s(t)&&(t=new r(t?1:0)),t instanceof r?e.plus(t):g(c(e),t);if(t instanceof r)return u(e)?e=f(e):s(e)&&(e=new r(e?1:0)),e instanceof r?e.plus(t):g(e,c(t));if(l(e)||l(t))return e+t;if(h(e)||h(t))return a.deepMap2(e,t,g);if(s(e))return g(+e,t);if(s(t))return g(e,+t);throw new n.error.UnsupportedTypeError("add",e,t)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],123:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=o.isCollection,c=i.isComplex;n.ceil=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("ceil",arguments.length,1);if(a(e))return Math.ceil(e);if(c(e))return new i(Math.ceil(e.re),Math.ceil(e.im));if(e instanceof r)return e.ceil();if(u(e))return o.deepMap(e,f);if(s(e))return Math.ceil(e);throw new n.error.UnsupportedTypeError("ceil",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],124:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.cube=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("cube",arguments.length,1);if(a(e))return e*e*e;if(u(e))return n.multiply(n.multiply(e,e),e);if(e instanceof r)return e.times(e).times(e);if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("cube",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],125:[function(e,n){n.exports=function(n){function t(e,n){var t=n.re*n.re+n.im*n.im;return 0!=t?new o((e.re*n.re+e.im*n.im)/t,(e.im*n.re-e.re*n.im)/t):new o(0!=e.re?e.re/0:0,0!=e.im?e.im/0:0)}var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Complex"),a=(e("../../type/Matrix"),e("../../type/Unit")),s=e("../../type/collection"),u=r.number.isNumber,c=r.number.toNumber,f=r.number.toBigNumber,l=r["boolean"].isBoolean,m=o.isComplex,p=a.isUnit,h=s.isCollection;n.divide=function g(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("divide",arguments.length,2);if(u(e)){if(u(r))return e/r;if(m(r))return t(new o(e,0),r)}if(m(e)){if(m(r))return t(e,r);if(u(r))return t(e,new o(r,0))}if(e instanceof i)return u(r)?r=f(r):l(r)&&(r=new i(r?1:0)),r instanceof i?e.div(r):g(c(e),r);if(r instanceof i)return u(e)?e=f(e):l(e)&&(e=new i(e?1:0)),e instanceof i?e.div(r):g(e,c(r));if(p(e)&&u(r)){var a=e.clone();return a.value/=r,a}if(h(e))return h(r)?n.multiply(e,n.inv(r)):s.deepMap2(e,r,g);if(h(r))return n.multiply(e,n.inv(r));if(l(e))return g(+e,r);if(l(r))return g(e,+r);throw new n.error.UnsupportedTypeError("divide",e,r)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],126:[function(e,n){n.exports=function(n){var t=e("../../type/collection");n.edivide=function(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("edivide",arguments.length,2);return t.deepMap2(e,r,n.divide)}}},{"../../type/collection":214}],127:[function(e,n){n.exports=function(n){var t=e("../../type/collection");n.emultiply=function(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("emultiply",arguments.length,2);return t.deepMap2(e,r,n.multiply)}}},{"../../type/collection":214}],128:[function(e,n){n.exports=function(n){var t=e("../../type/collection");n.epow=function(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("epow",arguments.length,2);return t.deepMap2(e,r,n.pow)}}},{"../../type/collection":214}],129:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t.number.toNumber,c=t.number.toBigNumber,f=t["boolean"].isBoolean,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.equal=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("equal",arguments.length,2);if(s(e)){if(s(t))return e==t;if(m(t))return e==t.re&&0==t.im}if(m(e)){if(s(t))return e.re==t&&0==e.im;if(m(t))return e.re==t.re&&e.im==t.im}if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?e.eq(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?e.eq(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.value==t.value}if(l(e)||l(t))return e==t;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);throw new n.error.UnsupportedTypeError("equal",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],130:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=(e("../../type/Matrix"),e("../../type/collection")),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.exp=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("exp",arguments.length,1);if(a(e))return Math.exp(e);if(u(e)){var l=Math.exp(e.re);return new i(l*Math.cos(e.im),l*Math.sin(e.im))}if(e instanceof r)return f(t.number.toNumber(e));if(c(e))return o.deepMap(e,f);if(s(e))return Math.exp(e);throw new n.error.UnsupportedTypeError("exp",e)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],131:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.fix=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("fix",arguments.length,1);if(a(e))return e>0?Math.floor(e):Math.ceil(e);if(u(e))return new i(e.re>0?Math.floor(e.re):Math.ceil(e.re),e.im>0?Math.floor(e.im):Math.ceil(e.im));if(e instanceof r)return e.isNegative()?e.ceil():e.floor();if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("fix",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],132:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.floor=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("floor",arguments.length,1);if(a(e))return Math.floor(e);if(u(e))return new i(Math.floor(e.re),Math.floor(e.im));if(e instanceof r)return e.floor();if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("floor",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],133:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=t.number.isNumber,a=t.number.toNumber,s=t["boolean"].isBoolean,u=t.number.isInteger,c=i.isCollection;n.gcd=function f(){var e,t=arguments[0],l=arguments[1];if(2==arguments.length){if(o(t)&&o(l)){if(!u(t)||!u(l))throw new Error("Parameters in function gcd must be integer numbers");for(;0!=l;)e=t%l,t=l,l=e;return 0>t?-t:t}if(c(t)||c(l))return i.deepMap2(t,l,f);if(t instanceof r)return f(a(t),l);if(l instanceof r)return f(t,a(l));if(s(t))return f(+t,l);if(s(l))return f(t,+l);throw new n.error.UnsupportedTypeError("gcd",t,l)}if(arguments.length>2){for(var m=1;mt;if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?e.gt(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?e.gt(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.value>t.value}if(l(e)||l(t))return e>t;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);if(m(e)||m(t))throw new TypeError("No ordering relation is defined for complex numbers");throw new n.error.UnsupportedTypeError("larger",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],135:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t.number.toNumber,c=t.number.toBigNumber,f=t["boolean"].isBoolean,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.largereq=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("largereq",arguments.length,2);if(s(e)&&s(t))return e>=t;if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?e.gte(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?e.gte(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.value>=t.value}if(l(e)||l(t))return e>=t;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);if(m(e)||m(t))throw new TypeError("No ordering relation is defined for complex numbers");throw new n.error.UnsupportedTypeError("largereq",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],136:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=t.number.isNumber,a=t.number.toNumber,s=t["boolean"].isBoolean,u=t.number.isInteger,c=i.isCollection;n.lcm=function f(){var e,t=arguments[0],l=arguments[1];if(2==arguments.length){if(o(t)&&o(l)){if(!u(t)||!u(l))throw new Error("Parameters in function lcm must be integer numbers");if(0==t||0==l)return 0;for(var m=t*l;0!=l;)e=l,l=t%e,t=e;return Math.abs(m/t)}if(c(t)||c(l))return i.deepMap2(t,l,f);if(s(t))return f(+t,l);if(s(l))return f(t,+l);if(t instanceof r)return f(a(t),l);if(l instanceof r)return f(t,a(l));throw new n.error.UnsupportedTypeError("lcm",t,l)}if(arguments.length>2){for(var p=1;p=0?Math.log(e):f(new i(e,0));if(u(e))return new i(Math.log(Math.sqrt(e.re*e.re+e.im*e.im)),Math.atan2(e.im,e.re));if(e instanceof r)return f(t.number.toNumber(e));if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("log",e)}if(2==arguments.length)return n.divide(f(e),f(l));throw new n.error.ArgumentsError("log",arguments.length,1,2)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],138:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.log10=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("log10",arguments.length,1);if(a(e))return e>=0?Math.log(e)/Math.LN10:f(new i(e,0));if(e instanceof r)return f(t.number.toNumber(e));if(u(e))return new i(Math.log(Math.sqrt(e.re*e.re+e.im*e.im))/Math.LN10,Math.atan2(e.im,e.re)/Math.LN10);if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("log10",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],139:[function(e,n){n.exports=function(n){function t(e,n){if(n>0)return e>0?e%n:0==e?0:e-n*Math.floor(e/n);if(0==n)return e;throw new Error("Cannot calculate mod for a negative divisor")}var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/collection"),a=r.number.isNumber,s=r.number.toNumber,u=r.number.toBigNumber,c=r["boolean"].isBoolean,f=o.isCollection;n.mod=function l(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("mod",arguments.length,2);if(a(e)&&a(r))return t(e,r);if(e instanceof i)return a(r)?r=u(r):c(r)&&(r=new i(r?1:0)),r instanceof i?e.mod(r):l(s(e),r);if(r instanceof i)return a(e)?e=u(e):c(e)&&(e=new i(e?1:0)),e instanceof i?e.mod(r):l(e,s(r));if(f(e)||f(r))return o.deepMap2(e,r,l);if(c(e))return l(+e,r);if(c(r))return l(e,+r);throw new n.error.UnsupportedTypeError("mod",e,r)}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],140:[function(e,n){n.exports=function(n){function t(e,t){for(var r=[],i=e.length,o=t[0].length,a=e[0].length,s=0;i>s;s++){r[s]=[];for(var u=0;o>u;u++){for(var c=null,f=0;a>f;f++){var l=n.multiply(e[s][f],t[f][u]);c=null===c?l:n.add(c,l)}r[s][u]=c}}return r}function r(e,t){for(var r=[],i=t.length,o=t[0].length,a=0;o>a;a++){for(var s=null,u=0;i>u;u++){var c=n.multiply(e[u],t[u][a]);s=0===u?c:n.add(s,c)}r[a]=s}return r}function i(e,t){for(var r=[],i=e.length,o=e[0].length,a=0;i>a;a++){for(var s=null,u=0;o>u;u++){var c=n.multiply(e[a][u],t[u]);s=0===u?c:n.add(s,c)}r[a]=s}return r}function o(e,t){var r=e.length,i=null;if(r){i=0;for(var o=0,a=e.length;a>o;o++)i=n.add(i,n.multiply(e[o],t[o]))}return i}function a(e,n){return 0==e.im?0==n.im?new c(e.re*n.re,0):0==n.re?new c(0,e.re*n.im):new c(e.re*n.re,e.re*n.im):0==e.re?0==n.im?new c(0,e.im*n.re):0==n.re?new c(-e.im*n.im,0):new c(-e.im*n.im,e.im*n.re):0==n.im?new c(e.re*n.re,e.im*n.re):0==n.re?new c(-e.im*n.im,e.re*n.im):new c(e.re*n.re-e.im*n.im,e.re*n.im+e.im*n.re)}var s=e("../../util/index"),u=e("bignumber.js"),c=e("../../type/Complex"),f=e("../../type/Matrix"),l=e("../../type/Unit"),m=e("../../type/collection"),p=s.array,h=s.number.isNumber,g=s.number.toNumber,d=s.number.toBigNumber,x=s["boolean"].isBoolean,y=c.isComplex,b=Array.isArray,v=l.isUnit;n.multiply=function w(e,s){if(2!=arguments.length)throw new n.error.ArgumentsError("multiply",arguments.length,2);if(h(e)){if(h(s))return e*s;if(y(s))return a(new c(e,0),s);if(v(s))return res=s.clone(),res.value*=e,res}if(y(e)){if(h(s))return a(e,new c(s,0));if(y(s))return a(e,s)}if(e instanceof u)return h(s)?s=d(s):x(s)&&(s=new u(s?1:0)),s instanceof u?e.times(s):w(g(e),s);if(s instanceof u)return h(e)?e=d(e):x(e)&&(e=new u(e?1:0)),e instanceof u?e.times(s):w(e,g(s));if(v(e)&&h(s))return res=e.clone(),res.value*=s,res;if(b(e)){if(b(s)){var l=p.size(e),E=p.size(s);if(1==l.length){if(1==E.length){if(l[0]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Length of A must match length of B (A is "+l[0]+", B is "+E[0]+l[0]+" != "+E[0]+")");return o(e,s)}if(2==E.length){if(l[0]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Length of A must match rows of B (A is "+l[0]+", B is "+E[0]+"x"+E[1]+", "+l[0]+" != "+E[0]+")");return r(e,s)}throw new Error("Can only multiply a 1 or 2 dimensional matrix (B has "+E.length+" dimensions)")}if(2==l.length){if(1==E.length){if(l[1]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Columns of A must match length of B (A is "+l[0]+"x"+l[0]+", B is "+E[0]+", "+l[1]+" != "+E[0]+")");return i(e,s)}if(2==E.length){if(l[1]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Columns of A must match rows of B (A is "+l[0]+"x"+l[1]+", B is "+E[0]+"x"+E[1]+", "+l[1]+" != "+E[0]+")");return t(e,s)}throw new Error("Can only multiply a 1 or 2 dimensional matrix (B has "+E.length+" dimensions)")}throw new Error("Can only multiply a 1 or 2 dimensional matrix (A has "+l.length+" dimensions)")}return s instanceof f?new f(w(e,s.valueOf())):m.deepMap2(e,s,w)}if(e instanceof f)return new f(s instanceof f?w(e.valueOf(),s.valueOf()):w(e.valueOf(),s));if(b(s))return m.deepMap2(e,s,w);if(s instanceof f)return new f(m.deepMap2(e,s.valueOf(),w));if(x(e))return w(+e,s);if(x(s))return w(e,+s);throw new n.error.UnsupportedTypeError("multiply",e,s)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],141:[function(e,n){n.exports=function(n){function t(e,t){var r=n.log(e),i=n.multiply(r,t);return n.exp(i)}var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Complex"),a=e("../../type/Matrix"),s=(e("../../type/collection"),r.array),u=r.number.isNumber,c=r.number.toNumber,f=r.number.toBigNumber,l=r["boolean"].isBoolean,m=Array.isArray,p=r.number.isInteger,h=o.isComplex;n.pow=function g(e,r){if(2!=arguments.length)throw new n.error.ArgumentsError("pow",arguments.length,2);if(u(e)){if(u(r))return p(r)||e>=0?Math.pow(e,r):t(new o(e,0),new o(r,0));if(h(r))return t(new o(e,0),r)}if(h(e)){if(u(r))return t(e,new o(r,0));if(h(r))return t(e,r)}if(e instanceof i)return u(r)?r=f(r):l(r)&&(r=new i(r?1:0)),r instanceof i?e.pow(r):g(c(e),r);if(r instanceof i)return u(e)?e=f(e):l(e)&&(e=new i(e?1:0)),e instanceof i?e.pow(r):g(e,c(r));if(m(e)){if(!u(r)||!p(r)||0>r)throw new TypeError("For A^b, b must be a positive integer (value is "+r+")");var d=s.size(e);if(2!=d.length)throw new Error("For A^b, A must be 2 dimensional (A has "+d.length+" dimensions)");if(d[0]!=d[1])throw new Error("For A^b, A must be square (size is "+d[0]+"x"+d[1]+")");if(0==r)return n.eye(d[0]);for(var x=e,y=1;r>y;y++)x=n.multiply(e,x);return x}if(e instanceof a)return new a(g(e.valueOf(),r));if(l(e))return g(+e,r);if(l(r))return g(e,+r);throw new n.error.UnsupportedTypeError("pow",e,r)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],142:[function(e,n){n.exports=function(n){function t(e,n){if(n){var t=Math.pow(10,n);return Math.round(e*t)/t}return Math.round(e)}var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Complex"),a=e("../../type/collection"),s=r.number.isNumber,u=r.number.isInteger,c=r["boolean"].isBoolean,f=o.isComplex,l=a.isCollection;n.round=function m(e,r){if(1!=arguments.length&&2!=arguments.length)throw new n.error.ArgumentsError("round",arguments.length,1,2);if(void 0==r){if(s(e))return Math.round(e);if(f(e))return new o(Math.round(e.re),Math.round(e.im));if(e instanceof i)return e.round();if(l(e))return a.deepMap(e,m);if(c(e))return Math.round(e);throw new n.error.UnsupportedTypeError("round",e)}if(r instanceof i&&(r=parseFloat(r.valueOf())),!s(r)||!u(r))throw new TypeError("Number of decimals in function round must be an integer");if(0>r||r>9)throw new Error("Number of decimals in function round must be in te range of 0-9");if(s(e))return t(e,r);if(f(e))return new o(t(e.re,r),t(e.im,r));if(e instanceof i&&s(r))return e.round(r);if(l(e)||l(r))return a.deepMap2(e,r,m);if(c(e))return m(+e,r);if(c(r))return m(e,+r);throw new n.error.UnsupportedTypeError("round",e,r)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],143:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number,s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isCollection;n.sign=function l(e){if(1!=arguments.length)throw new n.error.ArgumentsError("sign",arguments.length,1);if(s(e))return a.sign(e);if(c(e)){var t=Math.sqrt(e.re*e.re+e.im*e.im);return new i(e.re/t,e.im/t)}if(e instanceof r)return new r(e.cmp(0));if(f(e))return o.deepMap(e,l);if(u(e))return a.sign(e);throw new n.error.UnsupportedTypeError("sign",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],144:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t.number.toNumber,c=t.number.toBigNumber,f=t["boolean"].isBoolean,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.smaller=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("smaller",arguments.length,2);if(s(e)&&s(t))return t>e;if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?e.lt(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?e.lt(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.valuee;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);if(m(e)||m(t))throw new TypeError("No ordering relation is defined for complex numbers");throw new n.error.UnsupportedTypeError("smaller",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],145:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t.number.toNumber,c=t.number.toBigNumber,f=t["boolean"].isBoolean,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.smallereq=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("smallereq",arguments.length,2);if(s(e)&&s(t))return t>=e;if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?e.lte(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?e.lte(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.value<=t.value}if(l(e)||l(t))return t>=e;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);if(m(e)||m(t))throw new TypeError("No ordering relation is defined for complex numbers");throw new n.error.UnsupportedTypeError("smallereq",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],146:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.sqrt=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("sqrt",arguments.length,1);if(a(e))return e>=0?Math.sqrt(e):f(new i(e,0));if(u(e)){var t=Math.sqrt(e.re*e.re+e.im*e.im);return e.im>=0?new i(.5*Math.sqrt(2*(t+e.re)),.5*Math.sqrt(2*(t-e.re))):new i(.5*Math.sqrt(2*(t+e.re)),-.5*Math.sqrt(2*(t-e.re)))}if(e instanceof r)return e.sqrt();if(c(e))return o.deepMap(e,f);if(s(e))return f(+e);throw new n.error.UnsupportedTypeError("sqrt",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],147:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.square=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("square",arguments.length,1);if(a(e))return e*e;if(u(e))return n.multiply(e,e);if(e instanceof r)return e.times(e);if(c(e))return o.deepMap(e,f);if(s(e))return e*e;throw new n.error.UnsupportedTypeError("square",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],148:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=(e("../../type/Matrix"),e("../../type/Unit")),a=e("../../type/collection"),s=t.number.toNumber,u=t.number.toBigNumber,c=t["boolean"].isBoolean,f=t.number.isNumber,l=i.isComplex,m=o.isUnit,p=a.isCollection;n.subtract=function h(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("subtract",arguments.length,2);if(f(e)){if(f(t))return e-t;if(l(t))return new i(e-t.re,-t.im)}else if(l(e)){if(f(t))return new i(e.re-t,e.im);if(l(t))return new i(e.re-t.re,e.im-t.im)}if(e instanceof r)return f(t)?t=u(t):c(t)&&(t=new r(t?1:0)),t instanceof r?e.minus(t):h(s(e),t);if(t instanceof r)return f(e)?e=u(e):c(e)&&(e=new r(e?1:0)),e instanceof r?e.minus(t):h(e,s(t));if(m(e)&&m(t)){if(!e.equalBase(t))throw new Error("Units do not match");if(null==e.value)throw new Error("Unit on left hand side of operator - has an undefined value");if(null==t.value)throw new Error("Unit on right hand side of operator - has an undefined value");var o=e.clone();return o.value-=t.value,o.fixPrefix=!1,o}if(p(e)||p(t))return a.deepMap2(e,t,h);if(c(e))return h(+e,t);if(c(t))return h(e,+t);throw new n.error.UnsupportedTypeError("subtract",e,t)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],149:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.unary=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("unary",arguments.length,1);if(s(e))return-e;if(c(e))return new i(-e.re,-e.im);if(e instanceof r)return e.neg();if(f(e)){var t=e.clone();return t.value=-e.value,t}if(l(e))return a.deepMap(e,m);if(u(e))return-e;throw new n.error.UnsupportedTypeError("unary",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],150:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t.number.toNumber,c=t.number.toBigNumber,f=t["boolean"].isBoolean,l=t.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;n.unequal=function g(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("unequal",arguments.length,2);if(s(e)){if(s(t))return e!=t;if(m(t))return e!=t.re||0!=t.im}if(m(e)){if(s(t))return e.re!=t||0!=e.im;if(m(t))return e.re!=t.re||e.im!=t.im}if(e instanceof r)return s(t)?t=c(t):f(t)&&(t=new r(t?1:0)),t instanceof r?!e.eq(t):g(u(e),t);if(t instanceof r)return s(e)?e=c(e):f(e)&&(e=new r(e?1:0)),e instanceof r?!e.eq(t):g(e,u(t));if(p(e)&&p(t)){if(!e.equalBase(t))throw new Error("Cannot compare units with different base");return e.value!=t.value}if(l(e)||l(t))return e!=t;if(h(e)||h(t))return a.deepMap2(e,t,g);if(f(e))return g(+e,t);if(f(t))return g(e,+t);throw new n.error.UnsupportedTypeError("unequal",e,t)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],151:[function(e,n){n.exports=function(n){function t(e,n){for(var t,r,i,o=0,a=1,s=1,u=0;n;)r=Math.floor(e/n),i=e%n,t=o,o=a-r*o,a=t,t=s,s=u-r*s,u=t,e=n,n=i;return 0>e?[-e,e?-a:0,-u]:[e,e?a:0,u]}var r=e("../../util/index"),i=e("bignumber.js"),o=r.number.toNumber,a=r.number.isNumber,s=r["boolean"].isBoolean,u=r.number.isInteger;n.xgcd=function c(e,r){if(2==arguments.length){if(a(e)&&a(r)){if(!u(e)||!u(r))throw new Error("Parameters in function xgcd must be integer numbers");return t(e,r)}if(e instanceof i)return c(o(e),r);if(r instanceof i)return c(e,o(r));if(s(e))return c(+e,r);if(s(r))return c(e,+r);throw new n.error.UnsupportedTypeError("xgcd",e,r)}throw new SyntaxError("Function xgcd expects two arguments")}}},{"../../util/index":218,"bignumber.js":223}],152:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=o.isCollection,c=i.isComplex;n.arg=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("arg",arguments.length,1);if(a(e))return Math.atan2(0,e);if(c(e))return Math.atan2(e.im,e.re);if(u(e))return o.deepMap(e,f);if(s(e))return f(+e);if(e instanceof r)return f(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("arg",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],153:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.object,s=t.number.isNumber,u=t["boolean"].isBoolean,c=o.isCollection,f=i.isComplex;n.conj=function l(e){if(1!=arguments.length)throw new n.error.ArgumentsError("conj",arguments.length,1);return s(e)?e:e instanceof r?new r(e):f(e)?new i(e.re,-e.im):c(e)?o.deepMap(e,l):u(e)?+e:a.clone(e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],154:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=o.isCollection,c=i.isComplex;n.im=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("im",arguments.length,1);return a(e)?0:e instanceof r?new r(0):c(e)?e.im:u(e)?o.deepMap(e,f):s(e)?0:0}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],155:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.object,s=t.number.isNumber,u=t["boolean"].isBoolean,c=o.isCollection,f=i.isComplex;n.re=function l(e){if(1!=arguments.length)throw new n.error.ArgumentsError("re",arguments.length,1);return s(e)?e:e instanceof r?new r(e):f(e)?e.re:c(e)?o.deepMap(e,l):u(e)?+e:a.clone(e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],156:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=i.isCollection,a=t.number.isNumber,s=t.string.isString,u=t["boolean"].isBoolean;"function"!=typeof r.prototype.clone&&(r.prototype.clone=function(){return new r(this)}),n.bignumber=function c(e){if(arguments.length>1)throw new n.error.ArgumentsError("bignumber",arguments.length,0,1);if(e instanceof r||a(e)||s(e))return new r(e);if(u(e))return new r(+e);if(o(e))return i.deepMap(e,c);if(0==arguments.length)return new r(0);throw new n.error.UnsupportedTypeError("bignumber",e)}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],157:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=i.isCollection,a=t.number.isNumber,s=t.string.isString;n["boolean"]=function u(e){if(1!=arguments.length)throw new n.error.ArgumentsError("boolean",arguments.length,0,1);if("true"===e||e===!0)return!0;if("false"===e||e===!1)return!1;if(e instanceof Boolean)return e?!0:!1;if(a(e))return 0!==e;if(e instanceof r)return!e.isZero();if(s(e)){var t=e.toLowerCase();if("true"===t)return!0;if("false"===t)return!1;var c=Number(e);if(""!=e&&!isNaN(c))return 0!==c}if(o(e))return i.deepMap(e,u);throw new SyntaxError(e.toString()+" is no valid boolean")}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],158:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=o.isCollection,s=t.number.isNumber,u=t.number.toNumber,c=t.string.isString,f=i.isComplex;n.complex=function l(){switch(arguments.length){case 0:return new i(0,0);case 1:var e=arguments[0];if(s(e))return new i(e,0);if(e instanceof r)return new i(u(e),0);if(f(e))return e.clone();if(c(e)){var t=i.parse(e);if(t)return t;throw new SyntaxError('String "'+e+'" is no valid complex number')}if(a(e))return o.deepMap(e,l);throw new TypeError("Two numbers or a single string expected in function complex");case 2:var m=arguments[0],p=arguments[1];if(m instanceof r&&(m=u(m)),p instanceof r&&(p=u(p)),s(m)&&s(p))return new i(m,p);throw new TypeError("Two numbers or a single string expected in function complex");default:throw new n.error.ArgumentsError("complex",arguments.length,0,2)}}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],159:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Index"),o=t.number.toNumber;n.index=function(){var e=new i,n=Array.prototype.slice.apply(arguments).map(function(e){return e instanceof r?o(e):Array.isArray(e)?e.map(function(e){return e instanceof r?o(e):e}):e});return i.apply(e,n),e}}},{"../../type/Index":210,"../../util/index":218,"bignumber.js":223}],160:[function(e,n){n.exports=function(n){var t=e("../../type/Matrix");n.matrix=function(e){if(arguments.length>1)throw new n.error.ArgumentsError("matrix",arguments.length,0,1);return new t(e)}}},{"../../type/Matrix":211}],161:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=i.isCollection,a=t.number.toNumber;n.number=function s(e){switch(arguments.length){case 0:return 0;case 1:if(o(e))return i.deepMap(e,s);if(e instanceof r)return a(e);var t=Number(e);if(isNaN(t)&&(t=Number(e.valueOf())),isNaN(t))throw new SyntaxError(e.toString()+" is no valid number");return t;default:throw new n.error.ArgumentsError("number",arguments.length,0,1)}}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],162:[function(e,n){n.exports=function(n){var t=e("../../expression/Parser");n.parser=function(){return new t(n)}}},{"../../expression/Parser":4}],163:[function(e,n){n.exports=function(e){e.select=function(n){return new e.chaining.Selector(n)}}},{}],164:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("../../type/collection"),i=t.number,o=t.number.isNumber,a=r.isCollection;n.string=function s(e){switch(arguments.length){case 0:return"";case 1:return o(e)?i.format(e):a(e)?r.deepMap(e,s):null===e?"null":e.toString();default:throw new n.error.ArgumentsError("string",arguments.length,0,1)}}}},{"../../type/collection":214,"../../util/index":218}],165:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Unit"),o=e("../../type/collection"),a=o.isCollection,s=t.number.toNumber,u=t.string.isString;n.unit=function c(e){switch(arguments.length){case 1:var t=arguments[0];if(t instanceof i)return t.clone();if(u(t)){if(i.isPlainUnit(t))return new i(null,t);var f=i.parse(t);if(f)return f;throw new SyntaxError('String "'+t+'" is no valid unit')}if(a(e))return o.deepMap(e,c);throw new TypeError("A string or a number and string expected in function unit");case 2:return arguments[0]instanceof r?new i(s(arguments[0]),arguments[1]):new i(arguments[0],arguments[1]);default:throw new n.error.ArgumentsError("unit",arguments.length,1,2)}}}},{"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],166:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("../../type/collection"),i=t.string.isString,o=r.isCollection;n.eval=function(e,t){if(1!=arguments.length&&2!=arguments.length)throw new n.error.ArgumentsError("eval",arguments.length,1,2);if(t=t||{},i(e))return n.parse(e).compile(n).eval(t);if(o(e))return r.deepMap(e,function(e){return n.parse(e).compile(n).eval(t)});throw new TypeError("String or matrix expected")}}},{"../../type/collection":214,"../../util/index":218}],167:[function(e,n){n.exports=function(n){var t=e("../../type/Help");n.help=function(e){if(1!=arguments.length)throw new SyntaxError("Wrong number of arguments in function help ("+arguments.length+" provided, 1 expected)");var r=null;if(e instanceof String||"string"==typeof e)r=e;else{var i;for(i in n)if(n.hasOwnProperty(i)&&e===n[i]){r=i;break}if(!r)for(i in n.type)if(n.type.hasOwnProperty(i)&&e===n.type[i]){r=i;break}}if(r){var o=n.expression.docs[r];if(!o)throw new Error('No documentation found on "'+r+'"');return new t(n,o)}throw new Error('Could not find search term "'+e+'"')}}},{"../../type/Help":209}],168:[function(e,n){n.exports=function(n){var t=e("../../expression/parse");n.parse=function(){return t.apply(t,arguments)}}},{"../../expression/parse":120}],169:[function(e,n){n.exports=function(n){function t(e,n,r,i){if(r>i){if(e.length!=n.length)throw new Error("Dimensions mismatch ("+e.length+" != "+n.length+")");for(var o=[],a=0;ae;e++){var h=arguments[e];if(h instanceof i&&(m=!0),e==o-1&&u(h)){if(r=l,l=h,!c(l)||0>l)throw new TypeError("Dimension number must be a positive integer (dim = "+l+")");if(e>0&&l>r)throw new RangeError("Dimension out of range ("+l+" > "+r+")")}else{if(!f(h))throw new n.error.UnsupportedTypeError("concat",h);var g=a.clone(h).valueOf(),d=s.size(h.valueOf());if(p[e]=g,r=l,l=d.length-1,e>0&&l!=r)throw new RangeError("Dimension mismatch ("+r+" != "+l+")")}}if(0==p.length)throw new SyntaxError("At least one matrix expected");for(var x=p.shift();p.length;)x=t(x,p.shift(),l,0);return m?new i(x):x}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],170:[function(e,n){n.exports=function(n){function t(e,t,r){if(1==t)return e[0][0];if(2==t)return n.subtract(n.multiply(e[0][0],e[1][1]),n.multiply(e[1][0],e[0][1]));for(var o=1,a=0,s=0;t>s&&!(a>=r);s++){for(var u=s;0==e[u][a];)if(u++,u==t&&(u=s,a++,a==r))return i.deepEqual(e,eye(t).valueOf())?n.round(o,6):0;if(u!=s){for(var c=0;r>c;c++){var f=e[u][c];e[u][c]=e[s][c],e[s][c]=f}o*=-1}for(var l=e[s][a],c=0;r>c;c++)e[s][c]=e[s][c]/l;o*=l;for(var m=0;t>m;m++)if(m!=s)for(var p=e[m][a],c=0;r>c;c++)e[m][c]=e[m][c]-e[s][c]*p;a++}return i.deepEqual(e,n.eye(t).valueOf())?n.round(o,6):0}var r=e("../../util/index"),i=(e("../../type/Matrix"),r.object),o=r.array,a=r.string;n.det=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("det",arguments.length,1);var r=o.size(e.valueOf());switch(r.length){case 0:return i.clone(e);case 1:if(1==r[0])return i.clone(e.valueOf()[0]);throw new RangeError("Matrix must be square (size: "+a.format(r)+")");case 2:var s=r[0],u=r[1];if(s==u)return t(e.valueOf(),s,u);throw new RangeError("Matrix must be square (size: "+a.format(r)+")");default:throw new RangeError("Matrix must be two dimensional (size: "+a.format(r)+")")}}}},{"../../type/Matrix":211,"../../util/index":218}],171:[function(e,n){n.exports=function(n,t){var r=e("../../util/index"),i=e("../../type/Matrix"),o=(e("../../type/collection"),r.object),a=r.array.isArray,s=r.number.isNumber,u=r.number.isInteger;n.diag=function(e,r){var c,f,l,m;if(1!=arguments.length&&2!=arguments.length)throw new n.error.ArgumentsError("diag",arguments.length,1,2);if(r){if(!s(r)||!u(r))throw new TypeError("Second parameter in function diag must be an integer")}else r=0;var p=r>0?r:0,h=0>r?-r:0;if(e instanceof i);else{if(!a(e))throw new TypeError("First parameter in function diag must be a Matrix or Array");e=new i(e)}var g=e.size();switch(g.length){case 1:f=e.valueOf();var d=new i,x=0;for(d.resize([f.length+h,f.length+p],x),c=d.valueOf(),m=f.length,l=0;m>l;l++)c[l+h][l+p]=o.clone(f[l]);return"array"===t.matrix?d.valueOf():d;case 2:for(f=[],c=e.valueOf(),m=Math.min(g[0]-h,g[1]-p),l=0;m>l;l++)f[l]=o.clone(c[l+h][l+p]);return"array"===t.matrix?f:new i(f);default:throw new RangeError("Matrix for function diag must be 2 dimensional")}}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],172:[function(e,n){n.exports=function(n,t){var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Matrix"),a=e("../../type/collection"),s=r.number.toNumber,u=r.number.isNumber,c=r.number.isInteger,f=Array.isArray; -n.eye=function(e){var r=a.argsToArray(arguments),l=e instanceof o?!0:f(e)?!1:"matrix"===t.matrix;if(0==r.length)return l?new o:[];if(1==r.length)r[1]=r[0];else if(r.length>2)throw new n.error.ArgumentsError("eye",r.length,0,2);var m=r[0]instanceof i,p=r[0],h=r[1];if(p instanceof i&&(p=s(p)),h instanceof i&&(h=s(h)),!u(p)||!c(p)||1>p)throw new Error("Parameters in function eye must be positive integers");if(h&&(!u(h)||!c(h)||1>h))throw new Error("Parameters in function eye must be positive integers");var g=new o,d=m?new i(1):1,x=m?new i(0):0;g.resize(r.map(s),x);for(var y=n.min(r),b=g.valueOf(),v=0;y>v;v++)b[v][v]=d;return l?g:g.valueOf()}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],173:[function(e,n){n.exports=function(n){function t(e,t,r){var i,o,a,s,u;if(1==t){if(s=e[0][0],0==s)throw Error("Cannot calculate inverse, determinant is zero");return[[n.divide(1,s)]]}if(2==t){var c=n.det(e);if(0==c)throw Error("Cannot calculate inverse, determinant is zero");return[[n.divide(e[1][1],c),n.divide(n.unary(e[0][1]),c)],[n.divide(n.unary(e[1][0]),c),n.divide(e[0][0],c)]]}var f=e.concat();for(i=0;t>i;i++)f[i]=f[i].concat();for(var l=n.eye(t).valueOf(),m=0;r>m;m++){for(i=m;t>i&&0==f[i][m];)i++;if(i==t||0==f[i][m])throw Error("Cannot calculate inverse, determinant is zero");i!=m&&(u=f[m],f[m]=f[i],f[i]=u,u=l[m],l[m]=l[i],l[i]=u);var p=f[m],h=l[m];for(i=0;t>i;i++){var g=f[i],d=l[i];if(i!=m){if(0!=g[m]){for(a=n.divide(n.unary(g[m]),p[m]),o=m;r>o;o++)g[o]=n.add(g[o],n.multiply(a,p[o]));for(o=0;r>o;o++)d[o]=n.add(d[o],n.multiply(a,h[o]))}}else{for(a=p[m],o=m;r>o;o++)g[o]=n.divide(g[o],a);for(o=0;r>o;o++)d[o]=n.divide(d[o],a)}}}return l}{var r=e("../../util/string"),i=e("../../type/Matrix");e("../../type/collection")}n.inv=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("inv",arguments.length,1);var o=n.size(e).valueOf();switch(o.length){case 0:return n.divide(1,e);case 1:if(1==o[0])return e instanceof i?new i([n.divide(1,e.valueOf()[0])]):[n.divide(1,e[0])];throw new RangeError("Matrix must be square (size: "+r.format(o)+")");case 2:var a=o[0],s=o[1];if(a==s)return e instanceof i?new i(t(e.valueOf(),a,s)):t(e,a,s);throw new RangeError("Matrix must be square (size: "+r.format(o)+")");default:throw new RangeError("Matrix must be two dimensional (size: "+r.format(o)+")")}}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/string":221}],174:[function(e,n){n.exports=function(n,t){var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Matrix"),a=e("../../type/collection"),s=r.array,u=r.number.toNumber,c=Array.isArray;n.ones=function(e){var n=a.argsToArray(arguments),r=e instanceof o?!0:c(e)?!1:"matrix"===t.matrix;if(0==n.length)return r?new o:[];var f=[],l=n[0]instanceof i?new i(1):1;return f=s.resize(f,n.map(u),l),r?new o(f):f}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],175:[function(e,n){n.exports=function(n,t){function r(e,n,t){var r=[],i=e;if(t>0)for(;n>i;)r.push(i),i+=t;else if(0>t)for(;i>n;)r.push(i),i+=t;return r}function i(e,n,t){var r=[],i=e;if(t>0)for(;n>=i;)r.push(i),i+=t;else if(0>t)for(;i>=n;)r.push(i),i+=t;return r}function o(e,n,t){var r=[],i=e.clone(),o=new c(0);if(t.gt(o))for(;i.lt(n);)r.push(i),i=i.plus(t);else if(t.lt(o))for(;i.gt(n);)r.push(i),i=i.plus(t);return r}function a(e,n,t){var r=[],i=e.clone(),o=new c(0);if(t.gt(o))for(;i.lte(n);)r.push(i),i=i.plus(t);else if(t.lt(o))for(;i.gte(n);)r.push(i),i=i.plus(t);return r}function s(e){var n=e.split(":"),r=null;if("bignumber"===t.number)try{r=n.map(function(e){return new c(e)})}catch(i){return null}else{r=n.map(function(e){return parseFloat(e)});var o=r.some(function(e){return isNaN(e)});if(o)return null}switch(r.length){case 2:return{start:r[0],end:r[1],step:1};case 3:return{start:r[0],end:r[2],step:r[1]};default:return null}}var u=e("../../util/index"),c=e("bignumber.js"),f=e("../../type/Matrix"),l=(e("../../type/collection"),u["boolean"].isBoolean),m=u.string.isString,p=u.number.isNumber,h=u.number.toNumber,g=u.number.toBigNumber;n.range=function(){var e,u,d,x=Array.prototype.slice.call(arguments),y=!1;switch(l(x[x.length-1])&&(y=x.pop()?!0:!1),x.length){case 1:if(!m(x[0]))throw new TypeError("Two or three numbers or a single string expected in function range");var b=s(x[0]);if(!b)throw new SyntaxError('String "'+b+'" is no valid range');e=b.start,u=b.end,d=b.step;break;case 2:e=x[0],u=x[1],d=1;break;case 3:e=x[0],u=x[1],d=x[2];break;default:throw new n.error.ArgumentsError("range",arguments.length,2,4)}if(!(p(e)||e instanceof c))throw new TypeError("Parameter start must be a number");if(!(p(u)||u instanceof c))throw new TypeError("Parameter end must be a number");if(!(p(d)||d instanceof c))throw new TypeError("Parameter step must be a number");if(!l(y))throw new TypeError("Parameter includeEnd must be a boolean");if(e instanceof c||u instanceof c||d instanceof c){var v=!0;e instanceof c||(e=g(e)),u instanceof c||(u=g(u)),d instanceof c||(d=g(d)),e instanceof c&&u instanceof c&&d instanceof c||(v=!1,e=h(e),u=h(u),d=h(d))}var w=v?y?a:o:y?i:r,E=w(e,u,d);return"array"===t.matrix?E:new f(E)}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],176:[function(e,n){n.exports=function(n,t){function r(e,n,t){if(void 0!==t){if(!c(t)||1!==t.length)throw new TypeError("Single character expected as defaultValue")}else t=" ";if(1!==n.length)throw new Error("Dimension mismatch: ("+n.length+" != 1)");var r=n[0];if(!l(r)||!m(r))throw new TypeError("Size must contain numbers");if(e.length>r)return e.substring(0,r);if(e.lengtho;o++)i+=t;return i}return e}var i=e("../../util/index"),o=e("bignumber.js"),a=e("../../type/Matrix"),s=i.array,u=i.object.clone,c=i.string.isString,f=i.number.toNumber,l=i.number.isNumber,m=i.number.isInteger,p=s.isArray;n.resize=function(e,i,l){if(2!=arguments.length&&3!=arguments.length)throw new n.error.ArgumentsError("resize",arguments.length,2,3);var m=e instanceof a?!0:p(e)?!1:"array"!==t.matrix;if(e instanceof a&&(e=e.valueOf()),i instanceof a&&(i=i.valueOf()),i.length&&i[0]instanceof o&&(i=i.map(f)),c(e))return r(e,i,l);if(0==i.length){for(;p(e);)e=e[0];return u(e)}p(e)||(e=[e]),e=u(e);var h=s.resize(e,i,l);return m?new a(h):h}}},{"../../type/Matrix":211,"../../util/index":218,"bignumber.js":223}],177:[function(e,n){n.exports=function(n,t){var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Complex"),a=e("../../type/Unit"),s=e("../../type/Matrix"),u=r.array,c=r.number.isNumber,f=r["boolean"].isBoolean,l=r.string.isString,m=o.isComplex,p=a.isUnit;n.size=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("size",arguments.length,1);var r="array"===t.matrix;if(c(e)||m(e)||p(e)||f(e)||null==e||e instanceof i)return r?[]:new s([]);if(l(e))return r?[e.length]:new s([e.length]);if(Array.isArray(e))return u.size(e);if(e instanceof s)return new s(e.size());throw new n.error.UnsupportedTypeError("size",e)}}},{"../../type/Complex":208,"../../type/Matrix":211,"../../type/Unit":213,"../../util/index":218,"bignumber.js":223}],178:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("../../type/Matrix"),i=t.object,o=t.array,a=Array.isArray;n.squeeze=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("squeeze",arguments.length,1);if(a(e))return o.squeeze(i.clone(e));if(e instanceof r){var t=o.squeeze(e.toArray());return a(t)?new r(t):t}return i.clone(e)}}},{"../../type/Matrix":211,"../../util/index":218}],179:[function(e,n){n.exports=function(n){function t(e,t){var i,o;if(l(e))return i=new s(e),o=i.subset(t),o.valueOf();if(e instanceof s)return e.subset(t);if(f(e))return r(e,t);throw new n.error.UnsupportedTypeError("subset",e)}function r(e,n){if(!(n instanceof u))throw new TypeError("Index expected");if(1!=n.size().length)throw new RangeError("Dimension mismatch ("+n.size().length+" != 1)");var t=n.range(0),r="",i=e.length;return t.forEach(function(n){c.validateIndex(n,i),r+=e.charAt(n)}),r}function i(e,t,r,i){var a;if(l(e))return a=new s(n.clone(e)),a.subset(t,r,i),a.valueOf();if(e instanceof s)return e.clone().subset(t,r,i);if(f(e))return o(e,t,r,i);throw new n.error.UnsupportedTypeError("subset",e)}function o(e,n,t,r){if(!(n instanceof u))throw new TypeError("Index expected");if(1!=n.size().length)throw new RangeError("Dimension mismatch ("+n.size().length+" != 1)");if(void 0!==r){if(!f(r)||1!==r.length)throw new TypeError("Single character expected as defaultValue")}else r=" ";var i=n.range(0),o=i.size()[0];if(o!=t.length)throw new RangeError("Dimension mismatch ("+i.size()[0]+" != "+t.length+")");for(var a=e.length,s=[],l=0;a>l;l++)s[l]=e.charAt(l);if(i.forEach(function(e,n){c.validateIndex(e),s[e]=t.charAt(n)}),s.length>a)for(l=a-1,o=s.length;o>l;l++)s[l]||(s[l]=r);return s.join("")}var a=e("../../util/index"),s=e("../../type/Matrix"),u=e("../../type/Index"),c=a.array,f=a.string.isString,l=Array.isArray;n.subset=function(){switch(arguments.length){case 2:return t(arguments[0],arguments[1]);case 3:case 4:return i(arguments[0],arguments[1],arguments[2],arguments[3]);default:throw new n.error.ArgumentsError("subset",arguments.length,2,4)}}}},{"../../type/Index":210,"../../type/Matrix":211,"../../util/index":218}],180:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("../../type/Matrix"),i=(e("../../type/collection"),t.object),o=t.string;n.transpose=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("transpose",arguments.length,1);var t=n.size(e).valueOf();switch(t.length){case 0:return i.clone(e);case 1:return i.clone(e);case 2:var a,s=t[1],u=t[0],c=e instanceof r,f=e.valueOf(),l=[],m=i.clone;if(0===s)throw new RangeError("Cannot transpose a 2D matrix with no rows(size: "+o.format(t)+")");for(var p=0;s>p;p++){a=l[p]=[];for(var h=0;u>h;h++)a[h]=m(f[h][p])}return 0==u&&(l[0]=[]),c?new r(l):l;default:throw new RangeError("Matrix must be two dimensional (size: "+o.format(t)+")")}}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218}],181:[function(e,n){n.exports=function(n,t){var r=e("../../util/index"),i=e("bignumber.js"),o=e("../../type/Matrix"),a=e("../../type/collection"),s=r.array,u=r.number.toNumber,c=Array.isArray;n.zeros=function(e){var n=a.argsToArray(arguments),r=e instanceof o?!0:c(e)?!1:"matrix"===t.matrix;if(0==n.length)return r?new o:[];var f=[],l=n[0]instanceof i?new i(0):0;return f=s.resize(f,n.map(u),l),r?new o(f):f}}},{"../../type/Matrix":211,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],182:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=(e("../../type/collection"),t.number.isNumber),o=t.number.isInteger,a=t.number.toBigNumber;n.combinations=function(e,t){var u=arguments.length;if(2!=u)throw new n.error.ArgumentsError("combinations",arguments.length,2);if(i(e)){if(!o(e)||0>e)throw new TypeError("Positive integer value enpected in function combinations");if(t>e)throw new TypeError("k must be less than or equal to n");return Math.floor(n.factorial(e)/(n.factorial(t)*n.factorial(e-t)))}if(e instanceof r){if(t=a(t),!(t instanceof r&&s(e)&&s(t)))throw new TypeError("Positive integer value expected in function combinations");if(t.gt(e))throw new TypeError("k must be less than n in function combinations");return n.floor(n.divide(n.factorial(e),n.multiply(n.factorial(t),n.factorial(n.subtract(e,t)))))}throw new n.error.UnsupportedTypeError("combinations",e)};var s=function(e){return e.round().equals(e)&&e.gte(0)}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],183:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/collection"),o=t.number.isNumber,a=t["boolean"].isBoolean,s=t.number.isInteger,u=i.isCollection;n.factorial=function f(e){var t,l;if(1!=arguments.length)throw new n.error.ArgumentsError("factorial",arguments.length,1);if(o(e)){if(!s(e)||0>e)throw new TypeError("Positive integer value expected in function factorial");for(t=e-1,l=e;t>1;)l*=t,t--;return 0==l&&(l=1),l}if(e instanceof r){if(!c(e))throw new TypeError("Positive integer value expected in function factorial");var m=new r(1);for(t=e.minus(m),l=e;t.gt(m);)l=l.times(t),t=t.minus(m);return l.equals(0)&&(l=m),l}if(a(e))return 1;if(u(e))return i.deepMap(e,f);throw new n.error.UnsupportedTypeError("factorial",e)};var c=function(e){return e.round().equals(e)&&e.gte(0)}}},{"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],184:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=t.number.isNumber,o=t.number.isInteger,a=t.number.toBigNumber;n.permutations=function(e,t){var u=arguments.length;if(u>2)throw new n.error.ArgumentsError("permutations",arguments.length,2);if(i(e)){if(!o(e)||0>e)throw new TypeError("Positive integer value enpected in function permutations");if(1==u)return n.factorial(e);if(2==u&&i(t)){if(!o(t)||0>t)throw new TypeError("Positive integer value enpected in function permutations");if(t>e)throw new TypeError("second argument k must be less than or equal to first argument n");return Math.floor(n.factorial(e)/n.factorial(e-t))}}if(e instanceof r){if(void 0===t&&s(e))return n.factorial(e);if(t=a(t),!(t instanceof r&&s(e)&&s(t)))throw new TypeError("Positive integer value expected in function permutations");if(t.gt(e))throw new TypeError("second argument k must be less than or equal to first argument n");return n.floor(n.divide(n.factorial(e),n.factorial(n.subtract(e,t))))}throw new n.error.UnsupportedTypeError("permutations",e)};var s=function(e){return e.round().equals(e)&&e.gte(0)}}},{"../../util/index":218,"bignumber.js":223}],185:[function(e,n){n.exports=function(n,t){var r=e("../../type/Matrix"),i=(e("../../type/collection"),{uniform:function(){return Math.random},normal:function(){return function(){for(var e,n,t=-1;0>t||t>1;)e=Math.random(),n=Math.random(),t=1/6*Math.pow(-2*Math.log(e),.5)*Math.cos(2*Math.PI*n)+.5;return t}}});n.distribution=function(e){if(!i.hasOwnProperty(e))throw new Error("unknown distribution "+e);var o=Array.prototype.slice.call(arguments,1),a=i[e].apply(this,o);return function(e){var i={random:function(e,i,a){var u,c,f;if(arguments.length>3)throw new n.error.ArgumentsError("random",arguments.length,0,3);if(1===arguments.length?Array.isArray(e)?u=e:f=e:2===arguments.length?Array.isArray(e)?u=e:(c=e,f=i):(u=e,c=i,f=a),void 0===f&&(f=1),void 0===c&&(c=0),void 0!==u){var l=s(u,c,f,o);return"array"===t.matrix?l:new r(l)}return o(c,f)},randomInt:function(e,i,o){var u,c,f;if(arguments.length>3||arguments.length<1)throw new n.error.ArgumentsError("randomInt",arguments.length,1,3);if(1===arguments.length?f=e:2===arguments.length?"[object Array]"===Object.prototype.toString.call(e)?u=e:(c=e,f=i):(u=e,c=i,f=o),void 0===c&&(c=0),void 0!==u){var l=s(u,c,f,a);return"array"===t.matrix?l:new r(l)}return a(c,f)},pickRandom:function(e){if(1!==arguments.length)throw new n.error.ArgumentsError("pickRandom",arguments.length,1);if(!Array.isArray(e))throw new n.error.UnsupportedTypeError("pickRandom",e);return e[Math.floor(Math.random()*e.length)]}},o=function(n,t){return n+e()*(t-n)},a=function(n,t){return Math.floor(n+e()*(t-n))},s=function(e,n,t,r){var i,o,a=[];if(e=e.slice(0),e.length>1)for(o=0,i=e.shift();i>o;o++)a.push(s(e,n,t,r));else for(o=0,i=e.shift();i>o;o++)a.push(r(n,t));return a};return i}(a)};var o=n.distribution("uniform");n.random=o.random,n.randomInt=o.randomInt,n.pickRandom=o.pickRandom}},{"../../type/Matrix":211,"../../type/collection":214}],186:[function(e,n){n.exports=function(n){function t(e,t){return n.larger(e,t)?e:t}function r(e){var t=null;if(i.deepForEach(e,function(e){(null===t||n.larger(e,t))&&(t=e)}),null===t)throw new Error("Cannot calculate max of an empty array");return t}var i=(e("../../type/Matrix"),e("../../type/collection")),o=i.isCollection;n.max=function(e){if(0==arguments.length)throw new SyntaxError("Function max requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return r(e);if(2==arguments.length)return i.reduce(arguments[0],arguments[1],t);throw new SyntaxError("Wrong number of parameters")}return r(arguments)}}},{"../../type/Matrix":211,"../../type/collection":214}],187:[function(e,n){n.exports=function(n){function t(e,t){var r;return r=i.reduce(e,t,n.add),n.divide(r,size(e)[t])}function r(e){var t=0,r=0;if(i.deepForEach(e,function(e){t=n.add(t,e),r++}),0===r)throw new Error("Cannot calculate mean of an empty array");return n.divide(t,r)}var i=(e("../../type/Matrix"),e("../../type/collection")),o=i.isCollection;n.mean=function(e){if(0==arguments.length)throw new SyntaxError("Function mean requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return r(e);if(2==arguments.length)return t(arguments[0],arguments[1]);throw new SyntaxError("Wrong number of parameters")}return r(arguments)}}},{"../../type/Matrix":211,"../../type/collection":214}],188:[function(e,n){n.exports=function(n){function t(e,t){return n.smaller(e,t)?e:t}function r(e){var t=null;if(i.deepForEach(e,function(e){(null===t||n.smaller(e,t))&&(t=e)}),null===t)throw new Error("Cannot calculate min of an empty array");return t}var i=(e("../../type/Matrix"),e("../../type/collection")),o=i.isCollection;n.min=function(e){if(0==arguments.length)throw new SyntaxError("Function min requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return r(e);if(2==arguments.length)return i.reduce(arguments[0],arguments[1],t);throw new SyntaxError("Wrong number of parameters")}return r(arguments)}}},{"../../type/Matrix":211,"../../type/collection":214}],189:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.acos=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("acos",arguments.length,1);if(a(e))return e>=-1&&1>=e?Math.acos(e):f(new i(e,0));if(u(e)){var l,m=new i(e.im*e.im-e.re*e.re+1,-2*e.re*e.im),p=n.sqrt(m);l=p instanceof i?new i(p.re-e.im,p.im+e.re):new i(p-e.im,e.re);var h=n.log(l);return h instanceof i?new i(1.5707963267948966-h.im,h.re):new i(1.5707963267948966,h)}if(c(e))return o.deepMap(e,f);if(s(e))return Math.acos(e);if(e instanceof r)return f(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("acos",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],190:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.asin=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("asin",arguments.length,1);if(a(e))return e>=-1&&1>=e?Math.asin(e):f(new i(e,0));if(u(e)){var l,m=e.re,p=e.im,h=new i(p*p-m*m+1,-2*m*p),g=n.sqrt(h);l=g instanceof i?new i(g.re-p,g.im+m):new i(g-p,m);var d=n.log(l);return d instanceof i?new i(d.im,-d.re):new i(0,-d)}if(c(e))return o.deepMap(e,f);if(s(e))return Math.asin(e);if(e instanceof r)return f(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("asin",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],191:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.isNumber,s=t["boolean"].isBoolean,u=i.isComplex,c=o.isCollection;n.atan=function f(e){if(1!=arguments.length)throw new n.error.ArgumentsError("atan",arguments.length,1);if(a(e))return Math.atan(e);if(u(e)){var l=e.re,m=e.im,p=l*l+(1-m)*(1-m),h=new i((1-m*m-l*l)/p,-2*l/p),g=n.log(h);return g instanceof i?new i(-.5*g.im,.5*g.re):new i(0,.5*g)}if(c(e))return o.deepMap(e,f);if(s(e))return Math.atan(e);if(e instanceof r)return f(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("atan",e)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],192:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/collection"),a=t.number.toNumber,s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isCollection;n.atan2=function l(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("atan2",arguments.length,2);if(s(e)){if(s(t))return Math.atan2(e,t)}else if(c(e)&&s(t))return Math.atan2(e.re,t);if(f(e)||f(t))return o.deepMap2(e,t,l);if(u(e))return l(+e,t);if(u(t))return l(e,+t);if(e instanceof r)return l(a(e),t);if(t instanceof r)return l(e,a(t));throw new n.error.UnsupportedTypeError("atan2",e,t)}}},{"../../type/Complex":208,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],193:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.cos=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("cos",arguments.length,1);if(s(e))return Math.cos(e);if(c(e))return new i(.5*Math.cos(e.re)*(Math.exp(-e.im)+Math.exp(e.im)),.5*Math.sin(e.re)*(Math.exp(-e.im)-Math.exp(e.im)));if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function cos is no angle");return Math.cos(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return Math.cos(e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("cos",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],194:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.cot=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("cot",arguments.length,1);if(s(e))return 1/Math.tan(e);if(c(e)){var p=Math.exp(-4*e.im)-2*Math.exp(-2*e.im)*Math.cos(2*e.re)+1;return new i(2*Math.exp(-2*e.im)*Math.sin(2*e.re)/p,(Math.exp(-4*e.im)-1)/p)}if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function cot is no angle");return 1/Math.tan(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return m(+e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("cot",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],195:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.csc=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("csc",arguments.length,1);if(s(e))return 1/Math.sin(e);if(c(e)){var p=.25*(Math.exp(-2*e.im)+Math.exp(2*e.im))-.5*Math.cos(2*e.re);return new i(.5*Math.sin(e.re)*(Math.exp(-e.im)+Math.exp(e.im))/p,.5*Math.cos(e.re)*(Math.exp(-e.im)-Math.exp(e.im))/p)}if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function csc is no angle");return 1/Math.sin(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return m(+e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("csc",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],196:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.sec=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("sec",arguments.length,1);if(s(e))return 1/Math.cos(e);if(c(e)){var p=.25*(Math.exp(-2*e.im)+Math.exp(2*e.im))+.5*Math.cos(2*e.re);return new i(.5*Math.cos(e.re)*(Math.exp(-e.im)+Math.exp(e.im))/p,.5*Math.sin(e.re)*(Math.exp(e.im)-Math.exp(-e.im))/p)}if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function sec is no angle");return 1/Math.cos(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return m(+e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("sec",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],197:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.sin=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("sin",arguments.length,1);if(s(e))return Math.sin(e);if(c(e))return new i(.5*Math.sin(e.re)*(Math.exp(-e.im)+Math.exp(e.im)),.5*Math.cos(e.re)*(Math.exp(e.im)-Math.exp(-e.im)));if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function sin is no angle");return Math.sin(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return Math.sin(e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("sin",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],198:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Unit"),a=e("../../type/collection"),s=t.number.isNumber,u=t["boolean"].isBoolean,c=i.isComplex,f=o.isUnit,l=a.isCollection;n.tan=function m(e){if(1!=arguments.length)throw new n.error.ArgumentsError("tan",arguments.length,1);if(s(e))return Math.tan(e);if(c(e)){var p=Math.exp(-4*e.im)+2*Math.exp(-2*e.im)*Math.cos(2*e.re)+1;return new i(2*Math.exp(-2*e.im)*Math.sin(2*e.re)/p,(1-Math.exp(-4*e.im))/p)}if(f(e)){if(!e.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function tan is no angle");return Math.tan(e.value)}if(l(e))return a.deepMap(e,m);if(u(e))return Math.tan(e);if(e instanceof r)return m(t.number.toNumber(e));throw new n.error.UnsupportedTypeError("tan",e)}}},{"../../type/Complex":208,"../../type/Unit":213,"../../type/collection":214,"../../util/index":218,"bignumber.js":223}],199:[function(e,n){n.exports=function(n){var t=e("../../util/index"),r=e("../../type/Unit"),i=e("../../type/collection"),o=t.string.isString,a=r.isUnit,s=i.isCollection;n.to=function u(e,t){if(2!=arguments.length)throw new n.error.ArgumentsError("to",arguments.length,2);if(a(e)&&(a(t)||o(t)))return e.to(t);if(s(e)||s(t))return i.deepMap2(e,t,u);throw new n.error.UnsupportedTypeError("to",e,t)}}},{"../../type/Unit":213,"../../type/collection":214,"../../util/index":218}],200:[function(e,n){n.exports=function(n){var t=e("../../util/object");n.clone=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("clone",arguments.length,1);return t.clone(e)}}},{"../../util/object":220}],201:[function(e,n){n.exports=function(n){function t(e,n){var t=[],r=function(i,o){Array.isArray(i)?i.forEach(function(e,n){t[o]=n,r(e,o+1)}):n(i,t,e)};r(e,0)}var r=e("../../type/Matrix").isMatrix;n.forEach=function(e,i){if(2!=arguments.length)throw new n.error.ArgumentsError("forEach",arguments.length,2);if(Array.isArray(e))return t(e,i);if(r(e))return e.forEach(i);throw new n.error.UnsupportedTypeError("forEach",e)}}},{"../../type/Matrix":211}],202:[function(e,n){n.exports=function(n){var t=e("../../util/string");n.format=function(e,r){var i=arguments.length;if(1!==i&&2!==i)throw new n.error.ArgumentsError("format",i,1,2);return t.format(e,r)}}},{"../../util/string":221}],203:[function(e,n){n.exports=function(n){function t(e,t,r){(r.override||void 0===n[e])&&(n[e]=r.wrap&&"function"==typeof t?function(){for(var e=[],r=0,i=arguments.length;i>r;r++)e[r]=arguments[r].valueOf();return t.apply(n,e)}:t,n.chaining.Selector.createProxy(e,t))}function r(e){return"function"==typeof e||s(e)||u(e)||c(e)||f(e)}var i=e("../../util/index"),o=e("../../type/Complex"),a=e("../../type/Unit"),s=i.number.isNumber,u=i.string.isString,c=o.isComplex,f=a.isUnit;n["import"]=function l(o,a){var s,c={override:!1,wrap:!0};if(a&&a instanceof Object&&i.object.extend(c,a),u(o)){if("undefined"==typeof e)throw new Error("Cannot load file: require not available.");var f=e(o);l(f)}else if(r(o)){if(s=o.name,!s)throw new Error("Cannot import an unnamed function or object");(c.override||void 0===n[s])&&t(s,o,c)}else if(o instanceof Object)for(s in o)if(o.hasOwnProperty(s)){var m=o[s];r(m)?t(s,m,c):l(m)}}}},{"../../type/Complex":208,"../../type/Unit":213,"../../util/index":218}],204:[function(e,n){n.exports=function(n){function t(e,n){var t=[],r=function(i,o){return Array.isArray(i)?i.map(function(e,n){return t[o]=n,r(e,o+1)}):n(i,t,e)};return r(e,0)}var r=e("../../type/Matrix").isMatrix;n.map=function(e,i){if(2!=arguments.length)throw new n.error.ArgumentsError("map",arguments.length,2);if(Array.isArray(e))return t(e,i);if(r(e))return e.map(i);throw new n.error.UnsupportedTypeError("map",e)}}},{"../../type/Matrix":211}],205:[function(e,n){n.exports=function(n){var t=e("../../util/string"),r=t.isString;n.print=function(e,t,i){var o=arguments.length;if(2!=o&&3!=o)throw new n.error.ArgumentsError("print",o,2,3);if(!r(e))throw new TypeError("String expected as first parameter in function format");if(!(t instanceof Object))throw new TypeError("Object expected as second parameter in function format");return e.replace(/\$([\w\.]+)/g,function(e,o){for(var a=o.split("."),s=t[a.shift()];a.length&&void 0!==s;){var u=a.shift();s=u?s[u]:s+"."}return void 0!==s?r(s)?s:n.format(s,i):e})}}},{"../../util/string":221}],206:[function(e,n){n.exports=function(n){var t=e("../../util/types"),r=e("bignumber.js"),i=e("../../type/Complex"),o=e("../../type/Matrix"),a=e("../../type/Unit"),s=e("../../type/Index"),u=e("../../type/Range"),c=e("../../type/Help");n["typeof"]=function(e){if(1!=arguments.length)throw new n.error.ArgumentsError("typeof",arguments.length,1);var f=t.type(e);if("object"===f){if(e instanceof i)return"complex";if(e instanceof r)return"bignumber";if(e instanceof o)return"matrix";if(e instanceof a)return"unit";if(e instanceof s)return"index";if(e instanceof u)return"range";if(e instanceof c)return"matrix";if(e instanceof n.chaining.Selector)return"selector"}return f}}},{"../../type/Complex":208,"../../type/Help":209,"../../type/Index":210,"../../type/Matrix":211,"../../type/Range":212,"../../type/Unit":213,"../../util/types":222,"bignumber.js":223}],207:[function(e,n){function t(n){if("function"!=typeof Array.prototype.map)throw new Error("ES5 not supported by this JavaScript engine. Please load the es5-shim library for compatibility.");var t={},i={matrix:"matrix",number:"number"};return t.config=function(n){var t=e("bignumber.js");if(n){if(r.deepExtend(i,n),n.decimals&&t.config({DECIMAL_PLACES:n.decimals}),n.number&&n.number.defaultType)throw new Error("setting `number.defaultType` is deprecated. Use `number` instead.");if(n.number&&n.number.precision)throw new Error("setting `number.precision` is deprecated. Use `decimals` instead.");if(n.matrix&&n.matrix.defaultType)throw new Error("setting `matrix.defaultType` is deprecated. Use `matrix` instead.");if(n.matrix&&n.matrix["default"])throw new Error("setting `matrix.default` is deprecated. Use `matrix` instead.")}var o=r.clone(i);return o.decimals=t.config().DECIMAL_PLACES,o},t.config(n),t.expression={},t.expression.node=e("./expression/node/index.js"),t.expression.parse=e("./expression/parse.js"),t.expression.Scope=function(){throw new Error("Scope is deprecated. Use a regular Object instead")},t.expression.Parser=e("./expression/Parser.js"),t.expression.docs=e("./expression/docs/index.js"),t.type={},t.type.BigNumber=e("bignumber.js"),t.type.Complex=e("./type/Complex"),t.type.Range=e("./type/Range"),t.type.Index=e("./type/Index"),t.type.Matrix=e("./type/Matrix"),t.type.Unit=e("./type/Unit"),t.type.Help=e("./type/Help"),t.collection=e("./type/collection"),e("./type/error")(t),e("./function/expression/eval.js")(t,i),e("./function/expression/help.js")(t,i),e("./function/expression/parse.js")(t,i),e("./function/arithmetic/abs.js")(t,i),e("./function/arithmetic/add.js")(t,i),e("./function/arithmetic/ceil.js")(t,i),e("./function/arithmetic/cube.js")(t,i),e("./function/arithmetic/divide.js")(t,i),e("./function/arithmetic/edivide.js")(t,i),e("./function/arithmetic/emultiply.js")(t,i),e("./function/arithmetic/epow.js")(t,i),e("./function/arithmetic/equal.js")(t,i),e("./function/arithmetic/exp.js")(t,i),e("./function/arithmetic/fix.js")(t,i),e("./function/arithmetic/floor.js")(t,i),e("./function/arithmetic/gcd.js")(t,i),e("./function/arithmetic/larger.js")(t,i),e("./function/arithmetic/largereq.js")(t,i),e("./function/arithmetic/lcm.js")(t,i),e("./function/arithmetic/log.js")(t,i),e("./function/arithmetic/log10.js")(t,i),e("./function/arithmetic/mod.js")(t,i),e("./function/arithmetic/multiply.js")(t,i),e("./function/arithmetic/pow.js")(t,i),e("./function/arithmetic/round.js")(t,i),e("./function/arithmetic/sign.js")(t,i),e("./function/arithmetic/smaller.js")(t,i),e("./function/arithmetic/smallereq.js")(t,i),e("./function/arithmetic/sqrt.js")(t,i),e("./function/arithmetic/square.js")(t,i),e("./function/arithmetic/subtract.js")(t,i),e("./function/arithmetic/unary.js")(t,i),e("./function/arithmetic/unequal.js")(t,i),e("./function/arithmetic/xgcd.js")(t,i),e("./function/complex/arg.js")(t,i),e("./function/complex/conj.js")(t,i),e("./function/complex/re.js")(t,i),e("./function/complex/im.js")(t,i),e("./function/construction/bignumber")(t,i),e("./function/construction/boolean.js")(t,i),e("./function/construction/complex.js")(t,i),e("./function/construction/index.js")(t,i),e("./function/construction/matrix.js")(t,i),e("./function/construction/number.js")(t,i),e("./function/construction/parser.js")(t,i),e("./function/construction/select.js")(t,i),e("./function/construction/string.js")(t,i),e("./function/construction/unit.js")(t,i),e("./function/matrix/concat.js")(t,i),e("./function/matrix/det.js")(t,i),e("./function/matrix/diag.js")(t,i),e("./function/matrix/eye.js")(t,i),e("./function/matrix/inv.js")(t,i),e("./function/matrix/ones.js")(t,i),e("./function/matrix/range.js")(t,i),e("./function/matrix/resize.js")(t,i),e("./function/matrix/size.js")(t,i),e("./function/matrix/squeeze.js")(t,i),e("./function/matrix/subset.js")(t,i),e("./function/matrix/transpose.js")(t,i),e("./function/matrix/zeros.js")(t,i),e("./function/probability/factorial.js")(t,i),e("./function/probability/random.js")(t,i),e("./function/probability/permutations.js")(t,i),e("./function/probability/combinations.js")(t,i),e("./function/statistics/min.js")(t,i),e("./function/statistics/max.js")(t,i),e("./function/statistics/mean.js")(t,i),e("./function/trigonometry/acos.js")(t,i),e("./function/trigonometry/asin.js")(t,i),e("./function/trigonometry/atan.js")(t,i),e("./function/trigonometry/atan2.js")(t,i),e("./function/trigonometry/cos.js")(t,i),e("./function/trigonometry/cot.js")(t,i),e("./function/trigonometry/csc.js")(t,i),e("./function/trigonometry/sec.js")(t,i),e("./function/trigonometry/sin.js")(t,i),e("./function/trigonometry/tan.js")(t,i),e("./function/units/to.js")(t,i),e("./function/utils/clone.js")(t,i),e("./function/utils/format.js")(t,i),e("./function/utils/import.js")(t,i),e("./function/utils/map.js")(t,i),e("./function/utils/print.js")(t,i),e("./function/utils/typeof.js")(t,i),e("./function/utils/forEach.js")(t,i),e("./constants.js")(t,i),t.chaining={},t.chaining.Selector=e("./chaining/Selector.js")(t,i),t -}var r=e("./util/object");n.exports=t},{"./chaining/Selector.js":2,"./constants.js":3,"./expression/Parser.js":4,"./expression/docs/index.js":104,"./expression/node/index.js":119,"./expression/parse.js":120,"./function/arithmetic/abs.js":121,"./function/arithmetic/add.js":122,"./function/arithmetic/ceil.js":123,"./function/arithmetic/cube.js":124,"./function/arithmetic/divide.js":125,"./function/arithmetic/edivide.js":126,"./function/arithmetic/emultiply.js":127,"./function/arithmetic/epow.js":128,"./function/arithmetic/equal.js":129,"./function/arithmetic/exp.js":130,"./function/arithmetic/fix.js":131,"./function/arithmetic/floor.js":132,"./function/arithmetic/gcd.js":133,"./function/arithmetic/larger.js":134,"./function/arithmetic/largereq.js":135,"./function/arithmetic/lcm.js":136,"./function/arithmetic/log.js":137,"./function/arithmetic/log10.js":138,"./function/arithmetic/mod.js":139,"./function/arithmetic/multiply.js":140,"./function/arithmetic/pow.js":141,"./function/arithmetic/round.js":142,"./function/arithmetic/sign.js":143,"./function/arithmetic/smaller.js":144,"./function/arithmetic/smallereq.js":145,"./function/arithmetic/sqrt.js":146,"./function/arithmetic/square.js":147,"./function/arithmetic/subtract.js":148,"./function/arithmetic/unary.js":149,"./function/arithmetic/unequal.js":150,"./function/arithmetic/xgcd.js":151,"./function/complex/arg.js":152,"./function/complex/conj.js":153,"./function/complex/im.js":154,"./function/complex/re.js":155,"./function/construction/bignumber":156,"./function/construction/boolean.js":157,"./function/construction/complex.js":158,"./function/construction/index.js":159,"./function/construction/matrix.js":160,"./function/construction/number.js":161,"./function/construction/parser.js":162,"./function/construction/select.js":163,"./function/construction/string.js":164,"./function/construction/unit.js":165,"./function/expression/eval.js":166,"./function/expression/help.js":167,"./function/expression/parse.js":168,"./function/matrix/concat.js":169,"./function/matrix/det.js":170,"./function/matrix/diag.js":171,"./function/matrix/eye.js":172,"./function/matrix/inv.js":173,"./function/matrix/ones.js":174,"./function/matrix/range.js":175,"./function/matrix/resize.js":176,"./function/matrix/size.js":177,"./function/matrix/squeeze.js":178,"./function/matrix/subset.js":179,"./function/matrix/transpose.js":180,"./function/matrix/zeros.js":181,"./function/probability/combinations.js":182,"./function/probability/factorial.js":183,"./function/probability/permutations.js":184,"./function/probability/random.js":185,"./function/statistics/max.js":186,"./function/statistics/mean.js":187,"./function/statistics/min.js":188,"./function/trigonometry/acos.js":189,"./function/trigonometry/asin.js":190,"./function/trigonometry/atan.js":191,"./function/trigonometry/atan2.js":192,"./function/trigonometry/cos.js":193,"./function/trigonometry/cot.js":194,"./function/trigonometry/csc.js":195,"./function/trigonometry/sec.js":196,"./function/trigonometry/sin.js":197,"./function/trigonometry/tan.js":198,"./function/units/to.js":199,"./function/utils/clone.js":200,"./function/utils/forEach.js":201,"./function/utils/format.js":202,"./function/utils/import.js":203,"./function/utils/map.js":204,"./function/utils/print.js":205,"./function/utils/typeof.js":206,"./type/Complex":208,"./type/Help":209,"./type/Index":210,"./type/Matrix":211,"./type/Range":212,"./type/Unit":213,"./type/collection":214,"./type/error":215,"./util/object":220,"bignumber.js":223}],208:[function(e,n,t){function r(e,n){if(!(this instanceof r))throw new SyntaxError("Complex constructor must be called with the new operator");switch(arguments.length){case 0:this.re=0,this.im=0;break;case 2:if(!p(e)||!p(n))throw new TypeError("Two numbers expected in Complex constructor");this.re=e,this.im=n;break;default:if(0!=arguments.length&&2!=arguments.length)throw new SyntaxError("Two or zero arguments expected in Complex constructor")}}function i(){for(;" "==x||" "==x;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){d++,x=g.charAt(d)}function u(e){d=e,x=g.charAt(d)}function c(){var e,n="";if(e=d,"+"==x?s():"-"==x&&(n+=x,s()),!o(x))return u(e),null;if("."==x){if(n+=x,s(),!a(x))return u(e),null}else{for(;a(x);)n+=x,s();"."==x&&(n+=x,s())}for(;a(x);)n+=x,s();if("E"==x||"e"==x){if(n+=x,s(),("+"==x||"-"==x)&&(n+=x,s()),!a(x))return u(e),null;for(;a(x);)n+=x,s()}return n}function f(){var e=g.charAt(d+1);if("I"==x||"i"==x)return s(),"1";if(!("+"!=x&&"-"!=x||"I"!=e&&"i"!=e)){var n="+"==x?"1":"-1";return s(),s(),n}return null}var l=e("../util/index"),m=l.number,p=l.number.isNumber,h=l.string.isString;r.isComplex=function(e){return e instanceof r};var g,d,x;r.parse=function(e){if(g=e,d=-1,x="",!h(g))return null;s(),i();var n=c();if(n){if("I"==x||"i"==x)return s(),i(),x?null:new r(0,Number(n));i();var t=x;if("+"!=t&&"-"!=t)return i(),x?null:new r(Number(n),0);s(),i();var o=c();if(o){if("I"!=x&&"i"!=x)return null;s()}else if(o=f(),!o)return null;return"-"==t&&(o="-"==o[0]?"+"+o.substring(1):"-"+o),s(),i(),x?null:new r(Number(n),Number(o))}return(n=f())?(i(),x?null:new r(0,Number(n))):null},r.prototype.clone=function(){return new r(this.re,this.im)},r.prototype.equals=function(e){return this.re===e.re&&this.im===e.im},r.prototype.format=function(e){var n="",t=m.format(this.re,e),r=m.format(this.im,e);return n=0==this.im?t:0==this.re?1==this.im?"i":-1==this.im?"-i":r+"i":this.im>0?1==this.im?t+" + i":t+" + "+r+"i":-1==this.im?t+" - i":t+" - "+r.substring(1)+"i"},r.prototype.toString=function(){return this.format()},n.exports=r,t.isComplex=r.isComplex,t.parse=r.parse},{"../util/index":218}],209:[function(e,n,t){function r(e,n){this.math=e,this.doc=n}var i=e("../util/index"),o=i.object,a=i.string;r.isHelp=function(e){return e instanceof r},r.prototype.toString=function(){var e=this.doc||{},n="\n";if(e.name&&(n+="Name: "+e.name+"\n\n"),e.category&&(n+="Category: "+e.category+"\n\n"),e.description&&(n+="Description:\n "+e.description+"\n\n"),e.syntax&&(n+="Syntax:\n "+e.syntax.join("\n ")+"\n\n"),e.examples){var t=this.math.parser();n+="Examples:\n";for(var i=0;ie;e++){var t=arguments[e];if(t instanceof a)this._ranges.push(t);else if(t&&(t=t.valueOf()),f(t))this._ranges.push(i(t));else{if(!u(t))throw new TypeError("Range expected as Array, Number, or String");this._ranges.push(i([t,t+1]))}}}function i(e){for(var n=e.length,t=0;n>t;t++)if(!u(e[t])||!c(e[t]))throw new TypeError("Index parameters must be integer numbers");switch(e.length){case 2:return new a(e[0],e[1]);case 3:return new a(e[0],e[1],e[2]);default:throw new SyntaxError("Wrong number of arguments in Index (2 or 3 expected)")}}{var o=e("../util/index"),a=e("./Range"),s=o.number,u=s.isNumber,c=s.isInteger,f=Array.isArray;o.array.validateIndex}r.prototype.clone=function(){var e=new r;return e._ranges=o.object.clone(this._ranges),e},r.isIndex=function(e){return e instanceof r},r.create=function(e){var n=new r;return r.apply(n,e),n},r.prototype.size=function l(){for(var l=[],e=0,n=this._ranges.length;n>e;e++){var t=this._ranges[e];l[e]=t.size()[0]}return l},r.prototype.max=function(){for(var e=[],n=0,t=this._ranges.length;t>n;n++){var r=this._ranges[n];e[n]=r.max()}return e},r.prototype.min=function(){for(var e=[],n=0,t=this._ranges.length;t>n;n++){var r=this._ranges[n];e[n]=r.min()}return e},r.prototype.forEach=function(e){for(var n=0,t=this._ranges.length;t>n;n++)e(this._ranges[n],n,this)},r.prototype.range=function(e){return this._ranges[e]},r.prototype.isScalar=function(){for(var e=this.size(),n=0,t=e.length;t>n;n++)if(1!==e[n])return!1;return!0},r.prototype.toArray=function(){for(var e=[],n=0,t=this._ranges.length;t>n;n++){var r=this._ranges[n],i=[],o=r.start,a=r.end,s=r.step;if(s>0)for(;a>o;)i.push(o),o+=s;else if(0>s)for(;o>a;)i.push(o),o+=s;e.push(i)}return e},r.prototype.valueOf=r.prototype.toArray,r.prototype.toString=function(){for(var e=[],n=0,t=this._ranges.length;t>n;n++){var r=this._ranges[n],i=s.format(r.start);1!=r.step&&(i+=":"+s.format(r.step)),i+=":"+s.format(r.end),e.push(i)}return"["+e.join(",")+"]"},n.exports=r,t.isIndex=r.isIndex,t.create=r.create},{"../util/index":218,"./Range":212}],211:[function(e,n,t){function r(e){if(!(this instanceof r))throw new SyntaxError("Matrix constructor must be called with the new operator");if(e instanceof r)this._data=e.clone()._data;else if(g(e))this._data=c(e);else{if(null!=e)throw new TypeError("Unsupported type of data ("+f.types.type(e)+")");this._data=[]}this._size=p.size(this._data)}function i(e,n){if(!(n instanceof l))throw new TypeError("Invalid index");var t=n.isScalar();if(t)return e.get(n.min());var i=n.size();if(i.length!=e._size.length)throw new RangeError("Dimension mismatch ("+i.length+" != "+e._size.length+")");for(var a=new r(o(e._data,n,i.length,0));g(a._data)&&1==a._data.length;)a._data=a._data[0],a._size.shift();return a}function o(e,n,t,r){var i=r==t-1,a=n.range(r);return a.map(i?function(n){return d(n,e.length),e[n]}:function(i){d(i,e.length);var a=e[i];return o(a,n,t,r+1)})}function a(e,n,t,i){if(!(n instanceof l))throw new TypeError("Invalid index");var o,a=n.size(),c=n.isScalar();if(t instanceof r?(o=t.size(),t=t.valueOf()):o=p.size(t),c){if(0!=o.length)throw new TypeError("Scalar value expected");e.set(n.min(),t,i)}else{if(a.lengthf;f++)t=[t],o.unshift(1);if(!h.deepEqual(a,o))throw new RangeError("Dimensions mismatch ("+m.format(a)+" != "+m.format(o)+")");var d=n.max().map(function(e){return e+1});u(e,d,i);var x=a.length,y=0;s(e._data,n,t,x,y)}return e}function s(e,n,t,r,i){var o=i==r-1,a=n.range(i);a.forEach(o?function(n,r){d(n),e[n]=t[r]}:function(o,a){d(o),s(e[o],n,t[a],r,i+1)})}function u(e,n,t){if(!g(n))throw new Error("Array expected");for(var r=h.clone(e._size),i=!1;r.lengtho;o++)n[o]>r[o]&&(r[o]=n[o],i=!0);i&&e.resize(r,t)}function c(e){for(var n=0,t=e.length;t>n;n++){var i=e[n];g(i)?e[n]=c(i):i instanceof r&&(e[n]=c(i._data))}return e}var f=e("../util/index"),l=e("./Index"),m=(f.number,f.string),p=f.array,h=f.object,g=Array.isArray,d=p.validateIndex;r.isMatrix=function(e){return e instanceof r},r.prototype.subset=function(e,n,t){switch(arguments.length){case 1:return i(this,e);case 2:case 3:return a(this,e,n,t);default:throw new SyntaxError("Wrong number of arguments")}},r.prototype.get=function(e){if(!g(e))throw new Error("Array expected");if(e.length!=this._size.length)throw new RangeError("Dimension mismatch ("+e.length+" != "+this._size.length+")");for(var n=this._data,t=0,r=e.length;r>t;t++){var i=e[t];d(i,n.length),n=n[i]}return h.clone(n)},r.prototype.set=function(e,n,t){var r,i;if(!g(e))throw new Error("Array expected");if(e.lengthr;r++){var s=e[r];d(s,a.length),a=a[s]}return s=e[e.length-1],d(s,a.length),a[s]=n,this},r.prototype.resize=function(e,n){return this._size=h.clone(e),this._data=p.resize(this._data,this._size,n),this},r.prototype.clone=function(){var e=new r;return e._data=h.clone(this._data),e._size=h.clone(this._size),e},r.prototype.size=function(){return this._size},r.prototype.map=function(e){var n=this,t=new r,i=[],o=function(t,r){return g(t)?t.map(function(e,n){return i[r]=n,o(e,r+1)}):e(t,i,n)};return t._data=o(this._data,0),t._size=h.clone(this._size),t},r.prototype.forEach=function(e){var n=this,t=[],r=function(i,o){g(i)?i.forEach(function(e,n){t[o]=n,r(e,o+1)}):e(i,t,n)};r(this._data,0)},r.prototype.toArray=function(){return h.clone(this._data)},r.prototype.valueOf=function(){return this._data},r.prototype.format=function(e){return m.format(this._data,e)},r.prototype.toString=function(){return m.format(this._data)},n.exports=r,t.isMatrix=r.isMatrix},{"../util/index":218,"./Index":210}],212:[function(e,n,t){function r(e,n,t){if(!(this instanceof r))throw new SyntaxError("Range constructor must be called with the new operator");if(null!=e&&!o.isNumber(e))throw new TypeError("Parameter start must be a number");if(null!=n&&!o.isNumber(n))throw new TypeError("Parameter end must be a number");if(null!=t&&!o.isNumber(t))throw new TypeError("Parameter step must be a number");this.start=null!=e?parseFloat(e):0,this.end=null!=n?parseFloat(n):0,this.step=null!=t?parseFloat(t):1}{var i=e("../util/index"),o=i.number,a=i.string;i.array}r.parse=function(e){if(!a.isString(e))return null;var n=e.split(":"),t=n.map(function(e){return parseFloat(e)}),i=t.some(function(e){return isNaN(e)});if(i)return null;switch(t.length){case 2:return new r(t[0],t[1]);case 3:return new r(t[0],t[2],t[1]);default:return null}},r.prototype.clone=function(){return new r(this.start,this.end,this.step)},r.isRange=function(e){return e instanceof r},r.prototype.size=function(){var e=0,n=this.start,t=this.step,r=this.end,i=r-n;return o.sign(t)==o.sign(i)?e=Math.ceil(i/t):0==i&&(e=0),isNaN(e)&&(e=0),[e]},r.prototype.min=function(){var e=this.size()[0];return e>0?this.step>0?this.start:this.start+(e-1)*this.step:void 0},r.prototype.max=function(){var e=this.size()[0];return e>0?this.step>0?this.start+(e-1)*this.step:this.start:void 0},r.prototype.forEach=function(e){var n=this.start,t=this.step,r=this.end,i=0;if(t>0)for(;r>n;)e(n,i,this),n+=t,i++;else if(0>t)for(;n>r;)e(n,i,this),n+=t,i++},r.prototype.map=function(e){var n=[];return this.forEach(function(t,r,i){n[r]=e(t,r,i)}),n},r.prototype.toArray=function(){var e=[];return this.forEach(function(n,t){e[t]=n}),e},r.prototype.valueOf=function(){return this.toArray()},r.prototype.format=function(e){var n=o.format(this.start,e);return 1!=this.step&&(n+=":"+o.format(this.step,e)),n+=":"+o.format(this.end,e)},r.prototype.toString=function(){return this.format()},n.exports=r,t.isRange=r.isRange,t.parse=r.parse},{"../util/index":218}],213:[function(e,n,t){function r(e,n){if(!(this instanceof r))throw new Error("Unit constructor must be called with the new operator");if(null!=e&&!y(e))throw new TypeError("First parameter in Unit constructor must be a number");if(null!=n&&!b(n))throw new TypeError("Second parameter in Unit constructor must be a string");if(null!=n){var t=l(n);if(!t)throw new SyntaxError('Unknown unit "'+n+'"');this.unit=t.unit,this.prefix=t.prefix}else this.unit=UNIT_NONE,this.prefix=w;null!=e?(this.value=this._normalize(e),this.fixPrefix=!1):(this.value=null,this.fixPrefix=!0)}function i(){for(;" "==h||" "==h;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){p++,h=m.charAt(p)}function u(e){p=e,h=m.charAt(p)}function c(){var e,n="";if(e=p,"+"==h?s():"-"==h&&(n+=h,s()),!o(h))return u(e),null;if("."==h){if(n+=h,s(),!a(h))return u(e),null}else{for(;a(h);)n+=h,s();"."==h&&(n+=h,s())}for(;a(h);)n+=h,s();if("E"==h||"e"==h){if(n+=h,s(),("+"==h||"-"==h)&&(n+=h,s()),!a(h))return u(e),null;for(;a(h);)n+=h,s()}return n}function f(){var e="";for(i();h&&" "!=h&&" "!=h;)e+=h,s();return e||null}function l(e){for(var n in N)if(N.hasOwnProperty(n)&&x.endsWith(e,n)){var t=N[n],r=e.length-n.length,i=e.substring(0,r),o=t.prefixes[i];if(void 0!==o)return{unit:t,prefix:o}}return null}var m,p,h,g=e("../util/index"),d=g.number,x=g.string,y=g.number.isNumber,b=g.string.isString;r.parse=function(e){if(m=e,p=-1,h="",!b(m))return null;s(),i();var n,t=c();return t?(n=f(),s(),i(),h?null:t&&n?new r(Number(t),n):null):(n=f(),s(),i(),h?null:new r(null,n))},r.isUnit=function(e){return e instanceof r},r.prototype.clone=function(){var e=new r;for(var n in this)this.hasOwnProperty(n)&&(e[n]=this[n]);return e},r.prototype._normalize=function(e){return(e+this.unit.offset)*this.unit.value*this.prefix.value},r.prototype._unnormalize=function(e,n){return void 0==n?e/this.unit.value/this.prefix.value-this.unit.offset:e/this.unit.value/n-this.unit.offset},r.isPlainUnit=function(e){return null!=l(e)},r.prototype.hasBase=function(e){return void 0===this.unit.base?void 0===e:this.unit.base===e},r.prototype.equalBase=function(e){return this.unit.base===e.unit.base},r.prototype.equals=function(e){return this.equalBase(e)&&this.value==e.value},r.prototype.to=function(e){var n;if(b(e)){if(n=new r(null,e),!this.equalBase(n))throw new Error("Units do not match");return n.value=this.value,n}if(e instanceof r){if(!this.equalBase(e))throw new Error("Units do not match");if(null!=e.value)throw new Error("Cannot convert to a unit with a value");if(null==e.unit)throw new Error("Unit expected on the right hand side of function in");return n=e.clone(),n.value=this.value,n.fixPrefix=!0,n}throw new Error("String or Unit expected as parameter")},r.prototype.toNumber=function(e){var n=this.to(e),t=this.fixPrefix?n._bestPrefix():n.prefix;return n._unnormalize(n.value,t.value)},r.prototype.toString=function(){return this.format()},r.prototype.format=function(e){var n,t;if(this.fixPrefix)n=this._unnormalize(this.value),t=null!=this.value?d.format(n,e)+" ":"",t+=this.prefix.name+this.unit.name;else{var r=this._bestPrefix();n=this._unnormalize(this.value,r.value),t=null!=this.value?d.format(n,e)+" ":"",t+=r.name+this.unit.name}return t},r.prototype._bestPrefix=function(){var e=Math.abs(this.value/this.unit.value),n=w,t=Math.abs(Math.log(e/n.value)/Math.LN10-1.2),r=this.unit.prefixes;for(var i in r)if(r.hasOwnProperty(i)){var o=r[i];if(o.scientific){var a=Math.abs(Math.log(e/o.value)/Math.LN10-1.2);t>a&&(n=o,t=a)}}return n};var v={NONE:{"":{name:"",value:1,scientific:!0}},SHORT:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:10,scientific:!1},h:{name:"h",value:100,scientific:!1},k:{name:"k",value:1e3,scientific:!0},M:{name:"M",value:1e6,scientific:!0},G:{name:"G",value:1e9,scientific:!0},T:{name:"T",value:1e12,scientific:!0},P:{name:"P",value:1e15,scientific:!0},E:{name:"E",value:1e18,scientific:!0},Z:{name:"Z",value:1e21,scientific:!0},Y:{name:"Y",value:1e24,scientific:!0},d:{name:"d",value:.1,scientific:!1},c:{name:"c",value:.01,scientific:!1},m:{name:"m",value:.001,scientific:!0},u:{name:"u",value:1e-6,scientific:!0},n:{name:"n",value:1e-9,scientific:!0},p:{name:"p",value:1e-12,scientific:!0},f:{name:"f",value:1e-15,scientific:!0},a:{name:"a",value:1e-18,scientific:!0},z:{name:"z",value:1e-21,scientific:!0},y:{name:"y",value:1e-24,scientific:!0}},LONG:{"":{name:"",value:1,scientific:!0},deca:{name:"deca",value:10,scientific:!1},hecto:{name:"hecto",value:100,scientific:!1},kilo:{name:"kilo",value:1e3,scientific:!0},mega:{name:"mega",value:1e6,scientific:!0},giga:{name:"giga",value:1e9,scientific:!0},tera:{name:"tera",value:1e12,scientific:!0},peta:{name:"peta",value:1e15,scientific:!0},exa:{name:"exa",value:1e18,scientific:!0},zetta:{name:"zetta",value:1e21,scientific:!0},yotta:{name:"yotta",value:1e24,scientific:!0},deci:{name:"deci",value:.1,scientific:!1},centi:{name:"centi",value:.01,scientific:!1},milli:{name:"milli",value:.001,scientific:!0},micro:{name:"micro",value:1e-6,scientific:!0},nano:{name:"nano",value:1e-9,scientific:!0},pico:{name:"pico",value:1e-12,scientific:!0},femto:{name:"femto",value:1e-15,scientific:!0},atto:{name:"atto",value:1e-18,scientific:!0},zepto:{name:"zepto",value:1e-21,scientific:!0},yocto:{name:"yocto",value:1e-24,scientific:!0}},SQUARED:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:100,scientific:!1},h:{name:"h",value:1e4,scientific:!1},k:{name:"k",value:1e6,scientific:!0},M:{name:"M",value:1e12,scientific:!0},G:{name:"G",value:1e18,scientific:!0},T:{name:"T",value:1e24,scientific:!0},P:{name:"P",value:1e30,scientific:!0},E:{name:"E",value:1e36,scientific:!0},Z:{name:"Z",value:1e42,scientific:!0},Y:{name:"Y",value:1e48,scientific:!0},d:{name:"d",value:.01,scientific:!1},c:{name:"c",value:1e-4,scientific:!1},m:{name:"m",value:1e-6,scientific:!0},u:{name:"u",value:1e-12,scientific:!0},n:{name:"n",value:1e-18,scientific:!0},p:{name:"p",value:1e-24,scientific:!0},f:{name:"f",value:1e-30,scientific:!0},a:{name:"a",value:1e-36,scientific:!0},z:{name:"z",value:1e-42,scientific:!0},y:{name:"y",value:1e-42,scientific:!0}},CUBIC:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:1e3,scientific:!1},h:{name:"h",value:1e6,scientific:!1},k:{name:"k",value:1e9,scientific:!0},M:{name:"M",value:1e18,scientific:!0},G:{name:"G",value:1e27,scientific:!0},T:{name:"T",value:1e36,scientific:!0},P:{name:"P",value:1e45,scientific:!0},E:{name:"E",value:1e54,scientific:!0},Z:{name:"Z",value:1e63,scientific:!0},Y:{name:"Y",value:1e72,scientific:!0},d:{name:"d",value:.001,scientific:!1},c:{name:"c",value:1e-6,scientific:!1},m:{name:"m",value:1e-9,scientific:!0},u:{name:"u",value:1e-18,scientific:!0},n:{name:"n",value:1e-27,scientific:!0},p:{name:"p",value:1e-36,scientific:!0},f:{name:"f",value:1e-45,scientific:!0},a:{name:"a",value:1e-54,scientific:!0},z:{name:"z",value:1e-63,scientific:!0},y:{name:"y",value:1e-72,scientific:!0}},BINARY_SHORT:{"":{name:"",value:1,scientific:!0},k:{name:"k",value:1024,scientific:!0},M:{name:"M",value:Math.pow(1024,2),scientific:!0},G:{name:"G",value:Math.pow(1024,3),scientific:!0},T:{name:"T",value:Math.pow(1024,4),scientific:!0},P:{name:"P",value:Math.pow(1024,5),scientific:!0},E:{name:"E",value:Math.pow(1024,6),scientific:!0},Z:{name:"Z",value:Math.pow(1024,7),scientific:!0},Y:{name:"Y",value:Math.pow(1024,8),scientific:!0},Ki:{name:"Ki",value:1024,scientific:!0},Mi:{name:"Mi",value:Math.pow(1024,2),scientific:!0},Gi:{name:"Gi",value:Math.pow(1024,3),scientific:!0},Ti:{name:"Ti",value:Math.pow(1024,4),scientific:!0},Pi:{name:"Pi",value:Math.pow(1024,5),scientific:!0},Ei:{name:"Ei",value:Math.pow(1024,6),scientific:!0},Zi:{name:"Zi",value:Math.pow(1024,7),scientific:!0},Yi:{name:"Yi",value:Math.pow(1024,8),scientific:!0}},BINARY_LONG:{"":{name:"",value:1,scientific:!0},kilo:{name:"kilo",value:1024,scientific:!0},mega:{name:"mega",value:Math.pow(1024,2),scientific:!0},giga:{name:"giga",value:Math.pow(1024,3),scientific:!0},tera:{name:"tera",value:Math.pow(1024,4),scientific:!0},peta:{name:"peta",value:Math.pow(1024,5),scientific:!0},exa:{name:"exa",value:Math.pow(1024,6),scientific:!0},zetta:{name:"zetta",value:Math.pow(1024,7),scientific:!0},yotta:{name:"yotta",value:Math.pow(1024,8),scientific:!0},kibi:{name:"kibi",value:1024,scientific:!0},mebi:{name:"mebi",value:Math.pow(1024,2),scientific:!0},gibi:{name:"gibi",value:Math.pow(1024,3),scientific:!0},tebi:{name:"tebi",value:Math.pow(1024,4),scientific:!0},pebi:{name:"pebi",value:Math.pow(1024,5),scientific:!0},exi:{name:"exi",value:Math.pow(1024,6),scientific:!0},zebi:{name:"zebi",value:Math.pow(1024,7),scientific:!0},yobi:{name:"yobi",value:Math.pow(1024,8),scientific:!0}}},w={name:"",value:1,scientific:!0},E={NONE:{},LENGTH:{},MASS:{},TIME:{},CURRENT:{},TEMPERATURE:{},LUMINOUS_INTENSITY:{},AMOUNT_OF_SUBSTANCE:{},FORCE:{},SURFACE:{},VOLUME:{},ANGLE:{},BIT:{}};BASE_UNIT_NONE={},UNIT_NONE={name:"",base:BASE_UNIT_NONE,value:1,offset:0};var N={meter:{name:"meter",base:E.LENGTH,prefixes:v.LONG,value:1,offset:0},inch:{name:"inch",base:E.LENGTH,prefixes:v.NONE,value:.0254,offset:0},foot:{name:"foot",base:E.LENGTH,prefixes:v.NONE,value:.3048,offset:0},yard:{name:"yard",base:E.LENGTH,prefixes:v.NONE,value:.9144,offset:0},mile:{name:"mile",base:E.LENGTH,prefixes:v.NONE,value:1609.344,offset:0},link:{name:"link",base:E.LENGTH,prefixes:v.NONE,value:.201168,offset:0},rod:{name:"rod",base:E.LENGTH,prefixes:v.NONE,value:5.02921,offset:0},chain:{name:"chain",base:E.LENGTH,prefixes:v.NONE,value:20.1168,offset:0},angstrom:{name:"angstrom",base:E.LENGTH,prefixes:v.NONE,value:1e-10,offset:0},m:{name:"m",base:E.LENGTH,prefixes:v.SHORT,value:1,offset:0},"in":{name:"in",base:E.LENGTH,prefixes:v.NONE,value:.0254,offset:0},ft:{name:"ft",base:E.LENGTH,prefixes:v.NONE,value:.3048,offset:0},yd:{name:"yd",base:E.LENGTH,prefixes:v.NONE,value:.9144,offset:0},mi:{name:"mi",base:E.LENGTH,prefixes:v.NONE,value:1609.344,offset:0},li:{name:"li",base:E.LENGTH,prefixes:v.NONE,value:.201168,offset:0},rd:{name:"rd",base:E.LENGTH,prefixes:v.NONE,value:5.02921,offset:0},ch:{name:"ch",base:E.LENGTH,prefixes:v.NONE,value:20.1168,offset:0},mil:{name:"mil",base:E.LENGTH,prefixes:v.NONE,value:254e-7,offset:0},m2:{name:"m2",base:E.SURFACE,prefixes:v.SQUARED,value:1,offset:0},sqin:{name:"sqin",base:E.SURFACE,prefixes:v.NONE,value:64516e-8,offset:0},sqft:{name:"sqft",base:E.SURFACE,prefixes:v.NONE,value:.09290304,offset:0},sqyd:{name:"sqyd",base:E.SURFACE,prefixes:v.NONE,value:.83612736,offset:0},sqmi:{name:"sqmi",base:E.SURFACE,prefixes:v.NONE,value:2589988.110336,offset:0},sqrd:{name:"sqrd",base:E.SURFACE,prefixes:v.NONE,value:25.29295,offset:0},sqch:{name:"sqch",base:E.SURFACE,prefixes:v.NONE,value:404.6873,offset:0},sqmil:{name:"sqmil",base:E.SURFACE,prefixes:v.NONE,value:6.4516e-10,offset:0},m3:{name:"m3",base:E.VOLUME,prefixes:v.CUBIC,value:1,offset:0},L:{name:"L",base:E.VOLUME,prefixes:v.SHORT,value:.001,offset:0},l:{name:"l",base:E.VOLUME,prefixes:v.SHORT,value:.001,offset:0},litre:{name:"litre",base:E.VOLUME,prefixes:v.LONG,value:.001,offset:0},cuin:{name:"cuin",base:E.VOLUME,prefixes:v.NONE,value:16387064e-12,offset:0},cuft:{name:"cuft",base:E.VOLUME,prefixes:v.NONE,value:.028316846592,offset:0},cuyd:{name:"cuyd",base:E.VOLUME,prefixes:v.NONE,value:.764554857984,offset:0},teaspoon:{name:"teaspoon",base:E.VOLUME,prefixes:v.NONE,value:5e-6,offset:0},tablespoon:{name:"tablespoon",base:E.VOLUME,prefixes:v.NONE,value:15e-6,offset:0},minim:{name:"minim",base:E.VOLUME,prefixes:v.NONE,value:6.161152e-8,offset:0},fluiddram:{name:"fluiddram",base:E.VOLUME,prefixes:v.NONE,value:36966911e-13,offset:0},fluidounce:{name:"fluidounce",base:E.VOLUME,prefixes:v.NONE,value:2957353e-11,offset:0},gill:{name:"gill",base:E.VOLUME,prefixes:v.NONE,value:.0001182941,offset:0},cc:{name:"cc",base:E.VOLUME,prefixes:v.NONE,value:1e-6,offset:0},cup:{name:"cup",base:E.VOLUME,prefixes:v.NONE,value:.0002365882,offset:0},pint:{name:"pint",base:E.VOLUME,prefixes:v.NONE,value:.0004731765,offset:0},quart:{name:"quart",base:E.VOLUME,prefixes:v.NONE,value:.0009463529,offset:0},gallon:{name:"gallon",base:E.VOLUME,prefixes:v.NONE,value:.003785412,offset:0},beerbarrel:{name:"beerbarrel",base:E.VOLUME,prefixes:v.NONE,value:.1173478,offset:0},oilbarrel:{name:"oilbarrel",base:E.VOLUME,prefixes:v.NONE,value:.1589873,offset:0},hogshead:{name:"hogshead",base:E.VOLUME,prefixes:v.NONE,value:.238481,offset:0},fldr:{name:"fldr",base:E.VOLUME,prefixes:v.NONE,value:36966911e-13,offset:0},floz:{name:"floz",base:E.VOLUME,prefixes:v.NONE,value:2957353e-11,offset:0},gi:{name:"gi",base:E.VOLUME,prefixes:v.NONE,value:.0001182941,offset:0},cp:{name:"cp",base:E.VOLUME,prefixes:v.NONE,value:.0002365882,offset:0},pt:{name:"pt",base:E.VOLUME,prefixes:v.NONE,value:.0004731765,offset:0},qt:{name:"qt",base:E.VOLUME,prefixes:v.NONE,value:.0009463529,offset:0},gal:{name:"gal",base:E.VOLUME,prefixes:v.NONE,value:.003785412,offset:0},bbl:{name:"bbl",base:E.VOLUME,prefixes:v.NONE,value:.1173478,offset:0},obl:{name:"obl",base:E.VOLUME,prefixes:v.NONE,value:.1589873,offset:0},g:{name:"g",base:E.MASS,prefixes:v.SHORT,value:.001,offset:0},gram:{name:"gram",base:E.MASS,prefixes:v.LONG,value:.001,offset:0},ton:{name:"ton",base:E.MASS,prefixes:v.SHORT,value:907.18474,offset:0},tonne:{name:"tonne",base:E.MASS,prefixes:v.SHORT,value:1e3,offset:0},grain:{name:"grain",base:E.MASS,prefixes:v.NONE,value:6479891e-11,offset:0},dram:{name:"dram",base:E.MASS,prefixes:v.NONE,value:.0017718451953125,offset:0},ounce:{name:"ounce",base:E.MASS,prefixes:v.NONE,value:.028349523125,offset:0},poundmass:{name:"poundmass",base:E.MASS,prefixes:v.NONE,value:.45359237,offset:0},hundredweight:{name:"hundredweight",base:E.MASS,prefixes:v.NONE,value:45.359237,offset:0},stick:{name:"stick",base:E.MASS,prefixes:v.NONE,value:.115,offset:0},gr:{name:"gr",base:E.MASS,prefixes:v.NONE,value:6479891e-11,offset:0},dr:{name:"dr",base:E.MASS,prefixes:v.NONE,value:.0017718451953125,offset:0},oz:{name:"oz",base:E.MASS,prefixes:v.NONE,value:.028349523125,offset:0},lbm:{name:"lbm",base:E.MASS,prefixes:v.NONE,value:.45359237,offset:0},cwt:{name:"cwt",base:E.MASS,prefixes:v.NONE,value:45.359237,offset:0},s:{name:"s",base:E.TIME,prefixes:v.SHORT,value:1,offset:0},min:{name:"min",base:E.TIME,prefixes:v.NONE,value:60,offset:0},h:{name:"h",base:E.TIME,prefixes:v.NONE,value:3600,offset:0},second:{name:"second",base:E.TIME,prefixes:v.LONG,value:1,offset:0},sec:{name:"sec",base:E.TIME,prefixes:v.LONG,value:1,offset:0},minute:{name:"minute",base:E.TIME,prefixes:v.NONE,value:60,offset:0},hour:{name:"hour",base:E.TIME,prefixes:v.NONE,value:3600,offset:0},day:{name:"day",base:E.TIME,prefixes:v.NONE,value:86400,offset:0},rad:{name:"rad",base:E.ANGLE,prefixes:v.NONE,value:1,offset:0},deg:{name:"deg",base:E.ANGLE,prefixes:v.NONE,value:.017453292519943295,offset:0},grad:{name:"grad",base:E.ANGLE,prefixes:v.NONE,value:.015707963267948967,offset:0},cycle:{name:"cycle",base:E.ANGLE,prefixes:v.NONE,value:6.283185307179586,offset:0},A:{name:"A",base:E.CURRENT,prefixes:v.SHORT,value:1,offset:0},ampere:{name:"ampere",base:E.CURRENT,prefixes:v.LONG,value:1,offset:0},K:{name:"K",base:E.TEMPERATURE,prefixes:v.NONE,value:1,offset:0},degC:{name:"degC",base:E.TEMPERATURE,prefixes:v.NONE,value:1,offset:273.15},degF:{name:"degF",base:E.TEMPERATURE,prefixes:v.NONE,value:1/1.8,offset:459.67},degR:{name:"degR",base:E.TEMPERATURE,prefixes:v.NONE,value:1/1.8,offset:0},kelvin:{name:"kelvin",base:E.TEMPERATURE,prefixes:v.NONE,value:1,offset:0},celsius:{name:"celsius",base:E.TEMPERATURE,prefixes:v.NONE,value:1,offset:273.15},fahrenheit:{name:"fahrenheit",base:E.TEMPERATURE,prefixes:v.NONE,value:1/1.8,offset:459.67},rankine:{name:"rankine",base:E.TEMPERATURE,prefixes:v.NONE,value:1/1.8,offset:0},mol:{name:"mol",base:E.AMOUNT_OF_SUBSTANCE,prefixes:v.NONE,value:1,offset:0},mole:{name:"mole",base:E.AMOUNT_OF_SUBSTANCE,prefixes:v.NONE,value:1,offset:0},cd:{name:"cd",base:E.LUMINOUS_INTENSITY,prefixes:v.NONE,value:1,offset:0},candela:{name:"candela",base:E.LUMINOUS_INTENSITY,prefixes:v.NONE,value:1,offset:0},N:{name:"N",base:E.FORCE,prefixes:v.SHORT,value:1,offset:0},newton:{name:"newton",base:E.FORCE,prefixes:v.LONG,value:1,offset:0},lbf:{name:"lbf",base:E.FORCE,prefixes:v.NONE,value:4.4482216152605,offset:0},poundforce:{name:"poundforce",base:E.FORCE,prefixes:v.NONE,value:4.4482216152605,offset:0},b:{name:"b",base:E.BIT,prefixes:v.BINARY_SHORT,value:1,offset:0},bits:{name:"bits",base:E.BIT,prefixes:v.BINARY_LONG,value:1,offset:0},B:{name:"B",base:E.BIT,prefixes:v.BINARY_SHORT,value:8,offset:0},bytes:{name:"bytes",base:E.BIT,prefixes:v.BINARY_LONG,value:8,offset:0}},j={meters:"meter",inches:"inch",yards:"yard",miles:"mile",links:"link",rods:"rod",chains:"chain",angstroms:"angstrom",litres:"litre",teaspoons:"teaspoon",tablespoons:"tablespoon",minims:"minim",fluiddrams:"fluiddram",fluidounces:"fluidounce",gills:"gill",cups:"cup",pints:"pint",quarts:"quart",gallons:"gallon",beerbarrels:"beerbarrel",oilbarrels:"oilbarrel",hogsheads:"hogshead",grams:"gram",tons:"ton",tonnes:"tonne",grains:"grain",drams:"dram",ounces:"ounce",poundmasses:"poundmass",hundredweights:"hundredweight",sticks:"stick",seconds:"second",minutes:"minute",hours:"hour",days:"day",radians:"rad",degrees:"deg",gradients:"grad",cycles:"cycle",amperes:"ampere",moles:"mole"};for(var M in j)if(j.hasOwnProperty(M)){var C=N[j[M]],A=Object.create(C);A.name=M,N[M]=A -}N.lt=N.l,N.liter=N.litre,N.liters=N.litres,N.lb=N.lbm,r.PREFIXES=v,r.BASE_UNITS=E,r.UNITS=N,n.exports=r,t.isUnit=r.isUnit,t.isPlainUnit=r.isPlainUnit,t.parse=r.parse},{"../util/index":218}],214:[function(e,n,t){function r(e,n,t){var o,a,u,c;if(0>=n){if(s(e[0])){for(c=i(e),a=[],o=0;ot;t++){var a=[];for(n=0;r>n;n++)a.push(e[n][t]);o.push(a)}return o}{var o=e("../util/index"),a=e("./Matrix"),s=o.array.isArray;o.string.isString}t.argsToArray=function(e){var n;return 0==e.length?n=[]:1==e.length?(n=e[0],n instanceof a&&(n=n.valueOf()),s(n)||(n=[n])):n=Array.prototype.slice.apply(e),n},t.isCollection=function(e){return s(e)||e instanceof a},t.deepMap=function u(e,n){return e&&"function"==typeof e.map?e.map(function(e){return u(e,n)}):n(e)},t.deepMap2=function c(e,n,t){var r,i,o;if(s(e))if(s(n)){if(e.length!=n.length)throw new RangeError("Dimension mismatch ("+e.length+" != "+n.length+")");for(r=[],i=e.length,o=0;i>o;o++)r[o]=c(e[o],n[o],t)}else{if(n instanceof a)return r=c(e,n.valueOf(),t),new a(r);for(r=[],i=e.length,o=0;i>o;o++)r[o]=c(e[o],n,t)}else{if(e instanceof a)return n instanceof a?(r=c(e.valueOf(),n.valueOf(),t),new a(r)):(r=c(e.valueOf(),n,t),new a(r));if(s(n))for(r=[],i=n.length,o=0;i>o;o++)r[o]=c(e,n[o],t);else{if(n instanceof a)return r=c(e,n.valueOf(),t),new a(r);r=t(e,n)}}return r},t.reduce=function(e,n,t){return e instanceof a?new a(r(e.valueOf(),n,t)):r(e,n,t)},t.deepForEach=function f(e,n){e instanceof a&&(e=e.valueOf());for(var t=0,r=e.length;r>t;t++){var i=e[t];s(i)?f(i,n):n(i)}}},{"../util/index":218,"./Matrix":211}],215:[function(e,n){n.exports=function(n){var t=(e("./../util/types"),{});n.error=t,t.UnsupportedTypeError=function(e,t){if(2==arguments.length){var r=n["typeof"](t);this.message="Function "+e+"("+r+") not supported"}else if(arguments.length>2){var i=Array.prototype.splice.call(arguments,1),o=i.map(function(e){return n["typeof"](e)});this.message="Function "+e+"("+o.join(", ")+") not supported"}else this.message="Unsupported type of argument in function "+e},t.UnsupportedTypeError.prototype=new TypeError,t.UnsupportedTypeError.prototype.name="UnsupportedTypeError",t.ArgumentsError=function(e,n,t,r){this.message="Wrong number of arguments in function "+e+" ("+n+" provided, "+t+(void 0!=r?"-"+r:"")+" expected)"},t.ArgumentsError.prototype=new SyntaxError,t.ArgumentsError.prototype.name="ArgumentError"}},{"./../util/types":222}],216:[function(e,n,t){function r(e){for(var n=[];c(e);)n.push(e.length),e=e[0];return n}function i(e,n,t){var r,o=e.length;if(o!=n[t])throw new RangeError("Dimension mismatch ("+o+" != "+n[t]+")");if(tr;r++){var s=e[r];if(!c(s))throw new RangeError("Dimension mismatch ("+(n.length-1)+" < "+n.length+")");i(e[r],n,a)}}else for(r=0;o>r;r++)if(c(e[r]))throw new RangeError("Dimension mismatch ("+(n.length+1)+" > "+n.length+")")}function o(e,n,t,r){if(!c(e))throw Error("Array expected");var i,a,s=e.length,f=n[t],l=Math.min(s,f);if(e.length=f,ti;i++)a=e[i],o(a,n,m,r);for(i=l;f>i;i++)a=[],e[i]=a,o(a,n,m,r)}else if(void 0!==r)for(i=s;f>i;i++)e[i]=u.clone(r)}var a=e("./number"),s=e("./string"),u=e("./object"),c=(e("./types"),Array.isArray);t.size=function(e){var n=r(e);return t.validate(e,n),n},t.validate=function(e,n){var t=0==n.length;if(t){if(c(e))throw new RangeError("Dimension mismatch ("+e.length+" != 0)")}else i(e,n,0)},t.validateIndex=function(e,n){if(!a.isNumber(e)||!a.isInteger(e))throw new TypeError("Index must be an integer (value: "+e+")");if(0>e)throw new RangeError("Index out of range ("+e+" < 0)");if(void 0!==n&&e>=n)throw new RangeError("Index out of range ("+e+" > "+(n-1)+")")},t.resize=function(e,n,t){if(!c(e)||!c(n))throw new TypeError("Array expected");if(0===n.length)throw new Error("Resizing to scalar is not supported");n.forEach(function(e){if(!a.isNumber(e)||!a.isInteger(e)||0>e)throw new TypeError("Invalid size, must contain positive integers (size: "+s.format(n)+")")});for(var r=1,i=e[0];c(i);)r++,i=i[0];for(;rn.length;)e=e[0],r--;return o(e,n,0,t),e},t.squeeze=function(e){for(;c(e)&&1===e.length;)e=e[0];return e},t.unsqueeze=function(e,n){for(var r=t.size(e),i=0,o=n-r.length;o>i;i++)e=[e];return e},t.isArray=c},{"./number":219,"./object":220,"./string":221,"./types":222}],217:[function(e,n,t){t.isBoolean=function(e){return e instanceof Boolean||"boolean"==typeof e}},{}],218:[function(e,n,t){t.array=e("./array"),t["boolean"]=e("./boolean"),t.number=e("./number"),t.object=e("./object"),t.string=e("./string"),t.types=e("./types")},{"./array":216,"./boolean":217,"./number":219,"./object":220,"./string":221,"./types":222}],219:[function(e,n,t){function r(e){return e instanceof o?e.isZero():0===e}function i(e,n,t){var r;return e instanceof o?(r=e.abs(),r.gte(n)&&r.lt(t)):(r=Math.abs(e),r>=n&&t>r)}var o=e("bignumber.js");t.isNumber=function(e){return e instanceof Number||"number"==typeof e},t.isInteger=function(e){return e==Math.round(e)},t.sign=function(e){return e>0?1:0>e?-1:0},t.format=function(e,n){if("function"==typeof n)return n(e);if(1/0===e)return"Infinity";if(e===-1/0)return"-Infinity";if(isNaN(e))return"NaN";var a="auto",s=void 0;switch(void 0!==n&&(n.notation&&(a=n.notation),n&&(t.isNumber(n)?s=n:n.precision&&(s=n.precision))),a){case"fixed":return t.toFixed(e,s);case"scientific":throw new Error('Format notation "scientific" is deprecated. Use "exponential" instead.');case"exponential":return t.toExponential(e,s);case"auto":var u=.001,c=1e5;if(n&&n.exponential)void 0!==n.exponential.lower&&(u=n.exponential.lower),void 0!==n.exponential.upper&&(c=n.exponential.upper);else if(n&&n.scientific)throw new Error("options.scientific is deprecated, use options.exponential instead.");var f=e instanceof o;if(f){var l=o.config().EXPONENTIAL_AT;o.config({EXPONENTIAL_AT:[Math.round(Math.log(u)/Math.LN10),Math.round(Math.log(c)/Math.LN10)]})}if(r(e))return"0";var m;if(i(e,u,c))if(f)m=new o(e.toPrecision(s)).toString();else{var p=s?e.toPrecision(Math.min(s,21)):e.toPrecision();m=parseFloat(p)+""}else m=t.toExponential(e,s);return f&&o.config({EXPONENTIAL_AT:l}),m.replace(/((\.\d*?)(0+))($|e)/,function(){var e=arguments[2],n=arguments[4];return"."!==e?e+n:n});default:throw new Error('Unknown notation "'+a+'". Choose "auto", "exponential", or "fixed".')}},t.toExponential=function(e,n){return void 0!==n?e.toExponential(e instanceof o?n-1:Math.min(n-1,20)):e.toExponential()},t.toFixed=function(e,n){return e.toFixed(e instanceof o?n||0:Math.min(n,20))},t.digits=function(e){return e.toExponential().replace(/e[\+\-0-9]*$/,"").replace(/^0\.0*|\./,"").length},t.toBigNumber=function(e){return t.digits(e)>15?e:new o(e)},t.toNumber=function(e){return parseFloat(e.valueOf())}},{"bignumber.js":223}],220:[function(e,n,t){t.clone=function r(e){var n=typeof e;if("number"===n||"string"===n||"boolean"===n||null===e||void 0===e)return e;if("function"==typeof e.clone)return e.clone();if(Array.isArray(e))return e.map(function(e){return r(e)});if(e instanceof Object){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=r(e[i]));return e}throw new TypeError("Cannot clone "+e)},t.extend=function(e,n){for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e},t.deepExtend=function i(e,n){for(var t in n)n.hasOwnProperty(t)&&(n[t]&&n[t].constructor===Object?(void 0===e[t]&&(e[t]={}),e[t].constructor===Object?i(e[t],n[t]):e[t]=n[t]):e[t]=n[t]);return e},t.deepEqual=function(e,n){var r,i,o;if(Array.isArray(e)){if(!Array.isArray(n))return!1;if(e.length!=n.length)return!1;for(i=0,o=e.length;o>i;i++)if(!t.deepEqual(e[i],n[i]))return!1;return!0}if(e instanceof Object){if(Array.isArray(n)||!(n instanceof Object))return!1;for(r in e)if(e.hasOwnProperty(r)&&!t.deepEqual(e[r],n[r]))return!1;for(r in n)if(n.hasOwnProperty(r)&&!t.deepEqual(e[r],n[r]))return!1;return!0}return e==n}},{}],221:[function(e,n,t){function r(e,n){if(Array.isArray(e)){for(var i="[",o=e.length,a=0;o>a;a++)0!=a&&(i+=", "),i+=r(e[a],n);return i+="]"}return t.format(e,n)}var i=e("./number"),o=e("bignumber.js");t.isString=function(e){return e instanceof String||"string"==typeof e},t.endsWith=function(e,n){var t=e.length-n.length,r=e.length;return e.substring(t,r)===n},t.format=function(e,n){return i.isNumber(e)||e instanceof o?i.format(e,n):Array.isArray(e)?r(e,n):t.isString(e)?'"'+e+'"':"function"==typeof e?e.syntax?e.syntax+"":"function":e instanceof Object?"function"==typeof e.format?e.format(n):e.toString():String(e)}},{"./number":219,"bignumber.js":223}],222:[function(e,n,t){t.type=function r(e){var r=typeof e;if("object"===r){if(null===e)return"null";if(e instanceof Boolean)return"boolean";if(e instanceof Number)return"number";if(e instanceof String)return"string";if(Array.isArray(e))return"array";if(e instanceof Date)return"date"}return r}},{}],223:[function(n,t){!function(n){"use strict";function r(e,n){var t,a,s,u,l,m,g=this;if(!(g instanceof r))return new r(e,n);if(e instanceof r){if(N=0,n===t)return g.s=e.s,g.e=e.e,void(g.c=(e=e.c)?e.slice():e);e+=""}if("string"!=typeof e&&(e=(s="number"==typeof e||"[object Number]"==Object.prototype.toString.call(e))&&0===e&&0>1/e?"-0":e+""),m=e,n===t&&j.test(e))g.s="-"==e.charAt(0)?(e=e.slice(1),-1):1;else{if(10==n)return c(e,p,h);if(e=M.call(e).replace(/^\+(?!-)/,""),g.s="-"==e.charAt(0)?(e=e.replace(/^-(?!-)/,""),-1):1,null!=n?n!=(0|n)&&b||(f=!(n>=2&&65>n))?(i(n,2),l=j.test(e)):(u="["+E.slice(0,n=0|n)+"]+",e=e.replace(/\.$/,"").replace(/^\./,"0."),(l=new RegExp("^"+u+"(?:\\."+u+")?$",37>n?"i":"").test(e))?(s&&(e.replace(/^0\.0*|\./,"").length>15&&i(m,0),s=!s),e=o(e,10,n,g.s)):"Infinity"!=e&&"NaN"!=e&&(i(m,1,n),e="NaN")):l=j.test(e),!l)return g.c=g.e=null,"Infinity"!=e&&("NaN"!=e&&i(m,3),g.s=null),void(N=0)}for((t=e.indexOf("."))>-1&&(e=e.replace(".","")),(a=e.search(/e/i))>0?(0>t&&(t=a),t+=+e.slice(a+1),e=e.substring(0,a)):0>t&&(t=e.length),a=0;"0"==e.charAt(a);a++);if(n=e.length,s&&n>15&&e.slice(a).length>15&&i(m,0),N=0,(t-=a+1)>y)g.c=g.e=null;else if(a==n||x>t)g.c=[g.e=0];else{for(;"0"==e.charAt(--n););for(g.e=t,g.c=[],t=0;n>=a;g.c[t++]=+e.charAt(a++));}}function i(e,n,t,r,i,o){if(b){var a,s=["new BigNumber","cmp","div","eq","gt","gte","lt","lte","minus","mod","plus","times","toFr"][N?0>N?-N:N:0>1/N?1:0]+"()",u=f?" out of range":" not a"+(i?" non-zero":"n")+" integer";throw u=([s+" number type has more than 15 significant digits",s+" not a base "+t+" number",s+" base"+u,s+" not a number"][n]||t+"() "+n+(o?" not a boolean or binary digit":u+(r?" or not ["+(f?" negative, positive":" integer, integer")+" ]":"")))+": "+e,f=N=0,a=new Error(u),a.name="BigNumber Error",a}}function o(e,n,t,i){function o(e,r){var i,o,a=0,s=e.length,u=[0];for(r=r||t;s>a;a++){for(o=u.length,i=0;o>i;u[i]*=r,i++);for(u[0]+=E.indexOf(e.charAt(a)),i=0;in-1&&(null==u[i+1]&&(u[i+1]=0),u[i+1]+=u[i]/n^0,u[i]%=n)}return u.reverse()}function s(e){for(var n=0,t=e.length,r="";t>n;r+=E.charAt(e[n++]));return r}var u,c,f,l,m,p;if(37>t&&(e=e.toLowerCase()),(u=e.indexOf("."))>-1)if(u=e.length-u-1,c=o(new r(t).pow(u).toF(),10),l=e.split("."),f=o(l[1]),l=o(l[0]),p=a(f,c,f.length-c.length,i,n,1&l[l.length-1]),m=p.c,u=p.e){for(;++u;m.unshift(0));e=s(l)+"."+s(m)}else m[0]?l[u=l.length-1]j?0:j;v++f;f++){if(s!=(v=b.length))l=s>v?1:-1;else for(m=-1,l=0;++mb[m]?1:-1;break}if(!(0>l))break;for(c=v==s?n:h;v;){if(b[--v]j&&u(w,p,o,a,null!=b[0]),w.e>y?w.c=w.e=null:w.e++n&&u(e,i,10),i=0==o[0]?i+1:t?n:e.e+i+1;o.length=i)?(e.s<0&&o[0]?"-":"")+(o.length>1?(o.splice(1,0,"."),o.join("")):o[0])+(0>i?"e":"e+")+i:e.toS()}function u(e,n,t,r,i){var o=e.c,a=e.s<0,s=t/2,u=e.e+n+1,c=o[u],f=i||0>u||null!=o[u+1];if(i=4>h?(null!=c||f)&&(0==h||2==h&&!a||3==h&&a):c>s||c==s&&(4==h||f||6==h&&(1&o[u-1]||!n&&r)||7==h&&!a||8==h&&a),1>u||!o[0])return o.length=0,o.push(0),i?(o[0]=1,e.e=-n):e.e=0,e;if(o.length=u--,i)for(--t;++o[u]>t;)o[u]=0,u--||(++e.e,o.unshift(1));for(u=o.length;!o[--u];o.pop());return e}function c(e,n,t){var i=h;return h=t,e=new r(e),e.c&&u(e,n,10),h=i,e}var f,l=1e9,m=1e6,p=20,h=4,g=-7,d=21,x=-l,y=l,b=!0,v=parseInt,w=r.prototype,E="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",N=0,j=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,M=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},C=r(1);r.ROUND_UP=0,r.ROUND_DOWN=1,r.ROUND_CEIL=2,r.ROUND_FLOOR=3,r.ROUND_HALF_UP=4,r.ROUND_HALF_DOWN=5,r.ROUND_HALF_EVEN=6,r.ROUND_HALF_CEIL=7,r.ROUND_HALF_FLOOR=8,r.config=function(){var e,n,t=0,r={},o=arguments,a=o[0],s="config",u=function(e,n,t){return!((f=n>e||e>t)||v(e)!=e&&0!==e)},c=a&&"object"==typeof a?function(){return a.hasOwnProperty(n)?null!=(e=a[n]):void 0}:function(){return o.length>t?null!=(e=o[t++]):void 0};return c(n="DECIMAL_PLACES")&&(u(e,0,l)?p=0|e:i(e,n,s)),r[n]=p,c(n="ROUNDING_MODE")&&(u(e,0,8)?h=0|e:i(e,n,s)),r[n]=h,c(n="EXPONENTIAL_AT")&&(u(e,-l,l)?g=-(d=~~(0>e?-e:+e)):!f&&e&&u(e[0],-l,0)&&u(e[1],0,l)?(g=~~e[0],d=~~e[1]):i(e,n,s,1)),r[n]=[g,d],c(n="RANGE")&&(u(e,-l,l)&&~~e?x=-(y=~~(0>e?-e:+e)):!f&&e&&u(e[0],-l,-1)&&u(e[1],1,l)?(x=~~e[0],y=~~e[1]):i(e,n,s,1,1)),r[n]=[x,y],c(n="ERRORS")&&(e===!!e||1===e||0===e?(f=N=0,v=(b=!!e)?parseInt:parseFloat):i(e,n,s,0,0,1)),r[n]=b,r},w.abs=w.absoluteValue=function(){var e=new r(this);return e.s<0&&(e.s=1),e},w.ceil=function(){return c(this,0,2)},w.comparedTo=w.cmp=function(e,n){var t,i=this,o=i.c,a=(N=-N,e=new r(e,n)).c,s=i.s,u=e.s,c=i.e,f=e.e;if(!s||!u)return null;if(t=o&&!o[0],n=a&&!a[0],t||n)return t?n?0:-u:s;if(s!=u)return s;if(t=0>s,n=c==f,!o||!a)return n?0:!o^t?1:-1;if(!n)return c>f^t?1:-1;for(s=-1,u=(c=o.length)<(f=a.length)?c:f;++sa[s]^t?1:-1;return c==f?0:c>f^t?1:-1},w.dividedBy=w.div=function(e,n){var t=this.c,i=this.e,o=this.s,s=(N=2,e=new r(e,n)).c,u=e.e,c=e.s,f=o==c?1:-1;return(i||t&&t[0])&&(u||s&&s[0])?a(t,s,i-u,f,10):new r(o&&c&&(t?!s||t[0]!=s[0]:s)?t&&0==t[0]||!s?0*f:f/0:0/0)},w.equals=w.eq=function(e,n){return N=3,0===this.cmp(e,n)},w.floor=function(){return c(this,0,3)},w.greaterThan=w.gt=function(e,n){return N=4,this.cmp(e,n)>0},w.greaterThanOrEqualTo=w.gte=function(e,n){return N=5,1==(n=this.cmp(e,n))||0===n},w.isFinite=w.isF=function(){return!!this.c},w.isNaN=function(){return!this.s},w.isNegative=w.isNeg=function(){return this.s<0},w.isZero=w.isZ=function(){return!!this.c&&0==this.c[0]},w.lessThan=w.lt=function(e,n){return N=6,this.cmp(e,n)<0},w.lessThanOrEqualTo=w.lte=function(e,n){return N=7,-1==(n=this.cmp(e,n))||0===n},w.minus=function(e,n){var t,i,o,a,s=this,u=s.s;if(n=(N=8,e=new r(e,n)).s,!u||!n)return new r(0/0);if(u!=n)return e.s=-n,s.plus(e);var c=s.c,f=s.e,l=e.c,m=e.e;if(!f||!m){if(!c||!l)return c?(e.s=-n,e):new r(l?s:0/0);if(!c[0]||!l[0])return l[0]?(e.s=-n,e):new r(c[0]?s:3==h?-0:0)}if(c=c.slice(),u=f-m){for(t=(a=0>u)?(u=-u,c):(m=f,l),t.reverse(),n=u;n--;t.push(0));t.reverse()}else for(o=((a=c.lengthn;n++)if(c[n]!=l[n]){a=c[n]0)for(;n--;c[o++]=0);for(n=l.length;n>u;){if(c[--n]m||!c[0])&&(c[0]||(e.s=3==h?-1:1),c=[m=0]),e.c=c,e.e=m,e},w.modulo=w.mod=function(e,n){var t=this,i=t.c,o=(N=9,e=new r(e,n)).c,a=t.s,s=e.s;return n=!a||!s||o&&!o[0],n||i&&!i[0]?new r(n?0/0:t):(t.s=e.s=1,n=1==e.cmp(t),t.s=a,e.s=s,n?new r(t):(a=p,s=h,p=0,h=1,t=t.div(e),p=a,h=s,this.minus(t.times(e))))},w.negated=w.neg=function(){var e=new r(this);return e.s=-e.s||null,e},w.plus=function(e,n){var t,i=this,o=i.s;if(n=(N=10,e=new r(e,n)).s,!o||!n)return new r(0/0);if(o!=n)return e.s=-n,i.minus(e);var a=i.e,s=i.c,u=e.e,c=e.c;if(!a||!u){if(!s||!c)return new r(o/0);if(!s[0]||!c[0])return c[0]?e:new r(s[0]?i:0*o)}if(s=s.slice(),o=a-u){for(t=o>0?(u=a,c):(o=-o,s),t.reverse();o--;t.push(0));t.reverse()}for(s.length-c.length<0&&(t=c,c=s,s=t),o=c.length,n=0;o;n=(s[--o]=s[o]+c[o]+n)/10^0,s[o]%=10);for(n&&(s.unshift(n),++u>y&&(s=u=null)),o=s.length;0==s[--o];s.pop());return e.c=s,e.e=u,e},w.toPower=w.pow=function(e){var n=0*e==0?0|e:e,t=new r(this),o=new r(C);if(((f=-m>e||e>m)&&(n=1*e/0)||v(e)!=e&&0!==e&&!(n=0/0))&&!i(e,"exponent","pow")||!n)return new r(Math.pow(t.toS(),n));for(n=0>n?-n:n;1&n&&(o=o.times(t)),n>>=1,n;)t=t.times(t);return 0>e?C.div(o):o},w.round=function(e,n){return e=null==e||((f=0>e||e>l)||v(e)!=e)&&!i(e,"decimal places","round")?0:0|e,n=null==n||((f=0>n||n>8)||v(n)!=n&&0!==n)&&!i(n,"mode","round")?h:0|n,c(this,e,n)},w.squareRoot=w.sqrt=function(){var e,n,t,i,o=this,a=o.c,s=o.s,c=o.e,f=p,l=h,m=new r("0.5");if(1!==s||!a||!a[0])return new r(!s||0>s&&(!a||a[0])?0/0:a?o:1/0);for(s=Math.sqrt(o.toS()),h=1,0==s||s==1/0?(e=a.join(""),e.length+c&1||(e+="0"),n=new r(Math.sqrt(e)+""),n.c||(n.c=[1]),n.e=((c+1)/2|0)-(0>c||1&c)):n=new r(e=s.toString()),t=n.e,s=t+(p+=4),3>s&&(s=0),c=s;;)if(i=n,n=m.times(i.plus(o.div(i))),i.c.slice(0,s).join("")===n.c.slice(0,s).join("")){if(a=n.c,s-=e&&n.ec-2&&(a.length=c-2),n.times(n).eq(o)))){for(;a.length-1;s--){for(n=0,u=c+s;u>s;n=t[u]+a[s]*o[u-s-1]+n,t[u--]=n%10|0,n=n/10|0);n&&(t[u]=(t[u]+n)%10)}for(n&&++e.e,!t[0]&&t.shift(),u=t.length;!t[--u];t.pop());return e.c=e.e>y?e.e=null:e.ee||e>l)||v(e)!=e&&0!==e)&&!i(e,"decimal places","toE"))&&this.c?this.c.length-1:0|e,1)},w.toFixed=w.toF=function(e){var n,t,r,o=this;return null==e||((f=0>e||e>l)||v(e)!=e&&0!==e)&&!i(e,"decimal places","toF")||(r=o.e+(0|e)),n=g,e=d,g=-(d=1/0),r==t?t=o.toS():(t=s(o,r),o.s<0&&o.c&&(o.c[0]?t.indexOf("-")<0&&(t="-"+t):t=t.replace(/^-/,""))),g=n,d=e,t},w.toFraction=w.toFr=function(e){var n,t,o,a,s,u,c,l=a=new r(C),m=o=new r("0"),g=this,d=g.c,x=y,v=p,w=h,E=new r(C);if(!d)return g.toS();for(c=E.e=d.length-g.e-1,(null==e||(!(N=12,u=new r(e)).s||(f=u.cmp(l)<0||!u.c)||b&&u.e0)&&(e=c>0?E:l),y=1/0,u=new r(d.join("")),p=0,h=1;n=u.div(E),s=a.plus(n.times(m)),1!=s.cmp(e);)a=m,m=s,l=o.plus(n.times(s=l)),o=s,E=u.minus(n.times(s=E)),u=s;return s=e.minus(a).div(m),o=o.plus(s.times(l)),a=a.plus(s.times(m)),o.s=l.s=g.s,p=2*c,h=w,t=l.div(m).minus(g).abs().cmp(o.div(a).minus(g).abs())<1?[l.toS(),m.toS()]:[o.toS(),a.toS()],y=x,p=v,t},w.toPrecision=w.toP=function(e){return null==e||((f=1>e||e>l)||v(e)!=e)&&!i(e,"precision","toP")?this.toS():s(this,0|--e,2)},w.toString=w.toS=function(e){var n,t,r,a=this,u=a.e;if(null===u)t=a.s?"Infinity":"NaN";else{if(e===n&&(g>=u||u>=d))return s(a,a.c.length-1,1);if(t=a.c.join(""),0>u){for(;++u;t="0"+t);t="0."+t}else if(r=t.length,u>0)if(++u>r)for(u-=r;u--;t+="0");else r>u&&(t=t.slice(0,u)+"."+t.slice(u));else if(n=t.charAt(0),r>1)t=n+"."+t.slice(1);else if("0"==n)return n;if(null!=e)if((f=!(e>=2&&65>e))||e!=(0|e)&&b)i(e,"base","toS");else if(t=o(t,0|e,10,a.s),"0"==t)return t}return a.s<0?"-"+t:t},w.valueOf=function(){return this.toS()},"undefined"!=typeof t&&t.exports?t.exports=r:"function"==typeof e&&e.amd?e(function(){return r}):n.BigNumber=r}(this)},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){return function(n){return function(r){"object"==typeof exports&&"object"==typeof module?module.exports=n(r):"function"==typeof define&&define.amd?define(function(){return n(r)}):"object"==typeof exports?exports.mathjs=n(r):e.mathjs=n(r)}}}(this)(function(e){function n(i){if(t[i])return t[i][r];var o=t[i]={exports:{},id:i,loaded:!1};return e[i].call(o[r],o,o[r],n),o.loaded=!0,o[r]}var r="exports",t={};return n.modules=e,n.cache=t,n.p="",n(0)})([function(e,n,r){e.exports=r(1)},function(e,n,r){function t(e){if("function"!=typeof Object.create)throw new Error("ES5 not supported by this JavaScript engine. Please load the es5-shim and es5-sham library for compatibility.");var n={},t={matrix:"matrix",number:"number"};return n.config=function(e){var n=r(220);if(e){if(i.deepExtend(t,e),e.decimals&&n.config({DECIMAL_PLACES:e.decimals}),e.number&&e.number.defaultType)throw new Error("setting `number.defaultType` is deprecated. Use `number` instead.");if(e.number&&e.number.precision)throw new Error("setting `number.precision` is deprecated. Use `decimals` instead.");if(e.matrix&&e.matrix.defaultType)throw new Error("setting `matrix.defaultType` is deprecated. Use `matrix` instead.");if(e.matrix&&e.matrix["default"])throw new Error("setting `matrix.default` is deprecated. Use `matrix` instead.")}var o=i.clone(t);return o.decimals=n.config().DECIMAL_PLACES,o},n.config(e),n.expression={},n.expression.node=r(3),n.expression.parse=r(4),n.expression.Scope=function(){throw new Error("Scope is deprecated. Use a regular Object instead")},n.expression.Parser=r(5),n.expression.docs=r(6),n.type={},n.type.BigNumber=r(220),n.type.Complex=r(7),n.type.Range=r(8),n.type.Index=r(9),n.type.Matrix=r(10),n.type.Unit=r(11),n.type.Help=r(12),n.collection=r(13),r(14)(n),r(15)(n,t),r(16)(n,t),r(17)(n,t),r(18)(n,t),r(19)(n,t),r(20)(n,t),r(21)(n,t),r(22)(n,t),r(23)(n,t),r(24)(n,t),r(25)(n,t),r(26)(n,t),r(27)(n,t),r(28)(n,t),r(29)(n,t),r(30)(n,t),r(31)(n,t),r(32)(n,t),r(33)(n,t),r(34)(n,t),r(35)(n,t),r(36)(n,t),r(37)(n,t),r(38)(n,t),r(39)(n,t),r(40)(n,t),r(41)(n,t),r(42)(n,t),r(43)(n,t),r(44)(n,t),r(45)(n,t),r(46)(n,t),r(47)(n,t),r(48)(n,t),r(49)(n,t),r(50)(n,t),r(51)(n,t),r(52)(n,t),r(53)(n,t),r(54)(n,t),r(55)(n,t),r(56)(n,t),r(57)(n,t),r(58)(n,t),r(59)(n,t),r(60)(n,t),r(61)(n,t),r(62)(n,t),r(63)(n,t),r(64)(n,t),r(65)(n,t),r(66)(n,t),r(67)(n,t),r(68)(n,t),r(69)(n,t),r(70)(n,t),r(71)(n,t),r(72)(n,t),r(73)(n,t),r(74)(n,t),r(75)(n,t),r(76)(n,t),r(77)(n,t),r(78)(n,t),r(79)(n,t),r(80)(n,t),r(81)(n,t),r(82)(n,t),r(83)(n,t),r(84)(n,t),r(85)(n,t),r(86)(n,t),r(87)(n,t),r(88)(n,t),r(89)(n,t),r(90)(n,t),r(91)(n,t),r(92)(n,t),r(93)(n,t),r(94)(n,t),r(95)(n,t),r(96)(n,t),r(97)(n,t),r(98)(n,t),r(99)(n,t),r(100)(n,t),r(101)(n,t),n.chaining={},n.chaining.Selector=r(102)(n,t),n}var i=r(2);e.exports=t},function(e,n){n.clone=function r(e){var n=typeof e;if("number"===n||"string"===n||"boolean"===n||null===e||void 0===e)return e;if("function"==typeof e.clone)return e.clone();if(Array.isArray(e))return e.map(function(e){return r(e)});if(e instanceof Object){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=r(e[i]));return e}throw new TypeError("Cannot clone "+e)},n.extend=function(e,n){for(var r in n)n.hasOwnProperty(r)&&(e[r]=n[r]);return e},n.deepExtend=function t(e,n){for(var r in n)n.hasOwnProperty(r)&&(n[r]&&n[r].constructor===Object?(void 0===e[r]&&(e[r]={}),e[r].constructor===Object?t(e[r],n[r]):e[r]=n[r]):e[r]=n[r]);return e},n.deepEqual=function(e,r){var t,i,o;if(Array.isArray(e)){if(!Array.isArray(r))return!1;if(e.length!=r.length)return!1;for(i=0,o=e.length;o>i;i++)if(!n.deepEqual(e[i],r[i]))return!1;return!0}if(e instanceof Object){if(Array.isArray(r)||!(r instanceof Object))return!1;for(t in e)if(e.hasOwnProperty(t)&&!n.deepEqual(e[t],r[t]))return!1;for(t in r)if(r.hasOwnProperty(t)&&!n.deepEqual(e[t],r[t]))return!1;return!0}return e==r}},function(e,n,r){n.ArrayNode=r(103),n.AssignmentNode=r(104),n.BlockNode=r(105),n.ConstantNode=r(106),n.IndexNode=r(107),n.FunctionNode=r(108),n.Node=r(109),n.OperatorNode=r(110),n.ParamsNode=r(111),n.RangeNode=r(112),n.SymbolNode=r(113),n.UnitNode=r(114),n.UpdateNode=r(115),n.handlers=r(116)},function(e,n,r){function t(e){if(1!=arguments.length)throw new SyntaxError("Wrong number of arguments: 1 expected");if(G(e))return fn=e||"",m();if(D(e)||e instanceof H)return V.deepMap(e,function(e){return fn=e||"",m()});throw new TypeError("String or matrix expected")}function i(){cn=0,ln=fn.charAt(0)}function o(){cn++,ln=fn.charAt(cn)}function a(){return fn.charAt(cn+1)}function s(){for(pn=an.NULL,mn="";" "==ln||" "==ln;)o();if("#"==ln)for(;"\n"!=ln&&""!=ln;)o();if(""==ln)return void(pn=an.DELIMITER);var e=ln+a();if(sn[e])return pn=an.DELIMITER,mn=e,o(),void o();if(sn[ln])return pn=an.DELIMITER,mn=ln,void o();if(!c(ln)){if(f(ln)){for(;f(ln)||l(ln);)mn+=ln,o();return void(pn=un[mn]?an.DELIMITER:an.SYMBOL)}for(pn=an.UNKNOWN;""!=ln;)mn+=ln,o();throw P('Syntax error in part "'+mn+'"')}if(pn=an.NUMBER,"."==ln)mn+=ln,o(),l(ln)||(pn=an.UNKNOWN);else{for(;l(ln);)mn+=ln,o();"."==ln&&(mn+=ln,o())}for(;l(ln);)mn+=ln,o();if("E"==ln||"e"==ln)for(mn+=ln,o(),("+"==ln||"-"==ln)&&(mn+=ln,o()),l(ln)||(pn=an.UNKNOWN);l(ln);)mn+=ln,o()}function u(){for(;"\n"==mn;)s()}function f(e){return e>="a"&&"z">=e||e>="A"&&"Z">=e||"_"==e}function c(e){return e>="0"&&"9">=e||"."==e}function l(e){return e>="0"&&"9">=e}function m(){i(),s();var e;if(e=""==mn?new Q("undefined","undefined"):p(),""!=mn)throw pn==an.DELIMITER?k("Unknown operator "+mn):P('Unexpected part "'+mn+'"');return e}function p(){var e,n,r;for("\n"!=mn&&";"!=mn&&""!=mn&&(e=h());"\n"==mn||";"==mn;)n||(n=new Z,e&&(r=";"!=mn,n.add(e,r))),s(),"\n"!=mn&&";"!=mn&&""!=mn&&(e=h(),r=";"!=mn,n.add(e,r));return n?n:(e||(e=h()),e)}function h(){var e=g(),n="ans";return new W(n,e)}function g(){if(pn==an.SYMBOL&&"function"==mn)throw new Error('Deprecated keyword "function". Functions can now be assigned without it, like "f(x) = x^2".');return d()}function d(){var e,n,r,t=x();if("="==mn){if(t instanceof nn)return e=t.name,s(),r=d(),new W(e,r);if(t instanceof $)return s(),r=d(),new tn(t,r);if(t instanceof J){var i=!0;if(n=[],t.object instanceof nn?(e=t.object.name,t.params.forEach(function(e,r){e instanceof nn?n[r]=e.name:i=!1})):i=!1,i)return s(),r=d(),new K(e,n,r)}throw P("Invalid left hand side of assignment operator =")}return t}function x(){var e,n=[];if(e=":"==mn?new Q("number","1"):v(),":"==mn){for(n.push(e);":"==mn;)s(),n.push(")"==mn||"]"==mn||","==mn||""==mn?new nn("end"):v());if(n.length){if(3==n.length){var r=n[2];n[2]=n[1],n[1]=r}e=new en(n)}}return e}function v(){var e=w();return e}function w(){var e,n,r,t,i;for(e=b(),n={"==":"equal","!=":"unequal","<":"smaller",">":"larger","<=":"smallereq",">=":"largereq"};mn in n;)r=mn,t=n[r],s(),i=[e,b()],e=new X(r,t,i);return e}function b(){var e,n,r,t,i;for(e=y(),n={to:"to","in":"to"};mn in n;)r=mn,t=n[r],s(),i=[e,y()],e=new X(r,t,i);return e}function y(){var e,n,r,t,i;for(e=E(),n={"+":"add","-":"subtract"};mn in n;)r=mn,t=n[r],s(),i=[e,E()],e=new X(r,t,i);return e}function E(){var e,n,r,t,i;for(e=N(),n={"*":"multiply",".*":"emultiply","/":"divide","./":"edivide","%":"mod",mod:"mod"};mn in n;)r=mn,t=n[r],s(),i=[e,N()],e=new X(r,t,i);return e}function N(){var e,n;return e=M(),(pn==an.SYMBOL||"in"==mn)&&(n=mn,s(),e=new rn(e,n)),e}function M(){var e,n,r;return"-"==mn?(e=mn,n="unary",s(),r=[M()],new X(e,n,r)):A()}function A(){var e,n,r,t,i,o,a;for(r=[O()],t=[];"^"==mn||".^"==mn;)t.push(mn),s(),r.push(O());for(e=r.pop();r.length;)n=r.pop(),i=t.pop(),o="^"==i?"pow":"epow",a=[n,e],e=new X(i,o,a);return e}function O(){var e,n,r,t,i;for(e=T(),n={"!":"factorial","'":"transpose"};mn in n;)r=mn,t=n[r],s(),i=[e],e=new X(r,t,i);return e}function T(){var e,n;if(pn==an.SYMBOL&&on[mn]){if(n=on[mn],s(),"("==mn){if(e=[],s(),")"!=mn)for(e.push(x());","==mn;)s(),e.push(x());if(")"!=mn)throw P("Parenthesis ) expected");s()}return new n(e)}return S()}function S(){var e,n;return pn==an.SYMBOL||pn==an.DELIMITER&&mn in un?(n=mn,s(),e=new nn(n),C(e)):U()}function C(e){for(var n,r;"("==mn||"["==mn;){if(n=mn,r=[],s(),")"!=mn&&"]"!=mn)for(r.push(x());","==mn;)s(),r.push(x());if("("==n&&")"!=mn)throw P("Parenthesis ) expected");if("["==n&&"]"!=mn)throw P("Parenthesis ] expected");s(),e="("==n?new J(e,r):new $(e,r)}return e}function U(){var e,n,r;if('"'==mn){for(n="",r="";""!=ln&&('"'!=ln||"\\"==r);)n+=ln,r=ln,o();if(s(),'"'!=mn)throw P('End of string " expected');return s(),e=new Q("string",n),e=C(e)}return z()}function z(){var e,n,r,t;if("["==mn){if(s(),u(),"]"!=mn){var i=q();if(";"==mn){for(r=1,n=[i];";"==mn;)s(),u(),n[r]=q(),r++,u();if("]"!=mn)throw P("End of matrix ] expected");s(),t=n.length>0?n[0].length:0;for(var o=1;r>o;o++)if(n[o].length!=t)throw k("Number of columns must match ("+n[o].length+" != "+t+")");e=new Y(n)}else{if("]"!=mn)throw P("End of matrix ] expected");s(),e=i}}else s(),e=new Y([]);return e=C(e)}return R()}function q(){for(var e=[d()],n=1;","==mn;)s(),u(),e[n]=d(),n++,u();return new Y(e)}function R(){var e,n;return pn==an.NUMBER?(n="."==mn?"0":mn,s(),"i"==mn||"I"==mn?(s(),e=new Q("complex",n)):e=new Q("number",n),e=C(e)):_()}function _(){var e;if("("==mn){if(s(),e=d(),")"!=mn)throw P("Parenthesis ) expected");return s(),e=C(e)}return I()}function I(){throw P(""==mn?"Unexpected end of expression":"Value expected")}function L(){return void 0}function B(){return cn-mn.length+1}function j(e){var n=L(),r=B();return void 0===n?void 0===r?e:e+" (char "+r+")":e+" (line "+n+", char "+r+")"}function P(e){return new SyntaxError(j(e))}function k(e){return new Error(j(e))}var F=r(117),G=(F.number.toNumber,F.string.isString),D=Array.isArray,H=(r(7),r(10)),V=(r(11),r(13)),Y=r(103),W=r(104),Z=r(105),Q=r(106),K=r(108),$=r(107),X=r(110),J=r(111),en=r(112),nn=r(113),rn=r(114),tn=r(115),on=r(116),an={NULL:0,DELIMITER:1,NUMBER:2,SYMBOL:3,UNKNOWN:4},sn={",":!0,"(":!0,")":!0,"[":!0,"]":!0,'"':!0,"\n":!0,";":!0,"+":!0,"-":!0,"*":!0,".*":!0,"/":!0,"./":!0,"%":!0,"^":!0,".^":!0,"!":!0,"'":!0,"=":!0,":":!0,"==":!0,"!=":!0,"<":!0,">":!0,"<=":!0,">=":!0},un={mod:!0,to:!0,"in":!0},fn="",cn=0,ln="",mn="",pn=an.NULL;e.exports=t},function(e,n,r){function t(e){if(!(this instanceof t))throw new SyntaxError("Parser constructor must be called with the new operator");if("object"!=typeof e)throw new TypeError("Object expected as parameter math");this.math=e,this.scope={}}var i=r(4);t.prototype.parse=function(e){return i(e)},t.prototype.compile=function(e){return i(e).compile(this.math)},t.prototype.eval=function(e){return i(e).compile(this.math).eval(this.scope)},t.prototype.get=function(e){return this.scope[e]},t.prototype.set=function(e,n){return this.scope[e]=n},t.prototype.remove=function(e){delete this.scope[e]},t.prototype.clear=function(){for(var e in this.scope)this.scope.hasOwnProperty(e)&&delete this.scope[e]},e.exports=t},function(e,n,r){n.e=r(118),n.E=r(118),n["false"]=r(119),n.i=r(120),n.Infinity=r(121),n.LN2=r(122),n.LN10=r(123),n.LOG2E=r(124),n.LOG10E=r(125),n.NaN=r(126),n.pi=r(127),n.PI=r(127),n.SQRT1_2=r(128),n.SQRT2=r(129),n.tau=r(130),n["true"]=r(131),n.abs=r(132),n.add=r(133),n.ceil=r(134),n.cube=r(135),n.divide=r(136),n.edivide=r(137),n.emultiply=r(138),n.epow=r(139),n.equal=r(140),n.exp=r(141),n.fix=r(142),n.floor=r(143),n.gcd=r(144),n.larger=r(145),n.largereq=r(146),n.lcm=r(147),n.log=r(148),n.log10=r(149),n.mod=r(150),n.multiply=r(151),n.pow=r(152),n.round=r(153),n.sign=r(154),n.smaller=r(155),n.smallereq=r(156),n.sqrt=r(157),n.square=r(158),n.subtract=r(159),n.unary=r(160),n.unequal=r(161),n.xgcd=r(162),n.arg=r(163),n.conj=r(164),n.re=r(165),n.im=r(166),n.bignumber=r(167),n["boolean"]=r(168),n.complex=r(169),n.index=r(170),n.matrix=r(171),n.number=r(172),n.string=r(173),n.unit=r(174),n.eval=r(175),n.help=r(176),n.concat=r(177),n.det=r(178),n.diag=r(179),n.eye=r(180),n.inv=r(181),n.ones=r(182),n.range=r(183),n.resize=r(184),n.size=r(185),n.squeeze=r(186),n.subset=r(187),n.transpose=r(188),n.zeros=r(189),n.combinations=r(190),n.distribution=r(191),n.factorial=r(192),n.permutations=r(193),n.pickRandom=r(194),n.random=r(195),n.randomInt=r(196),n.min=r(197),n.mean=r(198),n.max=r(199),n.acos=r(200),n.asin=r(201),n.atan=r(202),n.atan2=r(203),n.cos=r(204),n.cot=r(205),n.csc=r(206),n.sec=r(207),n.sin=r(208),n.tan=r(209),n.to=r(210),n.clone=r(211),n.map=r(212),n.forEach=r(213),n.format=r(214),n["import"]=r(215),n["typeof"]=r(216)},function(e,n,r){function t(e,n){if(!(this instanceof t))throw new SyntaxError("Complex constructor must be called with the new operator");switch(arguments.length){case 0:this.re=0,this.im=0;break;case 2:if(!p(e)||!p(n))throw new TypeError("Two numbers expected in Complex constructor");this.re=e,this.im=n;break;default:if(0!=arguments.length&&2!=arguments.length)throw new SyntaxError("Two or zero arguments expected in Complex constructor")}}function i(){for(;" "==x||" "==x;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){d++,x=g.charAt(d)}function u(e){d=e,x=g.charAt(d)}function f(){var e,n="";if(e=d,"+"==x?s():"-"==x&&(n+=x,s()),!o(x))return u(e),null;if("."==x){if(n+=x,s(),!a(x))return u(e),null}else{for(;a(x);)n+=x,s();"."==x&&(n+=x,s())}for(;a(x);)n+=x,s();if("E"==x||"e"==x){if(n+=x,s(),("+"==x||"-"==x)&&(n+=x,s()),!a(x))return u(e),null;for(;a(x);)n+=x,s()}return n}function c(){var e=g.charAt(d+1);if("I"==x||"i"==x)return s(),"1";if(!("+"!=x&&"-"!=x||"I"!=e&&"i"!=e)){var n="+"==x?"1":"-1";return s(),s(),n}return null}var l=r(117),m=l.number,p=l.number.isNumber,h=l.string.isString;t.isComplex=function(e){return e instanceof t};var g,d,x;t.parse=function(e){if(g=e,d=-1,x="",!h(g))return null;s(),i();var n=f();if(n){if("I"==x||"i"==x)return s(),i(),x?null:new t(0,Number(n));i();var r=x;if("+"!=r&&"-"!=r)return i(),x?null:new t(Number(n),0);s(),i();var o=f();if(o){if("I"!=x&&"i"!=x)return null;s()}else if(o=c(),!o)return null;return"-"==r&&(o="-"==o[0]?"+"+o.substring(1):"-"+o),s(),i(),x?null:new t(Number(n),Number(o))}return(n=c())?(i(),x?null:new t(0,Number(n))):null},t.prototype.clone=function(){return new t(this.re,this.im)},t.prototype.equals=function(e){return this.re===e.re&&this.im===e.im},t.prototype.format=function(e){var n="",r=m.format(this.re,e),t=m.format(this.im,e);return n=0==this.im?r:0==this.re?1==this.im?"i":-1==this.im?"-i":t+"i":this.im>0?1==this.im?r+" + i":r+" + "+t+"i":-1==this.im?r+" - i":r+" - "+t.substring(1)+"i"},t.prototype.toString=function(){return this.format()},e.exports=t,n.isComplex=t.isComplex,n.parse=t.parse},function(e,n,r){function t(e,n,r){if(!(this instanceof t))throw new SyntaxError("Range constructor must be called with the new operator");if(null!=e&&!o.isNumber(e))throw new TypeError("Parameter start must be a number");if(null!=n&&!o.isNumber(n))throw new TypeError("Parameter end must be a number");if(null!=r&&!o.isNumber(r))throw new TypeError("Parameter step must be a number");this.start=null!=e?parseFloat(e):0,this.end=null!=n?parseFloat(n):0,this.step=null!=r?parseFloat(r):1}{var i=r(117),o=i.number,a=i.string;i.array}t.parse=function(e){if(!a.isString(e))return null;var n=e.split(":"),r=n.map(function(e){return parseFloat(e)}),i=r.some(function(e){return isNaN(e)});if(i)return null;switch(r.length){case 2:return new t(r[0],r[1]);case 3:return new t(r[0],r[2],r[1]);default:return null}},t.prototype.clone=function(){return new t(this.start,this.end,this.step)},t.isRange=function(e){return e instanceof t},t.prototype.size=function(){var e=0,n=this.start,r=this.step,t=this.end,i=t-n;return o.sign(r)==o.sign(i)?e=Math.ceil(i/r):0==i&&(e=0),isNaN(e)&&(e=0),[e]},t.prototype.min=function(){var e=this.size()[0];return e>0?this.step>0?this.start:this.start+(e-1)*this.step:void 0},t.prototype.max=function(){var e=this.size()[0];return e>0?this.step>0?this.start+(e-1)*this.step:this.start:void 0},t.prototype.forEach=function(e){var n=this.start,r=this.step,t=this.end,i=0;if(r>0)for(;t>n;)e(n,i,this),n+=r,i++;else if(0>r)for(;n>t;)e(n,i,this),n+=r,i++},t.prototype.map=function(e){var n=[];return this.forEach(function(r,t,i){n[t]=e(r,t,i)}),n},t.prototype.toArray=function(){var e=[];return this.forEach(function(n,r){e[r]=n}),e},t.prototype.valueOf=function(){return this.toArray()},t.prototype.format=function(e){var n=o.format(this.start,e);return 1!=this.step&&(n+=":"+o.format(this.step,e)),n+=":"+o.format(this.end,e)},t.prototype.toString=function(){return this.format()},e.exports=t,n.isRange=t.isRange,n.parse=t.parse},function(e,n,r){function t(){if(!(this instanceof t))throw new SyntaxError("Index constructor must be called with the new operator");this._ranges=[];for(var e=0,n=arguments.length;n>e;e++){var r=arguments[e];if(r instanceof a)this._ranges.push(r);else if(r&&(r=r.valueOf()),c(r))this._ranges.push(i(r));else{if(!u(r))throw new TypeError("Range expected as Array, Number, or String");this._ranges.push(i([r,r+1]))}}}function i(e){for(var n=e.length,r=0;n>r;r++)if(!u(e[r])||!f(e[r]))throw new TypeError("Index parameters must be integer numbers");switch(e.length){case 2:return new a(e[0],e[1]);case 3:return new a(e[0],e[1],e[2]);default:throw new SyntaxError("Wrong number of arguments in Index (2 or 3 expected)")}}{var o=r(117),a=r(8),s=o.number,u=s.isNumber,f=s.isInteger,c=Array.isArray;o.array.validateIndex}t.prototype.clone=function(){var e=new t;return e._ranges=o.object.clone(this._ranges),e},t.isIndex=function(e){return e instanceof t},t.create=function(e){var n=new t;return t.apply(n,e),n},t.prototype.size=function l(){for(var l=[],e=0,n=this._ranges.length;n>e;e++){var r=this._ranges[e];l[e]=r.size()[0]}return l},t.prototype.max=function(){for(var e=[],n=0,r=this._ranges.length;r>n;n++){var t=this._ranges[n];e[n]=t.max()}return e},t.prototype.min=function(){for(var e=[],n=0,r=this._ranges.length;r>n;n++){var t=this._ranges[n];e[n]=t.min()}return e},t.prototype.forEach=function(e){for(var n=0,r=this._ranges.length;r>n;n++)e(this._ranges[n],n,this)},t.prototype.range=function(e){return this._ranges[e]},t.prototype.isScalar=function(){for(var e=this.size(),n=0,r=e.length;r>n;n++)if(1!==e[n])return!1;return!0},t.prototype.toArray=function(){for(var e=[],n=0,r=this._ranges.length;r>n;n++){var t=this._ranges[n],i=[],o=t.start,a=t.end,s=t.step;if(s>0)for(;a>o;)i.push(o),o+=s;else if(0>s)for(;o>a;)i.push(o),o+=s;e.push(i)}return e},t.prototype.valueOf=t.prototype.toArray,t.prototype.toString=function(){for(var e=[],n=0,r=this._ranges.length;r>n;n++){var t=this._ranges[n],i=s.format(t.start);1!=t.step&&(i+=":"+s.format(t.step)),i+=":"+s.format(t.end),e.push(i)}return"["+e.join(",")+"]"},e.exports=t,n.isIndex=t.isIndex,n.create=t.create},function(e,n,r){function t(e){if(!(this instanceof t))throw new SyntaxError("Matrix constructor must be called with the new operator");if(e instanceof t)this._data=e.clone()._data;else if(g(e))this._data=f(e);else{if(null!=e)throw new TypeError("Unsupported type of data ("+c.types.type(e)+")");this._data=[]}this._size=p.size(this._data)}function i(e,n){if(!(n instanceof l))throw new TypeError("Invalid index");var r=n.isScalar();if(r)return e.get(n.min());var i=n.size();if(i.length!=e._size.length)throw new RangeError("Dimension mismatch ("+i.length+" != "+e._size.length+")");for(var a=new t(o(e._data,n,i.length,0));g(a._data)&&1==a._data.length;)a._data=a._data[0],a._size.shift();return a}function o(e,n,r,t){var i=t==r-1,a=n.range(t);return a.map(i?function(n){return d(n,e.length),e[n]}:function(i){d(i,e.length);var a=e[i];return o(a,n,r,t+1)})}function a(e,n,r,i){if(!(n instanceof l))throw new TypeError("Invalid index");var o,a=n.size(),f=n.isScalar();if(r instanceof t?(o=r.size(),r=r.valueOf()):o=p.size(r),f){if(0!=o.length)throw new TypeError("Scalar value expected");e.set(n.min(),r,i)}else{if(a.lengthc;c++)r=[r],o.unshift(1);if(!h.deepEqual(a,o))throw new RangeError("Dimensions mismatch ("+m.format(a)+" != "+m.format(o)+")");var d=n.max().map(function(e){return e+1});u(e,d,i);var x=a.length,v=0;s(e._data,n,r,x,v)}return e}function s(e,n,r,t,i){var o=i==t-1,a=n.range(i);a.forEach(o?function(n,t){d(n),e[n]=r[t]}:function(o,a){d(o),s(e[o],n,r[a],t,i+1)})}function u(e,n,r){if(!g(n))throw new Error("Array expected");for(var t=h.clone(e._size),i=!1;t.lengtho;o++)n[o]>t[o]&&(t[o]=n[o],i=!0);i&&e.resize(t,r)}function f(e){for(var n=0,r=e.length;r>n;n++){var i=e[n];g(i)?e[n]=f(i):i instanceof t&&(e[n]=f(i._data))}return e}var c=r(117),l=r(9),m=(c.number,c.string),p=c.array,h=c.object,g=Array.isArray,d=p.validateIndex;t.isMatrix=function(e){return e instanceof t},t.prototype.subset=function(e,n,r){switch(arguments.length){case 1:return i(this,e);case 2:case 3:return a(this,e,n,r);default:throw new SyntaxError("Wrong number of arguments")}},t.prototype.get=function(e){if(!g(e))throw new Error("Array expected");if(e.length!=this._size.length)throw new RangeError("Dimension mismatch ("+e.length+" != "+this._size.length+")");for(var n=this._data,r=0,t=e.length;t>r;r++){var i=e[r];d(i,n.length),n=n[i]}return h.clone(n)},t.prototype.set=function(e,n,r){var t,i;if(!g(e))throw new Error("Array expected");if(e.lengtht;t++){var s=e[t];d(s,a.length),a=a[s]}return s=e[e.length-1],d(s,a.length),a[s]=n,this},t.prototype.resize=function(e,n){return this._size=h.clone(e),this._data=p.resize(this._data,this._size,n),this},t.prototype.clone=function(){var e=new t;return e._data=h.clone(this._data),e._size=h.clone(this._size),e},t.prototype.size=function(){return this._size},t.prototype.map=function(e){var n=this,r=new t,i=[],o=function(r,t){return g(r)?r.map(function(e,n){return i[t]=n,o(e,t+1)}):e(r,i,n)};return r._data=o(this._data,0),r._size=h.clone(this._size),r},t.prototype.forEach=function(e){var n=this,r=[],t=function(i,o){g(i)?i.forEach(function(e,n){r[o]=n,t(e,o+1)}):e(i,r,n)};t(this._data,0)},t.prototype.toArray=function(){return h.clone(this._data)},t.prototype.valueOf=function(){return this._data},t.prototype.format=function(e){return m.format(this._data,e)},t.prototype.toString=function(){return m.format(this._data)},e.exports=t,n.isMatrix=t.isMatrix},function(e,n,r){function t(e,n){if(!(this instanceof t))throw new Error("Unit constructor must be called with the new operator");if(null!=e&&!v(e))throw new TypeError("First parameter in Unit constructor must be a number");if(null!=n&&!w(n))throw new TypeError("Second parameter in Unit constructor must be a string");if(null!=n){var r=l(n);if(!r)throw new SyntaxError('Unknown unit "'+n+'"');this.unit=r.unit,this.prefix=r.prefix}else this.unit=UNIT_NONE,this.prefix=y;null!=e?(this.value=this._normalize(e),this.fixPrefix=!1):(this.value=null,this.fixPrefix=!0)}function i(){for(;" "==h||" "==h;)s()}function o(e){return e>="0"&&"9">=e||"."==e}function a(e){return e>="0"&&"9">=e}function s(){p++,h=m.charAt(p)}function u(e){p=e,h=m.charAt(p)}function f(){var e,n="";if(e=p,"+"==h?s():"-"==h&&(n+=h,s()),!o(h))return u(e),null;if("."==h){if(n+=h,s(),!a(h))return u(e),null}else{for(;a(h);)n+=h,s();"."==h&&(n+=h,s())}for(;a(h);)n+=h,s();if("E"==h||"e"==h){if(n+=h,s(),("+"==h||"-"==h)&&(n+=h,s()),!a(h))return u(e),null;for(;a(h);)n+=h,s()}return n}function c(){var e="";for(i();h&&" "!=h&&" "!=h;)e+=h,s();return e||null}function l(e){for(var n in N)if(N.hasOwnProperty(n)&&x.endsWith(e,n)){var r=N[n],t=e.length-n.length,i=e.substring(0,t),o=r.prefixes[i];if(void 0!==o)return{unit:r,prefix:o}}return null}var m,p,h,g=r(117),d=g.number,x=g.string,v=g.number.isNumber,w=g.string.isString;t.parse=function(e){if(m=e,p=-1,h="",!w(m))return null;s(),i();var n,r=f();return r?(n=c(),s(),i(),h?null:r&&n?new t(Number(r),n):null):(n=c(),s(),i(),h?null:new t(null,n))},t.isUnit=function(e){return e instanceof t},t.prototype.clone=function(){var e=new t;for(var n in this)this.hasOwnProperty(n)&&(e[n]=this[n]);return e},t.prototype._normalize=function(e){return(e+this.unit.offset)*this.unit.value*this.prefix.value},t.prototype._unnormalize=function(e,n){return void 0==n?e/this.unit.value/this.prefix.value-this.unit.offset:e/this.unit.value/n-this.unit.offset},t.isPlainUnit=function(e){return null!=l(e)},t.prototype.hasBase=function(e){return void 0===this.unit.base?void 0===e:this.unit.base===e},t.prototype.equalBase=function(e){return this.unit.base===e.unit.base},t.prototype.equals=function(e){return this.equalBase(e)&&this.value==e.value},t.prototype.to=function(e){var n;if(w(e)){if(n=new t(null,e),!this.equalBase(n))throw new Error("Units do not match");return n.value=this.value,n}if(e instanceof t){if(!this.equalBase(e))throw new Error("Units do not match");if(null!=e.value)throw new Error("Cannot convert to a unit with a value");if(null==e.unit)throw new Error("Unit expected on the right hand side of function in");return n=e.clone(),n.value=this.value,n.fixPrefix=!0,n}throw new Error("String or Unit expected as parameter")},t.prototype.toNumber=function(e){var n=this.to(e),r=this.fixPrefix?n._bestPrefix():n.prefix;return n._unnormalize(n.value,r.value)},t.prototype.toString=function(){return this.format()},t.prototype.format=function(e){var n,r;if(this.fixPrefix)n=this._unnormalize(this.value),r=null!=this.value?d.format(n,e)+" ":"",r+=this.prefix.name+this.unit.name;else{var t=this._bestPrefix();n=this._unnormalize(this.value,t.value),r=null!=this.value?d.format(n,e)+" ":"",r+=t.name+this.unit.name}return r},t.prototype._bestPrefix=function(){var e=Math.abs(this.value/this.unit.value),n=y,r=Math.abs(Math.log(e/n.value)/Math.LN10-1.2),t=this.unit.prefixes;for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];if(o.scientific){var a=Math.abs(Math.log(e/o.value)/Math.LN10-1.2);r>a&&(n=o,r=a)}}return n};var b={NONE:{"":{name:"",value:1,scientific:!0}},SHORT:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:10,scientific:!1},h:{name:"h",value:100,scientific:!1},k:{name:"k",value:1e3,scientific:!0},M:{name:"M",value:1e6,scientific:!0},G:{name:"G",value:1e9,scientific:!0},T:{name:"T",value:1e12,scientific:!0},P:{name:"P",value:1e15,scientific:!0},E:{name:"E",value:1e18,scientific:!0},Z:{name:"Z",value:1e21,scientific:!0},Y:{name:"Y",value:1e24,scientific:!0},d:{name:"d",value:.1,scientific:!1},c:{name:"c",value:.01,scientific:!1},m:{name:"m",value:.001,scientific:!0},u:{name:"u",value:1e-6,scientific:!0},n:{name:"n",value:1e-9,scientific:!0},p:{name:"p",value:1e-12,scientific:!0},f:{name:"f",value:1e-15,scientific:!0},a:{name:"a",value:1e-18,scientific:!0},z:{name:"z",value:1e-21,scientific:!0},y:{name:"y",value:1e-24,scientific:!0}},LONG:{"":{name:"",value:1,scientific:!0},deca:{name:"deca",value:10,scientific:!1},hecto:{name:"hecto",value:100,scientific:!1},kilo:{name:"kilo",value:1e3,scientific:!0},mega:{name:"mega",value:1e6,scientific:!0},giga:{name:"giga",value:1e9,scientific:!0},tera:{name:"tera",value:1e12,scientific:!0},peta:{name:"peta",value:1e15,scientific:!0},exa:{name:"exa",value:1e18,scientific:!0},zetta:{name:"zetta",value:1e21,scientific:!0},yotta:{name:"yotta",value:1e24,scientific:!0},deci:{name:"deci",value:.1,scientific:!1},centi:{name:"centi",value:.01,scientific:!1},milli:{name:"milli",value:.001,scientific:!0},micro:{name:"micro",value:1e-6,scientific:!0},nano:{name:"nano",value:1e-9,scientific:!0},pico:{name:"pico",value:1e-12,scientific:!0},femto:{name:"femto",value:1e-15,scientific:!0},atto:{name:"atto",value:1e-18,scientific:!0},zepto:{name:"zepto",value:1e-21,scientific:!0},yocto:{name:"yocto",value:1e-24,scientific:!0}},SQUARED:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:100,scientific:!1},h:{name:"h",value:1e4,scientific:!1},k:{name:"k",value:1e6,scientific:!0},M:{name:"M",value:1e12,scientific:!0},G:{name:"G",value:1e18,scientific:!0},T:{name:"T",value:1e24,scientific:!0},P:{name:"P",value:1e30,scientific:!0},E:{name:"E",value:1e36,scientific:!0},Z:{name:"Z",value:1e42,scientific:!0},Y:{name:"Y",value:1e48,scientific:!0},d:{name:"d",value:.01,scientific:!1},c:{name:"c",value:1e-4,scientific:!1},m:{name:"m",value:1e-6,scientific:!0},u:{name:"u",value:1e-12,scientific:!0},n:{name:"n",value:1e-18,scientific:!0},p:{name:"p",value:1e-24,scientific:!0},f:{name:"f",value:1e-30,scientific:!0},a:{name:"a",value:1e-36,scientific:!0},z:{name:"z",value:1e-42,scientific:!0},y:{name:"y",value:1e-42,scientific:!0}},CUBIC:{"":{name:"",value:1,scientific:!0},da:{name:"da",value:1e3,scientific:!1},h:{name:"h",value:1e6,scientific:!1},k:{name:"k",value:1e9,scientific:!0},M:{name:"M",value:1e18,scientific:!0},G:{name:"G",value:1e27,scientific:!0},T:{name:"T",value:1e36,scientific:!0},P:{name:"P",value:1e45,scientific:!0},E:{name:"E",value:1e54,scientific:!0},Z:{name:"Z",value:1e63,scientific:!0},Y:{name:"Y",value:1e72,scientific:!0},d:{name:"d",value:.001,scientific:!1},c:{name:"c",value:1e-6,scientific:!1},m:{name:"m",value:1e-9,scientific:!0},u:{name:"u",value:1e-18,scientific:!0},n:{name:"n",value:1e-27,scientific:!0},p:{name:"p",value:1e-36,scientific:!0},f:{name:"f",value:1e-45,scientific:!0},a:{name:"a",value:1e-54,scientific:!0},z:{name:"z",value:1e-63,scientific:!0},y:{name:"y",value:1e-72,scientific:!0}},BINARY_SHORT:{"":{name:"",value:1,scientific:!0},k:{name:"k",value:1024,scientific:!0},M:{name:"M",value:Math.pow(1024,2),scientific:!0},G:{name:"G",value:Math.pow(1024,3),scientific:!0},T:{name:"T",value:Math.pow(1024,4),scientific:!0},P:{name:"P",value:Math.pow(1024,5),scientific:!0},E:{name:"E",value:Math.pow(1024,6),scientific:!0},Z:{name:"Z",value:Math.pow(1024,7),scientific:!0},Y:{name:"Y",value:Math.pow(1024,8),scientific:!0},Ki:{name:"Ki",value:1024,scientific:!0},Mi:{name:"Mi",value:Math.pow(1024,2),scientific:!0},Gi:{name:"Gi",value:Math.pow(1024,3),scientific:!0},Ti:{name:"Ti",value:Math.pow(1024,4),scientific:!0},Pi:{name:"Pi",value:Math.pow(1024,5),scientific:!0},Ei:{name:"Ei",value:Math.pow(1024,6),scientific:!0},Zi:{name:"Zi",value:Math.pow(1024,7),scientific:!0},Yi:{name:"Yi",value:Math.pow(1024,8),scientific:!0}},BINARY_LONG:{"":{name:"",value:1,scientific:!0},kilo:{name:"kilo",value:1024,scientific:!0},mega:{name:"mega",value:Math.pow(1024,2),scientific:!0},giga:{name:"giga",value:Math.pow(1024,3),scientific:!0},tera:{name:"tera",value:Math.pow(1024,4),scientific:!0},peta:{name:"peta",value:Math.pow(1024,5),scientific:!0},exa:{name:"exa",value:Math.pow(1024,6),scientific:!0},zetta:{name:"zetta",value:Math.pow(1024,7),scientific:!0},yotta:{name:"yotta",value:Math.pow(1024,8),scientific:!0},kibi:{name:"kibi",value:1024,scientific:!0},mebi:{name:"mebi",value:Math.pow(1024,2),scientific:!0},gibi:{name:"gibi",value:Math.pow(1024,3),scientific:!0},tebi:{name:"tebi",value:Math.pow(1024,4),scientific:!0},pebi:{name:"pebi",value:Math.pow(1024,5),scientific:!0},exi:{name:"exi",value:Math.pow(1024,6),scientific:!0},zebi:{name:"zebi",value:Math.pow(1024,7),scientific:!0},yobi:{name:"yobi",value:Math.pow(1024,8),scientific:!0}}},y={name:"",value:1,scientific:!0},E={NONE:{},LENGTH:{},MASS:{},TIME:{},CURRENT:{},TEMPERATURE:{},LUMINOUS_INTENSITY:{},AMOUNT_OF_SUBSTANCE:{},FORCE:{},SURFACE:{},VOLUME:{},ANGLE:{},BIT:{}};BASE_UNIT_NONE={},UNIT_NONE={name:"",base:BASE_UNIT_NONE,value:1,offset:0};var N={meter:{name:"meter",base:E.LENGTH,prefixes:b.LONG,value:1,offset:0},inch:{name:"inch",base:E.LENGTH,prefixes:b.NONE,value:.0254,offset:0},foot:{name:"foot",base:E.LENGTH,prefixes:b.NONE,value:.3048,offset:0},yard:{name:"yard",base:E.LENGTH,prefixes:b.NONE,value:.9144,offset:0},mile:{name:"mile",base:E.LENGTH,prefixes:b.NONE,value:1609.344,offset:0},link:{name:"link",base:E.LENGTH,prefixes:b.NONE,value:.201168,offset:0},rod:{name:"rod",base:E.LENGTH,prefixes:b.NONE,value:5.02921,offset:0},chain:{name:"chain",base:E.LENGTH,prefixes:b.NONE,value:20.1168,offset:0},angstrom:{name:"angstrom",base:E.LENGTH,prefixes:b.NONE,value:1e-10,offset:0},m:{name:"m",base:E.LENGTH,prefixes:b.SHORT,value:1,offset:0},"in":{name:"in",base:E.LENGTH,prefixes:b.NONE,value:.0254,offset:0},ft:{name:"ft",base:E.LENGTH,prefixes:b.NONE,value:.3048,offset:0},yd:{name:"yd",base:E.LENGTH,prefixes:b.NONE,value:.9144,offset:0},mi:{name:"mi",base:E.LENGTH,prefixes:b.NONE,value:1609.344,offset:0},li:{name:"li",base:E.LENGTH,prefixes:b.NONE,value:.201168,offset:0},rd:{name:"rd",base:E.LENGTH,prefixes:b.NONE,value:5.02921,offset:0},ch:{name:"ch",base:E.LENGTH,prefixes:b.NONE,value:20.1168,offset:0},mil:{name:"mil",base:E.LENGTH,prefixes:b.NONE,value:254e-7,offset:0},m2:{name:"m2",base:E.SURFACE,prefixes:b.SQUARED,value:1,offset:0},sqin:{name:"sqin",base:E.SURFACE,prefixes:b.NONE,value:64516e-8,offset:0},sqft:{name:"sqft",base:E.SURFACE,prefixes:b.NONE,value:.09290304,offset:0},sqyd:{name:"sqyd",base:E.SURFACE,prefixes:b.NONE,value:.83612736,offset:0},sqmi:{name:"sqmi",base:E.SURFACE,prefixes:b.NONE,value:2589988.110336,offset:0},sqrd:{name:"sqrd",base:E.SURFACE,prefixes:b.NONE,value:25.29295,offset:0},sqch:{name:"sqch",base:E.SURFACE,prefixes:b.NONE,value:404.6873,offset:0},sqmil:{name:"sqmil",base:E.SURFACE,prefixes:b.NONE,value:6.4516e-10,offset:0},m3:{name:"m3",base:E.VOLUME,prefixes:b.CUBIC,value:1,offset:0},L:{name:"L",base:E.VOLUME,prefixes:b.SHORT,value:.001,offset:0},l:{name:"l",base:E.VOLUME,prefixes:b.SHORT,value:.001,offset:0},litre:{name:"litre",base:E.VOLUME,prefixes:b.LONG,value:.001,offset:0},cuin:{name:"cuin",base:E.VOLUME,prefixes:b.NONE,value:16387064e-12,offset:0},cuft:{name:"cuft",base:E.VOLUME,prefixes:b.NONE,value:.028316846592,offset:0},cuyd:{name:"cuyd",base:E.VOLUME,prefixes:b.NONE,value:.764554857984,offset:0},teaspoon:{name:"teaspoon",base:E.VOLUME,prefixes:b.NONE,value:5e-6,offset:0},tablespoon:{name:"tablespoon",base:E.VOLUME,prefixes:b.NONE,value:15e-6,offset:0},minim:{name:"minim",base:E.VOLUME,prefixes:b.NONE,value:6.161152e-8,offset:0},fluiddram:{name:"fluiddram",base:E.VOLUME,prefixes:b.NONE,value:36966911e-13,offset:0},fluidounce:{name:"fluidounce",base:E.VOLUME,prefixes:b.NONE,value:2957353e-11,offset:0},gill:{name:"gill",base:E.VOLUME,prefixes:b.NONE,value:.0001182941,offset:0},cc:{name:"cc",base:E.VOLUME,prefixes:b.NONE,value:1e-6,offset:0},cup:{name:"cup",base:E.VOLUME,prefixes:b.NONE,value:.0002365882,offset:0},pint:{name:"pint",base:E.VOLUME,prefixes:b.NONE,value:.0004731765,offset:0},quart:{name:"quart",base:E.VOLUME,prefixes:b.NONE,value:.0009463529,offset:0},gallon:{name:"gallon",base:E.VOLUME,prefixes:b.NONE,value:.003785412,offset:0},beerbarrel:{name:"beerbarrel",base:E.VOLUME,prefixes:b.NONE,value:.1173478,offset:0},oilbarrel:{name:"oilbarrel",base:E.VOLUME,prefixes:b.NONE,value:.1589873,offset:0},hogshead:{name:"hogshead",base:E.VOLUME,prefixes:b.NONE,value:.238481,offset:0},fldr:{name:"fldr",base:E.VOLUME,prefixes:b.NONE,value:36966911e-13,offset:0},floz:{name:"floz",base:E.VOLUME,prefixes:b.NONE,value:2957353e-11,offset:0},gi:{name:"gi",base:E.VOLUME,prefixes:b.NONE,value:.0001182941,offset:0},cp:{name:"cp",base:E.VOLUME,prefixes:b.NONE,value:.0002365882,offset:0},pt:{name:"pt",base:E.VOLUME,prefixes:b.NONE,value:.0004731765,offset:0},qt:{name:"qt",base:E.VOLUME,prefixes:b.NONE,value:.0009463529,offset:0},gal:{name:"gal",base:E.VOLUME,prefixes:b.NONE,value:.003785412,offset:0},bbl:{name:"bbl",base:E.VOLUME,prefixes:b.NONE,value:.1173478,offset:0},obl:{name:"obl",base:E.VOLUME,prefixes:b.NONE,value:.1589873,offset:0},g:{name:"g",base:E.MASS,prefixes:b.SHORT,value:.001,offset:0},gram:{name:"gram",base:E.MASS,prefixes:b.LONG,value:.001,offset:0},ton:{name:"ton",base:E.MASS,prefixes:b.SHORT,value:907.18474,offset:0},tonne:{name:"tonne",base:E.MASS,prefixes:b.SHORT,value:1e3,offset:0},grain:{name:"grain",base:E.MASS,prefixes:b.NONE,value:6479891e-11,offset:0},dram:{name:"dram",base:E.MASS,prefixes:b.NONE,value:.0017718451953125,offset:0},ounce:{name:"ounce",base:E.MASS,prefixes:b.NONE,value:.028349523125,offset:0},poundmass:{name:"poundmass",base:E.MASS,prefixes:b.NONE,value:.45359237,offset:0},hundredweight:{name:"hundredweight",base:E.MASS,prefixes:b.NONE,value:45.359237,offset:0},stick:{name:"stick",base:E.MASS,prefixes:b.NONE,value:.115,offset:0},gr:{name:"gr",base:E.MASS,prefixes:b.NONE,value:6479891e-11,offset:0},dr:{name:"dr",base:E.MASS,prefixes:b.NONE,value:.0017718451953125,offset:0},oz:{name:"oz",base:E.MASS,prefixes:b.NONE,value:.028349523125,offset:0},lbm:{name:"lbm",base:E.MASS,prefixes:b.NONE,value:.45359237,offset:0},cwt:{name:"cwt",base:E.MASS,prefixes:b.NONE,value:45.359237,offset:0},s:{name:"s",base:E.TIME,prefixes:b.SHORT,value:1,offset:0},min:{name:"min",base:E.TIME,prefixes:b.NONE,value:60,offset:0},h:{name:"h",base:E.TIME,prefixes:b.NONE,value:3600,offset:0},second:{name:"second",base:E.TIME,prefixes:b.LONG,value:1,offset:0},sec:{name:"sec",base:E.TIME,prefixes:b.LONG,value:1,offset:0},minute:{name:"minute",base:E.TIME,prefixes:b.NONE,value:60,offset:0},hour:{name:"hour",base:E.TIME,prefixes:b.NONE,value:3600,offset:0},day:{name:"day",base:E.TIME,prefixes:b.NONE,value:86400,offset:0},rad:{name:"rad",base:E.ANGLE,prefixes:b.NONE,value:1,offset:0},deg:{name:"deg",base:E.ANGLE,prefixes:b.NONE,value:.017453292519943295,offset:0},grad:{name:"grad",base:E.ANGLE,prefixes:b.NONE,value:.015707963267948967,offset:0},cycle:{name:"cycle",base:E.ANGLE,prefixes:b.NONE,value:6.283185307179586,offset:0},A:{name:"A",base:E.CURRENT,prefixes:b.SHORT,value:1,offset:0},ampere:{name:"ampere",base:E.CURRENT,prefixes:b.LONG,value:1,offset:0},K:{name:"K",base:E.TEMPERATURE,prefixes:b.NONE,value:1,offset:0},degC:{name:"degC",base:E.TEMPERATURE,prefixes:b.NONE,value:1,offset:273.15},degF:{name:"degF",base:E.TEMPERATURE,prefixes:b.NONE,value:1/1.8,offset:459.67},degR:{name:"degR",base:E.TEMPERATURE,prefixes:b.NONE,value:1/1.8,offset:0},kelvin:{name:"kelvin",base:E.TEMPERATURE,prefixes:b.NONE,value:1,offset:0},celsius:{name:"celsius",base:E.TEMPERATURE,prefixes:b.NONE,value:1,offset:273.15},fahrenheit:{name:"fahrenheit",base:E.TEMPERATURE,prefixes:b.NONE,value:1/1.8,offset:459.67},rankine:{name:"rankine",base:E.TEMPERATURE,prefixes:b.NONE,value:1/1.8,offset:0},mol:{name:"mol",base:E.AMOUNT_OF_SUBSTANCE,prefixes:b.NONE,value:1,offset:0},mole:{name:"mole",base:E.AMOUNT_OF_SUBSTANCE,prefixes:b.NONE,value:1,offset:0},cd:{name:"cd",base:E.LUMINOUS_INTENSITY,prefixes:b.NONE,value:1,offset:0},candela:{name:"candela",base:E.LUMINOUS_INTENSITY,prefixes:b.NONE,value:1,offset:0},N:{name:"N",base:E.FORCE,prefixes:b.SHORT,value:1,offset:0},newton:{name:"newton",base:E.FORCE,prefixes:b.LONG,value:1,offset:0},lbf:{name:"lbf",base:E.FORCE,prefixes:b.NONE,value:4.4482216152605,offset:0},poundforce:{name:"poundforce",base:E.FORCE,prefixes:b.NONE,value:4.4482216152605,offset:0},b:{name:"b",base:E.BIT,prefixes:b.BINARY_SHORT,value:1,offset:0},bits:{name:"bits",base:E.BIT,prefixes:b.BINARY_LONG,value:1,offset:0},B:{name:"B",base:E.BIT,prefixes:b.BINARY_SHORT,value:8,offset:0},bytes:{name:"bytes",base:E.BIT,prefixes:b.BINARY_LONG,value:8,offset:0}},M={meters:"meter",inches:"inch",feet:"foot",yards:"yard",miles:"mile",links:"link",rods:"rod",chains:"chain",angstroms:"angstrom",litres:"litre",teaspoons:"teaspoon",tablespoons:"tablespoon",minims:"minim",fluiddrams:"fluiddram",fluidounces:"fluidounce",gills:"gill",cups:"cup",pints:"pint",quarts:"quart",gallons:"gallon",beerbarrels:"beerbarrel",oilbarrels:"oilbarrel",hogsheads:"hogshead",grams:"gram",tons:"ton",tonnes:"tonne",grains:"grain",drams:"dram",ounces:"ounce",poundmasses:"poundmass",hundredweights:"hundredweight",sticks:"stick",seconds:"second",minutes:"minute",hours:"hour",days:"day",radians:"rad",degrees:"deg",gradients:"grad",cycles:"cycle",amperes:"ampere",moles:"mole"}; +for(var A in M)if(M.hasOwnProperty(A)){var O=N[M[A]],T=Object.create(O);T.name=A,N[A]=T}N.lt=N.l,N.liter=N.litre,N.liters=N.litres,N.lb=N.lbm,t.PREFIXES=b,t.BASE_UNITS=E,t.UNITS=N,e.exports=t,n.isUnit=t.isUnit,n.isPlainUnit=t.isPlainUnit,n.parse=t.parse},function(e,n,r){function t(e,n){this.math=e,this.doc=n}var i=r(117),o=i.object,a=i.string;t.isHelp=function(e){return e instanceof t},t.prototype.toString=function(){var e=this.doc||{},n="\n";if(e.name&&(n+="Name: "+e.name+"\n\n"),e.category&&(n+="Category: "+e.category+"\n\n"),e.description&&(n+="Description:\n "+e.description+"\n\n"),e.syntax&&(n+="Syntax:\n "+e.syntax.join("\n ")+"\n\n"),e.examples){var r=this.math.parser();n+="Examples:\n";for(var i=0;i=n){if(s(e[0])){for(f=i(e),a=[],o=0;or;r++){var a=[];for(n=0;t>n;n++)a.push(e[n][r]);o.push(a)}return o}{var o=r(117),a=r(10),s=o.array.isArray;o.string.isString}n.argsToArray=function(e){var n;return 0==e.length?n=[]:1==e.length?(n=e[0],n instanceof a&&(n=n.valueOf()),s(n)||(n=[n])):n=Array.prototype.slice.apply(e),n},n.isCollection=function(e){return s(e)||e instanceof a},n.deepMap=function u(e,n){return e&&"function"==typeof e.map?e.map(function(e){return u(e,n)}):n(e)},n.deepMap2=function f(e,n,r){var t,i,o;if(s(e))if(s(n)){if(e.length!=n.length)throw new RangeError("Dimension mismatch ("+e.length+" != "+n.length+")");for(t=[],i=e.length,o=0;i>o;o++)t[o]=f(e[o],n[o],r)}else{if(n instanceof a)return t=f(e,n.valueOf(),r),new a(t);for(t=[],i=e.length,o=0;i>o;o++)t[o]=f(e[o],n,r)}else{if(e instanceof a)return n instanceof a?(t=f(e.valueOf(),n.valueOf(),r),new a(t)):(t=f(e.valueOf(),n,r),new a(t));if(s(n))for(t=[],i=n.length,o=0;i>o;o++)t[o]=f(e,n[o],r);else{if(n instanceof a)return t=f(e,n.valueOf(),r),new a(t);t=r(e,n)}}return t},n.reduce=function(e,n,r){return e instanceof a?new a(t(e.valueOf(),n,r)):t(e,n,r)},n.deepForEach=function c(e,n){e instanceof a&&(e=e.valueOf());for(var r=0,t=e.length;t>r;r++){var i=e[r];s(i)?c(i,n):n(i)}}},function(e,n,r){e.exports=function(e){var n=(r(217),{});e.error=n,n.UnsupportedTypeError=function(n,r){if(2==arguments.length){var t=e["typeof"](r);this.message="Function "+n+"("+t+") not supported"}else if(arguments.length>2){var i=Array.prototype.splice.call(arguments,1),o=i.map(function(n){return e["typeof"](n)});this.message="Function "+n+"("+o.join(", ")+") not supported"}else this.message="Unsupported type of argument in function "+n;this.stack=(new Error).stack},n.UnsupportedTypeError.prototype=new TypeError,n.UnsupportedTypeError.prototype.constructor=TypeError,n.UnsupportedTypeError.prototype.name="UnsupportedTypeError",n.ArgumentsError=function(e,n,r,t){this.message="Wrong number of arguments in function "+e+" ("+n+" provided, "+r+(void 0!=t?"-"+t:"")+" expected)",this.stack=(new Error).stack},n.ArgumentsError.prototype=new Error,n.ArgumentsError.prototype.constructor=Error,n.ArgumentsError.prototype.name="ArgumentError"}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(13),i=n.string.isString,o=t.isCollection;e.eval=function(n,r){if(1!=arguments.length&&2!=arguments.length)throw new e.error.ArgumentsError("eval",arguments.length,1,2);if(r=r||{},i(n))return e.parse(n).compile(e).eval(r);if(o(n))return t.deepMap(n,function(n){return e.parse(n).compile(e).eval(r)});throw new TypeError("String or matrix expected")}}},function(e,n,r){e.exports=function(e){var n=r(12);e.help=function(r){if(1!=arguments.length)throw new SyntaxError("Wrong number of arguments in function help ("+arguments.length+" provided, 1 expected)");var t=null;if(r instanceof String||"string"==typeof r)t=r;else{var i;for(i in e)if(e.hasOwnProperty(i)&&r===e[i]){t=i;break}if(!t)for(i in e.type)if(e.type.hasOwnProperty(i)&&r===e.type[i]){t=i;break}}if(t){var o=e.expression.docs[t];if(!o)throw new Error('No documentation found on "'+t+'"');return new n(e,o)}throw new Error('Could not find search term "'+r+'"')}}},function(e,n,r){e.exports=function(e){var n=r(4);e.parse=function(){return n.apply(n,arguments)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=(r(10),r(13)),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.abs=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("abs",arguments.length,1);if(a(n))return Math.abs(n);if(u(n))return Math.sqrt(n.re*n.re+n.im*n.im);if(n instanceof t)return n.abs();if(f(n))return o.deepMap(n,c);if(s(n))return Math.abs(n);throw new e.error.UnsupportedTypeError("abs",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=(r(10),r(11)),a=r(13),s=n["boolean"].isBoolean,u=n.number.isNumber,f=n.number.toNumber,c=n.number.toBigNumber,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.add=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("add",arguments.length,2);if(u(n)){if(u(r))return n+r;if(m(r))return new i(n+r.re,r.im)}if(m(n)){if(m(r))return new i(n.re+r.re,n.im+r.im);if(u(r))return new i(n.re+r,n.im)}if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Units do not match");if(null==n.value)throw new Error("Unit on left hand side of operator + has an undefined value");if(null==r.value)throw new Error("Unit on right hand side of operator + has an undefined value");var o=n.clone();return o.value+=r.value,o.fixPrefix=!1,o}if(n instanceof t)return u(r)?r=c(r):s(r)&&(r=new t(r?1:0)),r instanceof t?n.plus(r):g(f(n),r);if(r instanceof t)return u(n)?n=c(n):s(n)&&(n=new t(n?1:0)),n instanceof t?n.plus(r):g(n,f(r));if(l(n)||l(r))return n+r;if(h(n)||h(r))return a.deepMap2(n,r,g);if(s(n))return g(+n,r);if(s(r))return g(n,+r);throw new e.error.UnsupportedTypeError("add",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=o.isCollection,f=i.isComplex;e.ceil=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("ceil",arguments.length,1);if(a(n))return Math.ceil(n);if(f(n))return new i(Math.ceil(n.re),Math.ceil(n.im));if(n instanceof t)return n.ceil();if(u(n))return o.deepMap(n,c);if(s(n))return Math.ceil(n);throw new e.error.UnsupportedTypeError("ceil",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.cube=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("cube",arguments.length,1);if(a(n))return n*n*n;if(u(n))return e.multiply(e.multiply(n,n),n);if(n instanceof t)return n.times(n).times(n);if(f(n))return o.deepMap(n,c);if(s(n))return c(+n);throw new e.error.UnsupportedTypeError("cube",n)}}},function(e,n,r){e.exports=function(e){function n(e,n){var r=n.re*n.re+n.im*n.im;return 0!=r?new o((e.re*n.re+e.im*n.im)/r,(e.im*n.re-e.re*n.im)/r):new o(0!=e.re?e.re/0:0,0!=e.im?e.im/0:0)}var t=r(117),i=r(220),o=r(7),a=(r(10),r(11)),s=r(13),u=t.number.isNumber,f=t.number.toNumber,c=t.number.toBigNumber,l=t["boolean"].isBoolean,m=o.isComplex,p=a.isUnit,h=s.isCollection;e.divide=function g(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("divide",arguments.length,2);if(u(r)){if(u(t))return r/t;if(m(t))return n(new o(r,0),t)}if(m(r)){if(m(t))return n(r,t);if(u(t))return n(r,new o(t,0))}if(r instanceof i)return u(t)?t=c(t):l(t)&&(t=new i(t?1:0)),t instanceof i?r.div(t):g(f(r),t);if(t instanceof i)return u(r)?r=c(r):l(r)&&(r=new i(r?1:0)),r instanceof i?r.div(t):g(r,f(t));if(p(r)&&u(t)){var a=r.clone();return a.value/=t,a}if(h(r))return h(t)?e.multiply(r,e.inv(t)):s.deepMap2(r,t,g);if(h(t))return e.multiply(r,e.inv(t));if(l(r))return g(+r,t);if(l(t))return g(r,+t);throw new e.error.UnsupportedTypeError("divide",r,t)}}},function(e,n,r){e.exports=function(e){var n=r(13);e.edivide=function(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("edivide",arguments.length,2);return n.deepMap2(r,t,e.divide)}}},function(e,n,r){e.exports=function(e){var n=r(13);e.emultiply=function(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("emultiply",arguments.length,2);return n.deepMap2(r,t,e.multiply)}}},function(e,n,r){e.exports=function(e){var n=r(13);e.epow=function(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("epow",arguments.length,2);return n.deepMap2(r,t,e.pow)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n.number.toNumber,f=n.number.toBigNumber,c=n["boolean"].isBoolean,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.equal=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("equal",arguments.length,2);if(s(n)){if(s(r))return n==r;if(m(r))return n==r.re&&0==r.im}if(m(n)){if(s(r))return n.re==r&&0==n.im;if(m(r))return n.re==r.re&&n.im==r.im}if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?n.eq(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?n.eq(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.value==r.value}if(l(n)||l(r))return n==r;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);throw new e.error.UnsupportedTypeError("equal",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=(r(10),r(13)),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.exp=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("exp",arguments.length,1);if(a(r))return Math.exp(r);if(u(r)){var l=Math.exp(r.re);return new i(l*Math.cos(r.im),l*Math.sin(r.im))}if(r instanceof t)return c(n.number.toNumber(r));if(f(r))return o.deepMap(r,c);if(s(r))return Math.exp(r);throw new e.error.UnsupportedTypeError("exp",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.fix=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("fix",arguments.length,1);if(a(n))return n>0?Math.floor(n):Math.ceil(n);if(u(n))return new i(n.re>0?Math.floor(n.re):Math.ceil(n.re),n.im>0?Math.floor(n.im):Math.ceil(n.im));if(n instanceof t)return n.isNegative()?n.ceil():n.floor();if(f(n))return o.deepMap(n,c);if(s(n))return c(+n);throw new e.error.UnsupportedTypeError("fix",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.floor=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("floor",arguments.length,1);if(a(n))return Math.floor(n);if(u(n))return new i(Math.floor(n.re),Math.floor(n.im));if(n instanceof t)return n.floor();if(f(n))return o.deepMap(n,c);if(s(n))return c(+n);throw new e.error.UnsupportedTypeError("floor",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=n.number.isNumber,a=n.number.toNumber,s=n["boolean"].isBoolean,u=n.number.isInteger,f=i.isCollection;e.gcd=function c(){var n,r=arguments[0],l=arguments[1];if(2==arguments.length){if(o(r)&&o(l)){if(!u(r)||!u(l))throw new Error("Parameters in function gcd must be integer numbers");for(;0!=l;)n=r%l,r=l,l=n;return 0>r?-r:r}if(f(r)||f(l))return i.deepMap2(r,l,c);if(r instanceof t)return c(a(r),l);if(l instanceof t)return c(r,a(l));if(s(r))return c(+r,l);if(s(l))return c(r,+l);throw new e.error.UnsupportedTypeError("gcd",r,l)}if(arguments.length>2){for(var m=1;mr;if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?n.gt(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?n.gt(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.value>r.value}if(l(n)||l(r))return n>r;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);if(m(n)||m(r))throw new TypeError("No ordering relation is defined for complex numbers");throw new e.error.UnsupportedTypeError("larger",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n.number.toNumber,f=n.number.toBigNumber,c=n["boolean"].isBoolean,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.largereq=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("largereq",arguments.length,2);if(s(n)&&s(r))return n>=r;if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?n.gte(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?n.gte(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.value>=r.value}if(l(n)||l(r))return n>=r;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);if(m(n)||m(r))throw new TypeError("No ordering relation is defined for complex numbers");throw new e.error.UnsupportedTypeError("largereq",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=n.number.isNumber,a=n.number.toNumber,s=n["boolean"].isBoolean,u=n.number.isInteger,f=i.isCollection;e.lcm=function c(){var n,r=arguments[0],l=arguments[1];if(2==arguments.length){if(o(r)&&o(l)){if(!u(r)||!u(l))throw new Error("Parameters in function lcm must be integer numbers");if(0==r||0==l)return 0;for(var m=r*l;0!=l;)n=l,l=r%n,r=n;return Math.abs(m/r)}if(f(r)||f(l))return i.deepMap2(r,l,c);if(s(r))return c(+r,l);if(s(l))return c(r,+l);if(r instanceof t)return c(a(r),l);if(l instanceof t)return c(r,a(l));throw new e.error.UnsupportedTypeError("lcm",r,l)}if(arguments.length>2){for(var p=1;p=0?Math.log(r):c(new i(r,0));if(u(r))return new i(Math.log(Math.sqrt(r.re*r.re+r.im*r.im)),Math.atan2(r.im,r.re));if(r instanceof t)return c(n.number.toNumber(r));if(f(r))return o.deepMap(r,c);if(s(r))return c(+r);throw new e.error.UnsupportedTypeError("log",r)}if(2==arguments.length)return e.divide(c(r),c(l));throw new e.error.ArgumentsError("log",arguments.length,1,2)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.log10=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("log10",arguments.length,1);if(a(r))return r>=0?Math.log(r)/Math.LN10:c(new i(r,0));if(r instanceof t)return c(n.number.toNumber(r));if(u(r))return new i(Math.log(Math.sqrt(r.re*r.re+r.im*r.im))/Math.LN10,Math.atan2(r.im,r.re)/Math.LN10);if(f(r))return o.deepMap(r,c);if(s(r))return c(+r);throw new e.error.UnsupportedTypeError("log10",r)}}},function(e,n,r){e.exports=function(e){function n(e,n){if(n>0)return e>0?e%n:0==e?0:e-n*Math.floor(e/n);if(0==n)return e;throw new Error("Cannot calculate mod for a negative divisor")}var t=r(117),i=r(220),o=r(13),a=t.number.isNumber,s=t.number.toNumber,u=t.number.toBigNumber,f=t["boolean"].isBoolean,c=o.isCollection;e.mod=function l(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("mod",arguments.length,2);if(a(r)&&a(t))return n(r,t);if(r instanceof i)return a(t)?t=u(t):f(t)&&(t=new i(t?1:0)),t instanceof i?r.mod(t):l(s(r),t);if(t instanceof i)return a(r)?r=u(r):f(r)&&(r=new i(r?1:0)),r instanceof i?r.mod(t):l(r,s(t));if(c(r)||c(t))return o.deepMap2(r,t,l);if(f(r))return l(+r,t);if(f(t))return l(r,+t);throw new e.error.UnsupportedTypeError("mod",r,t)}}},function(e,n,r){e.exports=function(e){function n(n,r){for(var t=[],i=n.length,o=r[0].length,a=n[0].length,s=0;i>s;s++){t[s]=[];for(var u=0;o>u;u++){for(var f=null,c=0;a>c;c++){var l=e.multiply(n[s][c],r[c][u]);f=null===f?l:e.add(f,l)}t[s][u]=f}}return t}function t(n,r){for(var t=[],i=r.length,o=r[0].length,a=0;o>a;a++){for(var s=null,u=0;i>u;u++){var f=e.multiply(n[u],r[u][a]);s=0===u?f:e.add(s,f)}t[a]=s}return t}function i(n,r){for(var t=[],i=n.length,o=n[0].length,a=0;i>a;a++){for(var s=null,u=0;o>u;u++){var f=e.multiply(n[a][u],r[u]);s=0===u?f:e.add(s,f)}t[a]=s}return t}function o(n,r){var t=n.length,i=null;if(t){i=0;for(var o=0,a=n.length;a>o;o++)i=e.add(i,e.multiply(n[o],r[o]))}return i}function a(e,n){return 0==e.im?0==n.im?new f(e.re*n.re,0):0==n.re?new f(0,e.re*n.im):new f(e.re*n.re,e.re*n.im):0==e.re?0==n.im?new f(0,e.im*n.re):0==n.re?new f(-e.im*n.im,0):new f(-e.im*n.im,e.im*n.re):0==n.im?new f(e.re*n.re,e.im*n.re):0==n.re?new f(-e.im*n.im,e.re*n.im):new f(e.re*n.re-e.im*n.im,e.re*n.im+e.im*n.re)}var s=r(117),u=r(220),f=r(7),c=r(10),l=r(11),m=r(13),p=s.array,h=s.number.isNumber,g=s.number.toNumber,d=s.number.toBigNumber,x=s["boolean"].isBoolean,v=f.isComplex,w=Array.isArray,b=l.isUnit;e.multiply=function y(r,s){if(2!=arguments.length)throw new e.error.ArgumentsError("multiply",arguments.length,2);if(h(r)){if(h(s))return r*s;if(v(s))return a(new f(r,0),s);if(b(s))return res=s.clone(),res.value*=r,res}if(v(r)){if(h(s))return a(r,new f(s,0));if(v(s))return a(r,s)}if(r instanceof u)return h(s)?s=d(s):x(s)&&(s=new u(s?1:0)),s instanceof u?r.times(s):y(g(r),s);if(s instanceof u)return h(r)?r=d(r):x(r)&&(r=new u(r?1:0)),r instanceof u?r.times(s):y(r,g(s));if(b(r)&&h(s))return res=r.clone(),res.value*=s,res;if(w(r)){if(w(s)){var l=p.size(r),E=p.size(s);if(1==l.length){if(1==E.length){if(l[0]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Length of A must match length of B (A is "+l[0]+", B is "+E[0]+l[0]+" != "+E[0]+")");return o(r,s)}if(2==E.length){if(l[0]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Length of A must match rows of B (A is "+l[0]+", B is "+E[0]+"x"+E[1]+", "+l[0]+" != "+E[0]+")");return t(r,s)}throw new Error("Can only multiply a 1 or 2 dimensional matrix (B has "+E.length+" dimensions)")}if(2==l.length){if(1==E.length){if(l[1]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Columns of A must match length of B (A is "+l[0]+"x"+l[0]+", B is "+E[0]+", "+l[1]+" != "+E[0]+")");return i(r,s)}if(2==E.length){if(l[1]!=E[0])throw new RangeError("Dimensions mismatch in multiplication. Columns of A must match rows of B (A is "+l[0]+"x"+l[1]+", B is "+E[0]+"x"+E[1]+", "+l[1]+" != "+E[0]+")");return n(r,s)}throw new Error("Can only multiply a 1 or 2 dimensional matrix (B has "+E.length+" dimensions)")}throw new Error("Can only multiply a 1 or 2 dimensional matrix (A has "+l.length+" dimensions)")}return s instanceof c?new c(y(r,s.valueOf())):m.deepMap2(r,s,y)}if(r instanceof c)return new c(s instanceof c?y(r.valueOf(),s.valueOf()):y(r.valueOf(),s));if(w(s))return m.deepMap2(r,s,y);if(s instanceof c)return new c(m.deepMap2(r,s.valueOf(),y));if(x(r))return y(+r,s);if(x(s))return y(r,+s);throw new e.error.UnsupportedTypeError("multiply",r,s)}}},function(e,n,r){e.exports=function(e){function n(n,r){var t=e.log(n),i=e.multiply(t,r);return e.exp(i)}var t=r(117),i=r(220),o=r(7),a=r(10),s=(r(13),t.array),u=t.number.isNumber,f=t.number.toNumber,c=t.number.toBigNumber,l=t["boolean"].isBoolean,m=Array.isArray,p=t.number.isInteger,h=o.isComplex;e.pow=function g(r,t){if(2!=arguments.length)throw new e.error.ArgumentsError("pow",arguments.length,2);if(u(r)){if(u(t))return p(t)||r>=0?Math.pow(r,t):n(new o(r,0),new o(t,0));if(h(t))return n(new o(r,0),t)}if(h(r)){if(u(t))return n(r,new o(t,0));if(h(t))return n(r,t)}if(r instanceof i)return u(t)?t=c(t):l(t)&&(t=new i(t?1:0)),t instanceof i?r.pow(t):g(f(r),t);if(t instanceof i)return u(r)?r=c(r):l(r)&&(r=new i(r?1:0)),r instanceof i?r.pow(t):g(r,f(t));if(m(r)){if(!u(t)||!p(t)||0>t)throw new TypeError("For A^b, b must be a positive integer (value is "+t+")");var d=s.size(r);if(2!=d.length)throw new Error("For A^b, A must be 2 dimensional (A has "+d.length+" dimensions)");if(d[0]!=d[1])throw new Error("For A^b, A must be square (size is "+d[0]+"x"+d[1]+")");for(var x=e.eye(d[0]).valueOf(),v=r;t>=1;)1==(1&t)&&(x=e.multiply(v,x)),t>>=1,v=e.multiply(v,v);return x}if(r instanceof a)return new a(g(r.valueOf(),t));if(l(r))return g(+r,t);if(l(t))return g(r,+t);throw new e.error.UnsupportedTypeError("pow",r,t)}}},function(e,n,r){e.exports=function(e){function n(e,n){if(n){var r=Math.pow(10,n);return Math.round(e*r)/r}return Math.round(e)}var t=r(117),i=r(220),o=r(7),a=r(13),s=t.number.isNumber,u=t.number.isInteger,f=t["boolean"].isBoolean,c=o.isComplex,l=a.isCollection;e.round=function m(r,t){if(1!=arguments.length&&2!=arguments.length)throw new e.error.ArgumentsError("round",arguments.length,1,2);if(void 0==t){if(s(r))return Math.round(r);if(c(r))return new o(Math.round(r.re),Math.round(r.im));if(r instanceof i)return r.round();if(l(r))return a.deepMap(r,m);if(f(r))return Math.round(r);throw new e.error.UnsupportedTypeError("round",r)}if(t instanceof i&&(t=parseFloat(t.valueOf())),!s(t)||!u(t))throw new TypeError("Number of decimals in function round must be an integer");if(0>t||t>9)throw new Error("Number of decimals in function round must be in te range of 0-9");if(s(r))return n(r,t);if(c(r))return new o(n(r.re,t),n(r.im,t));if(r instanceof i&&s(t))return r.round(t);if(l(r)||l(t))return a.deepMap2(r,t,m);if(f(r))return m(+r,t);if(f(t))return m(r,+t);throw new e.error.UnsupportedTypeError("round",r,t)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number,s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isCollection;e.sign=function l(n){if(1!=arguments.length)throw new e.error.ArgumentsError("sign",arguments.length,1);if(s(n))return a.sign(n);if(f(n)){var r=Math.sqrt(n.re*n.re+n.im*n.im);return new i(n.re/r,n.im/r)}if(n instanceof t)return new t(n.cmp(0));if(c(n))return o.deepMap(n,l);if(u(n))return a.sign(n);throw new e.error.UnsupportedTypeError("sign",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n.number.toNumber,f=n.number.toBigNumber,c=n["boolean"].isBoolean,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.smaller=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("smaller",arguments.length,2);if(s(n)&&s(r))return r>n;if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?n.lt(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?n.lt(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.valuen;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);if(m(n)||m(r))throw new TypeError("No ordering relation is defined for complex numbers");throw new e.error.UnsupportedTypeError("smaller",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n.number.toNumber,f=n.number.toBigNumber,c=n["boolean"].isBoolean,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.smallereq=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("smallereq",arguments.length,2);if(s(n)&&s(r))return r>=n;if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?n.lte(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?n.lte(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.value<=r.value}if(l(n)||l(r))return r>=n;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);if(m(n)||m(r))throw new TypeError("No ordering relation is defined for complex numbers");throw new e.error.UnsupportedTypeError("smallereq",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.sqrt=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("sqrt",arguments.length,1);if(a(n))return n>=0?Math.sqrt(n):c(new i(n,0));if(u(n)){var r=Math.sqrt(n.re*n.re+n.im*n.im);return n.im>=0?new i(.5*Math.sqrt(2*(r+n.re)),.5*Math.sqrt(2*(r-n.re))):new i(.5*Math.sqrt(2*(r+n.re)),-.5*Math.sqrt(2*(r-n.re)))}if(n instanceof t)return n.sqrt();if(f(n))return o.deepMap(n,c);if(s(n))return c(+n);throw new e.error.UnsupportedTypeError("sqrt",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.square=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("square",arguments.length,1);if(a(n))return n*n;if(u(n))return e.multiply(n,n);if(n instanceof t)return n.times(n);if(f(n))return o.deepMap(n,c);if(s(n))return n*n;throw new e.error.UnsupportedTypeError("square",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=(r(10),r(11)),a=r(13),s=n.number.toNumber,u=n.number.toBigNumber,f=n["boolean"].isBoolean,c=n.number.isNumber,l=i.isComplex,m=o.isUnit,p=a.isCollection;e.subtract=function h(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("subtract",arguments.length,2);if(c(n)){if(c(r))return n-r;if(l(r))return new i(n-r.re,-r.im)}else if(l(n)){if(c(r))return new i(n.re-r,n.im);if(l(r))return new i(n.re-r.re,n.im-r.im)}if(n instanceof t)return c(r)?r=u(r):f(r)&&(r=new t(r?1:0)),r instanceof t?n.minus(r):h(s(n),r);if(r instanceof t)return c(n)?n=u(n):f(n)&&(n=new t(n?1:0)),n instanceof t?n.minus(r):h(n,s(r));if(m(n)&&m(r)){if(!n.equalBase(r))throw new Error("Units do not match");if(null==n.value)throw new Error("Unit on left hand side of operator - has an undefined value");if(null==r.value)throw new Error("Unit on right hand side of operator - has an undefined value");var o=n.clone();return o.value-=r.value,o.fixPrefix=!1,o}if(p(n)||p(r))return a.deepMap2(n,r,h);if(f(n))return h(+n,r);if(f(r))return h(n,+r);throw new e.error.UnsupportedTypeError("subtract",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.unary=function m(n){if(1!=arguments.length)throw new e.error.ArgumentsError("unary",arguments.length,1);if(s(n))return-n;if(f(n))return new i(-n.re,-n.im);if(n instanceof t)return n.neg();if(c(n)){var r=n.clone();return r.value=-n.value,r}if(l(n))return a.deepMap(n,m);if(u(n))return-n;throw new e.error.UnsupportedTypeError("unary",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n.number.toNumber,f=n.number.toBigNumber,c=n["boolean"].isBoolean,l=n.string.isString,m=i.isComplex,p=o.isUnit,h=a.isCollection;e.unequal=function g(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("unequal",arguments.length,2);if(s(n)){if(s(r))return n!=r;if(m(r))return n!=r.re||0!=r.im}if(m(n)){if(s(r))return n.re!=r||0!=n.im;if(m(r))return n.re!=r.re||n.im!=r.im}if(n instanceof t)return s(r)?r=f(r):c(r)&&(r=new t(r?1:0)),r instanceof t?!n.eq(r):g(u(n),r);if(r instanceof t)return s(n)?n=f(n):c(n)&&(n=new t(n?1:0)),n instanceof t?!n.eq(r):g(n,u(r));if(p(n)&&p(r)){if(!n.equalBase(r))throw new Error("Cannot compare units with different base");return n.value!=r.value}if(l(n)||l(r))return n!=r;if(h(n)||h(r))return a.deepMap2(n,r,g);if(c(n))return g(+n,r);if(c(r))return g(n,+r);throw new e.error.UnsupportedTypeError("unequal",n,r)}}},function(e,n,r){e.exports=function(e){function n(e,n){for(var r,t,i,o=0,a=1,s=1,u=0;n;)t=Math.floor(e/n),i=e%n,r=o,o=a-t*o,a=r,r=s,s=u-t*s,u=r,e=n,n=i;return 0>e?[-e,e?-a:0,-u]:[e,e?a:0,u]}var t=r(117),i=r(220),o=t.number.toNumber,a=t.number.isNumber,s=t["boolean"].isBoolean,u=t.number.isInteger;e.xgcd=function f(r,t){if(2==arguments.length){if(a(r)&&a(t)){if(!u(r)||!u(t))throw new Error("Parameters in function xgcd must be integer numbers");return n(r,t)}if(r instanceof i)return f(o(r),t);if(t instanceof i)return f(r,o(t));if(s(r))return f(+r,t);if(s(t))return f(r,+t);throw new e.error.UnsupportedTypeError("xgcd",r,t)}throw new SyntaxError("Function xgcd expects two arguments")}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=o.isCollection,f=i.isComplex;e.arg=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("arg",arguments.length,1);if(a(r))return Math.atan2(0,r);if(f(r))return Math.atan2(r.im,r.re);if(u(r))return o.deepMap(r,c);if(s(r))return c(+r);if(r instanceof t)return c(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("arg",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.object,s=n.number.isNumber,u=n["boolean"].isBoolean,f=o.isCollection,c=i.isComplex;e.conj=function l(n){if(1!=arguments.length)throw new e.error.ArgumentsError("conj",arguments.length,1);return s(n)?n:n instanceof t?new t(n):c(n)?new i(n.re,-n.im):f(n)?o.deepMap(n,l):u(n)?+n:a.clone(n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.object,s=n.number.isNumber,u=n["boolean"].isBoolean,f=o.isCollection,c=i.isComplex;e.re=function l(n){if(1!=arguments.length)throw new e.error.ArgumentsError("re",arguments.length,1);return s(n)?n:n instanceof t?new t(n):c(n)?n.re:f(n)?o.deepMap(n,l):u(n)?+n:a.clone(n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=o.isCollection,f=i.isComplex;e.im=function c(n){if(1!=arguments.length)throw new e.error.ArgumentsError("im",arguments.length,1);return a(n)?0:n instanceof t?new t(0):f(n)?n.im:u(n)?o.deepMap(n,c):s(n)?0:0}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=i.isCollection,a=n.number.isNumber,s=n.string.isString,u=n["boolean"].isBoolean;"function"!=typeof t.prototype.clone&&(t.prototype.clone=function(){return new t(this)}),e.bignumber=function f(n){if(arguments.length>1)throw new e.error.ArgumentsError("bignumber",arguments.length,0,1);if(n instanceof t||a(n)||s(n))return new t(n);if(u(n))return new t(+n);if(o(n))return i.deepMap(n,f);if(0==arguments.length)return new t(0);throw new e.error.UnsupportedTypeError("bignumber",n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=i.isCollection,a=n.number.isNumber,s=n.string.isString;e["boolean"]=function u(n){if(1!=arguments.length)throw new e.error.ArgumentsError("boolean",arguments.length,0,1);if("true"===n||n===!0)return!0;if("false"===n||n===!1)return!1;if(n instanceof Boolean)return n?!0:!1;if(a(n))return 0!==n;if(n instanceof t)return!n.isZero();if(s(n)){var r=n.toLowerCase();if("true"===r)return!0;if("false"===r)return!1;var f=Number(n);if(""!=n&&!isNaN(f))return 0!==f}if(o(n))return i.deepMap(n,u);throw new SyntaxError(n.toString()+" is no valid boolean")}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=o.isCollection,s=n.number.isNumber,u=n.number.toNumber,f=n.string.isString,c=i.isComplex;e.complex=function l(){switch(arguments.length){case 0:return new i(0,0); +case 1:var n=arguments[0];if(s(n))return new i(n,0);if(n instanceof t)return new i(u(n),0);if(c(n))return n.clone();if(f(n)){var r=i.parse(n);if(r)return r;throw new SyntaxError('String "'+n+'" is no valid complex number')}if(a(n))return o.deepMap(n,l);throw new TypeError("Two numbers or a single string expected in function complex");case 2:var m=arguments[0],p=arguments[1];if(m instanceof t&&(m=u(m)),p instanceof t&&(p=u(p)),s(m)&&s(p))return new i(m,p);throw new TypeError("Two numbers or a single string expected in function complex");default:throw new e.error.ArgumentsError("complex",arguments.length,0,2)}}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(9),o=n.number.toNumber;e.index=function(){var e=new i,n=Array.prototype.slice.apply(arguments).map(function(e){return e instanceof t?o(e):Array.isArray(e)?e.map(function(e){return e instanceof t?o(e):e}):e});return i.apply(e,n),e}}},function(e,n,r){e.exports=function(e){var n=r(10);e.matrix=function(r){if(arguments.length>1)throw new e.error.ArgumentsError("matrix",arguments.length,0,1);return new n(r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=i.isCollection,a=n.number.toNumber,s=n.number.isNumber,u=n["boolean"].isBoolean,f=n.string.isString;e.number=function c(n){switch(arguments.length){case 0:return 0;case 1:if(o(n))return i.deepMap(n,c);if(n instanceof t)return a(n);if(f(n)){var r=Number(n);if(isNaN(r)&&(r=Number(n.valueOf())),isNaN(r))throw new SyntaxError(n.toString()+" is no valid number");return r}if(u(n))return n+0;if(s(n))return n;throw new e.error.UnsupportedTypeError("number",n);default:throw new e.error.ArgumentsError("number",arguments.length,0,1)}}}},function(e,n,r){e.exports=function(e){var n=r(5);e.parser=function(){return new n(e)}}},function(e){e.exports=function(e){e.select=function(n){return new e.chaining.Selector(n)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(13),i=n.number,o=n.number.isNumber,a=t.isCollection;e.string=function s(n){switch(arguments.length){case 0:return"";case 1:return o(n)?i.format(n):a(n)?t.deepMap(n,s):null===n?"null":n.toString();default:throw new e.error.ArgumentsError("string",arguments.length,0,1)}}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(11),o=r(13),a=o.isCollection,s=n.number.toNumber,u=n.string.isString;e.unit=function f(n){switch(arguments.length){case 1:var r=arguments[0];if(r instanceof i)return r.clone();if(u(r)){if(i.isPlainUnit(r))return new i(null,r);var c=i.parse(r);if(c)return c;throw new SyntaxError('String "'+r+'" is no valid unit')}if(a(n))return o.deepMap(n,f);throw new TypeError("A string or a number and string expected in function unit");case 2:return arguments[0]instanceof t?new i(s(arguments[0]),arguments[1]):new i(arguments[0],arguments[1]);default:throw new e.error.ArgumentsError("unit",arguments.length,1,2)}}}},function(e,n,r){e.exports=function(e){function n(e,r,t,i){if(t>i){if(e.length!=r.length)throw new Error("Dimensions mismatch ("+e.length+" != "+r.length+")");for(var o=[],a=0;ar;r++){var h=arguments[r];if(h instanceof i&&(m=!0),r==o-1&&u(h)){if(t=l,l=h,!f(l)||0>l)throw new TypeError("Dimension number must be a positive integer (dim = "+l+")");if(r>0&&l>t)throw new RangeError("Dimension out of range ("+l+" > "+t+")")}else{if(!c(h))throw new e.error.UnsupportedTypeError("concat",h);var g=a.clone(h).valueOf(),d=s.size(h.valueOf());if(p[r]=g,t=l,l=d.length-1,r>0&&l!=t)throw new RangeError("Dimension mismatch ("+t+" != "+l+")")}}if(0==p.length)throw new SyntaxError("At least one matrix expected");for(var x=p.shift();p.length;)x=n(x,p.shift(),l,0);return m?new i(x):x}}},function(e,n,r){e.exports=function(e){function n(n,r,t){if(1==r)return n[0][0];if(2==r)return e.subtract(e.multiply(n[0][0],n[1][1]),e.multiply(n[1][0],n[0][1]));for(var o=1,a=0,s=0;r>s&&!(a>=t);s++){for(var u=s;0==n[u][a];)if(u++,u==r&&(u=s,a++,a==t))return i.deepEqual(n,eye(r).valueOf())?e.round(o,6):0;if(u!=s){for(var f=0;t>f;f++){var c=n[u][f];n[u][f]=n[s][f],n[s][f]=c}o*=-1}for(var l=n[s][a],f=0;t>f;f++)n[s][f]=n[s][f]/l;o*=l;for(var m=0;r>m;m++)if(m!=s)for(var p=n[m][a],f=0;t>f;f++)n[m][f]=n[m][f]-n[s][f]*p;a++}return i.deepEqual(n,e.eye(r).valueOf())?e.round(o,6):0}var t=r(117),i=(r(10),t.object),o=t.array,a=t.string;e.det=function(r){if(1!=arguments.length)throw new e.error.ArgumentsError("det",arguments.length,1);var t=o.size(r.valueOf());switch(t.length){case 0:return i.clone(r);case 1:if(1==t[0])return i.clone(r.valueOf()[0]);throw new RangeError("Matrix must be square (size: "+a.format(t)+")");case 2:var s=t[0],u=t[1];if(s==u)return n(r.valueOf(),s,u);throw new RangeError("Matrix must be square (size: "+a.format(t)+")");default:throw new RangeError("Matrix must be two dimensional (size: "+a.format(t)+")")}}}},function(e,n,r){e.exports=function(e,n){var t=r(117),i=r(10),o=(r(13),t.object),a=t.array.isArray,s=t.number.isNumber,u=t.number.isInteger;e.diag=function(r,t){var f,c,l,m;if(1!=arguments.length&&2!=arguments.length)throw new e.error.ArgumentsError("diag",arguments.length,1,2);if(t){if(!s(t)||!u(t))throw new TypeError("Second parameter in function diag must be an integer")}else t=0;var p=t>0?t:0,h=0>t?-t:0;if(r instanceof i);else{if(!a(r))throw new TypeError("First parameter in function diag must be a Matrix or Array");r=new i(r)}var g=r.size();switch(g.length){case 1:c=r.valueOf();var d=new i,x=0;for(d.resize([c.length+h,c.length+p],x),f=d.valueOf(),m=c.length,l=0;m>l;l++)f[l+h][l+p]=o.clone(c[l]);return"array"===n.matrix?d.valueOf():d;case 2:for(c=[],f=r.valueOf(),m=Math.min(g[0]-h,g[1]-p),l=0;m>l;l++)c[l]=o.clone(f[l+h][l+p]);return"array"===n.matrix?c:new i(c);default:throw new RangeError("Matrix for function diag must be 2 dimensional")}}}},function(e,n,r){e.exports=function(e,n){var t=r(117),i=r(220),o=r(10),a=r(13),s=t.number.toNumber,u=t.number.isNumber,f=t.number.isInteger,c=Array.isArray;e.eye=function(r){var t=a.argsToArray(arguments),l=r instanceof o?!0:c(r)?!1:"matrix"===n.matrix;if(0==t.length)return l?new o:[];if(1==t.length)t[1]=t[0];else if(t.length>2)throw new e.error.ArgumentsError("eye",t.length,0,2);var m=t[0]instanceof i,p=t[0],h=t[1];if(p instanceof i&&(p=s(p)),h instanceof i&&(h=s(h)),!u(p)||!f(p)||1>p)throw new Error("Parameters in function eye must be positive integers");if(h&&(!u(h)||!f(h)||1>h))throw new Error("Parameters in function eye must be positive integers");var g=new o,d=m?new i(1):1,x=m?new i(0):0;g.resize(t.map(s),x);for(var v=e.min(t),w=g.valueOf(),b=0;v>b;b++)w[b][b]=d;return l?g:g.valueOf()}}},function(e,n,r){e.exports=function(e){function n(n,r,t){var i,o,a,s,u;if(1==r){if(s=n[0][0],0==s)throw Error("Cannot calculate inverse, determinant is zero");return[[e.divide(1,s)]]}if(2==r){var f=e.det(n);if(0==f)throw Error("Cannot calculate inverse, determinant is zero");return[[e.divide(n[1][1],f),e.divide(e.unary(n[0][1]),f)],[e.divide(e.unary(n[1][0]),f),e.divide(n[0][0],f)]]}var c=n.concat();for(i=0;r>i;i++)c[i]=c[i].concat();for(var l=e.eye(r).valueOf(),m=0;t>m;m++){for(i=m;r>i&&0==c[i][m];)i++;if(i==r||0==c[i][m])throw Error("Cannot calculate inverse, determinant is zero");i!=m&&(u=c[m],c[m]=c[i],c[i]=u,u=l[m],l[m]=l[i],l[i]=u);var p=c[m],h=l[m];for(i=0;r>i;i++){var g=c[i],d=l[i];if(i!=m){if(0!=g[m]){for(a=e.divide(e.unary(g[m]),p[m]),o=m;t>o;o++)g[o]=e.add(g[o],e.multiply(a,p[o]));for(o=0;t>o;o++)d[o]=e.add(d[o],e.multiply(a,h[o]))}}else{for(a=p[m],o=m;t>o;o++)g[o]=e.divide(g[o],a);for(o=0;t>o;o++)d[o]=e.divide(d[o],a)}}}return l}{var t=r(218),i=r(10);r(13)}e.inv=function(r){if(1!=arguments.length)throw new e.error.ArgumentsError("inv",arguments.length,1);var o=e.size(r).valueOf();switch(o.length){case 0:return e.divide(1,r);case 1:if(1==o[0])return r instanceof i?new i([e.divide(1,r.valueOf()[0])]):[e.divide(1,r[0])];throw new RangeError("Matrix must be square (size: "+t.format(o)+")");case 2:var a=o[0],s=o[1];if(a==s)return r instanceof i?new i(n(r.valueOf(),a,s)):n(r,a,s);throw new RangeError("Matrix must be square (size: "+t.format(o)+")");default:throw new RangeError("Matrix must be two dimensional (size: "+t.format(o)+")")}}}},function(e,n,r){e.exports=function(e,n){var t=r(117),i=r(220),o=r(10),a=r(13),s=t.array,u=t.number.toNumber,f=Array.isArray;e.ones=function(e){var r=a.argsToArray(arguments),t=e instanceof o?!0:f(e)?!1:"matrix"===n.matrix;if(0==r.length)return t?new o:[];var c=[],l=r[0]instanceof i?new i(1):1;return c=s.resize(c,r.map(u),l),t?new o(c):c}}},function(e,n,r){e.exports=function(e,n){function t(e,n,r){var t=[],i=e;if(r>0)for(;n>i;)t.push(i),i+=r;else if(0>r)for(;i>n;)t.push(i),i+=r;return t}function i(e,n,r){var t=[],i=e;if(r>0)for(;n>=i;)t.push(i),i+=r;else if(0>r)for(;i>=n;)t.push(i),i+=r;return t}function o(e,n,r){var t=[],i=e.clone(),o=new f(0);if(r.gt(o))for(;i.lt(n);)t.push(i),i=i.plus(r);else if(r.lt(o))for(;i.gt(n);)t.push(i),i=i.plus(r);return t}function a(e,n,r){var t=[],i=e.clone(),o=new f(0);if(r.gt(o))for(;i.lte(n);)t.push(i),i=i.plus(r);else if(r.lt(o))for(;i.gte(n);)t.push(i),i=i.plus(r);return t}function s(e){var r=e.split(":"),t=null;if("bignumber"===n.number)try{t=r.map(function(e){return new f(e)})}catch(i){return null}else{t=r.map(function(e){return parseFloat(e)});var o=t.some(function(e){return isNaN(e)});if(o)return null}switch(t.length){case 2:return{start:t[0],end:t[1],step:1};case 3:return{start:t[0],end:t[2],step:t[1]};default:return null}}var u=r(117),f=r(220),c=r(10),l=(r(13),u["boolean"].isBoolean),m=u.string.isString,p=u.number.isNumber,h=u.number.toNumber,g=u.number.toBigNumber;e.range=function(){var r,u,d,x=Array.prototype.slice.call(arguments),v=!1;switch(l(x[x.length-1])&&(v=x.pop()?!0:!1),x.length){case 1:if(!m(x[0]))throw new TypeError("Two or three numbers or a single string expected in function range");var w=s(x[0]);if(!w)throw new SyntaxError('String "'+w+'" is no valid range');r=w.start,u=w.end,d=w.step;break;case 2:r=x[0],u=x[1],d=1;break;case 3:r=x[0],u=x[1],d=x[2];break;default:throw new e.error.ArgumentsError("range",arguments.length,2,4)}if(!(p(r)||r instanceof f))throw new TypeError("Parameter start must be a number");if(!(p(u)||u instanceof f))throw new TypeError("Parameter end must be a number");if(!(p(d)||d instanceof f))throw new TypeError("Parameter step must be a number");if(!l(v))throw new TypeError("Parameter includeEnd must be a boolean");if(r instanceof f||u instanceof f||d instanceof f){var b=!0;r instanceof f||(r=g(r)),u instanceof f||(u=g(u)),d instanceof f||(d=g(d)),r instanceof f&&u instanceof f&&d instanceof f||(b=!1,r=h(r),u=h(u),d=h(d))}var y=b?v?a:o:v?i:t,E=y(r,u,d);return"array"===n.matrix?E:new c(E)}}},function(e,n,r){e.exports=function(e,n){function t(e,n,r){if(void 0!==r){if(!f(r)||1!==r.length)throw new TypeError("Single character expected as defaultValue")}else r=" ";if(1!==n.length)throw new Error("Dimension mismatch: ("+n.length+" != 1)");var t=n[0];if(!l(t)||!m(t))throw new TypeError("Size must contain numbers");if(e.length>t)return e.substring(0,t);if(e.lengtho;o++)i+=r;return i}return e}var i=r(117),o=r(220),a=r(10),s=i.array,u=i.object.clone,f=i.string.isString,c=i.number.toNumber,l=i.number.isNumber,m=i.number.isInteger,p=s.isArray;e.resize=function(r,i,l){if(2!=arguments.length&&3!=arguments.length)throw new e.error.ArgumentsError("resize",arguments.length,2,3);var m=r instanceof a?!0:p(r)?!1:"array"!==n.matrix;if(r instanceof a&&(r=r.valueOf()),i instanceof a&&(i=i.valueOf()),i.length&&i[0]instanceof o&&(i=i.map(c)),f(r))return t(r,i,l);if(0==i.length){for(;p(r);)r=r[0];return u(r)}p(r)||(r=[r]),r=u(r);var h=s.resize(r,i,l);return m?new a(h):h}}},function(e,n,r){e.exports=function(e,n){var t=r(117),i=r(220),o=r(7),a=r(11),s=r(10),u=t.array,f=t.number.isNumber,c=t["boolean"].isBoolean,l=t.string.isString,m=o.isComplex,p=a.isUnit;e.size=function(r){if(1!=arguments.length)throw new e.error.ArgumentsError("size",arguments.length,1);var t="array"===n.matrix;if(f(r)||m(r)||p(r)||c(r)||null==r||r instanceof i)return t?[]:new s([]);if(l(r))return t?[r.length]:new s([r.length]);if(Array.isArray(r))return u.size(r);if(r instanceof s)return new s(r.size());throw new e.error.UnsupportedTypeError("size",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(10),i=n.object,o=n.array,a=Array.isArray;e.squeeze=function(n){if(1!=arguments.length)throw new e.error.ArgumentsError("squeeze",arguments.length,1);if(a(n))return o.squeeze(i.clone(n));if(n instanceof t){var r=o.squeeze(n.toArray());return a(r)?new t(r):r}return i.clone(n)}}},function(e,n,r){e.exports=function(e){function n(n,r){var i,o;if(l(n))return i=new s(n),o=i.subset(r),o.valueOf();if(n instanceof s)return n.subset(r);if(c(n))return t(n,r);throw new e.error.UnsupportedTypeError("subset",n)}function t(e,n){if(!(n instanceof u))throw new TypeError("Index expected");if(1!=n.size().length)throw new RangeError("Dimension mismatch ("+n.size().length+" != 1)");var r=n.range(0),t="",i=e.length;return r.forEach(function(n){f.validateIndex(n,i),t+=e.charAt(n)}),t}function i(n,r,t,i){var a;if(l(n))return a=new s(e.clone(n)),a.subset(r,t,i),a.valueOf();if(n instanceof s)return n.clone().subset(r,t,i);if(c(n))return o(n,r,t,i);throw new e.error.UnsupportedTypeError("subset",n)}function o(e,n,r,t){if(!(n instanceof u))throw new TypeError("Index expected");if(1!=n.size().length)throw new RangeError("Dimension mismatch ("+n.size().length+" != 1)");if(void 0!==t){if(!c(t)||1!==t.length)throw new TypeError("Single character expected as defaultValue")}else t=" ";var i=n.range(0),o=i.size()[0];if(o!=r.length)throw new RangeError("Dimension mismatch ("+i.size()[0]+" != "+r.length+")");for(var a=e.length,s=[],l=0;a>l;l++)s[l]=e.charAt(l);if(i.forEach(function(e,n){f.validateIndex(e),s[e]=r.charAt(n)}),s.length>a)for(l=a-1,o=s.length;o>l;l++)s[l]||(s[l]=t);return s.join("")}var a=r(117),s=r(10),u=r(9),f=a.array,c=a.string.isString,l=Array.isArray;e.subset=function(){switch(arguments.length){case 2:return n(arguments[0],arguments[1]);case 3:case 4:return i(arguments[0],arguments[1],arguments[2],arguments[3]);default:throw new e.error.ArgumentsError("subset",arguments.length,2,4)}}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(10),i=(r(13),n.object),o=n.string;e.transpose=function(n){if(1!=arguments.length)throw new e.error.ArgumentsError("transpose",arguments.length,1);var r=e.size(n).valueOf();switch(r.length){case 0:return i.clone(n);case 1:return i.clone(n);case 2:var a,s=r[1],u=r[0],f=n instanceof t,c=n.valueOf(),l=[],m=i.clone;if(0===s)throw new RangeError("Cannot transpose a 2D matrix with no rows(size: "+o.format(r)+")");for(var p=0;s>p;p++){a=l[p]=[];for(var h=0;u>h;h++)a[h]=m(c[h][p])}return 0==u&&(l[0]=[]),f?new t(l):l;default:throw new RangeError("Matrix must be two dimensional (size: "+o.format(r)+")")}}}},function(e,n,r){e.exports=function(e,n){var t=r(117),i=r(220),o=r(10),a=r(13),s=t.array,u=t.number.toNumber,f=Array.isArray;e.zeros=function(e){var r=a.argsToArray(arguments),t=e instanceof o?!0:f(e)?!1:"matrix"===n.matrix;if(0==r.length)return t?new o:[];var c=[],l=r[0]instanceof i?new i(0):0;return c=s.resize(c,r.map(u),l),t?new o(c):c}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(13),o=n.number.isNumber,a=n["boolean"].isBoolean,s=n.number.isInteger,u=i.isCollection;e.factorial=function c(n){var r,l;if(1!=arguments.length)throw new e.error.ArgumentsError("factorial",arguments.length,1);if(o(n)){if(!s(n)||0>n)throw new TypeError("Positive integer value expected in function factorial");for(r=n-1,l=n;r>1;)l*=r,r--;return 0==l&&(l=1),l}if(n instanceof t){if(!f(n))throw new TypeError("Positive integer value expected in function factorial");var m=new t(1);for(r=n.minus(m),l=n;r.gt(m);)l=l.times(r),r=r.minus(m);return l.equals(0)&&(l=m),l}if(a(n))return 1;if(u(n))return i.deepMap(n,c);throw new e.error.UnsupportedTypeError("factorial",n)};var f=function(e){return e.round().equals(e)&&e.gte(0)}}},function(e,n,r){e.exports=function(e,n){var t=r(10),i=(r(13),{uniform:function(){return Math.random},normal:function(){return function(){for(var e,n,r=-1;0>r||r>1;)e=Math.random(),n=Math.random(),r=1/6*Math.pow(-2*Math.log(e),.5)*Math.cos(2*Math.PI*n)+.5;return r}}});e.distribution=function(r){if(!i.hasOwnProperty(r))throw new Error("unknown distribution "+r);var o=Array.prototype.slice.call(arguments,1),a=i[r].apply(this,o);return function(r){var i={random:function(r,i,a){var u,f,c;if(arguments.length>3)throw new e.error.ArgumentsError("random",arguments.length,0,3);if(1===arguments.length?Array.isArray(r)?u=r:c=r:2===arguments.length?Array.isArray(r)?u=r:(f=r,c=i):(u=r,f=i,c=a),void 0===c&&(c=1),void 0===f&&(f=0),void 0!==u){var l=s(u,f,c,o);return"array"===n.matrix?l:new t(l)}return o(f,c)},randomInt:function(r,i,o){var u,f,c;if(arguments.length>3||arguments.length<1)throw new e.error.ArgumentsError("randomInt",arguments.length,1,3);if(1===arguments.length?c=r:2===arguments.length?"[object Array]"===Object.prototype.toString.call(r)?u=r:(f=r,c=i):(u=r,f=i,c=o),void 0===f&&(f=0),void 0!==u){var l=s(u,f,c,a);return"array"===n.matrix?l:new t(l)}return a(f,c)},pickRandom:function(n){if(1!==arguments.length)throw new e.error.ArgumentsError("pickRandom",arguments.length,1);if(!Array.isArray(n))throw new e.error.UnsupportedTypeError("pickRandom",n);return n[Math.floor(Math.random()*n.length)]}},o=function(e,n){return e+r()*(n-e)},a=function(e,n){return Math.floor(e+r()*(n-e))},s=function(e,n,r,t){var i,o,a=[];if(e=e.slice(0),e.length>1)for(o=0,i=e.shift();i>o;o++)a.push(s(e,n,r,t));else for(o=0,i=e.shift();i>o;o++)a.push(t(n,r));return a};return i}(a)};var o=e.distribution("uniform");e.random=o.random,e.randomInt=o.randomInt,e.pickRandom=o.pickRandom}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=n.number.isNumber,o=n.number.isInteger,a=n.number.toBigNumber;e.permutations=function(n,r){var u,f,c=arguments.length;if(c>2)throw new e.error.ArgumentsError("permutations",arguments.length,2);if(i(n)){if(!o(n)||0>n)throw new TypeError("Positive integer value expected in function permutations");if(1==c)return e.factorial(n);if(2==c&&i(r)){if(!o(r)||0>r)throw new TypeError("Positive integer value expected in function permutations");if(r>n)throw new TypeError("second argument k must be less than or equal to first argument n");for(u=1,f=n-r+1;n>=f;f++)u*=f;return u}}if(n instanceof t){if(void 0===r&&s(n))return e.factorial(n);if(r=a(r),!(r instanceof t&&s(n)&&s(r)))throw new TypeError("Positive integer value expected in function permutations");if(r.gt(n))throw new TypeError("second argument k must be less than or equal to first argument n");for(u=new t(1),f=n.minus(r).plus(1);f.lte(n);f=f.plus(1))u=u.times(f);return u}throw new e.error.UnsupportedTypeError("permutations",n)};var s=function(e){return e.round().equals(e)&&e.gte(0)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=(r(13),n.number.isNumber),o=n.number.isInteger,a=n.number.toBigNumber;e.combinations=function(n,r){var u,f,c,l,m=arguments.length;if(2!=m)throw new e.error.ArgumentsError("combinations",arguments.length,2);if(i(n)){if(!o(n)||0>n)throw new TypeError("Positive integer value enpected in function combinations");if(r>n)throw new TypeError("k must be less than or equal to n");for(u=Math.max(r,n-r),f=1,c=1;n-u>=c;c++)f=f*(u+c)/c;return f}if(n instanceof t){if(r=a(r),!(r instanceof t&&s(n)&&s(r)))throw new TypeError("Positive integer value expected in function combinations");if(r.gt(n))throw new TypeError("k must be less than n in function combinations");for(u=n.minus(r),r.lt(u)&&(u=r),f=new t(1),c=new t(1),l=n.minus(u);c.lte(l);c=c.plus(1))f=f.times(u.plus(c)).dividedBy(c);return f}throw new e.error.UnsupportedTypeError("combinations",n)};var s=function(e){return e.round().equals(e)&&e.gte(0)}}},function(e,n,r){e.exports=function(e){function n(n,r){return e.smaller(n,r)?n:r}function t(n){var r=null;if(i.deepForEach(n,function(n){(null===r||e.smaller(n,r))&&(r=n)}),null===r)throw new Error("Cannot calculate min of an empty array");return r}var i=(r(10),r(13)),o=i.isCollection;e.min=function(e){if(0==arguments.length)throw new SyntaxError("Function min requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return t(e);if(2==arguments.length)return i.reduce(arguments[0],arguments[1],n);throw new SyntaxError("Wrong number of parameters")}return t(arguments)}}},function(e,n,r){e.exports=function(e){function n(n,r){return e.larger(n,r)?n:r}function t(n){var r=null;if(i.deepForEach(n,function(n){(null===r||e.larger(n,r))&&(r=n)}),null===r)throw new Error("Cannot calculate max of an empty array");return r}var i=(r(10),r(13)),o=i.isCollection;e.max=function(e){if(0==arguments.length)throw new SyntaxError("Function max requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return t(e);if(2==arguments.length)return i.reduce(arguments[0],arguments[1],n);throw new SyntaxError("Wrong number of parameters")}return t(arguments)}}},function(e,n,r){e.exports=function(e){function n(n,r){var t;return t=i.reduce(n,r,e.add),e.divide(t,size(n)[r])}function t(n){var r=0,t=0;if(i.deepForEach(n,function(n){r=e.add(r,n),t++}),0===t)throw new Error("Cannot calculate mean of an empty array");return e.divide(r,t)}var i=(r(10),r(13)),o=i.isCollection;e.mean=function(e){if(0==arguments.length)throw new SyntaxError("Function mean requires one or more parameters (0 provided)");if(o(e)){if(1==arguments.length)return t(e);if(2==arguments.length)return n(arguments[0],arguments[1]);throw new SyntaxError("Wrong number of parameters")}return t(arguments)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.acos=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("acos",arguments.length,1);if(a(r))return r>=-1&&1>=r?Math.acos(r):c(new i(r,0));if(u(r)){var l,m=new i(r.im*r.im-r.re*r.re+1,-2*r.re*r.im),p=e.sqrt(m);l=p instanceof i?new i(p.re-r.im,p.im+r.re):new i(p-r.im,r.re);var h=e.log(l);return h instanceof i?new i(1.5707963267948966-h.im,h.re):new i(1.5707963267948966,h)}if(f(r))return o.deepMap(r,c);if(s(r))return Math.acos(r);if(r instanceof t)return c(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("acos",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.asin=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("asin",arguments.length,1);if(a(r))return r>=-1&&1>=r?Math.asin(r):c(new i(r,0));if(u(r)){var l,m=r.re,p=r.im,h=new i(p*p-m*m+1,-2*m*p),g=e.sqrt(h);l=g instanceof i?new i(g.re-p,g.im+m):new i(g-p,m);var d=e.log(l);return d instanceof i?new i(d.im,-d.re):new i(0,-d)}if(f(r))return o.deepMap(r,c);if(s(r))return Math.asin(r);if(r instanceof t)return c(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("asin",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.isNumber,s=n["boolean"].isBoolean,u=i.isComplex,f=o.isCollection;e.atan=function c(r){if(1!=arguments.length)throw new e.error.ArgumentsError("atan",arguments.length,1);if(a(r))return Math.atan(r);if(u(r)){var l=r.re,m=r.im,p=l*l+(1-m)*(1-m),h=new i((1-m*m-l*l)/p,-2*l/p),g=e.log(h);return g instanceof i?new i(-.5*g.im,.5*g.re):new i(0,.5*g)}if(f(r))return o.deepMap(r,c);if(s(r))return Math.atan(r);if(r instanceof t)return c(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("atan",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(13),a=n.number.toNumber,s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isCollection;e.atan2=function l(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("atan2",arguments.length,2);if(s(n)){if(s(r))return Math.atan2(n,r)}else if(f(n)&&s(r))return Math.atan2(n.re,r);if(c(n)||c(r))return o.deepMap2(n,r,l);if(u(n))return l(+n,r);if(u(r))return l(n,+r);if(n instanceof t)return l(a(n),r);if(r instanceof t)return l(n,a(r));throw new e.error.UnsupportedTypeError("atan2",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.cos=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("cos",arguments.length,1);if(s(r))return Math.cos(r);if(f(r))return new i(.5*Math.cos(r.re)*(Math.exp(-r.im)+Math.exp(r.im)),.5*Math.sin(r.re)*(Math.exp(-r.im)-Math.exp(r.im)));if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function cos is no angle");return Math.cos(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return Math.cos(r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("cos",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.cot=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("cot",arguments.length,1);if(s(r))return 1/Math.tan(r);if(f(r)){var p=Math.exp(-4*r.im)-2*Math.exp(-2*r.im)*Math.cos(2*r.re)+1;return new i(2*Math.exp(-2*r.im)*Math.sin(2*r.re)/p,(Math.exp(-4*r.im)-1)/p)}if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function cot is no angle");return 1/Math.tan(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return m(+r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("cot",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.csc=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("csc",arguments.length,1);if(s(r))return 1/Math.sin(r);if(f(r)){var p=.25*(Math.exp(-2*r.im)+Math.exp(2*r.im))-.5*Math.cos(2*r.re);return new i(.5*Math.sin(r.re)*(Math.exp(-r.im)+Math.exp(r.im))/p,.5*Math.cos(r.re)*(Math.exp(-r.im)-Math.exp(r.im))/p)}if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function csc is no angle");return 1/Math.sin(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return m(+r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("csc",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.sec=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("sec",arguments.length,1);if(s(r))return 1/Math.cos(r);if(f(r)){var p=.25*(Math.exp(-2*r.im)+Math.exp(2*r.im))+.5*Math.cos(2*r.re);return new i(.5*Math.cos(r.re)*(Math.exp(-r.im)+Math.exp(r.im))/p,.5*Math.sin(r.re)*(Math.exp(r.im)-Math.exp(-r.im))/p)}if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function sec is no angle");return 1/Math.cos(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return m(+r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("sec",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.sin=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("sin",arguments.length,1);if(s(r))return Math.sin(r);if(f(r))return new i(.5*Math.sin(r.re)*(Math.exp(-r.im)+Math.exp(r.im)),.5*Math.cos(r.re)*(Math.exp(r.im)-Math.exp(-r.im)));if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function sin is no angle");return Math.sin(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return Math.sin(r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("sin",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(220),i=r(7),o=r(11),a=r(13),s=n.number.isNumber,u=n["boolean"].isBoolean,f=i.isComplex,c=o.isUnit,l=a.isCollection;e.tan=function m(r){if(1!=arguments.length)throw new e.error.ArgumentsError("tan",arguments.length,1);if(s(r))return Math.tan(r);if(f(r)){var p=Math.exp(-4*r.im)+2*Math.exp(-2*r.im)*Math.cos(2*r.re)+1;return new i(2*Math.exp(-2*r.im)*Math.sin(2*r.re)/p,(1-Math.exp(-4*r.im))/p)}if(c(r)){if(!r.hasBase(o.BASE_UNITS.ANGLE))throw new TypeError("Unit in function tan is no angle");return Math.tan(r.value)}if(l(r))return a.deepMap(r,m);if(u(r))return Math.tan(r);if(r instanceof t)return m(n.number.toNumber(r));throw new e.error.UnsupportedTypeError("tan",r)}}},function(e,n,r){e.exports=function(e){var n=r(117),t=r(11),i=r(13),o=n.string.isString,a=t.isUnit,s=i.isCollection;e.to=function u(n,r){if(2!=arguments.length)throw new e.error.ArgumentsError("to",arguments.length,2);if(a(n)&&(a(r)||o(r)))return n.to(r);if(s(n)||s(r))return i.deepMap2(n,r,u);throw new e.error.UnsupportedTypeError("to",n,r)}}},function(e,n,r){e.exports=function(e){var n=r(2);e.clone=function(r){if(1!=arguments.length)throw new e.error.ArgumentsError("clone",arguments.length,1);return n.clone(r)}}},function(e,n,r){e.exports=function(e){var n=r(218);e.format=function(r,t){var i=arguments.length;if(1!==i&&2!==i)throw new e.error.ArgumentsError("format",i,1,2);return n.format(r,t)}}},function(e,n,r){e.exports=function(e){function n(n,r,t){(t.override||void 0===e[n])&&(e[n]=t.wrap&&"function"==typeof r?function(){for(var n=[],t=0,i=arguments.length;i>t;t++)n[t]=arguments[t].valueOf();return r.apply(e,n)}:r,e.chaining.Selector.createProxy(n,r))}function t(e){return"function"==typeof e||s(e)||u(e)||f(e)||c(e)}var i=r(117),o=r(7),a=r(11),s=i.number.isNumber,u=i.string.isString,f=o.isComplex,c=a.isUnit;e["import"]=function l(o,a){var s,f={override:!1,wrap:!0};if(a&&a instanceof Object&&i.object.extend(f,a),u(o)){var c=r(219)(o);l(c)}else if(t(o)){if(s=o.name,!s)throw new Error("Cannot import an unnamed function or object");(f.override||void 0===e[s])&&n(s,o,f)}else if(o instanceof Object)for(s in o)if(o.hasOwnProperty(s)){var m=o[s];t(m)?n(s,m,f):l(m)}}}},function(e,n,r){e.exports=function(e){function n(e,n){var r=[],t=function(i,o){return Array.isArray(i)?i.map(function(e,n){return r[o]=n,t(e,o+1)}):n(i,r,e)};return t(e,0)}var t=r(10).isMatrix;e.map=function(r,i){if(2!=arguments.length)throw new e.error.ArgumentsError("map",arguments.length,2);if(Array.isArray(r))return n(r,i);if(t(r))return r.map(i);throw new e.error.UnsupportedTypeError("map",r)}}},function(e,n,r){e.exports=function(e){var n=r(218),t=n.isString;e.print=function(n,r,i){var o=arguments.length;if(2!=o&&3!=o)throw new e.error.ArgumentsError("print",o,2,3);if(!t(n))throw new TypeError("String expected as first parameter in function format");if(!(r instanceof Object))throw new TypeError("Object expected as second parameter in function format");return n.replace(/\$([\w\.]+)/g,function(n,o){for(var a=o.split("."),s=r[a.shift()];a.length&&void 0!==s;){var u=a.shift();s=u?s[u]:s+"."}return void 0!==s?t(s)?s:e.format(s,i):n})}}},function(e,n,r){e.exports=function(e){var n=r(217),t=r(220),i=r(7),o=r(10),a=r(11),s=r(9),u=r(8),f=r(12);e["typeof"]=function(r){if(1!=arguments.length)throw new e.error.ArgumentsError("typeof",arguments.length,1);var c=n.type(r);if("object"===c){if(r instanceof i)return"complex";if(r instanceof t)return"bignumber";if(r instanceof o)return"matrix";if(r instanceof a)return"unit";if(r instanceof s)return"index";if(r instanceof u)return"range";if(r instanceof f)return"matrix";if(r instanceof e.chaining.Selector)return"selector"}return c}}},function(e,n,r){e.exports=function(e){function n(e,n){var r=[],t=function(i,o){Array.isArray(i)?i.forEach(function(e,n){r[o]=n,t(e,o+1)}):n(i,r,e)};t(e,0)}var t=r(10).isMatrix;e.forEach=function(r,i){if(2!=arguments.length)throw new e.error.ArgumentsError("forEach",arguments.length,2); +if(Array.isArray(r))return n(r,i);if(t(r))return r.forEach(i);throw new e.error.UnsupportedTypeError("forEach",r)}}},function(e,n,r){e.exports=function(e){var n=r(7);e.pi=Math.PI,e.e=Math.E,e.tau=2*Math.PI,e.i=new n(0,1),e.Infinity=1/0,e.NaN=0/0,e["true"]=!0,e["false"]=!1,e.E=Math.E,e.LN2=Math.LN2,e.LN10=Math.LN10,e.LOG2E=Math.LOG2E,e.LOG10E=Math.LOG10E,e.PI=Math.PI,e.SQRT1_2=Math.SQRT1_2,e.SQRT2=Math.SQRT2}},function(e,n,r){e.exports=function(e){function n(e){if(!(this instanceof n))throw new SyntaxError("Selector constructor must be called with the new operator");this.value=e instanceof n?e.value:e}function t(e,r){var t=Array.prototype.slice;n.prototype[e]="function"==typeof r?function(){var e=[this.value].concat(t.call(arguments,0));return new n(r.apply(this,e))}:new n(r)}var i=r(218);n.prototype.done=function(){return this.value},n.prototype.valueOf=function(){return this.value},n.prototype.toString=function(){return i.format(this.value)},n.createProxy=t;for(var o in e)e.hasOwnProperty(o)&&o&&t(o,e[o]);return n}},function(e,n,r){function t(e){this.nodes=e||[]}{var i=r(109),o=(r(2),r(218));r(13),r(10)}t.prototype=new i,t.prototype._compile=function(e){var n="array"!==e.math.config().matrix,r=this.nodes.map(function(n){return n._compile(e)});return(n?"math.matrix([":"[")+r.join(",")+(n?"])":"]")},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);for(var r=this.nodes,t=0,i=r.length;i>t;t++)for(var o=r[t],a=0,s=o.length;s>a;a++)n=n.concat(o[a].find(e));return n},t.prototype.toString=function(){return o.format(this.nodes)},e.exports=t},function(e,n,r){function t(e,n){this.name=e,this.expr=n}var i=r(109);t.prototype=new i,t.prototype._compile=function(e){return'scope["'+this.name+'"] = '+this.expr._compile(e)},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return this.name+" = "+this.expr.toString()},e.exports=t},function(e,n,r){function t(){this.params=[]}var i=r(109);t.prototype=new i,t.prototype.add=function(e,n){var r=this.params.length;this.params[r]={node:e,visible:void 0!=n?n:!0}},t.prototype._compile=function(e){var n=this.params.map(function(n){var r=n.node._compile(e);return n.visible?"results.push("+r+");":r+";"});return"(function () {var results = [];"+n.join("")+"return results;})()"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var r=this.params;if(r)for(var t=0,i=r.length;i>t;t++)n=n.concat(r[t].node.find(e));return n},t.prototype.toString=function(){return this.params.map(function(e){return e.node.toString()+(e.visible?"":";")}).join("\n")},e.exports=t},function(e,n,r){function t(e,n){if(!a(e))throw new TypeError("Constant type must be a string");if(!a(n))throw new TypeError("Constant value must be a string");this.type=e,this.value=n}var i=r(109),o=(r(7),r(220),r(218)),a=o.isString;t.prototype=new i,t.prototype._compile=function(e){switch(this.type){case"number":return"bignumber"===e.math.config().number?'math.bignumber("'+this.value+'")':this.value.replace(/^(0*)[0-9]/,function(e,n){return e.substring(n.length)});case"string":return'"'+this.value+'"';case"complex":return"math.complex(0, "+this.value+")";case"boolean":return this.value;case"undefined":return this.value;case"null":return this.value;default:throw new TypeError('Unsupported type of constant "'+this.type+'"')}},t.prototype.toString=function(){switch(this.type){case"string":return'"'+this.value+'"';case"complex":return this.value+"i";default:return this.value}},e.exports=t},function(e,n,r){function t(e,n){this.object=e,this.ranges=n}{var i=r(221),o=r(109),a=r(112),s=r(113);r(220),r(9),r(8),i.isNumber,i.toNumber}t.prototype=new o,t.prototype._compile=function(e){return this.compileSubset(e)},t.prototype.compileSubset=function(e,n){var r={type:s,properties:{name:"end"}},t=this.ranges.map(function(e){return e.find(r).length>0}),i=this.ranges.map(function(n,r){var i=t[r];return n instanceof a?i?'(function (scope) { scope = Object.create(scope); scope["end"] = size['+r+"]; var step = "+(n.step?n.step._compile(e):"1")+"; return [ "+n.start._compile(e)+" - 1, "+n.end._compile(e)+" - (step > 0 ? 0 : 2), step ];})(scope)":"(function () { var step = "+(n.step?n.step._compile(e):"1")+"; return [ "+n.start._compile(e)+" - 1, "+n.end._compile(e)+" - (step > 0 ? 0 : 2), step ];})()":i?'(function (scope) { scope = Object.create(scope); scope["end"] = size['+r+"]; return "+n._compile(e)+" - 1;})(scope)":n._compile(e)+" - 1"}),o=i.some(function(e){return e});return o?"(function () { var obj = "+this.object._compile(e)+"; var size = math.size(obj).valueOf(); return math.subset( obj, math.index("+i.join(", ")+") "+(n?", "+n:"")+" );})()":"math.subset("+this.object._compile(e)+",math.index("+i.join(", ")+(n?", "+n:"")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this),this.object&&(n=n.concat(this.object.find(e)));var r=this.ranges;if(r)for(var t=0,i=r.length;i>t;t++)n=n.concat(r[t].find(e));return n},t.prototype.objectName=function(){return this.object.name},t.prototype.toString=function(){var e=this.object?this.object.toString():"";return this.ranges&&(e+="["+this.ranges.join(", ")+"]"),e},e.exports=t},function(e,n,r){function t(e,n,r){this.name=e,this.args=n,this.expr=r}var i=r(109);t.prototype=new i,t.prototype._eval=function(){return this.scope.set(this.name,this.fn),this.fn},t.prototype._compile=function(e){return'scope["'+this.name+'"] = (function (scope) { scope = Object.create(scope); var fn = function '+this.name+"("+this.args.join(",")+") { if (arguments.length != "+this.args.length+') { throw new SyntaxError("Wrong number of arguments in function '+this.name+' (" + arguments.length + " provided, '+this.args.length+' expected)"); }'+this.args.map(function(e,n){return'scope["'+e+'"] = arguments['+n+"];"}).join("")+" return "+this.expr._compile(e)+' }; fn.syntax = "'+this.name+"("+this.args.join(", ")+')"; return fn; })(scope);'},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return"function "+this.name+"("+this.args.join(", ")+") = "+this.expr.toString()},e.exports=t},function(e){function n(){}n.prototype.eval=function(){throw new Error("Node.eval is deprecated. Use Node.compile(math).eval([scope]) instead.")},n.prototype.compile=function(e){if("object"!=typeof e)throw new TypeError("Object expected as parameter math");var n={math:e},r=this._compile(n),t=Object.keys(n).map(function(e){return" var "+e+' = defs["'+e+'"];'}),i=t.join(" ")+'return { "eval": function (scope) { scope = scope || {}; return '+r+"; }};",o=new Function("defs",i);return o(n)},n.prototype._compile=function(){throw new Error("Cannot compile a Node interface")},n.prototype.find=function(e){return this.match(e)?[this]:[]},n.prototype.match=function(e){var n=!0;if(e&&(!e.type||this instanceof e.type||(n=!1),n&&e.properties))for(var r in e.properties)if(e.properties.hasOwnProperty(r)&&this[r]!=e.properties[r]){n=!1;break}return n},n.prototype.toString=function(){return""},e.exports=n},function(e,n,r){function t(e,n,r){this.op=e,this.fn=n,this.params=r}var i=r(109);t.prototype=new i,t.prototype._compile=function(e){if(!(this.fn in e.math))throw new Error("Function "+this.fn+' missing in provided namespace "math"');var n=this.params.map(function(n){return n._compile(e)});return"math."+this.fn+"("+n.join(", ")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var r=this.params;if(r)for(var t=0,i=r.length;i>t;t++)n=n.concat(r[t].find(e));return n},t.prototype.toString=function(){var e=this.params;switch(e.length){case 1:return"-"==this.op?"-"+e[0].toString():e[0].toString()+this.op;case 2:var n=e[0].toString();e[0]instanceof t&&(n="("+n+")");var r=e[1].toString();return e[1]instanceof t&&(r="("+r+")"),n+" "+this.op+" "+r;default:return this.op+"("+this.params.join(", ")+")"}},e.exports=t},function(e,n,r){function t(e,n){this.object=e,this.params=n}{var i=r(221),o=r(109);r(112),r(113),r(220),r(9),r(8),i.isNumber,i.toNumber}t.prototype=new o,t.prototype._compile=function(e){var n=this.params.map(function(n){return n._compile(e)});return this.object._compile(e)+"("+n.join(", ")+")"},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this),this.object&&(n=n.concat(this.object.find(e)));var r=this.params;if(r)for(var t=0,i=r.length;i>t;t++)n=n.concat(r[t].find(e));return n},t.prototype.toString=function(){var e=this.object?this.object.toString():"";return this.params&&(e+="("+this.params.join(", ")+")"),e},e.exports=t},function(e,n,r){function t(e){if(2!=e.length&&3!=e.length)throw new SyntaxError("Wrong number of arguments. Expected [start, end] or [start, end, step]");this.start=e[0],this.end=e[1],this.step=e[2]}{var i=r(221),o=r(109);r(220),r(8),r(10),i.toNumber}t.prototype=new o,t.prototype._compile=function(e){return"math.range("+this.start._compile(e)+", "+this.end._compile(e)+", "+(this.step?this.step._compile(e)+", ":"")+"true)"},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),this.start&&(n=n.concat(this.start.find(e))),this.step&&(n=n.concat(this.step.find(e))),this.end&&(n=n.concat(this.end.find(e))),n},t.prototype.toString=function(){var e=this.start.toString();return this.step&&(e+=":"+this.step.toString()),e+=":"+this.end.toString()},e.exports=t},function(e,n,r){function t(e){this.name=e}function i(e){throw new Error("Undefined symbol "+e)}var o=r(109),a=r(11);t.prototype=new o,t.prototype._compile=function(e){return e.undef=i,e.Unit=a,'(scope["'+this.name+'"] !== undefined ? scope["'+this.name+'"] : math["'+this.name+'"] !== undefined ? math["'+this.name+'"] : '+(a.isPlainUnit(this.name)?'new Unit(null, "'+this.name+'")':'undef("'+this.name+'")')+")"},t.prototype.toString=function(){return this.name},e.exports=t},function(e,n,r){function t(e,n){this.value=e,this.unit=n}{var i=r(109),o=(r(220),r(7),r(11),r(221));o.toNumber}t.prototype=new i,t.prototype._compile=function(e){return"math.unit("+this.value._compile(e)+', "'+this.unit+'")'},t.prototype.find=function(e){var n=[];return this.match(e)&&n.push(this),n=n.concat(this.value.find(e))},t.prototype.toString=function(){return this.value+" "+this.unit},e.exports=t},function(e,n,r){function t(e,n){if(!(e instanceof a))throw new TypeError("index mus be an IndexNode");this.index=e,this.expr=n}{var i=r(221),o=r(109),a=(r(112),r(107));r(113),r(220),r(9),r(8),i.isNumber,i.toNumber}t.prototype=new o,t.prototype._compile=function(e){return'scope["'+this.index.objectName()+'"] = '+this.index.compileSubset(e,this.expr._compile(e))},t.prototype.find=function(e){var n=[];this.match(e)&&n.push(this);var r=this.ranges;if(r)for(var t=0,i=r.length;i>t;t++)n=n.concat(r[t].find(e));return this.expr&&(n=n.concat(this.expr.find(e))),n},t.prototype.toString=function(){return this.index.toString()+" = "+this.expr.toString()},e.exports=t},function(){},function(e,n,r){n.array=r(222),n["boolean"]=r(223),n.number=r(221),n.object=r(2),n.string=r(218),n.types=r(217)},function(e){e.exports={name:"e",category:"Constants",syntax:["e"],description:"Euler's number, the base of the natural logarithm. Approximately equal to 2.71828",examples:["e","e ^ 2","exp(2)","log(e)"],seealso:["exp"]}},function(e){e.exports={name:"false",category:"Constants",syntax:["false"],description:"Boolean value false",examples:["false"],seealso:["true"]}},function(e){e.exports={name:"i",category:"Constants",syntax:["i"],description:"Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.",examples:["i","i * i","sqrt(-1)"],seealso:[]}},function(e){e.exports={name:"Infinity",category:"Constants",syntax:["Infinity"],description:"Infinity, a number which is larger than the maximum number that can be handled by a floating point number.",examples:["Infinity","1 / 0"],seealso:[]}},function(e){e.exports={name:"LN2",category:"Constants",syntax:["LN2"],description:"Returns the natural logarithm of 2, approximately equal to 0.693",examples:["LN2","log(2)"],seealso:[]}},function(e){e.exports={name:"LN10",category:"Constants",syntax:["LN10"],description:"Returns the natural logarithm of 10, approximately equal to 2.302",examples:["LN10","log(10)"],seealso:[]}},function(e){e.exports={name:"LOG2E",category:"Constants",syntax:["LOG2E"],description:"Returns the base-2 logarithm of E, approximately equal to 1.442",examples:["LOG2E","log(e, 2)"],seealso:[]}},function(e){e.exports={name:"LOG10E",category:"Constants",syntax:["LOG10E"],description:"Returns the base-10 logarithm of E, approximately equal to 0.434",examples:["LOG10E","log(e, 10)"],seealso:[]}},function(e){e.exports={name:"NaN",category:"Constants",syntax:["NaN"],description:"Not a number",examples:["NaN","0 / 0"],seealso:[]}},function(e){e.exports={name:"pi",category:"Constants",syntax:["pi"],description:"The number pi is a mathematical constant that is the ratio of a circle's circumference to its diameter, and is approximately equal to 3.14159",examples:["pi","sin(pi/2)"],seealso:["tau"]}},function(e){e.exports={name:"SQRT1_2",category:"Constants",syntax:["SQRT1_2"],description:"Returns the square root of 1/2, approximately equal to 0.707",examples:["SQRT1_2","sqrt(1/2)"],seealso:[]}},function(e){e.exports={name:"SQRT2",category:"Constants",syntax:["SQRT2"],description:"Returns the square root of 2, approximately equal to 1.414",examples:["SQRT2","sqrt(2)"],seealso:[]}},function(e){e.exports={name:"tau",category:"Constants",syntax:["pi"],description:"Tau is the ratio constant of a circle's circumference to radius, equal to 2 * pi, approximately 6.2832.",examples:["tau","2 * pi"],seealso:["pi"]}},function(e){e.exports={name:"true",category:"Constants",syntax:["true"],description:"Boolean value true",examples:["true"],seealso:["false"]}},function(e){e.exports={name:"abs",category:"Arithmetic",syntax:["abs(x)"],description:"Compute the absolute value.",examples:["abs(3.5)","abs(-4.2)"],seealso:["sign"]}},function(e){e.exports={name:"add",category:"Operators",syntax:["x + y","add(x, y)"],description:"Add two values.",examples:["2.1 + 3.6","ans - 3.6","3 + 2i",'"hello" + " world"',"3 cm + 2 inch"],seealso:["subtract"]}},function(e){e.exports={name:"ceil",category:"Arithmetic",syntax:["ceil(x)"],description:"Round a value towards plus infinity.If x is complex, both real and imaginary part are rounded towards plus infinity.",examples:["ceil(3.2)","ceil(3.8)","ceil(-4.2)"],seealso:["floor","fix","round"]}},function(e){e.exports={name:"cube",category:"Arithmetic",syntax:["cube(x)"],description:"Compute the cube of a value. The cube of x is x * x * x.",examples:["cube(2)","2^3","2 * 2 * 2"],seealso:["multiply","square","pow"]}},function(e){e.exports={name:"divide",category:"Operators",syntax:["x / y","divide(x, y)"],description:"Divide two values.",examples:["2 / 3","ans * 3","4.5 / 2","3 + 4 / 2","(3 + 4) / 2","18 km / 4.5"],seealso:["multiply"]}},function(e){e.exports={name:"edivide",category:"Operators",syntax:["x ./ y","edivide(x, y)"],description:"divide two values element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","b = [2, 1, 1; 3, 2, 5]","a ./ b"],seealso:["multiply","emultiply","divide"]}},function(e){e.exports={name:"emultiply",category:"Operators",syntax:["x .* y","emultiply(x, y)"],description:"multiply two values element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","b = [2, 1, 1; 3, 2, 5]","a .* b"],seealso:["multiply","divide","edivide"]}},function(e){e.exports={name:"epow",category:"Operators",syntax:["x .^ y","epow(x, y)"],description:"Calculates the power of x to y element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","a .^ 2"],seealso:["pow"]}},function(e){e.exports={name:"equal",category:"Operators",syntax:["x == y","equal(x, y)"],description:"Check equality of two values. Returns 1 if the values are equal, and 0 if not.",examples:["2+2 == 3","2+2 == 4","a = 3.2","b = 6-2.8","a == b","50cm == 0.5m"],seealso:["unequal","smaller","larger","smallereq","largereq"]}},function(e){e.exports={name:"exp",category:"Arithmetic",syntax:["exp(x)"],description:"Calculate the exponent of a value.",examples:["exp(1.3)","e ^ 1.3","log(exp(1.3))","x = 2.4","(exp(i*x) == cos(x) + i*sin(x)) # Euler's formula"],seealso:["square","multiply","log"]}},function(e){e.exports={name:"fix",category:"Arithmetic",syntax:["fix(x)"],description:"Round a value towards zero.If x is complex, both real and imaginary part are rounded towards zero.",examples:["fix(3.2)","fix(3.8)","fix(-4.2)","fix(-4.8)"],seealso:["ceil","floor","round"]}},function(e){e.exports={name:"floor",category:"Arithmetic",syntax:["floor(x)"],description:"Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.",examples:["floor(3.2)","floor(3.8)","floor(-4.2)"],seealso:["ceil","fix","round"]}},function(e){e.exports={name:"gcd",category:"Arithmetic",syntax:["gcd(a, b)","gcd(a, b, c, ...)"],description:"Compute the greatest common divisor.",examples:["gcd(8, 12)","gcd(-4, 6)","gcd(25, 15, -10)"],seealso:["lcm","xgcd"]}},function(e){e.exports={name:"larger",category:"Operators",syntax:["x > y","larger(x, y)"],description:"Check if value x is larger than y. Returns 1 if x is larger than y, and 0 if not.",examples:["2 > 3","5 > 2*2","a = 3.3","b = 6-2.8","(a > b)","(b < a)","5 cm > 2 inch"],seealso:["equal","unequal","smaller","smallereq","largereq"]}},function(e){e.exports={name:"largereq",category:"Operators",syntax:["x >= y","largereq(x, y)"],description:"Check if value x is larger or equal to y. Returns 1 if x is larger or equal to y, and 0 if not.",examples:["2 > 1+1","2 >= 1+1","a = 3.2","b = 6-2.8","(a > b)"],seealso:["equal","unequal","smallereq","smaller","largereq"]}},function(e){e.exports={name:"lcm",category:"Arithmetic",syntax:["lcm(x, y)"],description:"Compute the least common multiple.",examples:["lcm(4, 6)","lcm(6, 21)","lcm(6, 21, 5)"],seealso:["gcd"]}},function(e){e.exports={name:"log",category:"Arithmetic",syntax:["log(x)","log(x, base)"],description:"Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).",examples:["log(3.5)","a = log(2.4)","exp(a)","10 ^ 3","log(1000, 10)","log(1000) / log(10)","b = logb(1024, 2)","2 ^ b"],seealso:["exp","log10"]}},function(e){e.exports={name:"log10",category:"Arithmetic",syntax:["log10(x)"],description:"Compute the 10-base logarithm of a value.",examples:["log10(1000)","10 ^ 3","log10(0.01)","log(1000) / log(10)","log(1000, 10)"],seealso:["exp","log"]}},function(e){e.exports={name:"mod",category:"Operators",syntax:["x % y","x mod y","mod(x, y)"],description:"Calculates the modulus, the remainder of an integer division.",examples:["7 % 3","11 % 2","10 mod 4","function isOdd(x) = x % 2","isOdd(2)","isOdd(3)"],seealso:[]}},function(e){e.exports={name:"multiply",category:"Operators",syntax:["x * y","multiply(x, y)"],description:"multiply two values.",examples:["2.1 * 3.6","ans / 3.6","2 * 3 + 4","2 * (3 + 4)","3 * 2.1 km"],seealso:["divide"]}},function(e){e.exports={name:"pow",category:"Operators",syntax:["x ^ y","pow(x, y)"],description:"Calculates the power of x to y, x^y.",examples:["2^3 = 8","2*2*2","1 + e ^ (pi * i)"],seealso:["unequal","smaller","larger","smallereq","largereq"]}},function(e){e.exports={name:"round",category:"Arithmetic",syntax:["round(x)","round(x, n)"],description:"round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.",examples:["round(3.2)","round(3.8)","round(-4.2)","round(-4.8)","round(pi, 3)","round(123.45678, 2)"],seealso:["ceil","floor","fix"]}},function(e){e.exports={name:"sign",category:"Arithmetic",syntax:["sign(x)"],description:"Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.",examples:["sign(3.5)","sign(-4.2)","sign(0)"],seealso:["abs"]}},function(e){e.exports={name:"smaller",category:"Operators",syntax:["x < y","smaller(x, y)"],description:"Check if value x is smaller than value y. Returns 1 if x is smaller than y, and 0 if not.",examples:["2 < 3","5 < 2*2","a = 3.3","b = 6-2.8","(a < b)","5 cm < 2 inch"],seealso:["equal","unequal","larger","smallereq","largereq"]}},function(e){e.exports={name:"smallereq",category:"Operators",syntax:["x <= y","smallereq(x, y)"],description:"Check if value x is smaller or equal to value y. Returns 1 if x is smaller than y, and 0 if not.",examples:["2 < 1+1","2 <= 1+1","a = 3.2","b = 6-2.8","(a < b)"],seealso:["equal","unequal","larger","smaller","largereq"]}},function(e){e.exports={name:"sqrt",category:"Arithmetic",syntax:["sqrt(x)"],description:"Compute the square root value. If x = y * y, then y is the square root of x.",examples:["sqrt(25)","5 * 5","sqrt(-1)"],seealso:["square","multiply"]}},function(e){e.exports={name:"square",category:"Arithmetic",syntax:["square(x)"],description:"Compute the square of a value. The square of x is x * x.",examples:["square(3)","sqrt(9)","3^2","3 * 3"],seealso:["multiply","pow","sqrt","cube"]}},function(e){e.exports={name:"subtract",category:"Operators",syntax:["x - y","subtract(x, y)"],description:"subtract two values.",examples:["5.3 - 2","ans + 2","2/3 - 1/6","2 * 3 - 3","2.1 km - 500m"],seealso:["add"]}},function(e){e.exports={name:"unary",category:"Operators",syntax:["-x","unary(x)"],description:"Inverse the sign of a value.",examples:["-4.5","-(-5.6)"],seealso:["add","subtract"]}},function(e){e.exports={name:"unequal",category:"Operators",syntax:["x != y","unequal(x, y)"],description:"Check unequality of two values. Returns 1 if the values are unequal, and 0 if they are equal.",examples:["2+2 != 3","2+2 != 4","a = 3.2","b = 6-2.8","a != b","50cm != 0.5m","5 cm != 2 inch"],seealso:["equal","smaller","larger","smallereq","largereq"]}},function(e){e.exports={name:"xgcd",category:"Arithmetic",syntax:["xgcd(a, b)"],description:"Calculate the extended greatest common divisor for two values",examples:["xgcd(8, 12)","gcd(8, 12)","xgcd(36163, 21199)"],seealso:["gcd","lcm"]}},function(e){e.exports={name:"arg",category:"Complex",syntax:["arg(x)"],description:"Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).",examples:["arg(2 + 2i)","atan2(3, 2)","arg(2 - 3i)"],seealso:["re","im","conj","abs"]}},function(e){e.exports={name:"conj",category:"Complex",syntax:["conj(x)"],description:"Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.",examples:["conj(2 + 3i)","conj(2 - 3i)","conj(-5.2i)"],seealso:["re","im","abs","arg"]}},function(e){e.exports={name:"re",category:"Complex",syntax:["re(x)"],description:"Get the real part of a complex number.",examples:["re(2 + 3i)","im(2 + 3i)","re(-5.2i)","re(2.4)"],seealso:["im","conj","abs","arg"]}},function(e){e.exports={name:"im",category:"Complex",syntax:["im(x)"],description:"Get the imaginary part of a complex number.",examples:["im(2 + 3i)","re(2 + 3i)","im(-5.2i)","im(2.4)"],seealso:["re","conj","abs","arg"]}},function(e){e.exports={name:"bignumber",category:"Type",syntax:["bignumber(x)"],description:"Create a big number from a number or string.",examples:["0.1 + 0.2","bignumber(0.1) + bignumber(0.2)",'bignumber("7.2")','bignumber("7.2e500")',"bignumber([0.1, 0.2, 0.3])"],seealso:["boolean","complex","index","matrix","string","unit"]}},function(e){e.exports={name:"boolean",category:"Type",syntax:["x","boolean(x)"],description:"Convert a string or number into a boolean.",examples:["boolean(0)","boolean(1)","boolean(3)",'boolean("true")','boolean("false")',"boolean([1, 0, 1, 1])"],seealso:["bignumber","complex","index","matrix","number","string","unit"]}},function(e){e.exports={name:"complex",category:"Type",syntax:["complex()","complex(re, im)","complex(string)"],description:"Create a complex number.",examples:["complex()","complex(2, 3)",'complex("7 - 2i")'],seealso:["bignumber","boolean","index","matrix","number","string","unit"]}},function(e){e.exports={name:"index",category:"Type",syntax:["[start]","[start:end]","[start:step:end]","[start1, start 2, ...]","[start1:end1, start2:end2, ...]","[start1:step1:end1, start2:step2:end2, ...]"],description:"Create an index to get or replace a subset of a matrix",examples:["[]","[1, 2, 3]","A = [1, 2, 3; 4, 5, 6]","A[1, :]","A[1, 2] = 50","A[0:2, 0:2] = ones(2, 2)"],seealso:["bignumber","boolean","complex","matrix,","number","range","string","unit"]}},function(e){e.exports={name:"matrix",category:"Type",syntax:["[]","[a1, b1, ...; a2, b2, ...]","matrix()","matrix([...])"],description:"Create a matrix.",examples:["[]","[1, 2, 3]","[1, 2, 3; 4, 5, 6]","matrix()","matrix([3, 4])"],seealso:["bignumber","boolean","complex","index","number","string","unit"]}},function(e){e.exports={name:"number",category:"Type",syntax:["x","number(x)"],description:"Create a number or convert a string or boolean into a number.",examples:["2","2e3","4.05","number(2)",'number("7.2")',"number(true)","number([true, false, true, true])"],seealso:["bignumber","boolean","complex","index","matrix","string","unit"]}},function(e){e.exports={name:"string",category:"Type",syntax:['"text"',"string(x)"],description:"Create a string or convert a value to a string",examples:['"Hello World!"',"string(4.2)","string(3 + 2i)"],seealso:["bignumber","boolean","complex","index","matrix","number","unit"]}},function(e){e.exports={name:"unit",category:"Type",syntax:["value unit","unit(value, unit)","unit(string)"],description:"Create a unit.",examples:["5.5 mm","3 inch",'unit(7.1, "kilogram")','unit("23 deg")'],seealso:["bignumber","boolean","complex","index","matrix","number","string"]}},function(e){e.exports={name:"eval",category:"Expression",syntax:["eval(expression)","eval([expr1, expr2, expr3, ...])"],description:"Evaluate an expression or an array with expressions.",examples:['eval("2 + 3")','eval("sqrt(" + 4 + ")")'],seealso:[]}},function(e){e.exports={name:"help",category:"Expression",syntax:["help(object)","help(string)"],description:"Display documentation on a function or data type.",examples:["help(sqrt)",'help("complex")'],seealso:[]}},function(e){e.exports={name:"concat",category:"Matrix",syntax:["concat(a, b, c, ...)","concat(a, b, c, ..., dim)"],description:"Concatenate matrices. By default, the matrices are concatenated by the first dimension. The dimension on which to concatenate can be provided as last argument.",examples:["a = [1, 2; 5, 6]","b = [3, 4; 7, 8]","concat(a, b)","[a, b]","concat(a, b, 2)","[a; b]"],seealso:["det","diag","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"det",category:"Matrix",syntax:["det(x)"],description:"Calculate the determinant of a matrix",examples:["det([1, 2; 3, 4])","det([-2, 2, 3; -1, 1, 3; 2, 0, -1])"],seealso:["concat","diag","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"diag",category:"Matrix",syntax:["diag(x)","diag(x, k)"],description:"Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned.When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.",examples:["diag(1:3)","diag(1:3, 1)","a = [1, 2, 3; 4, 5, 6; 7, 8, 9]","diag(a)"],seealso:["concat","det","eye","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"eye",category:"Matrix",syntax:["eye(n)","eye(m, n)","eye([m, n])","eye"],description:"Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.",examples:["eye(3)","eye(3, 5)","a = [1, 2, 3; 4, 5, 6]","eye(size(a))"],seealso:["concat","det","diag","inv","ones","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"inv",category:"Matrix",syntax:["inv(x)"],description:"Calculate the inverse of a matrix",examples:["inv([1, 2; 3, 4])","inv(4)","1 / 4"],seealso:["concat","det","diag","eye","ones","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"ones",category:"Matrix",syntax:["ones(m)","ones(m, n)","ones(m, n, p, ...)","ones([m])","ones([m, n])","ones([m, n, p, ...])","ones"],description:"Create a matrix containing ones.",examples:["ones(3)","ones(3, 5)","ones([2,3]) * 4.5","a = [1, 2, 3; 4, 5, 6]","ones(size(a))"],seealso:["concat","det","diag","eye","inv","range","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"range",category:"Type",syntax:["start:end","start:step:end","range(start, end)","range(start, end, step)","range(string)"],description:"Create a range. Lower bound of the range is included, upper bound is excluded.",examples:["1:5","3:-1:-3","range(3, 7)","range(0, 12, 2)",'range("4:10")',"a = [1, 2, 3, 4; 5, 6, 7, 8]","a[1:2, 1:2]"],seealso:["concat","det","diag","eye","inv","ones","size","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"resize",category:"Matrix",syntax:["resize(x, size)","resize(x, size, defaultValue)"],description:"Resize a matrix.",examples:["resize([1,2,3,4,5], [3])","resize([1,2,3], [5], 0)","resize(2, [2, 3], 0)",'resize("hello", [8], "!")'],seealso:["size","subset","squeeze"]}},function(e){e.exports={name:"size",category:"Matrix",syntax:["size(x)"],description:"Calculate the size of a matrix.",examples:["size(2.3)",'size("hello world")',"a = [1, 2; 3, 4; 5, 6]","size(a)","size(1:6)"],seealso:["concat","det","diag","eye","inv","ones","range","squeeze","subset","transpose","zeros"]}},function(e){e.exports={name:"squeeze",category:"Matrix",syntax:["squeeze(x)"],description:"Remove singleton dimensions from a matrix.",examples:["a = zeros(1,3,2)","size(squeeze(a))","b = zeros(3,1,1)","size(squeeze(b))"],seealso:["concat","det","diag","eye","inv","ones","range","size","subset","transpose","zeros"]}},function(e){e.exports={name:"subset",category:"Matrix",syntax:["value(index)","value(index) = replacement","subset(value, [index])","subset(value, [index], replacement)"],description:"Get or set a subset of a matrix or string. Indexes are one-based. Both the ranges lower-bound and upper-bound are included.",examples:["d = [1, 2; 3, 4]","e = []","e[1, 1:2] = [5, 6]","e[2, :] = [7, 8]","f = d * e","f[2, 1]","f[:, 1]"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","transpose","zeros"]}},function(e){e.exports={name:"transpose",category:"Matrix",syntax:["x'","transpose(x)"],description:"Transpose a matrix",examples:["a = [1, 2, 3; 4, 5, 6]","a'","transpose(a)"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","subset","zeros"]}},function(e){e.exports={name:"zeros",category:"Matrix",syntax:["zeros(m)","zeros(m, n)","zeros(m, n, p, ...)","zeros([m])","zeros([m, n])","zeros([m, n, p, ...])","zeros"],description:"Create a matrix containing zeros.",examples:["zeros(3)","zeros(3, 5)","a = [1, 2, 3; 4, 5, 6]","zeros(size(a))"],seealso:["concat","det","diag","eye","inv","ones","range","size","squeeze","subset","transpose"]}},function(e){e.exports={name:"combinations",category:"Probability",syntax:["combinations(n, k)"],description:"Compute the number of combinations of n items taken k at a time",examples:["combinations(7, 5)"],seealso:["permutations","factorial"]}},function(e){e.exports={name:"distribution",category:"Probability",syntax:["distribution(name)","distribution(name, arg1, arg2, ...)"],description:'Create a distribution object of a specific type. A distribution object contains functions `random([size,] [min,] [max])`, `randomInt([size,] [min,] [max])`, and `pickRandom(array)`. Available types of distributions: "uniform", "normal". Note that the function distribution is currently not available via the expression parser.',examples:[],seealso:["random","randomInt"]} +},function(e){e.exports={name:"factorial",category:"Probability",syntax:["n!","factorial(n)"],description:"Compute the factorial of a value",examples:["5!","5*4*3*2*1","3!"],seealso:[]}},function(e){e.exports={name:"permutations",category:"Probability",syntax:["permutations(n)","permutations(n, k)"],description:"Compute the number of permutations of n items taken k at a time",examples:["permutations(5)","permutations(5, 4)"],seealso:["combinations","factorial"]}},function(e){e.exports={name:"pickRandom",category:"Probability",syntax:["pickRandom(array)"],description:"Pick a random entry from a given array.",examples:["pickRandom(0:10)","pickRandom([1, 3, 1, 6])"],seealso:["distribution","random","randomInt"]}},function(e){e.exports={name:"random",category:"Probability",syntax:["random()","random(max)","random(min, max)","random(size)","random(size, max)","random(size, min, max)"],description:"Return a random number.",examples:["random()","random(10, 20)","random([2, 3])"],seealso:["distribution","pickRandom","randomInt"]}},function(e){e.exports={name:"randInt",category:"Probability",syntax:["randInt()","randInt(max)","randInt(min, max)","randInt(size)","randInt(size, max)","randInt(size, min, max)"],description:"Return a random integer number",examples:["randInt()","randInt(10, 20)","randInt([2, 3], 10)"],seealso:["distribution","pickRandom","random"]}},function(e){e.exports={name:"min",category:"Statistics",syntax:["min(a, b, c, ...)","min(A)","min(A, dim)"],description:"Compute the minimum value of a list of values.",examples:["min(2, 3, 4, 1)","min([2, 3, 4, 1])","min([2, 5; 4, 3], 0)","min([2, 5; 4, 3], 1)","min(2.7, 7.1, -4.5, 2.0, 4.1)","max(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["max","mean","min"]}},function(e){e.exports={name:"mean",category:"Statistics",syntax:["mean(a, b, c, ...)","mean(A)","mean(A, dim)"],description:"Compute the arithmetic mean of a list of values.",examples:["mean(2, 3, 4, 1)","mean([2, 3, 4, 1])","mean([2, 5; 4, 3], 0)","mean([2, 5; 4, 3], 1)","mean([1.0, 2.7, 3.2, 4.0])"],seealso:["max","min"]}},function(e){e.exports={name:"max",category:"Statistics",syntax:["max(a, b, c, ...)","max(A)","max(A, dim)"],description:"Compute the maximum value of a list of values.",examples:["max(2, 3, 4, 1)","max([2, 3, 4, 1])","max([2, 5; 4, 3], 0)","max([2, 5; 4, 3], 1)","max(2.7, 7.1, -4.5, 2.0, 4.1)","min(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["mean","min"]}},function(e){e.exports={name:"acos",category:"Trigonometry",syntax:["acos(x)"],description:"Compute the inverse cosine of a value in radians.",examples:["acos(0.5)","acos(cos(2.3))"],seealso:["cos","acos","asin"]}},function(e){e.exports={name:"asin",category:"Trigonometry",syntax:["asin(x)"],description:"Compute the inverse sine of a value in radians.",examples:["asin(0.5)","asin(sin(2.3))"],seealso:["sin","acos","asin"]}},function(e){e.exports={name:"atan",category:"Trigonometry",syntax:["atan(x)"],description:"Compute the inverse tangent of a value in radians.",examples:["atan(0.5)","atan(tan(2.3))"],seealso:["tan","acos","asin"]}},function(e){e.exports={name:"atan2",category:"Trigonometry",syntax:["atan2(y, x)"],description:"Computes the principal value of the arc tangent of y/x in radians.",examples:["atan2(2, 2) / pi","angle = 60 deg in rad","x = cos(angle)","y = sin(angle)","atan2(y, x)"],seealso:["sin","cos","tan"]}},function(e){e.exports={name:"cos",category:"Trigonometry",syntax:["cos(x)"],description:"Compute the cosine of x in radians.",examples:["cos(2)","cos(pi / 4) ^ 2","cos(180 deg)","cos(60 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["acos","sin","tan"]}},function(e){e.exports={name:"cot",category:"Trigonometry",syntax:["cot(x)"],description:"Compute the cotangent of x in radians. Defined as 1/tan(x)",examples:["cot(2)","1 / tan(2)"],seealso:["sec","csc","tan"]}},function(e){e.exports={name:"csc",category:"Trigonometry",syntax:["csc(x)"],description:"Compute the cosecant of x in radians. Defined as 1/sin(x)",examples:["csc(2)","1 / sin(2)"],seealso:["sec","cot","sin"]}},function(e){e.exports={name:"sec",category:"Trigonometry",syntax:["sec(x)"],description:"Compute the secant of x in radians. Defined as 1/cos(x)",examples:["sec(2)","1 / cos(2)"],seealso:["cot","csc","cos"]}},function(e){e.exports={name:"sin",category:"Trigonometry",syntax:["sin(x)"],description:"Compute the sine of x in radians.",examples:["sin(2)","sin(pi / 4) ^ 2","sin(90 deg)","sin(30 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["asin","cos","tan"]}},function(e){e.exports={name:"tan",category:"Trigonometry",syntax:["tan(x)"],description:"Compute the tangent of x in radians.",examples:["tan(0.5)","sin(0.5) / cos(0.5)","tan(pi / 4)","tan(45 deg)"],seealso:["atan","sin","cos"]}},function(e){e.exports={name:"to",category:"Units",syntax:["x to unit","to(x, unit)"],description:"Change the unit of a value.",examples:["5 inch in cm","3.2kg in g","16 bytes in bits"],seealso:[]}},function(e){e.exports={name:"clone",category:"Utils",syntax:["clone(x)"],description:"Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices",examples:["clone(3.5)","clone(2 - 4i)","clone(45 deg)","clone([1, 2; 3, 4])",'clone("hello world")'],seealso:[]}},function(e){e.exports={name:"map",category:"Utils",syntax:["map(x, callback)"],description:"Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.",examples:["map([1, 2, 3], function(val) { return math.max(val, 1.5) })"],seealso:[]}},function(e){e.exports={name:"forEach",category:"Utils",syntax:["forEach(x, callback)"],description:"Iterates over all elements of a matrix/array, and executes the given callback.",examples:["forEach([1, 2, 3], function(val) { console.log(val) })"],seealso:[]}},function(e){e.exports={name:"format",category:"Utils",syntax:["format(value)","format(value, precision)"],description:"Format a value of any type as string.",examples:["format(2.3)","format(3 - 4i)","format([])","format(pi, 3)"],seealso:["print"]}},function(e){e.exports={name:"import",category:"Utils",syntax:["import(string)"],description:"Import functions from a file.",examples:['import("numbers")','import("./mylib.js")'],seealso:[]}},function(e){e.exports={name:"typeof",category:"Utils",syntax:["typeof(x)"],description:"Get the type of a variable.",examples:["typeof(3.5)","typeof(2 - 4i)","typeof(45 deg)",'typeof("hello world")'],seealso:[]}},function(e,n){n.type=function r(e){var r=typeof e;if("object"===r){if(null===e)return"null";if(e instanceof Boolean)return"boolean";if(e instanceof Number)return"number";if(e instanceof String)return"string";if(Array.isArray(e))return"array";if(e instanceof Date)return"date"}return r}},function(e,n,r){function t(e,r){if(Array.isArray(e)){for(var i="[",o=e.length,a=0;o>a;a++)0!=a&&(i+=", "),i+=t(e[a],r);return i+="]"}return n.format(e,r)}var i=r(221),o=r(220);n.isString=function(e){return e instanceof String||"string"==typeof e},n.endsWith=function(e,n){var r=e.length-n.length,t=e.length;return e.substring(r,t)===n},n.format=function(e,r){return i.isNumber(e)||e instanceof o?i.format(e,r):Array.isArray(e)?t(e,r):n.isString(e)?'"'+e+'"':"function"==typeof e?e.syntax?e.syntax+"":"function":e instanceof Object?"function"==typeof e.format?e.format(r):e.toString():String(e)}},function(e,n,r){function t(e){return r(i(e))}function i(e){return o[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var o={"./clone":94,"./clone.js":94,"./forEach":100,"./forEach.js":100,"./format":95,"./format.js":95,"./import":96,"./import.js":96,"./map":97,"./map.js":97,"./print":98,"./print.js":98,"./typeof":99,"./typeof.js":99};t.keys=function(){return Object.keys(o)},t.resolve=i,e.exports=t},function(e,n,r){var t;!function(i){"use strict";function o(e,n){var r,t,i,u,f,c,p=this;if(!(p instanceof o))return new o(e,n);if(e instanceof o){if(A=0,n===r)return p.s=e.s,p.e=e.e,void(p.c=(e=e.c)?e.slice():e);e+=""}if("string"!=typeof e&&(e=(i="number"==typeof e||"[object Number]"==Object.prototype.toString.call(e))&&0===e&&0>1/e?"-0":e+""),c=e,n===r&&O.test(e))p.s="-"==e.charAt(0)?(e=e.slice(1),-1):1;else{if(10==n)return l(e,g,d);if(e=T.call(e).replace(/^\+(?!-)/,""),p.s="-"==e.charAt(0)?(e=e.replace(/^-(?!-)/,""),-1):1,null!=n?n!=(0|n)&&y||(m=!(n>=2&&65>n))?(a(n,2),f=O.test(e)):(u="["+M.slice(0,n=0|n)+"]+",e=e.replace(/\.$/,"").replace(/^\./,"0."),(f=new RegExp("^"+u+"(?:\\."+u+")?$",37>n?"i":"").test(e))?(i&&(e.replace(/^0\.0*|\./,"").length>15&&a(c,0),i=!i),e=s(e,10,n,p.s)):"Infinity"!=e&&"NaN"!=e&&(a(c,1,n),e="NaN")):f=O.test(e),!f)return p.c=p.e=null,"Infinity"!=e&&("NaN"!=e&&a(c,3),p.s=null),void(A=0)}for((r=e.indexOf("."))>-1&&(e=e.replace(".","")),(t=e.search(/e/i))>0?(0>r&&(r=t),r+=+e.slice(t+1),e=e.substring(0,t)):0>r&&(r=e.length),t=0;"0"==e.charAt(t);t++);if(n=e.length,i&&n>15&&e.slice(t).length>15&&a(c,0),A=0,(r-=t+1)>b)p.c=p.e=null;else if(t==n||w>r)p.c=[p.e=0];else{for(;"0"==e.charAt(--n););for(p.e=r,p.c=[],r=0;n>=t;p.c[r++]=+e.charAt(t++));}}function a(e,n,r,t,i,o){if(y){var a,s=["new BigNumber","cmp","div","eq","gt","gte","lt","lte","minus","mod","plus","times","toFr"][A?0>A?-A:A:0>1/A?1:0]+"()",u=m?" out of range":" not a"+(i?" non-zero":"n")+" integer";throw u=([s+" number type has more than 15 significant digits",s+" not a base "+r+" number",s+" base"+u,s+" not a number"][n]||r+"() "+n+(o?" not a boolean or binary digit":u+(t?" or not ["+(m?" negative, positive":" integer, integer")+" ]":"")))+": "+e,m=A=0,a=new Error(u),a.name="BigNumber Error",a}}function s(e,n,r,t){function i(e,t){var i,o,a=0,s=e.length,u=[0];for(t=t||r;s>a;a++){for(o=u.length,i=0;o>i;u[i]*=t,i++);for(u[0]+=M.indexOf(e.charAt(a)),i=0;in-1&&(null==u[i+1]&&(u[i+1]=0),u[i+1]+=u[i]/n^0,u[i]%=n)}return u.reverse()}function a(e){for(var n=0,r=e.length,t="";r>n;t+=M.charAt(e[n++]));return t}var s,f,c,l,m,p;if(37>r&&(e=e.toLowerCase()),(s=e.indexOf("."))>-1)if(s=e.length-s-1,f=i(new o(r).pow(s).toF(),10),l=e.split("."),c=i(l[1]),l=i(l[0]),p=u(c,f,c.length-f.length,t,n,1&l[l.length-1]),m=p.c,s=p.e){for(;++s;m.unshift(0));e=a(l)+"."+a(m)}else m[0]?l[s=l.length-1]M?0:M;v++f;f++){if(s!=(v=x.length))l=s>v?1:-1;else for(m=-1,l=0;++mx[m]?1:-1;break}if(!(0>l))break;for(u=v==s?n:p;v;){if(x[--v]M&&c(y,g,i,a,null!=x[0]),y.e>b?y.c=y.e=null:y.e++n&&c(e,t,10),t=0==i[0]?t+1:r?n:e.e+t+1;i.length=t)?(e.s<0&&i[0]?"-":"")+(i.length>1?(i.splice(1,0,"."),i.join("")):i[0])+(0>t?"e":"e+")+t:e.toS()}function c(e,n,r,t,i){var o=e.c,a=e.s<0,s=r/2,u=e.e+n+1,f=o[u],c=i||0>u||null!=o[u+1];if(i=4>d?(null!=f||c)&&(0==d||2==d&&!a||3==d&&a):f>s||f==s&&(4==d||c||6==d&&(1&o[u-1]||!n&&t)||7==d&&!a||8==d&&a),1>u||!o[0])return o.length=0,o.push(0),i?(o[0]=1,e.e=-n):e.e=0,e;if(o.length=u--,i)for(--r;++o[u]>r;)o[u]=0,u--||(++e.e,o.unshift(1));for(u=o.length;!o[--u];o.pop());return e}function l(e,n,r){var t=d;return d=r,e=new o(e),e.c&&c(e,n,10),d=t,e}var m,p=1e9,h=1e6,g=20,d=4,x=-7,v=21,w=-p,b=p,y=!0,E=parseInt,N=o.prototype,M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",A=0,O=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,T=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},S=o(1);o.ROUND_UP=0,o.ROUND_DOWN=1,o.ROUND_CEIL=2,o.ROUND_FLOOR=3,o.ROUND_HALF_UP=4,o.ROUND_HALF_DOWN=5,o.ROUND_HALF_EVEN=6,o.ROUND_HALF_CEIL=7,o.ROUND_HALF_FLOOR=8,o.config=function(){var e,n,r=0,t={},i=arguments,o=i[0],s="config",u=function(e,n,r){return!((m=n>e||e>r)||E(e)!=e&&0!==e)},f=o&&"object"==typeof o?function(){return o.hasOwnProperty(n)?null!=(e=o[n]):void 0}:function(){return i.length>r?null!=(e=i[r++]):void 0};return f(n="DECIMAL_PLACES")&&(u(e,0,p)?g=0|e:a(e,n,s)),t[n]=g,f(n="ROUNDING_MODE")&&(u(e,0,8)?d=0|e:a(e,n,s)),t[n]=d,f(n="EXPONENTIAL_AT")&&(u(e,-p,p)?x=-(v=~~(0>e?-e:+e)):!m&&e&&u(e[0],-p,0)&&u(e[1],0,p)?(x=~~e[0],v=~~e[1]):a(e,n,s,1)),t[n]=[x,v],f(n="RANGE")&&(u(e,-p,p)&&~~e?w=-(b=~~(0>e?-e:+e)):!m&&e&&u(e[0],-p,-1)&&u(e[1],1,p)?(w=~~e[0],b=~~e[1]):a(e,n,s,1,1)),t[n]=[w,b],f(n="ERRORS")&&(e===!!e||1===e||0===e?(m=A=0,E=(y=!!e)?parseInt:parseFloat):a(e,n,s,0,0,1)),t[n]=y,t},N.abs=N.absoluteValue=function(){var e=new o(this);return e.s<0&&(e.s=1),e},N.ceil=function(){return l(this,0,2)},N.comparedTo=N.cmp=function(e,n){var r,t=this,i=t.c,a=(A=-A,e=new o(e,n)).c,s=t.s,u=e.s,f=t.e,c=e.e;if(!s||!u)return null;if(r=i&&!i[0],n=a&&!a[0],r||n)return r?n?0:-u:s;if(s!=u)return s;if(r=0>s,n=f==c,!i||!a)return n?0:!i^r?1:-1;if(!n)return f>c^r?1:-1;for(s=-1,u=(f=i.length)<(c=a.length)?f:c;++sa[s]^r?1:-1;return f==c?0:f>c^r?1:-1},N.dividedBy=N.div=function(e,n){var r=this.c,t=this.e,i=this.s,a=(A=2,e=new o(e,n)).c,s=e.e,f=e.s,c=i==f?1:-1;return(t||r&&r[0])&&(s||a&&a[0])?u(r,a,t-s,c,10):new o(i&&f&&(r?!a||r[0]!=a[0]:a)?r&&0==r[0]||!a?0*c:c/0:0/0)},N.equals=N.eq=function(e,n){return A=3,0===this.cmp(e,n)},N.floor=function(){return l(this,0,3)},N.greaterThan=N.gt=function(e,n){return A=4,this.cmp(e,n)>0},N.greaterThanOrEqualTo=N.gte=function(e,n){return A=5,1==(n=this.cmp(e,n))||0===n},N.isFinite=N.isF=function(){return!!this.c},N.isNaN=function(){return!this.s},N.isNegative=N.isNeg=function(){return this.s<0},N.isZero=N.isZ=function(){return!!this.c&&0==this.c[0]},N.lessThan=N.lt=function(e,n){return A=6,this.cmp(e,n)<0},N.lessThanOrEqualTo=N.lte=function(e,n){return A=7,-1==(n=this.cmp(e,n))||0===n},N.minus=function(e,n){var r,t,i,a,s=this,u=s.s;if(n=(A=8,e=new o(e,n)).s,!u||!n)return new o(0/0);if(u!=n)return e.s=-n,s.plus(e);var f=s.c,c=s.e,l=e.c,m=e.e;if(!c||!m){if(!f||!l)return f?(e.s=-n,e):new o(l?s:0/0);if(!f[0]||!l[0])return l[0]?(e.s=-n,e):new o(f[0]?s:3==d?-0:0)}if(f=f.slice(),u=c-m){for(r=(a=0>u)?(u=-u,f):(m=c,l),r.reverse(),n=u;n--;r.push(0));r.reverse()}else for(i=((a=f.lengthn;n++)if(f[n]!=l[n]){a=f[n]0)for(;n--;f[i++]=0);for(n=l.length;n>u;){if(f[--n]m||!f[0])&&(f[0]||(e.s=3==d?-1:1),f=[m=0]),e.c=f,e.e=m,e},N.modulo=N.mod=function(e,n){var r=this,t=r.c,i=(A=9,e=new o(e,n)).c,a=r.s,s=e.s;return n=!a||!s||i&&!i[0],n||t&&!t[0]?new o(n?0/0:r):(r.s=e.s=1,n=1==e.cmp(r),r.s=a,e.s=s,n?new o(r):(a=g,s=d,g=0,d=1,r=r.div(e),g=a,d=s,this.minus(r.times(e))))},N.negated=N.neg=function(){var e=new o(this);return e.s=-e.s||null,e},N.plus=function(e,n){var r,t=this,i=t.s;if(n=(A=10,e=new o(e,n)).s,!i||!n)return new o(0/0);if(i!=n)return e.s=-n,t.minus(e);var a=t.e,s=t.c,u=e.e,f=e.c;if(!a||!u){if(!s||!f)return new o(i/0);if(!s[0]||!f[0])return f[0]?e:new o(s[0]?t:0*i)}if(s=s.slice(),i=a-u){for(r=i>0?(u=a,f):(i=-i,s),r.reverse();i--;r.push(0));r.reverse()}for(s.length-f.length<0&&(r=f,f=s,s=r),i=f.length,n=0;i;n=(s[--i]=s[i]+f[i]+n)/10^0,s[i]%=10);for(n&&(s.unshift(n),++u>b&&(s=u=null)),i=s.length;0==s[--i];s.pop());return e.c=s,e.e=u,e},N.toPower=N.pow=function(e){var n=0*e==0?0|e:e,r=new o(this),t=new o(S);if(((m=-h>e||e>h)&&(n=1*e/0)||E(e)!=e&&0!==e&&!(n=0/0))&&!a(e,"exponent","pow")||!n)return new o(Math.pow(r.toS(),n));for(n=0>n?-n:n;1&n&&(t=t.times(r)),n>>=1,n;)r=r.times(r);return 0>e?S.div(t):t},N.round=function(e,n){return e=null==e||((m=0>e||e>p)||E(e)!=e)&&!a(e,"decimal places","round")?0:0|e,n=null==n||((m=0>n||n>8)||E(n)!=n&&0!==n)&&!a(n,"mode","round")?d:0|n,l(this,e,n)},N.squareRoot=N.sqrt=function(){var e,n,r,t,i=this,a=i.c,s=i.s,u=i.e,f=g,l=d,m=new o("0.5");if(1!==s||!a||!a[0])return new o(!s||0>s&&(!a||a[0])?0/0:a?i:1/0);for(s=Math.sqrt(i.toS()),d=1,0==s||s==1/0?(e=a.join(""),e.length+u&1||(e+="0"),n=new o(Math.sqrt(e)+""),n.c||(n.c=[1]),n.e=((u+1)/2|0)-(0>u||1&u)):n=new o(e=s.toString()),r=n.e,s=r+(g+=4),3>s&&(s=0),u=s;;)if(t=n,n=m.times(t.plus(i.div(t))),t.c.slice(0,s).join("")===n.c.slice(0,s).join("")){if(a=n.c,s-=e&&n.eu-2&&(a.length=u-2),n.times(n).eq(i)))){for(;a.length-1;s--){for(n=0,u=f+s;u>s;n=r[u]+a[s]*i[u-s-1]+n,r[u--]=n%10|0,n=n/10|0);n&&(r[u]=(r[u]+n)%10)}for(n&&++e.e,!r[0]&&r.shift(),u=r.length;!r[--u];r.pop());return e.c=e.e>b?e.e=null:e.ee||e>p)||E(e)!=e&&0!==e)&&!a(e,"decimal places","toE"))&&this.c?this.c.length-1:0|e,1)},N.toFixed=N.toF=function(e){var n,r,t,i=this;return null==e||((m=0>e||e>p)||E(e)!=e&&0!==e)&&!a(e,"decimal places","toF")||(t=i.e+(0|e)),n=x,e=v,x=-(v=1/0),t==r?r=i.toS():(r=f(i,t),i.s<0&&i.c&&(i.c[0]?r.indexOf("-")<0&&(r="-"+r):r=r.replace(/^-/,""))),x=n,v=e,r},N.toFraction=N.toFr=function(e){var n,r,t,i,s,u,f,c=i=new o(S),l=t=new o("0"),p=this,h=p.c,x=b,v=g,w=d,E=new o(S);if(!h)return p.toS();for(f=E.e=h.length-p.e-1,(null==e||(!(A=12,u=new o(e)).s||(m=u.cmp(c)<0||!u.c)||y&&u.e0)&&(e=f>0?E:c),b=1/0,u=new o(h.join("")),g=0,d=1;n=u.div(E),s=i.plus(n.times(l)),1!=s.cmp(e);)i=l,l=s,c=t.plus(n.times(s=c)),t=s,E=u.minus(n.times(s=E)),u=s;return s=e.minus(i).div(l),t=t.plus(s.times(c)),i=i.plus(s.times(l)),t.s=c.s=p.s,g=2*f,d=w,r=c.div(l).minus(p).abs().cmp(t.div(i).minus(p).abs())<1?[c.toS(),l.toS()]:[t.toS(),i.toS()],b=x,g=v,r},N.toPrecision=N.toP=function(e){return null==e||((m=1>e||e>p)||E(e)!=e)&&!a(e,"precision","toP")?this.toS():f(this,0|--e,2)},N.toString=N.toS=function(e){var n,r,t,i=this,o=i.e;if(null===o)r=i.s?"Infinity":"NaN";else{if(e===n&&(x>=o||o>=v))return f(i,i.c.length-1,1);if(r=i.c.join(""),0>o){for(;++o;r="0"+r);r="0."+r}else if(t=r.length,o>0)if(++o>t)for(o-=t;o--;r+="0");else t>o&&(r=r.slice(0,o)+"."+r.slice(o));else if(n=r.charAt(0),t>1)r=n+"."+r.slice(1);else if("0"==n)return n;if(null!=e)if((m=!(e>=2&&65>e))||e!=(0|e)&&y)a(e,"base","toS");else if(r=s(r,0|e,10,i.s),"0"==r)return r}return i.s<0?"-"+r:r},N.valueOf=function(){return this.toS()},"undefined"!=typeof e&&e.exports?e.exports=o:(t=function(){return o}.call(n,r,n,e),!(void 0!==t&&(e.exports=t)))}(this)},function(e,n,r){function t(e){return e instanceof o?e.isZero():0===e}function i(e,n,r){var t;return e instanceof o?(t=e.abs(),t.gte(n)&&t.lt(r)):(t=Math.abs(e),t>=n&&r>t)}var o=r(220);n.isNumber=function(e){return e instanceof Number||"number"==typeof e},n.isInteger=function(e){return e==Math.round(e)},n.sign=function(e){return e>0?1:0>e?-1:0},n.format=function(e,r){if("function"==typeof r)return r(e);if(1/0===e)return"Infinity";if(e===-1/0)return"-Infinity";if(isNaN(e))return"NaN";var a="auto",s=void 0;switch(void 0!==r&&(r.notation&&(a=r.notation),r&&(n.isNumber(r)?s=r:r.precision&&(s=r.precision))),a){case"fixed":return n.toFixed(e,s);case"scientific":throw new Error('Format notation "scientific" is deprecated. Use "exponential" instead.');case"exponential":return n.toExponential(e,s);case"auto":var u=.001,f=1e5;if(r&&r.exponential)void 0!==r.exponential.lower&&(u=r.exponential.lower),void 0!==r.exponential.upper&&(f=r.exponential.upper);else if(r&&r.scientific)throw new Error("options.scientific is deprecated, use options.exponential instead.");var c=e instanceof o;if(c){var l=o.config().EXPONENTIAL_AT;o.config({EXPONENTIAL_AT:[Math.round(Math.log(u)/Math.LN10),Math.round(Math.log(f)/Math.LN10)]})}if(t(e))return"0";var m;if(i(e,u,f))if(c)m=new o(e.toPrecision(s)).toString();else{var p=s?e.toPrecision(Math.min(s,21)):e.toPrecision();m=parseFloat(p)+""}else m=n.toExponential(e,s);return c&&o.config({EXPONENTIAL_AT:l}),m.replace(/((\.\d*?)(0+))($|e)/,function(){var e=arguments[2],n=arguments[4];return"."!==e?e+n:n});default:throw new Error('Unknown notation "'+a+'". Choose "auto", "exponential", or "fixed".')}},n.toExponential=function(e,n){return void 0!==n?e.toExponential(e instanceof o?n-1:Math.min(n-1,20)):e.toExponential()},n.toFixed=function(e,n){return e.toFixed(e instanceof o?n||0:Math.min(n,20))},n.digits=function(e){return e.toExponential().replace(/e[\+\-0-9]*$/,"").replace(/^0\.0*|\./,"").length},n.toBigNumber=function(e){return n.digits(e)>15?e:new o(e)},n.toNumber=function(e){return parseFloat(e.valueOf())}},function(e,n,r){function t(e){for(var n=[];f(e);)n.push(e.length),e=e[0];return n}function i(e,n,r){var t,o=e.length;if(o!=n[r])throw new RangeError("Dimension mismatch ("+o+" != "+n[r]+")");if(rt;t++){var s=e[t];if(!f(s))throw new RangeError("Dimension mismatch ("+(n.length-1)+" < "+n.length+")");i(e[t],n,a)}}else for(t=0;o>t;t++)if(f(e[t]))throw new RangeError("Dimension mismatch ("+(n.length+1)+" > "+n.length+")")}function o(e,n,r,t){if(!f(e))throw Error("Array expected");var i,a,s=e.length,c=n[r],l=Math.min(s,c);if(e.length=c,ri;i++)a=e[i],o(a,n,m,t);for(i=l;c>i;i++)a=[],e[i]=a,o(a,n,m,t)}else if(void 0!==t)for(i=s;c>i;i++)e[i]=u.clone(t)}var a=r(221),s=r(218),u=r(2),f=(r(217),Array.isArray);n.size=function(e){var r=t(e);return n.validate(e,r),r},n.validate=function(e,n){var r=0==n.length;if(r){if(f(e))throw new RangeError("Dimension mismatch ("+e.length+" != 0)")}else i(e,n,0)},n.validateIndex=function(e,n){if(!a.isNumber(e)||!a.isInteger(e))throw new TypeError("Index must be an integer (value: "+e+")");if(0>e)throw new RangeError("Index out of range ("+e+" < 0)");if(void 0!==n&&e>=n)throw new RangeError("Index out of range ("+e+" > "+(n-1)+")")},n.resize=function(e,n,r){if(!f(e)||!f(n))throw new TypeError("Array expected");if(0===n.length)throw new Error("Resizing to scalar is not supported");n.forEach(function(e){if(!a.isNumber(e)||!a.isInteger(e)||0>e)throw new TypeError("Invalid size, must contain positive integers (size: "+s.format(n)+")")});for(var t=1,i=e[0];f(i);)t++,i=i[0];for(;tn.length;)e=e[0],t--;return o(e,n,0,r),e},n.squeeze=function(e){for(;f(e)&&1===e.length;)e=e[0];return e},n.unsqueeze=function(e,r){for(var t=n.size(e),i=0,o=r-t.length;o>i;i++)e=[e];return e},n.isArray=f},function(e,n){n.isBoolean=function(e){return e instanceof Boolean||"boolean"==typeof e}}]); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index c22380373..f0f4b82e6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,14 +5,14 @@ var fs = require('fs'), uglify = require('uglify-js'); var ENTRY = './index.js', + HEADER = './lib/header.js', FILE = 'math.js', FILE_MIN = 'math.min.js', - MAP = 'math.map.js', + FILE_MAP = 'math.map', DIST = './dist', - HEADER = './lib/header.js', MATH_JS = DIST + '/' + FILE, MATH_MIN_JS = DIST + '/' + FILE_MIN, - MATH_MAP_JS = DIST + '/' + MAP; + MATH_MAP_JS = DIST + '/' + FILE_MAP; // generate banner with today's date and correct version function createBanner() { @@ -42,7 +42,8 @@ var webpackConfig = { }; var uglifyConfig = { - outSourceMap: MAP, + // FIXME: source map is generated, but math.min.js misses a link to this source file + outSourceMap: FILE_MAP, output: { comments: /@license/ }