simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

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;