simple-squiggle

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

sum.js (2279B)


      1 import { containsCollections, deepForEach, reduce } from '../../utils/collection.js';
      2 import { factory } from '../../utils/factory.js';
      3 import { improveErrorMessage } from './utils/improveErrorMessage.js';
      4 var name = 'sum';
      5 var dependencies = ['typed', 'config', 'add', 'numeric'];
      6 export var createSum = /* #__PURE__ */factory(name, dependencies, _ref => {
      7   var {
      8     typed,
      9     config,
     10     add,
     11     numeric
     12   } = _ref;
     13 
     14   /**
     15    * Compute the sum of a matrix or a list with values.
     16    * In case of a (multi dimensional) array or matrix, the sum of all
     17    * elements will be calculated.
     18    *
     19    * Syntax:
     20    *
     21    *     math.sum(a, b, c, ...)
     22    *     math.sum(A)
     23    *
     24    * Examples:
     25    *
     26    *     math.sum(2, 1, 4, 3)               // returns 10
     27    *     math.sum([2, 1, 4, 3])             // returns 10
     28    *     math.sum([[2, 5], [4, 3], [1, 7]]) // returns 22
     29    *
     30    * See also:
     31    *
     32    *    mean, median, min, max, prod, std, variance, cumsum
     33    *
     34    * @param {... *} args  A single matrix or or multiple scalar values
     35    * @return {*} The sum of all values
     36    */
     37   return typed(name, {
     38     // sum([a, b, c, d, ...])
     39     'Array | Matrix': _sum,
     40     // sum([a, b, c, d, ...], dim)
     41     'Array | Matrix, number | BigNumber': _nsumDim,
     42     // sum(a, b, c, d, ...)
     43     '...': function _(args) {
     44       if (containsCollections(args)) {
     45         throw new TypeError('Scalar values expected in function sum');
     46       }
     47 
     48       return _sum(args);
     49     }
     50   });
     51   /**
     52    * Recursively calculate the sum of an n-dimensional array
     53    * @param {Array | Matrix} array
     54    * @return {number} sum
     55    * @private
     56    */
     57 
     58   function _sum(array) {
     59     var sum;
     60     deepForEach(array, function (value) {
     61       try {
     62         sum = sum === undefined ? value : add(sum, value);
     63       } catch (err) {
     64         throw improveErrorMessage(err, 'sum', value);
     65       }
     66     }); // make sure returning numeric value: parse a string into a numeric value
     67 
     68     if (sum === undefined) {
     69       sum = numeric(0, config.number);
     70     }
     71 
     72     if (typeof sum === 'string') {
     73       sum = numeric(sum, config.number);
     74     }
     75 
     76     return sum;
     77   }
     78 
     79   function _nsumDim(array, dim) {
     80     try {
     81       var sum = reduce(array, dim, add);
     82       return sum;
     83     } catch (err) {
     84       throw improveErrorMessage(err, 'sum');
     85     }
     86   }
     87 });