cumsum.js (4303B)
1 "use strict"; 2 3 Object.defineProperty(exports, "__esModule", { 4 value: true 5 }); 6 exports.createCumSum = void 0; 7 8 var _collection = require("../../utils/collection.js"); 9 10 var _factory = require("../../utils/factory.js"); 11 12 var _switch2 = require("../../utils/switch.js"); 13 14 var _improveErrorMessage = require("./utils/improveErrorMessage.js"); 15 16 var _array = require("../../utils/array.js"); 17 18 var _IndexError = require("../../error/IndexError.js"); 19 20 var name = 'cumsum'; 21 var dependencies = ['typed', 'add', 'unaryPlus']; 22 var createCumSum = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) { 23 var typed = _ref.typed, 24 add = _ref.add, 25 unaryPlus = _ref.unaryPlus; 26 27 /** 28 * Compute the cumulative sum of a matrix or a list with values. 29 * In case of a (multi dimensional) array or matrix, the cumulative sums 30 * along a specified dimension (defaulting to the first) will be calculated. 31 * 32 * Syntax: 33 * 34 * math.cumsum(a, b, c, ...) 35 * math.cumsum(A) 36 * 37 * Examples: 38 * 39 * math.cumsum(2, 1, 4, 3) // returns [2, 3, 7, 10] 40 * math.cumsum([2, 1, 4, 3]) // returns [2, 3, 7, 10] 41 * math.cumsum([[1, 2], [3, 4]]) // returns [[1, 2], [4, 6]] 42 * math.cumsum([[1, 2], [3, 4]], 0) // returns [[1, 2], [4, 6]] 43 * math.cumsum([[1, 2], [3, 4]], 1) // returns [[1, 3], [3, 7]] 44 * math.cumsum([[2, 5], [4, 3], [1, 7]]) // returns [[2, 5], [6, 8], [7, 15]] 45 * 46 * See also: 47 * 48 * mean, median, min, max, prod, std, variance, sum 49 * 50 * @param {... *} args A single matrix or or multiple scalar values 51 * @return {*} The cumulative sum of all values 52 */ 53 return typed(name, { 54 // sum([a, b, c, d, ...]) 55 Array: _cumsum, 56 Matrix: function Matrix(matrix) { 57 return matrix.create(_cumsum(matrix.valueOf())); 58 }, 59 // sum([a, b, c, d, ...], dim) 60 'Array, number | BigNumber': _ncumSumDim, 61 'Matrix, number | BigNumber': function MatrixNumberBigNumber(matrix, dim) { 62 return matrix.create(_ncumSumDim(matrix.valueOf(), dim)); 63 }, 64 // cumsum(a, b, c, d, ...) 65 '...': function _(args) { 66 if ((0, _collection.containsCollections)(args)) { 67 throw new TypeError('All values expected to be scalar in function cumsum'); 68 } 69 70 return _cumsum(args); 71 } 72 }); 73 /** 74 * Recursively calculate the cumulative sum of an n-dimensional array 75 * @param {Array} array 76 * @return {number} cumsum 77 * @private 78 */ 79 80 function _cumsum(array) { 81 try { 82 return _cumsummap(array); 83 } catch (err) { 84 throw (0, _improveErrorMessage.improveErrorMessage)(err, name); 85 } 86 } 87 88 function _cumsummap(array) { 89 if (array.length === 0) { 90 return []; 91 } 92 93 var sums = [unaryPlus(array[0])]; // unaryPlus converts to number if need be 94 95 for (var i = 1; i < array.length; ++i) { 96 // Must use add below and not addScalar for the case of summing a 97 // 2+-dimensional array along the 0th dimension (the row vectors, 98 // or higher-d analogues, are literally added to each other). 99 sums.push(add(sums[i - 1], array[i])); 100 } 101 102 return sums; 103 } 104 105 function _ncumSumDim(array, dim) { 106 var size = (0, _array.arraySize)(array); 107 108 if (dim < 0 || dim >= size.length) { 109 // TODO: would be more clear when throwing a DimensionError here 110 throw new _IndexError.IndexError(dim, size.length); 111 } 112 113 try { 114 return _cumsumDimensional(array, dim); 115 } catch (err) { 116 throw (0, _improveErrorMessage.improveErrorMessage)(err, name); 117 } 118 } 119 /* Possible TODO: Refactor _reduce in collection.js to be able to work here as well */ 120 121 122 function _cumsumDimensional(mat, dim) { 123 var i, ret, tran; 124 125 if (dim <= 0) { 126 var initialValue = mat[0][0]; 127 128 if (!Array.isArray(initialValue)) { 129 return _cumsummap(mat); 130 } else { 131 tran = (0, _switch2._switch)(mat); 132 ret = []; 133 134 for (i = 0; i < tran.length; i++) { 135 ret[i] = _cumsumDimensional(tran[i], dim - 1); 136 } 137 138 return ret; 139 } 140 } else { 141 ret = []; 142 143 for (i = 0; i < mat.length; i++) { 144 ret[i] = _cumsumDimensional(mat[i], dim - 1); 145 } 146 147 return ret; 148 } 149 } 150 }); 151 exports.createCumSum = createCumSum;