cumsum.js 4.2 KB

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