UNPKG

pando-computing

Version:

Distribute processing of a stream of items to volunteers on the web.

1,334 lines (1,282 loc) 33.4 kB
/* * MatJuice API. These functions are used internally in the library * for MATLAB built-ins, however they do not correspond to any MATLAB * built-in. */ /* Create a new matrix object. * x : the Float64Array that contains the data. * shape: an array containing the dimensions of the matrix. * * Note: the elements in x are expected to be in column-major order, * i.e. the matrix [1 2 ; 3 4] is represented as {1, 3, 2, 4}. */ var CLONE_LENGTHS = 0; var CLONE_COUNT = 0; Float64Array.prototype.mj_clone = function() { CLONE_COUNT++; CLONE_LENGTHS += this.length; var newbuf = new Float64Array(this); var newshape = this.mj_size().slice(0); return mj_create(newbuf, newshape); } Float64Array.prototype.mj_scalar = function() { return false; } Float64Array.prototype.mj_numel = function() { return this._length; } Float64Array.prototype.mj_size = function() { return this._shape; } Float64Array.prototype.mj_stride = function() { return this._stride; } Float64Array.prototype.mj_dims = function() { return this._dims; } Float64Array.prototype.mj_get = function(indices) { return this[mj_compute_index(this, indices)]; } Float64Array.prototype.mj_set = function(value, indices) { this[mj_compute_index(this, indices)] = value; return this; } Number.prototype.mj_clone = function() { return this; } Number.prototype.mj_scalar = function() { return true; } Number.prototype.mj_numel = function() { return 1; } Number.prototype.mj_size = function() { return [1, 1]; } Number.prototype.mj_stride = function() { return [1, 0]; } Number.prototype.mj_dims = function() { return 2; } Number.prototype.mj_get = function(indices) { var idx = mj_compute_index(this, indices); if (idx === 0) return this; else return undefined; } Number.prototype.mj_set = function(value, indices) { var idx = mj_compute_index(this, indices); if (idx === 0) return value; else return undefined; } function mj_create(x, shape) { function mj_make_stride(shape) { var stride = [1]; for (var i = 0; i < shape.length - 1; ++i) { stride.push(stride[i] * shape[i]); } return stride; } if (typeof x === "object" && x.length == 1) { x = x[0]; } else if (typeof x === "object") { x._length = x.length; x._shape = shape; x._dims = shape.length; x._stride = mj_make_stride(shape, x._dims); } return x; } function mj_new_from(matrix) { var buf = new Float64Array(matrix.mj_numel()); return mj_create(buf, matrix.mj_size()); } function mj_compute_index(x, indices) { var array_index = 0; var stride = x.mj_stride(); for (var i = 0, end = indices.length; i < end; ++i) { array_index += (indices[i] - 1) * stride[i]; } return array_index; } function mj_convert_to_slices(array, indices) { var slice_indices = new Array(indices.length); for (var i = 0; i < indices.length; ++i) { if (indices[i] === MC_COLON) { slice_indices[i] = mc_colon(1, array.mj_size()[i]); } else if (typeof indices[i] === "object") { // slice slice_indices[i] = indices[i]; } else { slice_indices[i] = [indices[i]]; } } return slice_indices; } function mj_compute_shape(slice_indices) { var shape = []; for (var i = 0; i < slice_indices.length; ++i) { shape.push(slice_indices[i].length); } // HACK(vfoley): make sure always at least two dimensions. if (shape.length === 1) shape.push(1); return shape; } function MJSliceIterator(indices) { N = indices.length; this.indices = indices; this.is_done = false; this.curr = new Array(N); for (var j = 0; j < N; ++j) { this.curr[j] = 0; } this.next = function() { if (this.is_done) return null; // Save current index settings prev = this.curr.slice(); // Advance current index for (var j = 0; j < N; ++j) { this.curr[j] = (this.curr[j] + 1) % this.indices[j].length; if (this.curr[j] !== 0) break; } // We are done if all indices of prev are at the end this.is_done = true; for (var j = 0; j < N; ++j) { this.is_done = this.is_done && (prev[j]+1 === this.indices[j].length); } var result = new Array(N); for (var j = 0; j < N; ++j) { result[j] = this.indices[j][prev[j]]; } return result; } } function mj_forall(arr) { for (var i = 0; i < arr.length; ++i) { if (arr.mj_get([i]) === 0) { return false; } } return true; } function zeroIndex(xs) { for (var i = 0; i < xs.length; ++i) if (xs[i] === 0) return i; return -1; } function nanIndex(xs) { for (var i = 0; i < xs.length; ++i) if (isNaN(xs[i])) return i; return -1; } var MC_COLON = {}; var MC_TICTOC = 0; function mc_error(msg) { throw new Error(msg); } function mc_plus_SS(x$2, y) { return x$2 + y; } function mc_plus_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) + x$2, [i]); } ; return out$2; } function mc_plus_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) + x$2, [i]); } ; return out$2; } function mc_plus_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 + y, [i]); } ; return out$2; } function mc_minus_SS(x$2, y) { return x$2 - y; } function mc_minus_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 - m.mj_get([i]), [i]); } ; return out$2; } function mc_minus_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) - x$2, [i]); } ; return out$2; } function mc_minus_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 - y, [i]); } ; return out$2; } function mc_rem_SS(x$2, y) { return x$2 % y; } function mc_rem_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 % m.mj_get([i]), [i]); } ; return out$2; } function mc_rem_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) % x$2, [i]); } ; return out$2; } function mc_rem_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 % y, [i]); } ; return out$2; } function mc_mod_SS(x$2, y) { var n = Math.floor(x$2 / y); return x$2 - n * y; } function mc_mod_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1; i <= m.mj_numel(); ++i) { out$2.mj_set(mc_mod_SS(x$2, m.mj_get([i])), [i]); } return out$2; } function mc_mod_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1; i <= m.mj_numel(); ++i) { out$2.mj_set(mc_mod_SS(m.mj_get([i]), x$2), [i]); } return out$2; } function mc_mod_MM(m1, m2) { var out$2 = mj_new_from(m1); if (m1.mj_numel() !== m2.mj_numel()) { throw new Error('matrix sizes differ'); } for (var i = 1; i <= m1.mj_numel(); ++i) { var a = m1.mj_get([i]); var b = m2.mj_get([i]); out$2.mj_set(mc_mod_SS(a, b), [i]); } return out$2; } function mc_mtimes_SS(x$2, y) { return x$2 * y; } function mc_mtimes_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) * x$2, [i]); } ; return out$2; } function mc_mtimes_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) * x$2, [i]); } ; return out$2; } function mc_mtimes_MM(m1, m2) { var m1_rows = m1.mj_size()[0]; var m1_cols = m1.mj_size()[1]; var m2_rows = m2.mj_size()[0]; var m2_cols = m2.mj_size()[1]; if (m1_cols !== m2_rows) { throw new Error('Inner matrix dimensions must agree.'); } var out$2 = mc_zeros(m1_rows, m2_cols); for (var row = 1; row <= m1_rows; ++row) { for (var col = 1; col <= m2_cols; ++col) { var acc = 0; for (var k = 1; k <= m2_rows; ++k) { acc += m1.mj_get([ row, k ]) * m2.mj_get([ k, col ]); } out$2 = out$2.mj_set(acc, [ row, col ]); } } return out$2; } function mc_times_SS(a, b) { return mc_mtimes_SS(a, b); } function mc_times_SM(a, b) { return mc_mtimes_SM(a, b); } function mc_times_MS(a, b) { return mc_mtimes_MS(a, b); } function mc_times_MM(a, b) { var out$2 = mj_new_from(a); var m1_length = a.mj_numel(); var m2_length = b.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = a.mj_get([i]); var y = b.mj_get([i]); out$2.mj_set(x$2 * y, [i]); } ; return out$2; } function mc_mrdivide_SS(x$2, y) { return x$2 / y; } function mc_mrdivide_SM(x$2, m) { throw new Error('Unsupported mrdivide for scalar-matrix arguments'); } function mc_mrdivide_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) / x$2, [i]); } ; return out$2; } function mc_mrdivide_MM(m1, m2) { throw new Error('mc_mrdivide_MM: not implemented'); } function mc_rdivide_SS(x$2, y) { return x$2 / y; } function mc_rdivide_MS(m, d) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) / d, [i]); } ; return out$2; } function mc_rdivide_SM(d, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(d / m.mj_get([i]), [i]); } ; return out$2; } function mc_rdivide_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 / y, [i]); } ; return out$2; } function mc_lt_SS(x$2, y) { return x$2 < y; } function mc_lt_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 < m.mj_get([i]), [i]); } ; return out$2; } function mc_lt_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) < x$2, [i]); } ; return out$2; } function mc_lt_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 < y, [i]); } ; return out$2; } function mc_gt_SS(x$2, y) { return x$2 > y; } function mc_gt_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 > m.mj_get([i]), [i]); } ; return out$2; } function mc_gt_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) > x$2, [i]); } ; return out$2; } function mc_gt_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 > y, [i]); } ; return out$2; } function mc_le_SS(x$2, y) { return x$2 <= y; } function mc_le_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 <= m.mj_get([i]), [i]); } ; return out$2; } function mc_le_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) <= x$2, [i]); } ; return out$2; } function mc_le_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 <= y, [i]); } ; return out$2; } function mc_ge_SS(x$2, y) { return x$2 >= y; } function mc_ge_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 >= m.mj_get([i]), [i]); } ; return out$2; } function mc_ge_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) >= x$2, [i]); } ; return out$2; } function mc_ge_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 >= y, [i]); } ; return out$2; } function mc_eq_SS(x1, x2) { return x1 === x2; } function mc_eq_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 === m.mj_get([i]), [i]); } ; return out$2; } function mc_eq_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) === x$2, [i]); } ; return out$2; } function mc_eq_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 === y, [i]); } ; return out$2; } function mc_ne_SS(x1, x2) { return x1 !== x2; } function mc_ne_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2 !== m.mj_get([i]), [i]); } ; return out$2; } function mc_ne_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(m.mj_get([i]) !== x$2, [i]); } ; return out$2; } function mc_ne_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 !== y, [i]); } ; return out$2; } function mc_length_S(x$2) { return 1; } function mc_length_M(m) { var max = 0; var size = m.mj_size(); for (var i = 0, n = size.length; i < n; ++i) max = Math.max(max, size[i]); return max; } function mc_floor_S(x$2) { return Math.floor(x$2); } function mc_floor_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.floor(m.mj_get([i])), [i]); } ; return out$2; } function mc_ceil_S(x$2) { return Math.ceil(x$2); } function mc_ceil_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.ceil(m.mj_get([i])), [i]); } ; return out$2; } function mc_sin_S(x$2) { return Math.sin(x$2); } function mc_sin_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.sin(m.mj_get([i])), [i]); } ; return out$2; } function mc_cos_S(x$2) { return Math.cos(x$2); } function mc_cos_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.cos(m.mj_get([i])), [i]); } ; return out$2; } function mc_tan_S(x$2) { return Math.tan(x$2); } function mc_tan_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.tan(m.mj_get([i])), [i]); } ; return out$2; } function mc_sqrt_S(x$2) { return Math.sqrt(x$2); } function mc_sqrt_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.sqrt(m.mj_get([i])), [i]); } ; return out$2; } function mc_uminus_S(x$2) { return -x$2; } function mc_uminus_M(m) { var out$2 = mj_new_from(m); for (var i = 1; i <= m.mj_numel(); ++i) out$2.mj_set(-out$2.mj_get([i]), [i]); return out$2; } function mc_round_S(x$2) { return Math.round(x$2); } function mc_round_M(m) { out = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out.mj_set(Math.round(m.mj_get([i])), [i]); } ; return m; } function mc_mpower_SS(a, b) { return Math.pow(a, b); } function mc_power_SS(a, b) { return Math.pow(a, b); } function mc_power_SM(a, b) { var out$2 = mj_new_from(b); for (var i = 0; i < b.mj_numel(); ++i) out$2[i] = Math.pow(a, out$2[i]); return out$2; } function mc_power_MS(a, b) { var out$2 = mj_new_from(a); for (var i = 0; i < a.mj_numel(); ++i) { out$2[i] = Math.pow(out$2[i], b); } return out$2; } function mc_true() { return true; } function mc_false() { return false; } function mc_horzcat() { var num_rows = -1; var num_cols = 0; var len = 0; for (// Compute the length and number of columns of the result. // Also check that all arguments have the same number of rows. var i = 0; i < arguments.length; ++i) { if (num_rows == -1) { num_rows = arguments[i].mj_size()[0]; } else if (arguments[i].mj_size()[0] != num_rows) { throw new Error('Dimensions of matrices being concatenated are not consistent.'); } num_cols += arguments[i].mj_size()[1]; len += arguments[i].mj_numel(); } var // Create the result array buffer and populate it by just putting // all the arguments back-to-back. buf = new Float64Array(len); var offset = 0; for (var i = 0; i < arguments.length; ++i) { if (arguments[i].mj_scalar()) { buf[offset] = arguments[i]; } else { buf.set(arguments[i], offset); } offset += arguments[i].mj_numel(); } return mj_create(buf, [ num_rows, num_cols ]); } function mc_vertcat() { var num_rows = 0; var num_cols = -1; var len = 0; for (var i = 0; i < arguments.length; ++i) { if (num_cols == -1) { num_cols = arguments[i].mj_size()[1]; } else if (arguments[i].mj_size()[1] != num_cols) { throw new Error('Dimensions of matrices being concatenated are not consistent.'); } num_rows += arguments[i].mj_size()[0]; len += arguments[i].mj_numel(); } var buf = new Float64Array(len); var offset = 0; for (var col = 1; col <= num_cols; ++col) { for (var arg_id = 0; arg_id < arguments.length; ++arg_id) { for (var row = 1; row <= arguments[arg_id].mj_size()[0]; ++row) { buf[offset] = arguments[arg_id].mj_get([ row, col ]); offset++; } } } return mj_create(buf, [ num_rows, num_cols ]); } function mc_compute_shape_length(arg) { var shape, length; if (arg.length === 0) { shape = [ 1, 1 ]; length = 1; } else if (arg.length === 1) { var len = Math.max(arg[0], 0); shape = [ len, len ]; length = len * len; } else { shape = arg; length = 1; for (var i = 0; i < shape.length; ++i) length *= arg[i]; } return [ shape, length ]; } function mc_rand() { var sh_len = mc_compute_shape_length(Array.prototype.slice.call(arguments, 0)); var shape = sh_len[0]; var length = sh_len[1]; var buf = new Float64Array(length); for (var i = 0; i < length; ++i) { buf[i] = Math.random(); } return mj_create(buf, shape); } function mc_randn() { var sh_len = mc_compute_shape_length(Array.prototype.slice.call(arguments, 0)); var shape = sh_len[0]; var length = sh_len[1]; var buf = new Float64Array(length); for (var i = 0; i < length; ++i) { buf[i] = Math.random(); } return mj_create(buf, shape); } function mc_randi(imax) { var sh_len = mc_compute_shape_length(Array.prototype.slice.call(arguments, 1)); var shape = sh_len[0]; var length = sh_len[1]; var buf = new Float64Array(length); for (var i = 0; i < length; ++i) { buf[i] = Math.abs(Math.floor(Math.random() * imax)); } return mj_create(buf, shape); } function mc_zeros() { var sh_len = mc_compute_shape_length(Array.prototype.slice.call(arguments, 0)); var shape = sh_len[0]; var length = sh_len[1]; var buf = new Float64Array(length); return mj_create(buf, shape); } function mc_ones() { var sh_len = mc_compute_shape_length(Array.prototype.slice.call(arguments, 0)); var shape = sh_len[0]; var length = sh_len[1]; var buf = new Float64Array(length); for (var i = 0; i < length; ++i) { buf[i] = 1; } return mj_create(buf, shape); } function mc_eye(rows, cols) { if (cols === undefined) cols = rows; var buf = new Float64Array(rows * cols); var mat = mj_create(buf, [ rows, cols ]); for (var i = 1; i <= rows; ++i) { mat.mj_set(1, [ i, i ]); } return mat; } function mc_exp_S(x$2) { return Math.exp(x$2); } function mc_exp_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.exp(m.mj_get([i])), [i]); } ; return out$2; } function mc_log_S(x$2) { return Math.log(x$2); } function mc_log_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.log(m.mj_get([i])), [i]); } ; return out$2; } function mc_abs_S(x$2) { return Math.abs(x$2); } function mc_abs_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(Math.abs(m.mj_get([i])), [i]); } ; return out$2; } function mc_colon() { var start, stop, step; switch (arguments.length) { case 2: start = arguments[0]; stop = arguments[1]; step = 1; break; case 3: start = arguments[0]; stop = arguments[2]; step = arguments[1]; break; default: throw new Error('invalid number of arguments'); } var len = Math.floor((stop - start) / step) + 1; var buf = new Float64Array(len); var i = 0; var val = start; while (true) { if (start <= stop && val > stop) break; if (start > stop && val < stop) break; buf[i] = val; val += step; i++; } return mj_create(buf, [ 1, len ]); } function mc_transpose(matrix) { var new_matrix = mc_zeros(matrix.mj_size()[1], matrix.mj_size()[0]); for (var i = 1; i <= matrix.mj_size()[0]; ++i) { for (var j = 1; j <= matrix.mj_size()[1]; ++j) { new_matrix.mj_set(matrix.mj_get([ i, j ]), [ j, i ]); } } return new_matrix; } function mc_const_false() { return false; } function mc_disp(x$2) { console.log(x$2); } function mc_pi() { return Math.PI; } function mc_mean(m) { if (// TODO(vfoley): implement mean for matrices m.mj_dims() == 2 && (m.mj_size()[0] == 1 || m.mj_size()[1] == 1)) { var sum = 0; var n = m.mj_numel(); for (var i = 1; i <= n; ++i) sum += m.mj_get([i]); return sum / n; } var rows = m.mj_size()[0]; var cols = m.mj_size()[1]; var out$2 = mc_zeros(1, cols); for (var c = 0; c < cols; ++c) { for (var r = 0; r < rows; ++r) { out$2[c] += m.mj_get([ r + 1, c + 1 ]); } out$2[c] /= rows; } return out$2; } function mc_max(a, b) { return Math.max(a, b); } function mc_min(a, b) { return Math.min(a, b); } function mc_tic() { MC_TICTOC = Date.now(); } function mc_toc() { var elapsed = Date.now() - MC_TICTOC; return elapsed / 1000; } function mc_resize(array, new_index) { var // new_index contains the 0-based index to assign to. new_array = mj_create(new Float64Array(new_index + 1), array.mj_dims()); new_array.set(array, 0); return new_array; } function loop_direction(from, step, to) { if (from < to) { if (step <= 0) return mc_const_false; else return mc_le_SS; } else if (from > to) { if (step >= 0) return mc_const_false; else return mc_ge_SS; } else { return mc_eq_SS; } } function mc_slice_get(m, indices) { var slice_indices = mj_convert_to_slices(m, indices); var shape = mj_compute_shape(slice_indices); var numel = 1; for (var i = 0; i < shape.length; ++i) numel *= shape[i]; var buf = new Float64Array(numel); var it = new MJSliceIterator(slice_indices); var i = 0; while ((x = it.next()) !== null) { var y = m.mj_get(x); buf[i++] = y; } var out$2 = mj_create(buf, shape); return out$2; } function mc_slice_set(m, values, indices) { var slice_indices = mj_convert_to_slices(m, indices); var i = 0; var it = new MJSliceIterator(slice_indices); while ((x = it.next()) !== null) { m.mj_set(values[i++], x); } } function mc_slice_set_scalar(m, scalar, indices) { var slice_indices = mj_convert_to_slices(m, indices); var it = new MJSliceIterator(slice_indices); while ((x = it.next()) !== null) { m.mj_set(scalar, x); } } function mc_size(m, dim) { if (dim === undefined) { var shape = m.mj_size(); return mj_create(new Float64Array(shape), [ 1, shape.length ]); } else { var s = m.mj_size(); if (dim > s.length) return 1; else return s[dim - 1]; } } function mc_any(m) { if (// TODO: Handle 2d and ndarrays correctly typeof m === 'number') return m !== 0 ? 1 : 0; else if (typeof m === 'boolean') return m ? 1 : 0; else { for (var i = 0; i < m.length; ++i) { if (m[i] !== 0) return 1; } return 0; } } function mc_fix_S(x$2) { if (x$2 < 0) return Math.ceil(x$2); else return Math.floor(x$2); } function mc_fix_M(m) { var out$2 = mj_new_from(m); for (var i = 1, N = m.mj_numel(); i <= N; ++i) { out$2.mj_set(mc_fix_S(m.mj_get([i])), [i]); } ; return out$2; } function mc_and_SS(x$2, y) { return x$2 && y; } function mc_and_SM(x$2, m) { var out$2 = mj_new_from(m); for (var i = 1, N = x$2.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2.mj_get([i]) && m, [i]); } ; return out$2; } function mc_and_MS(m, x$2) { var out$2 = mj_new_from(m); for (var i = 1, N = x$2.mj_numel(); i <= N; ++i) { out$2.mj_set(x$2.mj_get([i]) && m, [i]); } ; return out$2; } function mc_and_MM(m1, m2) { var out$2 = mj_new_from(m1); var m1_length = m1.mj_numel(); var m2_length = m2.mj_numel(); if (m1_length !== m2_length) throw new Error('array sizes differ'); for (var i = 1, n = m1_length; i <= n; ++i) { var x$2 = m1.mj_get([i]); var y = m2.mj_get([i]); out$2.mj_set(x$2 && y, [i]); } ; return out$2; } function mc_sum(m, dim) { if (typeof m === 'number') { return m; } else if (m.mj_dims() !== 2) { throw new Error('Unimplemented \'sum\' operator for n-dimensional arrays'); } else if ((m.mj_size()[0] == 1 || m.mj_size()[1] == 1) && dim === undefined) { var sum = 0; var n = m.mj_numel(); for (var i = 1; i <= n; ++i) sum += m.mj_get([i]); return sum; } else { if (dim < 0) { throw new Error('Error using sum\n' + 'Dimension argument must be a positive integer scalar within indexing range.'); } throw new Error('sum: Unimplemented for matrices'); } } function mc_assert(bool) { if (typeof bool !== 'number' && typeof bool !== 'boolean') { throw new Error('Error using assert\n' + 'The condition input argument must be a scalar logical.'); } if (!bool) { throw new Error('assertion failed'); } } function mc_isequal(v1, v2) { if (typeof v1 !== typeof v2) { return false; } else if (typeof v1 === 'number') { return v1 === v2; } else if (!(v1 instanceof Float64Array && v2 instanceof Float64Array)) { throw new Error('Unsupported isequal method for non-matrix ' + v1 + ' or ' + v2); } else { if (v1.mj_dims() !== v2.mj_dims()) { return false; } else if (v1.mj_numel() !== v2.mj_numel()) { return false; } else { var v1size = v1.mj_size(); var v2size = v2.mj_size(); for (var d = 0; d < v1.mj_dims(); ++d) { if (v1size[d] !== v2size[d]) { return false; } } for (var i = 1; i <= v1.mj_numel(); ++i) { if (v1.mj_get([i]) !== v2.mj_get([i])) { return false; } } return true; } } } function mc_not(v) { if (typeof v == 'boolean') { return !v; } else if (typeof v === 'number') { if (v === 0) { return 1; } else { return 0; } } else if (v instanceof Float64Array) { var not_array = mj_new_from(v); for (var i = 1; i < not_array.mj_numel(); ++i) { not_array.mj_set([i], mc_not(not_array.mj_get([i]))); } } else { throw new Error('Unimplemented \'not\' operation for ' + v); } } // BEGINNING OF PROGRAM function collatz_S(n){ var mc_t9 = 0; var mc_t7 = 0; var mc_t8 = 0; var mc_t5 = 0; var mc_t6 = 0; var mc_t3 = 0; var mc_t4 = 0; var mc_t2 = 0; var mc_t10 = 0; var mc_t11 = 0; var mc_t0 = 0; var y = 0; y = 0; mc_t11 = 1; mc_t10 = n > mc_t11; while (mc_t10) { mc_t3 = 2; mc_t0 = mc_mod_SS(n, mc_t3); mc_t8 = 0; mc_t7 = mc_t0 === mc_t8; if (mc_t7) { mc_t4 = 2; n = n / mc_t4; } else { mc_t5 = 3; mc_t2 = mc_t5 * n; mc_t6 = 1; n = mc_t2 + mc_t6; } mc_t9 = 1; y = y + mc_t9; mc_t11 = 1; mc_t10 = n > mc_t11; } return y; } module.exports['/pando/1.0.0'] = function (x, cb) { try { var r = collatz_S(x) cb(null, r) } catch (e) { cb(e) } }