{"version":3,"file":"ml-spectra-processing.min.js","sources":["../src/x/xAbsolute.js","../node_modules/is-any-array/src/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-array-median/lib-es6/index.js","../src/x/xMultiply.js","../src/x/xDotProduct.js","../src/x/xCrossCorrelation.js","../src/x/xFindClosestIndex.js","../src/x/xGetFromToIndex.js","../src/x/xGetTargetIndex.js","../src/x/xCheck.js","../node_modules/d3-array/build/d3-array.js","../node_modules/spline-interpolator/index.js","../src/x/erfcinv.js","../src/x/rayleighCdf.js","../src/x/xNoiseSanPlot.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-variance/lib-es6/index.js","../src/x/xPadding.js","../src/x/xRotate.js","../src/x/xRolling.js","../src/x/xRollingAverage.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../src/reim/reimAbsolute.js","../src/reim/reimPhaseCorrection.js","../src/reim/reimAutoPhaseCorrection.js","../node_modules/fft.js/lib/fft.js","../src/reim/reimFFT.js","../src/xy/xyCheck.js","../src/xy/xyJoinX.js","../src/zones/zonesNormalize.js","../node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/ml-savitzky-golay-generalized/src/index.js","../node_modules/ml-gsd/src/gsd.js","../node_modules/ml-peak-shape-generator/src/util/getShapeGenerator.js","../node_modules/assign-symbols/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/assign-deep/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../src/xy/xySortX.js","../src/xyObject/xyObjectCheck.js","../src/xyObject/xyObjectMaxXPoint.js","../src/xyObject/xyObjectMinXPoint.js","../node_modules/ml-matrix/src/mathOperations.js","../src/utils/createSequentialArray.js","../src/matrix/matrixCenterYMean.js","../src/matrix/matrixPQN.js","../src/matrix/matrixYRescale.js","../src/x/xAbsoluteMedian.js","../src/x/xAdd.js","../src/x/xAutoCorrelation.js","../src/x/xBoxPlot.js","../src/x/xCorrelation.js","../src/x/xDivide.js","../src/x/xIsMonotone.js","../src/x/xMaxIndex.js","../src/x/xMaxValue.js","../src/x/xMean.js","../src/x/xMeanAbsoluteError.js","../src/x/xMeanSquaredError.js","../src/x/xMinIndex.js","../src/x/xMinValue.js","../src/x/xNorm.js","../src/x/xParetoNormalization.js","../node_modules/ml-array-standard-deviation/lib-es6/index.js","../src/x/xRollingMax.js","../src/x/xRollingMedian.js","../src/x/xRollingMin.js","../src/x/xSubtract.js","../src/x/xSum.js","../src/xreim/xreimSortX.js","../src/xreim/xreimZeroFilling.js","../src/xy/xyAlign.js","../src/xyArray/xyArrayAlign.js","../src/xy/xyCalibrate.js","../src/xy/xyExtract.js","../src/xy/xyGetNMaxY.js","../src/xy/xyGrowingX.js","../src/xy/xyIntegral.js","../src/xy/xyIntegration.js","../src/xy/xyMaxClosestYPoint.js","../src/xy/xyMaxY.js","../src/xy/xyMaxYPoint.js","../src/xy/xyMaximaY.js","../src/xy/xyMinClosestYPoint.js","../src/xy/xyMinYPoint.js","../src/xy/xyMinimaY.js","../src/xyObject/xyObjectBestPoints.js","../src/xyObject/xyObjectJoinX.js","../src/xyObject/xyObjectMaxYPoint.js","../src/xyObject/xyObjectMinYPoint.js","../src/xyObject/xyObjectSlotX.js","../src/xyObject/xyObjectSortX.js","../src/xyObject/xyObjectToXY.js","../src/xy/xyPeakInfo.js","../src/xy/xyRealMaxYPoint.js","../src/xy/xyRealMinYPoint.js","../src/xy/xyReduce.js","../src/xy/xyRolling.js","../src/xy/xyToXYArray.js","../src/xy/xyToXYObject.js","../src/xy/xyUniqueX.js","../src/zone/zoneToX.js"],"sourcesContent":["/**\n * This function returns an array with absolute values\n * @param {Array<Number>} array\n * @return {Number}\n */\nexport function xAbsolute(array) {\n  let tmpArray = array.slice();\n  for (let i = 0; i < tmpArray.length; i++) {\n    tmpArray[i] = Math.abs(tmpArray[i]);\n  }\n\n  return tmpArray;\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","(function(){function a(d){for(var e=0,f=d.length-1,g=void 0,h=void 0,i=void 0,j=c(e,f);!0;){if(f<=e)return d[j];if(f==e+1)return d[e]>d[f]&&b(d,e,f),d[j];for(g=c(e,f),d[g]>d[f]&&b(d,g,f),d[e]>d[f]&&b(d,e,f),d[g]>d[e]&&b(d,g,e),b(d,g,e+1),h=e+1,i=f;!0;){do h++;while(d[e]>d[h]);do i--;while(d[i]>d[e]);if(i<h)break;b(d,h,i)}b(d,e,i),i<=j&&(e=h),i>=j&&(f=i-1)}}var b=function b(d,e,f){var _ref;return _ref=[d[f],d[e]],d[e]=_ref[0],d[f]=_ref[1],_ref},c=function c(d,e){return~~((d+e)/2)};'undefined'!=typeof module&&module.exports?module.exports=a:window.median=a})();\n","import isArray from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n\nfunction median(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  return quickSelectMedian(input.slice());\n}\n\nexport default median;\n","import isAnyArray from 'is-any-array';\n/**\n * This function xMultiply the first array by the second array or a constant value to each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Float64Array}\n */\nexport function xMultiply(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Float64Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * array2[i];\n    }\n  }\n\n  return array3;\n}\n","import { xMultiply } from './xMultiply';\n\nexport function xDotProduct(A, B) {\n  let g = xMultiply(A, B);\n  let result = 0;\n  for (let i = 0; i < A.length; i++) {\n    result += g[i];\n  }\n  return result;\n}\n","import { xDotProduct } from './xDotProduct';\n\n/**\n * Calculates the cross-correlation between 2 vectors\n * @param {Array<Number>} [A] - fixed array\n * @param {Array<Number>} [B] - sweeping array\n * @param {object} [options={}]\n * @param {number} [options.tau=1] - sweep increment size (in number of points, min=1, max=A.length)\n * @param {number} [options.lag=A.length - 1] - scalar lag parameter\n */\n\nexport function xCrossCorrelation(A, B, options = {}) {\n  let { tau = 1, lag = A.length - 1 } = options;\n  let result = new Float64Array(1 + (2 * lag) / tau);\n  if (A.length === B.length) {\n    let n = B.length;\n    let g = new Float64Array(2 * n);\n    let q = new Float64Array(2 * n);\n    for (let i = 0; i < n; i++) {\n      q[n + i] = B[i];\n    }\n    for (let i = n * 2 - (tau - 1); i > 0; i -= tau) {\n      let k = 0;\n      for (let j = i; j < n * 2; j++) {\n        g[k] = q[j];\n        k++;\n      }\n      let w = [];\n      for (let l = 0; l < n; l++) {\n        w[l] = g[l];\n      }\n      result[(k - (n - lag)) / tau] = xDotProduct(A, w);\n    }\n  }\n  return result;\n}\n","/**\n * Returns the closest index of a `target` in an ordered array\n * @param {array<Number>} array\n * @param {number} target\n */\n\nexport function xFindClosestIndex(array, target) {\n  let low = 0;\n  let high = array.length - 1;\n  let middle = 0;\n  while (high - low > 1) {\n    middle = low + ((high - low) >> 1);\n    if (array[middle] < target) {\n      low = middle;\n    } else if (array[middle] > target) {\n      high = middle;\n    } else {\n      return middle;\n    }\n  }\n\n  if (low < array.length - 1) {\n    if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n      return low;\n    } else {\n      return low + 1;\n    }\n  } else {\n    return low;\n  }\n}\n","import { xFindClosestIndex } from './xFindClosestIndex';\n\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param {array} x\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n */\n\nexport function xGetFromToIndex(x, options = {}) {\n  let { fromIndex, toIndex, from, to } = options;\n\n  if (fromIndex === undefined) {\n    if (from !== undefined) {\n      fromIndex = xFindClosestIndex(x, from);\n    } else {\n      fromIndex = 0;\n    }\n  }\n  if (toIndex === undefined) {\n    if (to !== undefined) {\n      toIndex = xFindClosestIndex(x, to);\n    } else {\n      toIndex = x.length - 1;\n    }\n  }\n  if (fromIndex > toIndex) [fromIndex, toIndex] = [toIndex, fromIndex];\n  return { fromIndex, toIndex };\n}\n","import { xFindClosestIndex } from './xFindClosestIndex';\n\n/**\n *  Returns the targetIndex\n * @param {array} [x]\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @param {number}\n */\n\nexport function xGetTargetIndex(x, options = {}) {\n  let { target, targetIndex } = options;\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      return xFindClosestIndex(x, target);\n    } else {\n      return 0;\n    }\n  }\n  return targetIndex;\n}\n","import isArray from 'is-any-array';\n\n/**\n * Checks if input is valdi\n * @param {Array<number>} input\n\n */\nexport default function xCheck(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n}\n\nexport function xCheckLengths(array1, array2) {\n  if (array1.length !== array2.length) {\n    throw new TypeError('Length of array1 and array2 must be identical');\n  }\n}\n","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.d3_array = {})));\n}(this, function (exports) { 'use strict';\n\n  function ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n\n  function bisector(compare) {\n    if (compare.length === 1) compare = ascendingComparator(compare);\n    return {\n      left: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1;\n          else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid;\n          else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n\n  function ascendingComparator(f) {\n    return function(d, x) {\n      return ascending(f(d), x);\n    };\n  }\n\n  var ascendingBisect = bisector(ascending);\n  var bisectRight = ascendingBisect.right;\n  var bisectLeft = ascendingBisect.left;\n\n  function descending(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  }\n\n  function number$1(x) {\n    return x === null ? NaN : +x;\n  }\n\n  function variance(array, f) {\n    var n = array.length,\n        m = 0,\n        a,\n        d,\n        s = 0,\n        i = -1,\n        j = 0;\n\n    if (f == null) {\n      while (++i < n) {\n        if (!isNaN(a = number$1(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    else {\n      while (++i < n) {\n        if (!isNaN(a = number$1(f(array[i], i, array)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    if (j > 1) return s / (j - 1);\n  }\n\n  function deviation(array, f) {\n    var v = variance(array, f);\n    return v ? Math.sqrt(v) : v;\n  }\n\n  function extent(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b,\n        c;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    return [a, c];\n  }\n\n  function constant(x) {\n    return function() {\n      return x;\n    };\n  }\n\n  function identity(x) {\n    return x;\n  }\n\n  function range(start, stop, step) {\n    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n    var i = -1,\n        n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n        range = new Array(n);\n\n    while (++i < n) {\n      range[i] = start + i * step;\n    }\n\n    return range;\n  }\n\n  var e10 = Math.sqrt(50);\n  var e5 = Math.sqrt(10);\n  var e2 = Math.sqrt(2);\n  function ticks(start, stop, count) {\n    var step = tickStep(start, stop, count);\n    return range(\n      Math.ceil(start / step) * step,\n      Math.floor(stop / step) * step + step / 2, // inclusive\n      step\n    );\n  }\n\n  function tickStep(start, stop, count) {\n    var step0 = Math.abs(stop - start) / Math.max(0, count),\n        step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n        error = step0 / step1;\n    if (error >= e10) step1 *= 10;\n    else if (error >= e5) step1 *= 5;\n    else if (error >= e2) step1 *= 2;\n    return stop < start ? -step1 : step1;\n  }\n\n  function sturges(values) {\n    return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n  }\n\n  function number(x) {\n    return +x;\n  }\n\n  function histogram() {\n    var value = identity,\n        domain = extent,\n        threshold = sturges;\n\n    function histogram(data) {\n      var i,\n          n = data.length,\n          x,\n          values = new Array(n);\n\n      // Coerce values to numbers.\n      for (i = 0; i < n; ++i) {\n        values[i] = +value(data[i], i, data);\n      }\n\n      var xz = domain(values),\n          x0 = +xz[0],\n          x1 = +xz[1],\n          tz = threshold(values, x0, x1);\n\n      // Convert number of thresholds into uniform thresholds.\n      if (!Array.isArray(tz)) tz = ticks(x0, x1, +tz);\n\n      // Coerce thresholds to numbers, ignoring any outside the domain.\n      var m = tz.length;\n      for (i = 0; i < m; ++i) tz[i] = +tz[i];\n      while (tz[0] <= x0) tz.shift(), --m;\n      while (tz[m - 1] >= x1) tz.pop(), --m;\n\n      var bins = new Array(m + 1),\n          bin;\n\n      // Initialize bins.\n      for (i = 0; i <= m; ++i) {\n        bin = bins[i] = [];\n        bin.x0 = i > 0 ? tz[i - 1] : x0;\n        bin.x1 = i < m ? tz[i] : x1;\n      }\n\n      // Assign data to bins by value, ignoring any outside the domain.\n      for (i = 0; i < n; ++i) {\n        x = values[i];\n        if (x0 <= x && x <= x1) {\n          bins[bisectRight(tz, x, 0, m)].push(data[i]);\n        }\n      }\n\n      return bins;\n    }\n\n    histogram.value = function(_) {\n      return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), histogram) : value;\n    };\n\n    histogram.domain = function(_) {\n      return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), histogram) : domain;\n    };\n\n    histogram.thresholds = function(_) {\n      if (!arguments.length) return threshold;\n      threshold = typeof _ === \"function\" ? _\n          : Array.isArray(_) ? constant(Array.prototype.map.call(_, number))\n          : constant(+_);\n      return histogram;\n    };\n\n    return histogram;\n  }\n\n  function quantile(array, p, f) {\n    if (f == null) f = number$1;\n    if (!(n = array.length)) return;\n    if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array);\n    if (p >= 1) return +f(array[n - 1], n - 1, array);\n    var n,\n        h = (n - 1) * p,\n        i = Math.floor(h),\n        a = +f(array[i], i, array),\n        b = +f(array[i + 1], i + 1, array);\n    return a + (b - a) * (h - i);\n  }\n\n  function freedmanDiaconis(values, min, max) {\n    values.sort(ascending);\n    return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function scott(values, min, max) {\n    return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function max(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b;\n    }\n\n    return a;\n  }\n\n  function mean(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1,\n        j = n;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) s += a; else --j;\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) s += a; else --j;\n    }\n\n    if (j) return s / j;\n  }\n\n  function median(array, f) {\n    var numbers = [],\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) numbers.push(a);\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) numbers.push(a);\n    }\n\n    return quantile(numbers.sort(ascending), 0.5);\n  }\n\n  function merge(arrays) {\n    var n = arrays.length,\n        m,\n        i = -1,\n        j = 0,\n        merged,\n        array;\n\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n\n    return merged;\n  }\n\n  function min(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b;\n    }\n\n    return a;\n  }\n\n  function pairs(array) {\n    var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [p, p = array[++i]];\n    return pairs;\n  }\n\n  function permute(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  }\n\n  function scan(array, compare) {\n    if (!(n = array.length)) return;\n    var i = 0,\n        n,\n        j = 0,\n        xi,\n        xj = array[j];\n\n    if (!compare) compare = ascending;\n\n    while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i;\n\n    if (compare(xj, xj) === 0) return j;\n  }\n\n  function shuffle(array, i0, i1) {\n    var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n        t,\n        i;\n\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0];\n      array[m + i0] = array[i + i0];\n      array[i + i0] = t;\n    }\n\n    return array;\n  }\n\n  function sum(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent.\n    }\n\n    else {\n      while (++i < n) if (a = +f(array[i], i, array)) s += a;\n    }\n\n    return s;\n  }\n\n  function transpose(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  }\n\n  function length(d) {\n    return d.length;\n  }\n\n  function zip() {\n    return transpose(arguments);\n  }\n\n  var version = \"0.7.1\";\n\n  exports.version = version;\n  exports.bisect = bisectRight;\n  exports.bisectRight = bisectRight;\n  exports.bisectLeft = bisectLeft;\n  exports.ascending = ascending;\n  exports.bisector = bisector;\n  exports.descending = descending;\n  exports.deviation = deviation;\n  exports.extent = extent;\n  exports.histogram = histogram;\n  exports.thresholdFreedmanDiaconis = freedmanDiaconis;\n  exports.thresholdScott = scott;\n  exports.thresholdSturges = sturges;\n  exports.max = max;\n  exports.mean = mean;\n  exports.median = median;\n  exports.merge = merge;\n  exports.min = min;\n  exports.pairs = pairs;\n  exports.permute = permute;\n  exports.quantile = quantile;\n  exports.range = range;\n  exports.scan = scan;\n  exports.shuffle = shuffle;\n  exports.sum = sum;\n  exports.ticks = ticks;\n  exports.tickStep = tickStep;\n  exports.transpose = transpose;\n  exports.variance = variance;\n  exports.zip = zip;\n\n}));","const {bisectRight} = require('d3-array')\n\nconst quincunx = (u, v, w, q) => {\n  const n = u.length - 1\n\n  u[0] = 0\n  v[0] = 0\n  w[0] = 0\n  v[1] = v[1] / u[1]\n  w[1] = w[1] / u[1]\n  for (let i = 2; i < n; ++i) {\n    u[i] = u[i] - u[i - 2] * w[i - 2] * w[i - 2] - u[i - 1] * v[i - 1] * v[i - 1]\n    v[i] = (v[i] - u[i - 1] * v[i - 1] * w[i - 1]) / u[i]\n    w[i] = w[i] / u[i]\n  }\n\n  for (let i = 2; i < n; ++i) {\n    q[i] = q[i] - v[i - 1] * q[i - 1] - w[i - 2] * q[i - 2]\n  }\n  for (let i = 1; i < n; ++i) {\n    q[i] = q[i] / u[i]\n  }\n\n  q[n - 2] = q[n - 2] - v[n - 2] * q[n - 1]\n  for (let i = n - 3; i > 0; --i) {\n    q[i] = q[i] - v[i] * q[i + 1] - w[i] * q[i + 2]\n  }\n}\n\nconst smoothingSpline = (x, y, sigma, lambda) => {\n  const n = x.length - 1\n  const h = new Array(n + 1)\n  const r = new Array(n + 1)\n  const f = new Array(n + 1)\n  const p = new Array(n + 1)\n  const q = new Array(n + 1)\n  const u = new Array(n + 1)\n  const v = new Array(n + 1)\n  const w = new Array(n + 1)\n  const params = x.map(() => [0, 0, 0, 0])\n  params.pop()\n\n  const mu = 2 * (1 - lambda) / (3 * lambda)\n  for (let i = 0; i < n; ++i) {\n    h[i] = x[i + 1] - x[i]\n    r[i] = 3 / h[i]\n  }\n  q[0] = 0\n  for (let i = 1; i < n; ++i) {\n    f[i] = -(r[i - 1] + r[i])\n    p[i] = 2 * (x[i + 1] - x[i - 1])\n    q[i] = 3 * (y[i + 1] - y[i]) / h[i] - 3 * (y[i] - y[i - 1]) / h[i - 1]\n  }\n  q[n] = 0\n\n  for (let i = 1; i < n; ++i) {\n    u[i] = r[i - 1] * r[i - 1] * sigma[i - 1] + f[i] * f[i] * sigma[i] + r[i] * r[i] * sigma[i + 1]\n    u[i] = mu * u[i] + p[i]\n  }\n  for (let i = 1; i < n - 1; ++i) {\n    v[i] = f[i] * r[i] * sigma[i] + r[i] * f[i + 1] * sigma[i + 1]\n    v[i] = mu * v[i] + h[i]\n  }\n  for (let i = 1; i < n - 2; ++i) {\n    w[i] = mu * r[i] * r[i + 1] * sigma[i + 1]\n  }\n\n  quincunx(u, v, w, q)\n\n  params[0][3] = y[0] - mu * r[0] * q[1] * sigma[0]\n  params[1][3] = y[1] - mu * (f[1] * q[1] + r[1] * q[2]) * sigma[0]\n  params[0][0] = q[1] / (3 * h[0])\n  params[0][1] = 0\n  params[0][2] = (params[1][3] - params[0][3]) / h[0] - q[1] * h[0] / 3\n  r[0] = 0\n  for (let i = 1; i < n; ++i) {\n    params[i][0] = (q[i + 1] - q[i]) / (3 * h[i])\n    params[i][1] = q[i]\n    params[i][2] = (q[i] + q[i - 1]) * h[i - 1] + params[i - 1][2]\n    params[i][3] = r[i - 1] * q[i - 1] + f[i] * q[i] + r[i] * q[i + 1]\n    params[i][3] = y[i] - mu * params[i][3] * sigma[i]\n  }\n  return params\n}\n\nclass SplineInterpolator {\n  constructor (xIn, yIn, lambda = 1) {\n    const indices = xIn.map((_, i) => i)\n    indices.sort((i, j) => xIn[i] - xIn[j])\n    const x = indices.map((i) => xIn[i])\n    const y = indices.map((i) => yIn[i])\n    const n = indices.length\n    const sigma = indices.map(() => 1)\n    this.n = n\n    this.x = x\n    this.y = y\n    this.params = smoothingSpline(x, y, sigma, lambda)\n  }\n\n  interpolate (v) {\n    if (v === this.x[this.n - 1]) {\n      return this.y[this.n - 1]\n    }\n    const i = Math.min(Math.max(0, bisectRight(this.x, v) - 1), this.n - 2)\n    const [a, b, c, d] = this.params[i]\n    v = v - this.x[i]\n    return a * v * v * v + b * v * v + c * v + d\n  }\n\n  max (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let maxValue = -Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y > maxValue) {\n        maxValue = y\n      }\n    }\n    return maxValue\n  }\n\n  min (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let minValue = Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y < minValue) {\n        minValue = y\n      }\n    }\n    return minValue\n  }\n\n  domain () {\n    return [this.x[0], this.x[this.x.length - 1]]\n  }\n\n  range () {\n    return [this.min(), this.max()]\n  }\n\n  curve (nInterval, domain = null) {\n    domain = domain || this.domain()\n    const delta = (domain[1] - domain[0]) / (nInterval - 1)\n    const vals = new Array(nInterval)\n    for (let i = 0; i < nInterval; ++i) {\n      const x = delta * i + domain[0]\n      vals[i] = [x, this.interpolate(x)]\n    }\n    return vals\n  }\n}\n\nmodule.exports = SplineInterpolator\n","/* eslint-disable no-loss-of-precision */\n\n/*\nAdapted from: https://github.com/compute-io/erfcinv/blob/aa116e23883839359e310ad41a7c42f72815fc1e/lib/number.js\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2015 The Compute.io Authors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Coefficients for erfcinv on [0, 0.5]:\nconst Y1 = 8.91314744949340820313e-2;\nconst P1 = [\n  -5.38772965071242932965e-3,\n  8.22687874676915743155e-3,\n  2.19878681111168899165e-2,\n  -3.65637971411762664006e-2,\n  -1.26926147662974029034e-2,\n  3.34806625409744615033e-2,\n  -8.36874819741736770379e-3,\n  -5.08781949658280665617e-4,\n];\nconst Q1 = [\n  8.86216390456424707504e-4,\n  -2.33393759374190016776e-3,\n  7.95283687341571680018e-2,\n  -5.27396382340099713954e-2,\n  -7.1228902341542847553e-1,\n  6.62328840472002992063e-1,\n  1.56221558398423026363,\n  -1.56574558234175846809,\n  -9.70005043303290640362e-1,\n  1,\n];\n\n// Coefficients for erfcinv for 0.5 > 1-x >= 0:\nconst Y2 = 2.249481201171875;\nconst P2 = [\n  -3.67192254707729348546,\n  2.11294655448340526258e1,\n  1.7445385985570866523e1,\n  -4.46382324441786960818e1,\n  -1.88510648058714251895e1,\n  1.76447298408374015486e1,\n  8.37050328343119927838,\n  1.05264680699391713268e-1,\n  -2.02433508355938759655e-1,\n];\nconst Q2 = [\n  1.72114765761200282724,\n  -2.26436933413139721736e1,\n  1.08268667355460159008e1,\n  4.85609213108739935468e1,\n  -2.01432634680485188801e1,\n  -2.86608180499800029974e1,\n  3.9713437953343869095,\n  6.24264124854247537712,\n  1,\n];\n\n// Coefficients for erfcinv for sqrt( -log(1-x)):\nconst Y3 = 8.07220458984375e-1;\nconst P3 = [\n  -6.81149956853776992068e-10,\n  2.85225331782217055858e-8,\n  -6.79465575181126350155e-7,\n  2.14558995388805277169e-3,\n  2.90157910005329060432e-2,\n  1.42869534408157156766e-1,\n  3.37785538912035898924e-1,\n  3.87079738972604337464e-1,\n  1.17030156341995252019e-1,\n  -1.63794047193317060787e-1,\n  -1.31102781679951906451e-1,\n];\nconst Q3 = [\n  1.105924229346489121e-2,\n  1.52264338295331783612e-1,\n  8.48854343457902036425e-1,\n  2.59301921623620271374,\n  4.77846592945843778382,\n  5.38168345707006855425,\n  3.46625407242567245975,\n  1,\n];\n\nconst Y4 = 9.3995571136474609375e-1;\nconst P4 = [\n  2.66339227425782031962e-12,\n  -2.30404776911882601748e-10,\n  4.60469890584317994083e-6,\n  1.57544617424960554631e-4,\n  1.87123492819559223345e-3,\n  9.50804701325919603619e-3,\n  1.85573306514231072324e-2,\n  -2.22426529213447927281e-3,\n  -3.50353787183177984712e-2,\n];\nconst Q4 = [\n  7.64675292302794483503e-5,\n  2.63861676657015992959e-3,\n  3.41589143670947727934e-2,\n  2.20091105764131249824e-1,\n  7.62059164553623404043e-1,\n  1.3653349817554063097,\n  1,\n];\n\nconst Y5 = 9.8362827301025390625e-1;\nconst P5 = [\n  9.9055709973310326855e-17,\n  -2.81128735628831791805e-14,\n  4.62596163522878599135e-9,\n  4.49696789927706453732e-7,\n  1.49624783758342370182e-5,\n  2.09386317487588078668e-4,\n  1.05628862152492910091e-3,\n  -1.12951438745580278863e-3,\n  -1.67431005076633737133e-2,\n];\nconst Q5 = [\n  2.82243172016108031869e-7,\n  2.75335474764726041141e-5,\n  9.64011807005165528527e-4,\n  1.60746087093676504695e-2,\n  1.38151865749083321638e-1,\n  5.91429344886417493481e-1,\n  1,\n];\n\nfunction polyval(c, x) {\n  let p = 0;\n  for (const coef of c) {\n    p = p * x + coef;\n  }\n  return p;\n}\n\n/**\n * Calculates a rational approximation.\n *\n * @private\n * @param {Number} x\n * @param {Number} v\n * @param {Array} P - array of polynomial coefficients\n * @param {Array} Q - array of polynomial coefficients\n * @param {Number} Y\n * @returns {Number} rational approximation\n */\nfunction calc(x, v, P, Q, Y) {\n  const s = x - v;\n  const r = polyval(P, s) / polyval(Q, s);\n  return Y * x + r * x;\n}\n\n/**\n * Evaluates the complementary inverse error function for an input value.\n *\n * @private\n * @param {Number} x - input value\n * @returns {Number} evaluated complementary inverse error function\n */\nexport default function erfcinv(x) {\n  let sign = false;\n  let val;\n  let q;\n  let g;\n  let r;\n\n  // [1] Special cases...\n\n  // NaN:\n  if (Number.isNaN(x)) {\n    return NaN;\n  }\n  // x not on the interval: [0,2]\n  if (x < 0 || x > 2) {\n    throw new RangeError(\n      `erfcinv()::invalid input argument. Value must be on the interval [0,2]. Value: \\`${x}\\`.`,\n    );\n  }\n  if (x === 0) {\n    return Number.POSITIVE_INFINITY;\n  }\n  if (x === 2) {\n    return Number.NEGATIVE_INFINITY;\n  }\n  if (x === 1) {\n    return 0;\n  }\n  // [2] Get the sign and make use of `erfc` reflection formula: `erfc(-z)=2 - erfc(z)`...\n  if (x > 1) {\n    q = 2 - x;\n    x = 1 - q;\n    sign = true;\n  } else {\n    q = x;\n    x = 1 - x;\n  }\n  // [3] |x| <= 0.5\n  if (x <= 0.5) {\n    g = x * (x + 10);\n    r = polyval(P1, x) / polyval(Q1, x);\n    val = g * Y1 + g * r;\n    return sign ? -val : val;\n  }\n\n  // [4] 1-|x| >= 0.25\n  if (q >= 0.25) {\n    g = Math.sqrt(-2 * Math.log(q));\n    q = q - 0.25;\n    r = polyval(P2, q) / polyval(Q2, q);\n    val = g / (Y2 + r);\n    return sign ? -val : val;\n  }\n  q = Math.sqrt(-Math.log(q));\n\n  // [5] q < 3\n  if (q < 3) {\n    return calc(q, 1.125, P3, Q3, Y3);\n  }\n  // [6] q < 6\n  if (q < 6) {\n    return calc(q, 3, P4, Q4, Y4);\n  }\n  // Note that the smallest number in JavaScript is 5e-324. Math.sqrt( -Math.log( 5e-324 ) ) ~27.2844\n  return calc(q, 6, P5, Q5, Y5);\n\n  // Note that in the boost library, they are able to go to much smaller values, as 128 bit long doubles support ~1e-5000; something which JavaScript does not natively support.\n}\n","export default function rayleighCdf(x, sigma = 1) {\n  if (x < 0) {\n    return 0;\n  }\n  return -Math.expm1(-Math.pow(x, 2) / (2 * Math.pow(sigma, 2)));\n}\n","import SplineInterpolator from 'spline-interpolator';\n\nimport erfcinv from './erfcinv';\nimport rayleighCdf from './rayleighCdf';\n\n/**\n * Determine noise level by san plot methodology (https://doi.org/10.1002/mrc.4882)\n * @param {Array} data - real or magnitude spectra data.\n * @param {object} [options = {}]\n * @param {array} [options.mask] - boolean array to filter data, if the i-th element is true then the i-th element of the distribution will be ignored.\n * @param {number} [options.scaleFactor=1] - factor to scale the data input[i]*=scaleFactor.\n * @param {number} [options.cutOff] - percent of positive signal distribution where the noise level will be determined, if it is not defined the program calculate it.\n * @param {number} [options.factorStd=5] - factor times std to determine what will be marked as signals.\n * @param {boolean} [options.refine=true] - if true the noise level will be recalculated get out the signals using factorStd.\n * @param {boolean} [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. if true, the distribution will be centered.\n */\n\nexport function xNoiseSanPlot(data, options = {}) {\n  const {\n    mask,\n    cutOff,\n    refine = true,\n    magnitudeMode = false,\n    scaleFactor = 1,\n    factorStd = 5,\n    fixOffset = true,\n  } = options;\n\n  let input;\n  if (Array.isArray(mask) && mask.length === data.length) {\n    input = data.filter((_e, i) => !mask[i]);\n  } else {\n    input = data.slice();\n  }\n\n  if (scaleFactor > 1) {\n    for (let i = 0; i < input.length; i++) {\n      input[i] *= scaleFactor;\n    }\n  }\n\n  input.sort((a, b) => b - a);\n\n  if (fixOffset && !magnitudeMode) {\n    let medianIndex = Math.floor(input.length / 2);\n    let median = 0.5 * (input[medianIndex] + input[medianIndex + 1]);\n    for (let i = 0; i < input.length; i++) {\n      input[i] -= median;\n    }\n  }\n\n  let firstNegativeValueIndex = input.findIndex((e) => e < 0);\n  let lastPositiveValueIndex = firstNegativeValueIndex - 1;\n  for (let i = lastPositiveValueIndex; i >= 0; i--) {\n    if (input[i] > 0) {\n      lastPositiveValueIndex = i;\n      break;\n    }\n  }\n\n  let signPositive = new Float64Array(\n    input.slice(0, lastPositiveValueIndex + 1),\n  );\n  let signNegative = new Float64Array(input.slice(firstNegativeValueIndex));\n\n  let cutOffDist = cutOff || determineCutOff(signPositive, { magnitudeMode });\n\n  let pIndex = Math.floor(signPositive.length * cutOffDist);\n  let initialNoiseLevelPositive = signPositive[pIndex];\n\n  let skyPoint = signPositive[0];\n\n  let initialNoiseLevelNegative;\n  if (signNegative.length > 0) {\n    let nIndex = Math.floor(signNegative.length * (1 - cutOffDist));\n    initialNoiseLevelNegative = -1 * signNegative[nIndex];\n  } else {\n    initialNoiseLevelNegative = 0;\n  }\n\n  let noiseLevelPositive = initialNoiseLevelPositive;\n  let noiseLevelNegative = initialNoiseLevelNegative;\n  let cloneSignPositive = signPositive.slice();\n  let cloneSignNegative = signNegative.slice();\n\n  let cutOffSignalsIndexPlus = 0;\n  let cutOffSignalsIndexNeg = 2;\n  if (refine) {\n    let cutOffSignals = noiseLevelPositive * factorStd;\n    cutOffSignalsIndexPlus = signPositive.findIndex((e) => e < cutOffSignals);\n\n    if (cutOffSignalsIndexPlus > -1) {\n      cloneSignPositive = signPositive.slice(cutOffSignalsIndexPlus);\n      noiseLevelPositive =\n        cloneSignPositive[Math.floor(cloneSignPositive.length * cutOffDist)];\n    }\n\n    cutOffSignals = noiseLevelNegative * factorStd;\n    cutOffSignalsIndexNeg = signNegative.findIndex((e) => e < cutOffSignals);\n    if (cutOffSignalsIndexNeg > -1) {\n      cloneSignNegative = signNegative.slice(cutOffSignalsIndexNeg);\n      noiseLevelNegative =\n        cloneSignPositive[\n          Math.floor(cloneSignNegative.length * (1 - cutOffDist))\n        ];\n    }\n  }\n  let correctionFactor = -simpleNormInv(cutOffDist / 2, { magnitudeMode });\n  initialNoiseLevelPositive = initialNoiseLevelPositive / correctionFactor;\n  initialNoiseLevelNegative = initialNoiseLevelNegative / correctionFactor;\n\n  let effectiveCutOffDist, refinedCorrectionFactor;\n  if (refine && cutOffSignalsIndexPlus > -1) {\n    effectiveCutOffDist =\n      (cutOffDist * cloneSignPositive.length + cutOffSignalsIndexPlus) /\n      (cloneSignPositive.length + cutOffSignalsIndexPlus);\n    refinedCorrectionFactor =\n      -1 * simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n\n    noiseLevelPositive /= refinedCorrectionFactor;\n\n    if (cutOffSignalsIndexNeg > -1) {\n      effectiveCutOffDist =\n        (cutOffDist * cloneSignNegative.length + cutOffSignalsIndexNeg) /\n        (cloneSignNegative.length + cutOffSignalsIndexNeg);\n      refinedCorrectionFactor =\n        -1 * simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n      if (noiseLevelNegative !== 0) {\n        noiseLevelNegative /= refinedCorrectionFactor;\n      }\n    }\n  } else {\n    noiseLevelPositive /= correctionFactor;\n    noiseLevelNegative /= correctionFactor;\n  }\n\n  return {\n    positive: noiseLevelPositive,\n    negative: noiseLevelNegative,\n    snr: skyPoint / noiseLevelPositive,\n  };\n}\n\nfunction determineCutOff(signPositive, options = {}) {\n  let {\n    magnitudeMode = false,\n    considerList = { from: 0.5, step: 0.1, to: 0.9 },\n  } = options;\n  //generate a list of values for\n  let cutOff = [];\n  let indexMax = signPositive.length - 1;\n  for (let i = 0.01; i <= 0.99; i += 0.01) {\n    let index = Math.round(indexMax * i);\n    let value =\n      -signPositive[index] / simpleNormInv([i / 2], { magnitudeMode });\n    cutOff.push([i, value]);\n  }\n\n  let minKi = Number.MAX_SAFE_INTEGER;\n  let { from, to, step } = considerList;\n  let delta = step / 2;\n  let whereToCutStat = 0.5;\n  for (let i = from; i <= to; i += step) {\n    let floor = i - delta;\n    let top = i + delta;\n    let elementsOfCutOff = cutOff.filter((e) => e[0] < top && e[0] > floor);\n    let averageValue = elementsOfCutOff.reduce((a, b) => a + Math.abs(b[1]), 0);\n    let kiSqrt = 0;\n    for (let j = 0; j < elementsOfCutOff.length; j++) {\n      kiSqrt += Math.pow(elementsOfCutOff[j][1] - averageValue, 2);\n    }\n\n    if (kiSqrt < minKi) {\n      minKi = kiSqrt;\n      whereToCutStat = i;\n    }\n  }\n\n  return whereToCutStat;\n}\n\nfunction simpleNormInv(data, options = {}) {\n  const { magnitudeMode = false } = options;\n\n  if (!Array.isArray(data)) data = [data];\n\n  let from = 0;\n  let to = 2;\n  let step = 0.01;\n  let xTraining = createArray(from, to, step);\n\n  let result = new Float64Array(data.length);\n  let yTraining = new Float64Array(xTraining.length);\n  if (magnitudeMode) {\n    let factor = 1;\n    for (let i = 0; i < yTraining.length; i++) {\n      let finalInput = xTraining[i] * factor;\n      yTraining[i] = 1 - rayleighCdf(finalInput);\n    }\n    let interp = new SplineInterpolator(xTraining, yTraining);\n    for (let i = 0; i < result.length; i++) {\n      let yValue = 2 * data[i];\n      result[i] = -1 * interp.interpolate(yValue);\n    }\n  } else {\n    for (let i = 0; i < result.length; i++) {\n      result[i] = -1 * Math.SQRT2 * erfcinv(2 * data[i]);\n    }\n  }\n  return result.length === 1 ? result[0] : result;\n}\n\nfunction createArray(from, to, step) {\n  let result = new Float32Array(Math.abs((from - to) / step + 1));\n  for (let i = 0; i < result.length; i++) {\n    result[i] = from + i * step;\n  }\n  return Array.from(result);\n}\n","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport default mean;\n","import isArray from 'is-any-array';\n\nfunction sum(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport default sum;\n","import isArray from 'is-any-array';\nimport arrayMean from 'ml-array-mean';\n\nfunction variance(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(values)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options$unbiased = options.unbiased,\n      unbiased = _options$unbiased === void 0 ? true : _options$unbiased,\n      _options$mean = options.mean,\n      mean = _options$mean === void 0 ? arrayMean(values) : _options$mean;\n  var sqrError = 0;\n\n  for (var i = 0; i < values.length; i++) {\n    var x = values[i] - mean;\n    sqrError += x * x;\n  }\n\n  if (unbiased) {\n    return sqrError / (values.length - 1);\n  } else {\n    return sqrError / values.length;\n  }\n}\n\nexport default variance;\n","import xCheck from './xCheck';\n\n/**\n * This function pads an array\n * @param {Array} array - the array that will be padded\n * @param {object} [options={}]\n * @param {string} [options.algorithm=''] '', value, circular, duplicate\n * @param {number} [options.size=0] padding size before first element and after last element\n * @param {number} [options.value=0] value to use for padding (if algorithm='value')\n * @return {Array}\n */\nexport function xPadding(array, options = {}) {\n  const { size = 0, value = 0, algorithm = '' } = options;\n  xCheck(array);\n\n  if (!algorithm) {\n    if (array instanceof Float64Array) {\n      return array.slice();\n    } else {\n      return Float64Array.from(array);\n    }\n  }\n\n  let result = new Float64Array(array.length + size * 2);\n\n  for (let i = 0; i < array.length; i++) {\n    result[i + size] = array[i];\n  }\n\n  let fromEnd = size + array.length;\n  let toEnd = 2 * size + array.length;\n\n  switch (algorithm.toLowerCase()) {\n    case 'value':\n      for (let i = 0; i < size; i++) {\n        result[i] = value;\n      }\n      for (let i = fromEnd; i < toEnd; i++) {\n        result[i] = value;\n      }\n      break;\n    case 'duplicate':\n      for (let i = 0; i < size; i++) {\n        result[i] = array[0];\n      }\n      for (let i = fromEnd; i < toEnd; i++) {\n        result[i] = array[array.length - 1];\n      }\n      break;\n    case 'circular':\n      for (let i = 0; i < size; i++) {\n        result[i] =\n          array[(array.length - (size % array.length) + i) % array.length];\n      }\n      for (let i = 0; i < size; i++) {\n        result[i + fromEnd] = array[i % array.length];\n      }\n      break;\n    default:\n      throw Error('xPadding: unknown algorithm');\n  }\n\n  return result;\n}\n","/**\n * This function performs a circular shift to a new array\n * Positive values of shifts will shift to the right and negative values will do to the left\n * @example xRotate([1,2,3,4],1) -> [4,1,2,3]\n * @example xRotate([1,2,3,4],-1) -> [2,3,4,1]\n * @param {Array} array - the array that will be rotated\n * @param {number} shift\n * @return {Array}\n */\nexport function xRotate(array, shift) {\n  shift = shift % array.length;\n  if (shift < 0) shift += array.length;\n  let result = new Float64Array(array.length);\n  result.set(array.slice(array.length - shift));\n  result.set(array.slice(0, array.length - shift), shift);\n  return result;\n}\n","import xCheck from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n * @param {Array<Number>} array - the array that will be rotated\n * @param {function} fct callback function that from an array returns a value.\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {string} [options.padding.size=0] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='value'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xRolling(array, fct, options = {}) {\n  xCheck(array);\n  if (typeof fct !== 'function') throw Error('fct has to be a function');\n\n  const { window = 5, padding = {} } = options;\n  const { size = window - 1, algorithm, value } = padding;\n\n  array = xPadding(array, { size, algorithm, value }); // ensure we get a copy and it is float64\n\n  const newArray = [];\n  for (let i = 0; i < array.length - window + 1; i++) {\n    let subArray = new Float64Array(array.buffer, i * 8, window);\n    // we will send a view to the original buffer\n    newArray.push(fct(subArray));\n  }\n\n  return newArray;\n}\n","import mean from 'ml-array-mean';\n\nimport { xRolling } from './xRolling';\n\n/**\n * This function calculates a rolling average\n * @param {Array<Number>} array - the array that will be rotated\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm=''] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xRollingAverage(array, options = {}) {\n  return xRolling(array, mean, options);\n}\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport default min;\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","/**\n * Calculates reimAbsolute value of a complex spectrum\n * @param {object} [reim] - An object of kind {re:[], im:[]}.\n * @return {Float64Array}\n */\nexport function reimAbsolute(data) {\n  const length = data.re.length;\n  const re = data.re;\n  const im = data.im;\n  const newArray = new Float64Array(length);\n  for (let i = 0; i < length; i++) {\n    newArray[i] = Math.sqrt(re[i] ** 2 + im[i] ** 2);\n  }\n\n  return newArray;\n}\n","/**\n * Phase correction filter\n * @param {object} reim - An object of kind {re:[], im:[]}\n * @param {number} [phi0=0] - Angle in radians for zero order phase correction\n * @param {number} [phi1=0] - Angle in radians for first order phase correction\n * @return {object} returns a new object {re:[], im:[]}\n */\nexport function reimPhaseCorrection(data, phi0, phi1) {\n  phi0 = Number.isFinite(phi0) ? phi0 : 0;\n  phi1 = Number.isFinite(phi1) ? phi1 : 0;\n\n  const re = data.re;\n  const im = data.im;\n  const length = data.re.length;\n\n  const delta = phi1 / length;\n  const alpha = 2 * Math.pow(Math.sin(delta / 2), 2);\n  const beta = Math.sin(delta);\n  let cosTheta = Math.cos(phi0);\n  let sinTheta = Math.sin(phi0);\n\n  const newRe = new Float64Array(length);\n  const newIm = new Float64Array(length);\n  for (let i = 0; i < length; i++) {\n    newRe[i] = re[i] * cosTheta - im[i] * sinTheta;\n    newIm[i] = re[i] * sinTheta + im[i] * cosTheta;\n    // calculate angles i+1 from i\n    let newCosTheta = cosTheta - (alpha * cosTheta + beta * sinTheta);\n    let newSinTheta = sinTheta - (alpha * sinTheta - beta * cosTheta);\n    cosTheta = newCosTheta;\n    sinTheta = newSinTheta;\n  }\n\n  return { re: newRe, im: newIm };\n}\n","import { xNoiseSanPlot } from '../x/xNoiseSanPlot';\n\nimport { reimAbsolute } from './reimAbsolute';\nimport { reimPhaseCorrection } from './reimPhaseCorrection';\n/**\n * Implementation of the algorithm for automatic phase correction: A robust, general automatic phase\n * correction algorithm for high-resolution NMR data. 10.1002/mrc.4586\n * @param {object} data - { re, im } real and imaginary data.\n * @param {object} options -\n * @param {Number} options.minRegSize - min number of points to auto phase a region.\n * @param {Number} options.maxDistanceToJoin - max distance between regions (in number of points) to join two regions\n * @param {boolean} options.magnitudeMode - if true it uses magnitude spectrum.boolean\n * @param {Number} options.factorNoise - scale the cutoff like factorStd * noiseLevel.\n */\n\nconst defaultOptions = {\n  minRegSize: 30,\n  maxDistanceToJoin: 256,\n  magnitudeMode: true,\n  factorNoise: 3,\n};\n\nexport function reimAutoPhaseCorrection(data, options = {}) {\n  const { re, im } = data;\n  const length = re.length;\n\n  options = Object.assign(defaultOptions, options);\n\n  const { magnitudeMode, minRegSize } = options;\n\n  let magnitudeData = magnitudeMode ? reimAbsolute(data) : re;\n\n  let ds = holoborodko(magnitudeData);\n  let peaksDs = robustBaseLineRegionsDetection(ds, options);\n  let peaksSp = robustBaseLineRegionsDetection(magnitudeData, options);\n  let finalPeaks = new Array(length);\n  for (let i = 0; i < length; i++) {\n    finalPeaks[i] = peaksSp[i] & peaksDs[i];\n  }\n\n  // Once the regions are detected, we auto phase each of them separately.\n  // TODO: This part can be put inside a function\n  let i = -1;\n  let x0 = 0;\n  let res = [];\n  while (i < length) {\n    //phase first region\n    let reTmp = [];\n    let imTmp = [];\n\n    //Look for the first 1 in the array\n    while (!finalPeaks[++i] && i < length) {\n      //TODO: Add some extra points(0.1 ppm) at rigth and left sides of the region.\n      x0 = i;\n    }\n    for (; finalPeaks[i] && i < length; i++) {\n      reTmp.push(re[i]);\n      imTmp.push(im[i]);\n      i++;\n    }\n\n    if (reTmp.length > minRegSize) {\n      res.push(autoPhaseRegion(reTmp, imTmp, x0));\n    }\n  }\n  // TODO: Still some corrections needed. In the paper they remove the outlayers interatively\n  // until they can perform a regression witout bad points. Can someone help here?\n  let [ph1, ph0] = weightedLinearRegression(\n    res.map((r) => r.x0 / length),\n    res.map((r) => r.ph0),\n    res.map((r) => r.area / 1e11),\n  );\n  let phased = reimPhaseCorrection(\n    { re, im },\n    (ph0 * Math.PI) / 180,\n    (ph1 * Math.PI) / 180,\n  );\n  return { data: phased, ph0, ph1 };\n}\n\nfunction autoPhaseRegion(re, im, x0) {\n  let start = -180;\n  let stop = 180;\n  let nSteps = 6;\n  let maxSteps = 5;\n\n  let bestAng = 0;\n  let minArea = Number.MAX_SAFE_INTEGER;\n  while (maxSteps > 0) {\n    let dAng = (stop - start) / (nSteps + 1);\n    for (let i = start; i <= stop; i += dAng) {\n      let phased = reimPhaseCorrection({ re, im }, toRadians(i), 0);\n      let negArea = getNegArea(phased.re);\n      if (negArea < minArea) {\n        [minArea, bestAng] = [negArea, i];\n      }\n    }\n    start = bestAng - dAng;\n    stop = bestAng + dAng;\n    maxSteps--;\n  }\n\n  // Calculate the area for the best angle\n  let phased = reimPhaseCorrection({ re, im }, toRadians(bestAng), 0);\n  let area = 0;\n  let sumX = 0;\n  for (let j = 0; j < re.length; j++) {\n    area += phased.re[j];\n    sumX += phased.re[j] * (j + x0);\n  }\n\n  return { ph0: bestAng, area, x0: sumX / area };\n}\n\nfunction holoborodko(s) {\n  let dk = new Float64Array(s.length);\n  for (let i = 5; i < s.length - 5; i++) {\n    dk[i] =\n      (42 * (s[i + 1] - s[i - 1]) +\n        48 * (s[i + 2] - s[i - 2]) +\n        27 * (s[i + 3] + s[i - 3]) +\n        8 * (s[i + 4] - s[i - 4]) +\n        s[i + 5] -\n        s[i - 5]) /\n      512;\n  }\n  //Fill the borders\n  for (let i = 0; i < 5; i++) {\n    dk[i] = dk[5];\n    dk[s.length - i - 1] = dk[s.length - 6];\n  }\n\n  return dk;\n}\n\nfunction robustBaseLineRegionsDetection(s, options) {\n  const { maxDistanceToJoin, magnitudeMode, factorNoise } = options;\n\n  let mask = new Array(s.length);\n  for (let i = 0; i < s.length; i++) {\n    mask[i] = false;\n  }\n\n  let change = true;\n  while (change) {\n    let noiseLevel = xNoiseSanPlot(s, { magnitudeMode });\n    let cutOff = factorNoise * noiseLevel.positive;\n    change = false;\n    for (let i = 0; i < s.length; i++) {\n      if (Math.abs(s[i]) > cutOff && !mask[i]) {\n        change = true;\n        mask[i] = true;\n      }\n    }\n  }\n  // Clean up mask by merging peaks blocks, separated by just a few points(4??).\n  let count = 0;\n  let prev = 0;\n  for (let i = 0; i < s.length; i++) {\n    if (!mask[i]) {\n      count++;\n    } else {\n      if (count < maxDistanceToJoin) {\n        for (let j = 0; j <= count; j++) {\n          mask[prev + j] = true;\n        }\n      }\n      while (mask[++i] && i < s.length);\n      prev = i;\n      count = 0;\n    }\n  }\n\n  return mask;\n}\n\nfunction weightedLinearRegression(x, y, w) {\n  let sxtw = 0;\n  let swx = 0;\n  let sw = 0;\n  let sxtwy = 0;\n  let swy = 0;\n  for (let i = 0; i < x.length; i++) {\n    sxtw += x[i] * x[i] * w[i];\n    swx += x[i] * w[i];\n    sw += w[i];\n    sxtwy += x[i] * w[i] * y[i];\n    swy += w[i] * y[i];\n  }\n\n  /* Just to know what is the matrix system that we solve\n   let Mx=[[sxtw, swx], [swx, sw]];\n   let My=[[sxtwy], [swy]];\n  */\n\n  //Mx inverse\n  let detMx = sxtw * sw - swx * swx;\n  let inMx = [\n    [sw / detMx, -swx / detMx],\n    [-swx / detMx, sxtw / detMx],\n  ];\n\n  return [\n    inMx[0][0] * sxtwy + inMx[0][1] * swy,\n    inMx[1][0] * sxtwy + inMx[1][1] * swy,\n  ];\n}\n\nconst toRadians = (degree) => (degree * Math.PI) / 180;\n\nconst getNegArea = (data) => {\n  let area = 0;\n  for (let i = 0; i < data.length; i++) {\n    if (data[i] < 0) area -= data[i];\n  }\n  return area;\n};\n","'use strict';\n\nfunction FFT(size) {\n  this.size = size | 0;\n  if (this.size <= 1 || (this.size & (this.size - 1)) !== 0)\n    throw new Error('FFT size must be a power of two and bigger than 1');\n\n  this._csize = size << 1;\n\n  // NOTE: Use of `var` is intentional for old V8 versions\n  var table = new Array(this.size * 2);\n  for (var i = 0; i < table.length; i += 2) {\n    const angle = Math.PI * i / this.size;\n    table[i] = Math.cos(angle);\n    table[i + 1] = -Math.sin(angle);\n  }\n  this.table = table;\n\n  // Find size's power of two\n  var power = 0;\n  for (var t = 1; this.size > t; t <<= 1)\n    power++;\n\n  // Calculate initial step's width:\n  //   * If we are full radix-4 - it is 2x smaller to give inital len=8\n  //   * Otherwise it is the same as `power` to give len=4\n  this._width = power % 2 === 0 ? power - 1 : power;\n\n  // Pre-compute bit-reversal patterns\n  this._bitrev = new Array(1 << this._width);\n  for (var j = 0; j < this._bitrev.length; j++) {\n    this._bitrev[j] = 0;\n    for (var shift = 0; shift < this._width; shift += 2) {\n      var revShift = this._width - shift - 2;\n      this._bitrev[j] |= ((j >>> shift) & 3) << revShift;\n    }\n  }\n\n  this._out = null;\n  this._data = null;\n  this._inv = 0;\n}\nmodule.exports = FFT;\n\nFFT.prototype.fromComplexArray = function fromComplexArray(complex, storage) {\n  var res = storage || new Array(complex.length >>> 1);\n  for (var i = 0; i < complex.length; i += 2)\n    res[i >>> 1] = complex[i];\n  return res;\n};\n\nFFT.prototype.createComplexArray = function createComplexArray() {\n  const res = new Array(this._csize);\n  for (var i = 0; i < res.length; i++)\n    res[i] = 0;\n  return res;\n};\n\nFFT.prototype.toComplexArray = function toComplexArray(input, storage) {\n  var res = storage || this.createComplexArray();\n  for (var i = 0; i < res.length; i += 2) {\n    res[i] = input[i >>> 1];\n    res[i + 1] = 0;\n  }\n  return res;\n};\n\nFFT.prototype.completeSpectrum = function completeSpectrum(spectrum) {\n  var size = this._csize;\n  var half = size >>> 1;\n  for (var i = 2; i < half; i += 2) {\n    spectrum[size - i] = spectrum[i];\n    spectrum[size - i + 1] = -spectrum[i + 1];\n  }\n};\n\nFFT.prototype.transform = function transform(out, data) {\n  if (out === data)\n    throw new Error('Input and output buffers must be different');\n\n  this._out = out;\n  this._data = data;\n  this._inv = 0;\n  this._transform4();\n  this._out = null;\n  this._data = null;\n};\n\nFFT.prototype.realTransform = function realTransform(out, data) {\n  if (out === data)\n    throw new Error('Input and output buffers must be different');\n\n  this._out = out;\n  this._data = data;\n  this._inv = 0;\n  this._realTransform4();\n  this._out = null;\n  this._data = null;\n};\n\nFFT.prototype.inverseTransform = function inverseTransform(out, data) {\n  if (out === data)\n    throw new Error('Input and output buffers must be different');\n\n  this._out = out;\n  this._data = data;\n  this._inv = 1;\n  this._transform4();\n  for (var i = 0; i < out.length; i++)\n    out[i] /= this.size;\n  this._out = null;\n  this._data = null;\n};\n\n// radix-4 implementation\n//\n// NOTE: Uses of `var` are intentional for older V8 version that do not\n// support both `let compound assignments` and `const phi`\nFFT.prototype._transform4 = function _transform4() {\n  var out = this._out;\n  var size = this._csize;\n\n  // Initial step (permute and transform)\n  var width = this._width;\n  var step = 1 << width;\n  var len = (size / step) << 1;\n\n  var outOff;\n  var t;\n  var bitrev = this._bitrev;\n  if (len === 4) {\n    for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n      const off = bitrev[t];\n      this._singleTransform2(outOff, off, step);\n    }\n  } else {\n    // len === 8\n    for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n      const off = bitrev[t];\n      this._singleTransform4(outOff, off, step);\n    }\n  }\n\n  // Loop through steps in decreasing order\n  var inv = this._inv ? -1 : 1;\n  var table = this.table;\n  for (step >>= 2; step >= 2; step >>= 2) {\n    len = (size / step) << 1;\n    var quarterLen = len >>> 2;\n\n    // Loop through offsets in the data\n    for (outOff = 0; outOff < size; outOff += len) {\n      // Full case\n      var limit = outOff + quarterLen;\n      for (var i = outOff, k = 0; i < limit; i += 2, k += step) {\n        const A = i;\n        const B = A + quarterLen;\n        const C = B + quarterLen;\n        const D = C + quarterLen;\n\n        // Original values\n        const Ar = out[A];\n        const Ai = out[A + 1];\n        const Br = out[B];\n        const Bi = out[B + 1];\n        const Cr = out[C];\n        const Ci = out[C + 1];\n        const Dr = out[D];\n        const Di = out[D + 1];\n\n        // Middle values\n        const MAr = Ar;\n        const MAi = Ai;\n\n        const tableBr = table[k];\n        const tableBi = inv * table[k + 1];\n        const MBr = Br * tableBr - Bi * tableBi;\n        const MBi = Br * tableBi + Bi * tableBr;\n\n        const tableCr = table[2 * k];\n        const tableCi = inv * table[2 * k + 1];\n        const MCr = Cr * tableCr - Ci * tableCi;\n        const MCi = Cr * tableCi + Ci * tableCr;\n\n        const tableDr = table[3 * k];\n        const tableDi = inv * table[3 * k + 1];\n        const MDr = Dr * tableDr - Di * tableDi;\n        const MDi = Dr * tableDi + Di * tableDr;\n\n        // Pre-Final values\n        const T0r = MAr + MCr;\n        const T0i = MAi + MCi;\n        const T1r = MAr - MCr;\n        const T1i = MAi - MCi;\n        const T2r = MBr + MDr;\n        const T2i = MBi + MDi;\n        const T3r = inv * (MBr - MDr);\n        const T3i = inv * (MBi - MDi);\n\n        // Final values\n        const FAr = T0r + T2r;\n        const FAi = T0i + T2i;\n\n        const FCr = T0r - T2r;\n        const FCi = T0i - T2i;\n\n        const FBr = T1r + T3i;\n        const FBi = T1i - T3r;\n\n        const FDr = T1r - T3i;\n        const FDi = T1i + T3r;\n\n        out[A] = FAr;\n        out[A + 1] = FAi;\n        out[B] = FBr;\n        out[B + 1] = FBi;\n        out[C] = FCr;\n        out[C + 1] = FCi;\n        out[D] = FDr;\n        out[D + 1] = FDi;\n      }\n    }\n  }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleTransform2 = function _singleTransform2(outOff, off,\n                                                             step) {\n  const out = this._out;\n  const data = this._data;\n\n  const evenR = data[off];\n  const evenI = data[off + 1];\n  const oddR = data[off + step];\n  const oddI = data[off + step + 1];\n\n  const leftR = evenR + oddR;\n  const leftI = evenI + oddI;\n  const rightR = evenR - oddR;\n  const rightI = evenI - oddI;\n\n  out[outOff] = leftR;\n  out[outOff + 1] = leftI;\n  out[outOff + 2] = rightR;\n  out[outOff + 3] = rightI;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleTransform4 = function _singleTransform4(outOff, off,\n                                                             step) {\n  const out = this._out;\n  const data = this._data;\n  const inv = this._inv ? -1 : 1;\n  const step2 = step * 2;\n  const step3 = step * 3;\n\n  // Original values\n  const Ar = data[off];\n  const Ai = data[off + 1];\n  const Br = data[off + step];\n  const Bi = data[off + step + 1];\n  const Cr = data[off + step2];\n  const Ci = data[off + step2 + 1];\n  const Dr = data[off + step3];\n  const Di = data[off + step3 + 1];\n\n  // Pre-Final values\n  const T0r = Ar + Cr;\n  const T0i = Ai + Ci;\n  const T1r = Ar - Cr;\n  const T1i = Ai - Ci;\n  const T2r = Br + Dr;\n  const T2i = Bi + Di;\n  const T3r = inv * (Br - Dr);\n  const T3i = inv * (Bi - Di);\n\n  // Final values\n  const FAr = T0r + T2r;\n  const FAi = T0i + T2i;\n\n  const FBr = T1r + T3i;\n  const FBi = T1i - T3r;\n\n  const FCr = T0r - T2r;\n  const FCi = T0i - T2i;\n\n  const FDr = T1r - T3i;\n  const FDi = T1i + T3r;\n\n  out[outOff] = FAr;\n  out[outOff + 1] = FAi;\n  out[outOff + 2] = FBr;\n  out[outOff + 3] = FBi;\n  out[outOff + 4] = FCr;\n  out[outOff + 5] = FCi;\n  out[outOff + 6] = FDr;\n  out[outOff + 7] = FDi;\n};\n\n// Real input radix-4 implementation\nFFT.prototype._realTransform4 = function _realTransform4() {\n  var out = this._out;\n  var size = this._csize;\n\n  // Initial step (permute and transform)\n  var width = this._width;\n  var step = 1 << width;\n  var len = (size / step) << 1;\n\n  var outOff;\n  var t;\n  var bitrev = this._bitrev;\n  if (len === 4) {\n    for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n      const off = bitrev[t];\n      this._singleRealTransform2(outOff, off >>> 1, step >>> 1);\n    }\n  } else {\n    // len === 8\n    for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n      const off = bitrev[t];\n      this._singleRealTransform4(outOff, off >>> 1, step >>> 1);\n    }\n  }\n\n  // Loop through steps in decreasing order\n  var inv = this._inv ? -1 : 1;\n  var table = this.table;\n  for (step >>= 2; step >= 2; step >>= 2) {\n    len = (size / step) << 1;\n    var halfLen = len >>> 1;\n    var quarterLen = halfLen >>> 1;\n    var hquarterLen = quarterLen >>> 1;\n\n    // Loop through offsets in the data\n    for (outOff = 0; outOff < size; outOff += len) {\n      for (var i = 0, k = 0; i <= hquarterLen; i += 2, k += step) {\n        var A = outOff + i;\n        var B = A + quarterLen;\n        var C = B + quarterLen;\n        var D = C + quarterLen;\n\n        // Original values\n        var Ar = out[A];\n        var Ai = out[A + 1];\n        var Br = out[B];\n        var Bi = out[B + 1];\n        var Cr = out[C];\n        var Ci = out[C + 1];\n        var Dr = out[D];\n        var Di = out[D + 1];\n\n        // Middle values\n        var MAr = Ar;\n        var MAi = Ai;\n\n        var tableBr = table[k];\n        var tableBi = inv * table[k + 1];\n        var MBr = Br * tableBr - Bi * tableBi;\n        var MBi = Br * tableBi + Bi * tableBr;\n\n        var tableCr = table[2 * k];\n        var tableCi = inv * table[2 * k + 1];\n        var MCr = Cr * tableCr - Ci * tableCi;\n        var MCi = Cr * tableCi + Ci * tableCr;\n\n        var tableDr = table[3 * k];\n        var tableDi = inv * table[3 * k + 1];\n        var MDr = Dr * tableDr - Di * tableDi;\n        var MDi = Dr * tableDi + Di * tableDr;\n\n        // Pre-Final values\n        var T0r = MAr + MCr;\n        var T0i = MAi + MCi;\n        var T1r = MAr - MCr;\n        var T1i = MAi - MCi;\n        var T2r = MBr + MDr;\n        var T2i = MBi + MDi;\n        var T3r = inv * (MBr - MDr);\n        var T3i = inv * (MBi - MDi);\n\n        // Final values\n        var FAr = T0r + T2r;\n        var FAi = T0i + T2i;\n\n        var FBr = T1r + T3i;\n        var FBi = T1i - T3r;\n\n        out[A] = FAr;\n        out[A + 1] = FAi;\n        out[B] = FBr;\n        out[B + 1] = FBi;\n\n        // Output final middle point\n        if (i === 0) {\n          var FCr = T0r - T2r;\n          var FCi = T0i - T2i;\n          out[C] = FCr;\n          out[C + 1] = FCi;\n          continue;\n        }\n\n        // Do not overwrite ourselves\n        if (i === hquarterLen)\n          continue;\n\n        // In the flipped case:\n        // MAi = -MAi\n        // MBr=-MBi, MBi=-MBr\n        // MCr=-MCr\n        // MDr=MDi, MDi=MDr\n        var ST0r = T1r;\n        var ST0i = -T1i;\n        var ST1r = T0r;\n        var ST1i = -T0i;\n        var ST2r = -inv * T3i;\n        var ST2i = -inv * T3r;\n        var ST3r = -inv * T2i;\n        var ST3i = -inv * T2r;\n\n        var SFAr = ST0r + ST2r;\n        var SFAi = ST0i + ST2i;\n\n        var SFBr = ST1r + ST3i;\n        var SFBi = ST1i - ST3r;\n\n        var SA = outOff + quarterLen - i;\n        var SB = outOff + halfLen - i;\n\n        out[SA] = SFAr;\n        out[SA + 1] = SFAi;\n        out[SB] = SFBr;\n        out[SB + 1] = SFBi;\n      }\n    }\n  }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleRealTransform2 = function _singleRealTransform2(outOff,\n                                                                     off,\n                                                                     step) {\n  const out = this._out;\n  const data = this._data;\n\n  const evenR = data[off];\n  const oddR = data[off + step];\n\n  const leftR = evenR + oddR;\n  const rightR = evenR - oddR;\n\n  out[outOff] = leftR;\n  out[outOff + 1] = 0;\n  out[outOff + 2] = rightR;\n  out[outOff + 3] = 0;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleRealTransform4 = function _singleRealTransform4(outOff,\n                                                                     off,\n                                                                     step) {\n  const out = this._out;\n  const data = this._data;\n  const inv = this._inv ? -1 : 1;\n  const step2 = step * 2;\n  const step3 = step * 3;\n\n  // Original values\n  const Ar = data[off];\n  const Br = data[off + step];\n  const Cr = data[off + step2];\n  const Dr = data[off + step3];\n\n  // Pre-Final values\n  const T0r = Ar + Cr;\n  const T1r = Ar - Cr;\n  const T2r = Br + Dr;\n  const T3r = inv * (Br - Dr);\n\n  // Final values\n  const FAr = T0r + T2r;\n\n  const FBr = T1r;\n  const FBi = -T3r;\n\n  const FCr = T0r - T2r;\n\n  const FDr = T1r;\n  const FDi = T3r;\n\n  out[outOff] = FAr;\n  out[outOff + 1] = 0;\n  out[outOff + 2] = FBr;\n  out[outOff + 3] = FBi;\n  out[outOff + 4] = FCr;\n  out[outOff + 5] = 0;\n  out[outOff + 6] = FDr;\n  out[outOff + 7] = FDi;\n};\n","import FFT from 'fft.js';\n\nimport { xRotate } from '../x/xRotate';\n\nexport function reimFFT(data, options = {}) {\n  const { inverse = false, applyZeroShift = false } = options;\n\n  let { re, im } = data;\n  const size = re.length;\n  const csize = size << 1;\n\n  let complexArray = new Float64Array(csize);\n  for (let i = 0; i < csize; i += 2) {\n    complexArray[i] = re[i >>> 1];\n    complexArray[i + 1] = im[i >>> 1];\n  }\n\n  let fft = new FFT(size);\n  let output = new Float64Array(csize);\n  if (inverse) {\n    if (applyZeroShift) complexArray = zeroShift(complexArray, true);\n    fft.inverseTransform(output, complexArray);\n  } else {\n    fft.transform(output, complexArray);\n    if (applyZeroShift) output = zeroShift(output);\n  }\n\n  let newRe = new Float64Array(size);\n  let newIm = new Float64Array(size);\n  for (let i = 0; i < csize; i += 2) {\n    newRe[i >>> 1] = output[i];\n    newIm[i >>> 1] = output[i + 1];\n  }\n\n  return { re: newRe, im: newIm };\n}\n\nconst zeroShift = (data, inverse) => {\n  let middle = inverse\n    ? Math.ceil(data.length / 2)\n    : Math.floor(data.length / 2);\n  return xRotate(data, middle);\n};\n","import isAnyArray from 'is-any-array';\n\n/**\n * Throw an error in no an object of x,y arrays\n * @param {DataXY} [data={}]\n */\nexport function xyCheck(data = {}) {\n  if (!isAnyArray(data.x) || !isAnyArray(data.y)) {\n    throw new Error('Points must be an object of x and y arrays');\n  }\n  if (data.x.length !== data.y.length) {\n    throw new Error('The x and y arrays mush have the same length');\n  }\n}\n","import { xyCheck } from './xyCheck';\n/**\n * Join x / y values when difference in X is closer than delta.\n * When joining, y values are summed and x values are weighted average\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number|function} [options.delta=1] The range in which the two x values of the spectra must be to be placed on the same line. It may also be a function that allows to change `delta` depending on the X values of the spectrum\n * @return {DataXY} An object with the xyIntegration function\n */\n\nexport function xyJoinX(data = {}, options = {}) {\n  xyCheck(data);\n  const { delta = 1 } = options;\n  const deltaIsFunction = typeof delta === 'function';\n  const x = Array.from(data.x);\n  const y = Array.from(data.y);\n  if (x.length < 2) {\n    return { x, y };\n  }\n  let position = 0;\n\n  for (let i = 1; i < x.length; i++) {\n    let difference = x[i] - x[i - 1];\n    let currentDelta = deltaIsFunction ? delta((x[i] + x[i - 1]) / 2) : delta;\n\n    if (difference <= currentDelta) {\n      // we join\n      x[position] =\n        (x[position] * y[position] + x[i] * y[i]) / (y[position] + y[i]);\n      y[position] += y[i];\n    } else {\n      position++;\n      x[position] = x[i];\n      y[position] = y[i];\n    }\n  }\n\n  x.length = position + 1;\n  y.length = position + 1;\n  return { x, y };\n}\n","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n * @param {Array<Zone>} [zones=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.MIN_VALUE]\n * @param {number} [options.to=Number.MAX_VALUE]\n */\n\nexport function zonesNormalize(zones = [], options = {}) {\n  if (zones.length === 0) return [];\n  zones = JSON.parse(JSON.stringify(zones)).map((zone) =>\n    zone.from > zone.to ? { from: zone.to, to: zone.from } : zone,\n  );\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) {\n    [from, to] = [to, from];\n  }\n\n  zones = zones.sort((a, b) => {\n    if (a.from !== b.from) return a.from - b.from;\n    return a.to - b.to;\n  });\n\n  zones.forEach((zone) => {\n    if (from > zone.from) zone.from = from;\n    if (to < zone.to) zone.to = to;\n  });\n\n  zones = zones.filter((zone) => zone.from <= zone.to);\n  if (zones.length === 0) return [];\n\n  let currentZone = zones[0];\n  let result = [currentZone];\n  for (let zone of zones) {\n    if (zone.from <= currentZone.to) {\n      currentZone.to = zone.to;\n    } else {\n      currentZone = zone;\n      result.push(currentZone);\n    }\n  }\n  return result;\n}\n","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n","import {\n  ROOT_2LN2,\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\nimport erfinv from '../util/erfinv';\n\nexport class Gaussian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.sd\n      ? Gaussian.widthToFWHM(2 * options.sd)\n      : options.fwhm\n      ? options.fwhm\n      : 500;\n    this.height =\n      options.height === undefined\n        ? Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / this.fwhm\n        : options.height;\n  }\n  /**\n   * Calculate a gaussian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = 6] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a gaussian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of gaussian with the current parameters.\n   */\n  fct(x) {\n    return Gaussian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Gaussian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Gaussian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} width - Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    //https://mathworld.wolfram.com/GaussianFunction.html\n    return Gaussian.widthToFWHM(width);\n  }\n\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @returns {number} width\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Gaussian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nGaussian.fct = function fct(x, fwhm = 500) {\n  return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} width - Width between the inflection points\n * @returns {number} fwhm\n */\nGaussian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_2LN2;\n};\n\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} fwhm - Full Width at Half Maximum.\n * @returns {number} width\n */\nGaussian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_2LN2;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {object} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\n\nGaussian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n  return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nGaussian.getFactor = function getFactor(area = 0.9999) {\n  return Math.sqrt(2) * erfinv(area);\n};\n","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n\nexport default function erfinv(x) {\n  let a = 0.147;\n  if (x === 0) return 0;\n  let ln1MinusXSqrd = Math.log(1 - x * x);\n  let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n  let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n  let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n  return secondSqrt * (x > 0 ? 1 : -1);\n}\n","import { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined ? 2 / Math.PI / this.fwhm : options.height;\n  }\n  /**\n   * Calculate a lorentzian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a lorentzian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of lorentzian with the current parameters.\n   */\n  fct(x) {\n    return Lorentzian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Lorentzian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Lorentzian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [fwhm] - Full Width at Half Maximum.\n   * @returns {number} width between the inflection points\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Lorentzian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [width] Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    return Lorentzian.widthToFWHM(width);\n  }\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nLorentzian.fct = function fct(x, fwhm) {\n  const squareFWHM = fwhm * fwhm;\n  return squareFWHM / (4 * Math.pow(x, 2) + squareFWHM);\n};\n\n/**\n * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [fwhm] - Full Width at Half Maximum.\n * @returns {number} width between the inflection points\n */\nLorentzian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_THREE;\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [width] Width between the inflection points\n * @returns {number} fwhm\n */\nLorentzian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_THREE;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nLorentzian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n\n  return (height * Math.PI * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nLorentzian.getFactor = function getFactor(area = 0.9999) {\n  return 2 * Math.tan(Math.PI * (area - 0.5));\n};\n","import {\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_2LN2_MINUS_ONE,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\n\nimport { Gaussian } from './Gaussian';\nimport { Lorentzian } from './Lorentzian';\n\nexport class PseudoVoigt {\n  /**\n   * @param {object} [options={}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm=500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.mu=0.5] - ratio of gaussian contribution.\n   */\n\n  constructor(options = {}) {\n    this.mu = options.mu === undefined ? 0.5 : options.mu;\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined\n        ? 1 /\n          ((this.mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * this.fwhm +\n            ((1 - this.mu) * this.fwhm * Math.PI) / 2)\n        : options.height;\n  }\n\n  /**\n   * Calculate a linear combination of gaussian and lorentzian function width an same full width at half maximum\n   * @param { object } [options = {}]\n   * @param { number } [options.factor = 2 * Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm in the calculation of the length.Default covers 99.99 % of area.\n   * @param { number } [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return { object } - { fwhm, data<Float64Array>} - An with the number of points at half maximum and the array of y values covering the 99.99 % of the area.\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n    if (!length) {\n      length = Math.ceil(this.fwhm * factor);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n\n    let data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a linear combination of Gaussian and Lorentzian shapes where the full width at half maximum are the same for both kind of shapes (see README for equation).\n   * @param {number} [x] x value to calculate.\n   * @returns {number} - the y value of a pseudo voigt with the current parameters.\n   */\n\n  fct(x) {\n    return PseudoVoigt.fct(x, this.fwhm, this.mu);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999] - required area to be coverage\n   * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n   * @returns {number}\n   */\n  getFactor(area = 0.9999, mu = this.mu) {\n    return PseudoVoigt.getFactor(area, mu);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n  getArea() {\n    return PseudoVoigt.getArea(this.fwhm, { height: this.height, mu: this.mu });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n   * @param {number} width - width between the inflection points\n   * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n   * @returns {number} Full Width at Half Maximum (FMHM).\n   */\n  widthToFWHM(width, mu) {\n    return PseudoVoigt.widthToFWHM(width, mu);\n  }\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @param {number} [mu] - ratio of gaussian contribution.\n   * @returns {number} width between the inflection points.\n   */\n  fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n    return PseudoVoigt.fwhmToWidth(fwhm, mu);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n\n  /**\n   * set a new mu\n   * @param {number} mu - ratio of gaussian contribution.\n   */\n  setMu(mu) {\n    this.mu = mu;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @param {number} [mu=0.5] - ratio of gaussian contribution.\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nPseudoVoigt.fct = function fct(x, fwhm, mu = 0.5) {\n  return (1 - mu) * Lorentzian.fct(x, fwhm) + mu * Gaussian.fct(x, fwhm);\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n * @param {number} width - width between the inflection points\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} Full Width at Half Maximum (FMHM).\n */\nPseudoVoigt.widthToFWHM = function widthToFWHM(width, mu = 0.5) {\n  return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * @param {number} fwhm - Full Width at Half Maximum.\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} width between the inflection points.\n */\nPseudoVoigt.fwhmToWidth = function fwhmToWidth(fwhm, mu = 0.5) {\n  return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @param {number} [options.mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nPseudoVoigt.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1, mu = 0.5 } = options;\n  return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999] - required area to be coverage\n * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n * @returns {number}\n */\nPseudoVoigt.getFactor = function getFactor(area = 0.9999, mu = 0.5) {\n  return mu < 1 ? Lorentzian.getFactor(area) : Gaussian.getFactor(area);\n};\n","/**\n * Apply Savitzky Golay algorithm\n * @param {array} [ys] Array of y values\n * @param {array|number} [xs] Array of X or deltaX\n * @param {object} [options={}]\n * @param {number} [options.windowSize=9]\n * @param {number} [options.derivative=0]\n * @param {number} [options.polynomial=3]\n * @return {array} Array containing the new ys (same length)\n */\n\nexport default function SavitzkyGolay(ys, xs, options = {}) {\n  let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n\n  if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n    throw new RangeError(\n      'Invalid window size (should be odd and at least 5 integer number)',\n    );\n  }\n  if (windowSize > ys.length) {\n    throw new RangeError(\n      `Window size is higher than the data length ${windowSize}>${ys.length}`,\n    );\n  }\n  if (derivative < 0 || !Number.isInteger(derivative)) {\n    throw new RangeError('Derivative should be a positive integer');\n  }\n  if (polynomial < 1 || !Number.isInteger(polynomial)) {\n    throw new RangeError('Polynomial should be a positive integer');\n  }\n  if (polynomial >= 6) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      'You should not use polynomial grade higher than 5 if you are' +\n        ' not sure that your data arises from such a model. Possible polynomial oscillation problems',\n    );\n  }\n\n  let half = Math.floor(windowSize / 2);\n  let np = ys.length;\n  let ans = new Array(np);\n  let weights = fullWeights(windowSize, polynomial, derivative);\n  let hs = 0;\n  let constantH = true;\n  if (Array.isArray(xs)) {\n    constantH = false;\n  } else {\n    hs = Math.pow(xs, derivative);\n  }\n\n  //For the borders\n  for (let i = 0; i < half; i++) {\n    let wg1 = weights[half - i - 1];\n    let wg2 = weights[half + i + 1];\n    let d1 = 0;\n    let d2 = 0;\n    for (let l = 0; l < windowSize; l++) {\n      d1 += wg1[l] * ys[l];\n      d2 += wg2[l] * ys[np - windowSize + l];\n    }\n    if (constantH) {\n      ans[half - i - 1] = d1 / hs;\n      ans[np - half + i] = d2 / hs;\n    } else {\n      hs = getHs(xs, half - i - 1, half, derivative);\n      ans[half - i - 1] = d1 / hs;\n      hs = getHs(xs, np - half + i, half, derivative);\n      ans[np - half + i] = d2 / hs;\n    }\n  }\n\n  //For the internal points\n  let wg = weights[half];\n  for (let i = windowSize; i <= np; i++) {\n    let d = 0;\n    for (let l = 0; l < windowSize; l++) d += wg[l] * ys[l + i - windowSize];\n    if (!constantH) hs = getHs(xs, i - half - 1, half, derivative);\n    ans[i - half - 1] = d / hs;\n  }\n  return ans;\n}\n\nfunction getHs(h, center, half, derivative) {\n  let hs = 0;\n  let count = 0;\n  for (let i = center - half; i < center + half; i++) {\n    if (i >= 0 && i < h.length - 1) {\n      hs += h[i + 1] - h[i];\n      count++;\n    }\n  }\n  return Math.pow(hs / count, derivative);\n}\n\nfunction GramPoly(i, m, k, s) {\n  let Grampoly = 0;\n  if (k > 0) {\n    Grampoly =\n      ((4 * k - 2) / (k * (2 * m - k + 1))) *\n        (i * GramPoly(i, m, k - 1, s) + s * GramPoly(i, m, k - 1, s - 1)) -\n      (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n        GramPoly(i, m, k - 2, s);\n  } else {\n    if (k === 0 && s === 0) {\n      Grampoly = 1;\n    } else {\n      Grampoly = 0;\n    }\n  }\n  return Grampoly;\n}\n\nfunction GenFact(a, b) {\n  let gf = 1;\n  if (a >= b) {\n    for (let j = a - b + 1; j <= a; j++) {\n      gf *= j;\n    }\n  }\n  return gf;\n}\n\nfunction Weight(i, t, m, n, s) {\n  let sum = 0;\n  for (let k = 0; k <= n; k++) {\n    //console.log(k);\n    sum +=\n      (2 * k + 1) *\n      (GenFact(2 * m, k) / GenFact(2 * m + k + 1, k + 1)) *\n      GramPoly(i, m, k, 0) *\n      GramPoly(t, m, k, s);\n  }\n  return sum;\n}\n\n/**\n *\n * @param m  Number of points\n * @param n  Polynomial grade\n * @param s  Derivative\n */\nfunction fullWeights(m, n, s) {\n  let weights = new Array(m);\n  let np = Math.floor(m / 2);\n  for (let t = -np; t <= np; t++) {\n    weights[t + np] = new Array(m);\n    for (let j = -np; j <= np; j++) {\n      weights[t + np][j + np] = Weight(j, t, np, n, s);\n    }\n  }\n  return weights;\n}\n\n/*function entropy(data,h,options){\n    var trend = SavitzkyGolay(data,h,trendOptions);\n    var copy = new Array(data.length);\n    var sum = 0;\n    var max = 0;\n    for(var i=0;i<data.length;i++){\n        copy[i] = data[i]-trend[i];\n    }\n\n    sum/=data.length;\n    console.log(sum+\" \"+max);\n    console.log(stat.array.standardDeviation(copy));\n    console.log(Math.abs(stat.array.mean(copy))/stat.array.standardDeviation(copy));\n    return sum;\n\n}\n\n\n\nfunction guessWindowSize(data, h){\n    console.log(\"entropy \"+entropy(data,h,trendOptions));\n    return 5;\n}\n*/\n","import { getShapeGenerator } from 'ml-peak-shape-generator';\nimport SG from 'ml-savitzky-golay-generalized';\n\n/**\n * Global spectra deconvolution\n * @param {object} data - Object data with x and y arrays\n * @param {Array<number>} [data.x] - Independent variable\n * @param {Array<number>} [data.y] - Dependent variable\n * @param {object} [options={}] - Options object\n * @param {object} [options.shape={}] - Object that specified the kind of shape to calculate the FWHM instead of width between inflection points. see https://mljs.github.io/peak-shape-generator/#inflectionpointswidthtofwhm\n * @param {object} [options.shape.kind='gaussian']\n * @param {object} [options.shape.options={}]\n * @param {object} [options.sgOptions] - Options object for Savitzky-Golay filter. See https://github.com/mljs/savitzky-golay-generalized#options\n * @param {number} [options.sgOptions.windowSize = 9] - points to use in the approximations\n * @param {number} [options.sgOptions.polynomial = 3] - degree of the polynomial to use in the approximations\n * @param {number} [options.minMaxRatio = 0.00025] - Threshold to determine if a given peak should be considered as a noise\n * @param {number} [options.broadRatio = 0.00] - If `broadRatio` is higher than 0, then all the peaks which second derivative\n * smaller than `broadRatio * maxAbsSecondDerivative` will be marked with the soft mask equal to true.\n * @param {number} [options.noiseLevel = 0] - Noise threshold in spectrum units\n * @param {boolean} [options.maxCriteria = true] - Peaks are local maximum(true) or minimum(false)\n * @param {boolean} [options.smoothY = true] - Select the peak intensities from a smoothed version of the independent variables\n * @param {boolean} [options.realTopDetection = false] - Use a quadratic optimizations with the peak and its 3 closest neighbors\n * to determine the true x,y values of the peak?\n * @param {number} [options.heightFactor = 0] - Factor to multiply the calculated height (usually 2)\n * @param {number} [options.derivativeThreshold = -1] - Filters based on the amplitude of the first derivative\n * @return {Array<object>}\n */\nexport function gsd(data, options = {}) {\n  let {\n    noiseLevel,\n    sgOptions = {\n      windowSize: 9,\n      polynomial: 3,\n    },\n    shape = {},\n    smoothY = true,\n    heightFactor = 0,\n    broadRatio = 0.0,\n    maxCriteria = true,\n    minMaxRatio = 0.00025,\n    derivativeThreshold = -1,\n    realTopDetection = false,\n  } = options;\n\n  let { y: yIn, x } = data;\n\n  const y = yIn.slice();\n  let equalSpaced = isEqualSpaced(x);\n\n  if (noiseLevel === undefined) {\n    noiseLevel = equalSpaced ? getNoiseLevel(y) : 0;\n  }\n\n  const yCorrection = { m: 1, b: noiseLevel };\n\n  if (!maxCriteria) {\n    yCorrection.m = -1;\n    yCorrection.b *= -1;\n  }\n\n  for (let i = 0; i < y.length; i++) {\n    y[i] = yCorrection.m * y[i] - yCorrection.b;\n  }\n\n  for (let i = 0; i < y.length; i++) {\n    if (y[i] < 0) {\n      y[i] = 0;\n    }\n  }\n  // If the max difference between delta x is less than 5%, then,\n  // we can assume it to be equally spaced variable\n  let yData = y;\n  let dY, ddY;\n  const { windowSize, polynomial } = sgOptions;\n\n  if (equalSpaced) {\n    if (smoothY) {\n      yData = SG(y, x[1] - x[0], {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  } else {\n    if (smoothY) {\n      yData = SG(y, x, {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  }\n\n  const xData = x;\n  const dX = x[1] - x[0];\n  let maxDdy = 0;\n  let maxY = 0;\n  for (let i = 0; i < yData.length; i++) {\n    if (Math.abs(ddY[i]) > maxDdy) {\n      maxDdy = Math.abs(ddY[i]);\n    }\n    if (Math.abs(yData[i]) > maxY) {\n      maxY = Math.abs(yData[i]);\n    }\n  }\n\n  let lastMax = null;\n  let lastMin = null;\n  let minddY = [];\n  let intervalL = [];\n  let intervalR = [];\n  let broadMask = [];\n\n  // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n  for (let i = 1; i < yData.length - 1; ++i) {\n    // filter based on derivativeThreshold\n    // console.log('pasa', y[i], dY[i], ddY[i]);\n    if (Math.abs(dY[i]) > derivativeThreshold) {\n      // Minimum in first derivative\n      if (\n        (dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n        (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])\n      ) {\n        lastMin = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX > 0 && lastMax !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n\n      // Maximum in first derivative\n      if (\n        (dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n        (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])\n      ) {\n        lastMax = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX < 0 && lastMin !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n    }\n\n    // Minimum in second derivative\n    if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n      minddY.push(i);\n      broadMask.push(Math.abs(ddY[i]) <= broadRatio * maxDdy);\n    }\n  }\n\n  let widthProcessor = shape.kind\n    ? getShapeGenerator(shape.kind, shape.options).widthToFWHM\n    : (x) => x;\n\n  let signals = [];\n  let lastK = -1;\n  let possible, frequency, distanceJ, minDistance, gettingCloser;\n  for (let j = 0; j < minddY.length; ++j) {\n    frequency = xData[minddY[j]];\n    possible = -1;\n    let k = lastK + 1;\n    minDistance = Number.MAX_VALUE;\n    distanceJ = 0;\n    gettingCloser = true;\n    while (possible === -1 && k < intervalL.length && gettingCloser) {\n      distanceJ = Math.abs(frequency - (intervalL[k].x + intervalR[k].x) / 2);\n\n      // Still getting closer?\n      if (distanceJ < minDistance) {\n        minDistance = distanceJ;\n      } else {\n        gettingCloser = false;\n      }\n      if (distanceJ < Math.abs(intervalL[k].x - intervalR[k].x) / 2) {\n        possible = k;\n        lastK = k;\n      }\n      ++k;\n    }\n\n    if (possible !== -1) {\n      if (Math.abs(yData[minddY[j]]) > minMaxRatio * maxY) {\n        let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n        signals.push({\n          index: minddY[j],\n          x: frequency,\n          y: (yData[minddY[j]] + yCorrection.b) / yCorrection.m,\n          width: widthProcessor(width),\n          soft: broadMask[j],\n        });\n\n        signals[signals.length - 1].left = intervalL[possible];\n        signals[signals.length - 1].right = intervalR[possible];\n\n        if (heightFactor) {\n          let yLeft = yData[intervalL[possible].index];\n          let yRight = yData[intervalR[possible].index];\n          signals[signals.length - 1].height =\n            heightFactor *\n            (signals[signals.length - 1].y - (yLeft + yRight) / 2);\n        }\n      }\n    }\n  }\n\n  if (realTopDetection) {\n    determineRealTop(signals, xData, yData);\n  }\n\n  // Correct the values to fit the original spectra data\n  for (let j = 0; j < signals.length; j++) {\n    signals[j].base = noiseLevel;\n  }\n\n  signals.sort(function (a, b) {\n    return a.x - b.x;\n  });\n\n  return signals;\n}\n\nconst isEqualSpaced = (x) => {\n  let tmp;\n  let maxDx = 0;\n  let minDx = Number.MAX_SAFE_INTEGER;\n  for (let i = 0; i < x.length - 1; ++i) {\n    tmp = Math.abs(x[i + 1] - x[i]);\n    if (tmp < minDx) {\n      minDx = tmp;\n    }\n    if (tmp > maxDx) {\n      maxDx = tmp;\n    }\n  }\n  return (maxDx - minDx) / maxDx < 0.05;\n};\n\nconst getNoiseLevel = (y) => {\n  let mean = 0;\n\n  let stddev = 0;\n  let length = y.length;\n  for (let i = 0; i < length; ++i) {\n    mean += y[i];\n  }\n  mean /= length;\n  let averageDeviations = new Array(length);\n  for (let i = 0; i < length; ++i) {\n    averageDeviations[i] = Math.abs(y[i] - mean);\n  }\n  averageDeviations.sort((a, b) => a - b);\n  if (length % 2 === 1) {\n    stddev = averageDeviations[(length - 1) / 2] / 0.6745;\n  } else {\n    stddev =\n      (0.5 *\n        (averageDeviations[length / 2] + averageDeviations[length / 2 - 1])) /\n      0.6745;\n  }\n\n  return stddev;\n};\n\nconst determineRealTop = (peakList, x, y) => {\n  let alpha, beta, gamma, p, currentPoint;\n  for (let j = 0; j < peakList.length; j++) {\n    currentPoint = peakList[j].index; // peakList[j][2];\n    // The detected peak could be moved 1 or 2 units to left or right.\n    if (\n      y[currentPoint - 1] >= y[currentPoint - 2] &&\n      y[currentPoint - 1] >= y[currentPoint]\n    ) {\n      currentPoint--;\n    } else {\n      if (\n        y[currentPoint + 1] >= y[currentPoint] &&\n        y[currentPoint + 1] >= y[currentPoint + 2]\n      ) {\n        currentPoint++;\n      } else {\n        if (\n          y[currentPoint - 2] >= y[currentPoint - 3] &&\n          y[currentPoint - 2] >= y[currentPoint - 1]\n        ) {\n          currentPoint -= 2;\n        } else {\n          if (\n            y[currentPoint + 2] >= y[currentPoint + 1] &&\n            y[currentPoint + 2] >= y[currentPoint + 3]\n          ) {\n            currentPoint += 2;\n          }\n        }\n      }\n    }\n    // interpolation to a sin() function\n    if (\n      y[currentPoint - 1] > 0 &&\n      y[currentPoint + 1] > 0 &&\n      y[currentPoint] >= y[currentPoint - 1] &&\n      y[currentPoint] >= y[currentPoint + 1] &&\n      (y[currentPoint] !== y[currentPoint - 1] ||\n        y[currentPoint] !== y[currentPoint + 1])\n    ) {\n      alpha = 20 * Math.log10(y[currentPoint - 1]);\n      beta = 20 * Math.log10(y[currentPoint]);\n      gamma = 20 * Math.log10(y[currentPoint + 1]);\n      p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n      // console.log(alpha, beta, gamma, `p: ${p}`);\n      // console.log(x[currentPoint]+\" \"+tmp+\" \"+currentPoint);\n      peakList[j].x =\n        x[currentPoint] + (x[currentPoint] - x[currentPoint - 1]) * p;\n      peakList[j].y =\n        y[currentPoint] -\n        0.25 * (y[currentPoint - 1] - y[currentPoint + 1]) * p;\n    }\n  }\n};\n","import { Gaussian } from '../classes/Gaussian';\nimport { Lorentzian } from '../classes/Lorentzian';\nimport { PseudoVoigt } from '../classes/PseudoVoigt';\n\nexport function getShapeGenerator(options) {\n  let { kind = 'Gaussian', options: shapeOptions } = options;\n  switch (kind.toLowerCase().replace(/[^a-z]/g, '')) {\n    case 'gaussian':\n      return new Gaussian(shapeOptions);\n    case 'lorentzian':\n      return new Lorentzian(shapeOptions);\n    case 'pseudovoigt':\n      return new PseudoVoigt(shapeOptions);\n    default:\n      throw new Error(`Unknown kind: ${kind}`);\n  }\n}\n","/*!\n * assign-symbols <https://github.com/jonschlinkert/assign-symbols>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst isEnumerable = Object.prototype.propertyIsEnumerable;\nconst getSymbols = Object.getOwnPropertySymbols;\n\nmodule.exports = (target, ...args) => {\n  if (!isObject(target)) {\n    throw new TypeError('expected the first argument to be an object');\n  }\n\n  if (args.length === 0 || typeof Symbol !== 'function' || typeof getSymbols !== 'function') {\n    return target;\n  }\n\n  for (let arg of args) {\n    let names = getSymbols(arg);\n\n    for (let key of names) {\n      if (isEnumerable.call(arg, key)) {\n        target[key] = arg[key];\n      }\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]' || Array.isArray(val);\n}\n","import isArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport default rescale;\n","/*!\n * assign-deep <https://github.com/jonschlinkert/assign-deep>\n *\n * Copyright (c) 2017-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst assignSymbols = require('assign-symbols');\n\nconst isValidKey = key => {\n  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\nconst assign = module.exports = (target, ...args) => {\n  let i = 0;\n  if (isPrimitive(target)) target = args[i++];\n  if (!target) target = {};\n  for (; i < args.length; i++) {\n    if (isObject(args[i])) {\n      for (const key of Object.keys(args[i])) {\n        if (isValidKey(key)) {\n          if (isObject(target[key]) && isObject(args[i][key])) {\n            assign(target[key], args[i][key]);\n          } else {\n            target[key] = args[i][key];\n          }\n        }\n      }\n      assignSymbols(target, args[i]);\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]';\n}\n\nfunction isPrimitive(val) {\n  return typeof val === 'object' ? val === null : typeof val !== 'function';\n}\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkIndices,\n  checkNonEmpty,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","/**\n *This function performs a quick sort of the x array while transforming the y array to preserve the coordinates.\n * @param {DataXY} [data] Object that contains property x (Array) and y (Array)\n */\nexport function xySortX(data) {\n  const { x, y } = data;\n\n  let xyObject = x\n    .map((val, index) => ({\n      x: val,\n      y: y[index],\n    }))\n    .sort((a, b) => a.x - b.x);\n\n  let response = { x: [], y: [] };\n  for (let i = 0; i < x.length; i++) {\n    response.x.push(xyObject[i].x);\n    response.y.push(xyObject[i].y);\n  }\n\n  return response;\n}\n","/**\n * Throw an error in no an object of x,y arrays\n * @param {ArrayPoints} [points=[]]\n */\nexport function xyObjectCheck(points = []) {\n  if (!Array.isArray(points)) {\n    throw new Error('ArrayPoints must be an array of {x,y} object');\n  }\n  if (\n    points.length > 0 &&\n    (points[0].x === undefined || points[0].y === undefined)\n  ) {\n    throw new Error('ArrayPoints must be an array of {x,y} object');\n  }\n}\n","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the max x value and return a {x,y,index} point\n * @param {DataXY} [points=[]] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {object}\n */\n\nexport function xyObjectMaxXPoint(points = []) {\n  xyObjectCheck(points);\n\n  if (points.length < 1) return {};\n\n  let current = {\n    x: points[0].x,\n    y: points[0].y,\n    index: 0,\n  };\n\n  for (let i = 1; i < points.length; i++) {\n    if (points[i].x > current.x) {\n      current = {\n        x: points[i].x,\n        y: points[i].y,\n        index: i,\n      };\n    }\n  }\n\n  return current;\n}\n","import { xyObjectCheck } from './xyObjectCheck';\n\n/**\n * Finds the min x value and return a {x,y,index} point\n * @param {DataXY} [points=[]] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {object}\n */\n\nexport function xyObjectMinXPoint(points = []) {\n  xyObjectCheck(points);\n\n  if (points.length < 1) return {};\n\n  let current = {\n    x: points[0].x,\n    y: points[0].y,\n    index: 0,\n  };\n\n  for (let i = 1; i < points.length; i++) {\n    if (points[i].x < current.x) {\n      current = {\n        x: points[i].x,\n        y: points[i].y,\n        index: i,\n      };\n    }\n  }\n\n  return current;\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","/**\n * Create an array with sequential numbers between from and to of length\n * @param {number} [options.from=0]\n * @param {number} [options.to=1]\n * @param {number} [options.length=1001]\n */\nexport function createSequentialArray(options = {}) {\n  const { from = 0, to = 1, length = 1000 } = options;\n  const array = new Float64Array(length);\n  let step = (to - from) / (array.length - 1);\n  for (let i = 0; i < array.length; i++) {\n    array[i] = from + step * i;\n  }\n  return array;\n}\n","/**\n * Center mean of columns\n * @param {Array<Array<Number>>} [matrix] - matrix [rows][cols].\n */\nexport function matrixCenterYMean(matrix) {\n  const nbRows = matrix.length;\n  const nbColumns = matrix[0].length;\n  const newMatrix = new Array(nbRows);\n  for (let row = 0; row < nbRows; row++) {\n    newMatrix[row] = new Float64Array(nbColumns);\n  }\n  for (let column = 0; column < nbColumns; column++) {\n    let mean = 0;\n    for (let row = 0; row < nbRows; row++) {\n      mean += matrix[row][column];\n    }\n    mean /= nbRows;\n    for (let row = 0; row < nbRows; row++) {\n      newMatrix[row][column] = matrix[row][column] - mean;\n    }\n  }\n  return newMatrix;\n}\n","import median from 'ml-array-median';\nimport { Matrix } from 'ml-matrix';\n\n/**\n * Performs a Probabilistic quotient normalization (PQN) over the dataset to account dilution based in median spectrum.\n * Dieterle, F., Ross, A., Schlotterbeck, G., & Senn, H. (2006). Probabilistic quotient normalization as robust method to account for dilution of complex biological mixtures. Application in 1H NMR metabonomics. Analytical chemistry, 78(13), 4281-4290.\n * DOI: 10.1021/ac051632c\n * @param {Array<Array<Number>>} [matrix] - matrix [rows][cols].\n * @param {Object} [options={}]\n * @param {number} [options.max=100] - Normalization integral constant.\n * @return {Object} { data, medianOfQuotients }.\n * data: Normalized dataset.\n * medianOfQuotients: The median of quotients of each variables.\n */\nexport function matrixPQN(matrix, options = {}) {\n  const { max = 100 } = options;\n  matrix = new Matrix(matrix);\n  for (let i = 0; i < matrix.rows; i++) {\n    const normalizationFactor = matrix.getRowVector(i).norm() / max;\n    const row = matrix.getRowVector(i).div(normalizationFactor);\n    matrix.setRow(i, row);\n  }\n\n  let referenceSpectrum = [];\n  for (let i = 0; i < matrix.columns; i++) {\n    const currentVariable = matrix.getColumn(i);\n    referenceSpectrum.push(median(currentVariable));\n  }\n\n  let medianOfQuotients = [];\n  for (let i = 0; i < matrix.columns; i++) {\n    let quotients = matrix.getColumnVector(i).div(referenceSpectrum[i]);\n    medianOfQuotients.push(median(quotients.getColumn(0)));\n  }\n\n  for (let i = 0; i < matrix.rows; i++) {\n    matrix.mulRow(i, 1 / medianOfQuotients[i]);\n  }\n\n  return {\n    data: matrix.to2DArray(),\n    medianOfQuotients: medianOfQuotients,\n  };\n}\n","/**\n * Rescale columns\n * @param {Array<Array<Number>>} [matrix] - matrix [rows][cols].\n * @param {object} [options={}]\n * @param {object} [options.min=0]\n * @param {object} [options.max=1]\n *\n */\nexport function matrixYRescale(matrix, options = {}) {\n  const { min = 0, max = 1 } = options;\n  const nbRows = matrix.length;\n  const nbColumns = matrix[0].length;\n  const newMatrix = new Array(nbRows);\n  for (let row = 0; row < nbRows; row++) {\n    newMatrix[row] = new Float64Array(nbColumns);\n  }\n  for (let column = 0; column < nbColumns; column++) {\n    let currentMin = matrix[0][column];\n    let currentMax = matrix[0][column];\n    for (let row = 1; row < nbRows; row++) {\n      if (matrix[row][column] < currentMin) currentMin = matrix[row][column];\n      if (matrix[row][column] > currentMax) currentMax = matrix[row][column];\n    }\n\n    const factor = (max - min) / (currentMax - currentMin);\n\n    for (let row = 0; row < nbRows; row++) {\n      newMatrix[row][column] =\n        (matrix[row][column] - currentMin) * factor + min;\n    }\n  }\n  return newMatrix;\n}\n","import median from 'ml-array-median';\n\nimport { xAbsolute } from './xAbsolute';\n/**\n * This function calculates the median after taking the reimAbsolute values of the points\n * @param {Array<Number>} array - the array that will be rotated\n * @return {Number}\n */\nexport function xAbsoluteMedian(array) {\n  return median(xAbsolute(array));\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * This function xAdd the first array by the second array or a constant value to each element of the first array\n * @param {Array<Number>} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function xAdd(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + array2[i];\n    }\n  }\n\n  return array3;\n}\n","import { xCrossCorrelation } from './xCrossCorrelation';\n\n/**\n * Calculates the auto-correlation of a vector\n * @param {Array<Number>} [A] - the array that will be fixed\n * @param {object} [options={}]\n * @param {number} [options.tau=1] - sweep increment size (in number of points, min=1, max=A.length)\n * @param {number} [options.lag=A.length - 1] - scalar lag parameter\n */\n\nexport function xAutoCorrelation(A, options = {}) {\n  return xCrossCorrelation(A, A, options);\n}\n","/**\n * This function xSubtract the first array by the second array or a constant value from each element of the first array\n * @param {Array<Number>} array1 - the array that will be rotated\n * @return {object}\n */\nexport function xBoxPlot(array) {\n  array = array.slice(0).sort((a, b) => a - b);\n  if (array.length < 5) {\n    throw Error(\n      'xBoxPlot: can not calculate info if array contains less than 3 elements',\n    );\n  }\n  let info = {\n    Q1: 0.0,\n    Q2: 0.0,\n    Q3: 0.0,\n    min: array[0],\n    max: array[array.length - 1],\n  };\n  let q1max, q3min;\n  if (array.length % 2 === 1) {\n    // odd\n    let middle = (array.length - 1) / 2;\n    info.Q2 = array[middle];\n    q1max = middle - 1;\n    q3min = middle + 1;\n  } else {\n    // even\n    q3min = array.length / 2;\n    q1max = q3min - 1;\n    info.Q2 = (array[q1max] + array[q3min]) / 2;\n  }\n  if (q1max % 2 === 0) {\n    info.Q1 = array[q1max / 2];\n    info.Q3 = array[(array.length + q3min - 1) / 2];\n  } else {\n    info.Q1 = (array[(q1max + 1) / 2] + array[(q1max - 1) / 2]) / 2;\n    let middleOver = (array.length + q3min) / 2;\n    info.Q3 = (array[middleOver] + array[middleOver - 1]) / 2;\n  }\n  return info;\n}\n","/**\n\n/**\n * Calculates the correlation between 2 vectors\n * https://en.wikipedia.org/wiki/Correlation_and_dependence\n *\n * @param {Array<Number>} [A] - the array that will be rotated\n * @param {Array<Number>} [B]\n * @return {Array}\n */\nexport function xCorrelation(A, B) {\n  let n = A.length;\n  let sumA = 0;\n  let sumA2 = 0;\n  let sumB = 0;\n  let sumB2 = 0;\n  let sumAB = 0;\n  for (let i = 0; i < n; i++) {\n    let a = A[i];\n    let b = B[i];\n    sumA += a;\n    sumA2 += a ** 2;\n    sumB += b;\n    sumB2 += b ** 2;\n    sumAB += a * b;\n  }\n  return (\n    (n * sumAB - sumA * sumB) /\n    (Math.sqrt(n * sumA2 - sumA ** 2) * Math.sqrt(n * sumB2 - sumB ** 2))\n  );\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * This function divide the first array by the second array or a constant value to each element of the first array\n * @param {Array<Number>} array1 - the array that will be rotated\n * @param {Array<Number>|Number} array2\n * @return {Array}\n */\nexport function xDivide(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / array2[i];\n    }\n  }\n\n  return array3;\n}\n","/**\n * Returns true if x is monotone\n * @param {Array} array\n * @return {boolean}\n */\nexport function xIsMonotone(array) {\n  if (array.length <= 2) {\n    return true;\n  }\n  if (array[0] === array[1]) {\n    // maybe a constant series\n    for (let i = 1; i < array.length - 1; i++) {\n      if (array[i] !== array[i + 1]) return false;\n    }\n    return true;\n  }\n\n  if (array[0] < array[array.length - 1]) {\n    for (let i = 0; i < array.length - 1; i++) {\n      if (array[i] >= array[i + 1]) return false;\n    }\n  } else {\n    for (let i = 0; i < array.length - 1; i++) {\n      if (array[i] <= array[i + 1]) return false;\n    }\n  }\n  return true;\n}\n","import xCheck from './xCheck';\n/**\n * Computes the index of the maximum of the given values\n * @param {Array<number>} array\n * @return {number}\n */\nexport function xMaxIndex(array) {\n  xCheck(array);\n\n  let maxIndex = 0;\n\n  for (let i = 1; i < array.length; i++) {\n    if (array[i] > array[maxIndex]) {\n      maxIndex = i;\n    }\n  }\n  return maxIndex;\n}\n","import xCheck from './xCheck';\n\n/**\n * Computes the maximal value of an array of values\n * @param {Array<number>} array\n * @param {object} [options={}]\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number}\n */\nexport function xMaxValue(array, options = {}) {\n  xCheck(array);\n  const { fromIndex = 0, toIndex = array.length - 1 } = options;\n  let maxValue = array[fromIndex];\n\n  for (let i = fromIndex + 1; i <= toIndex; i++) {\n    if (array[i] > maxValue) {\n      maxValue = array[i];\n    }\n  }\n  return maxValue;\n}\n","import xCheck from './xCheck';\n\n/**\n * Computes the maximal value of an array of values\n * @param {Array<number>} array\n * @param {object} [options={}]\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number}\n */\nexport function xMean(array, options = {}) {\n  xCheck(array);\n  const { fromIndex = 0, toIndex = array.length - 1 } = options;\n  let sumValue = array[fromIndex];\n\n  for (let i = fromIndex + 1; i <= toIndex; i++) {\n    sumValue += array[i];\n  }\n  return sumValue / (toIndex - fromIndex + 1);\n}\n","import { xCheckLengths } from './xCheck.js';\n/**\n * This function calculates the mean absolute error\n * @param {Array<number>} array1 -\n * @param {Array<number>} array2\n * @return {Number}\n */\nexport function xMeanAbsoluteError(array1, array2) {\n  xCheckLengths(array1, array2);\n  let sum = 0;\n  for (let i = 0; i < array1.length; i++) {\n    sum += Math.abs(array1[i] - array2[i]);\n  }\n  return sum / array1.length;\n}\n","import { xCheckLengths } from './xCheck.js';\n\n/**\n * This function calculates the mean squared error\n * @param {Array<number>} array1 -\n * @param {Array<number>} array2\n * @return {Number}\n */\nexport function xMeanSquaredError(array1, array2) {\n  xCheckLengths(array1, array2);\n  let sum = 0;\n  for (let i = 0; i < array1.length; i++) {\n    sum += Math.pow(array1[i] - array2[i], 2);\n  }\n  return sum / array1.length;\n}\n","import xCheck from './xCheck';\n\n/**\n * Computes the index of the minimum of the given values\n * @param {Array<number>} array\n * @return {number}\n */\nexport function xMinIndex(array) {\n  xCheck(array);\n  let minIndex = 0;\n  for (let i = 1; i < array.length; i++) {\n    if (array[i] < array[minIndex]) {\n      minIndex = i;\n    }\n  }\n  return minIndex;\n}\n","import xCheck from './xCheck';\n\n/**\n * Computes the minimal value of an array of values\n * @param {Array<number>} array\n * @param {object} [options={}]\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number}\n */\nexport function xMinValue(array, options = {}) {\n  xCheck(array);\n  const { fromIndex = 0, toIndex = array.length - 1 } = options;\n  let minValue = array[fromIndex];\n\n  for (let i = fromIndex + 1; i <= toIndex; i++) {\n    if (array[i] < minValue) {\n      minValue = array[i];\n    }\n  }\n  return minValue;\n}\n","/**\n * This function calculate the norm of a vector\n * @example xNorm([3, 4]) -> 5\n * @param {Array} array - the array that will be rotated\n * @return {number} calculated norm\n */\nexport function xNorm(array) {\n  let result = 0;\n  for (let i = 0; i < array.length; i++) {\n    result += array[i] ** 2;\n  }\n  return Math.sqrt(result);\n}\n","import sd from 'ml-array-standard-deviation';\n\nimport xCheck from './xCheck';\n\n/**\n * Pareto scaling, which uses the square root of standard deviation as the scaling factor, circumvents the amplification of noise by retaining a small portion of magnitude information.\n * Noda, I. (2008). Scaling techniques to enhance two-dimensional correlation spectra. Journal of Molecular Structure, 883, 216-227.\n * DOI: 10.1016/j.molstruc.2007.12.026\n * @param {Array<Number>} array\n * @return {Array}\n */\nexport function xParetoNormalization(array) {\n  xCheck(array);\n  let result = [];\n  const sqrtSD = Math.sqrt(sd(array));\n\n  for (let item of array) {\n    result.push(item / sqrtSD);\n  }\n  return result;\n}\n","import variance from 'ml-array-variance';\n\nfunction standardDeviation(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return Math.sqrt(variance(values, options));\n}\n\nexport default standardDeviation;\n","import max from 'ml-array-max';\n\nimport { xRolling } from './xRolling';\n\n/**\n * This function calculates a maximum within a rolling window\n * @param {Array<Number>} array - the array that will be rotated\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm=''] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xRollingMax(array, options = {}) {\n  return xRolling(array, max, options);\n}\n","import median from 'ml-array-median';\n\nimport { xRolling } from './xRolling';\n\n/**\n * This function calculates a rolling average\n * @param {Array<Number>} array - the array that will be rotated\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm=''] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xRollingMedian(array, options = {}) {\n  return xRolling(array, median, options);\n}\n","import min from 'ml-array-min';\n\nimport { xRolling } from './xRolling';\n\n/**\n * This function calculates a minimum within a rolling window\n * @param {Array<Number>} array - the array that will be rotated\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm=''] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xRollingMin(array, options = {}) {\n  return xRolling(array, min, options);\n}\n","import isAnyArray from 'is-any-array';\n/**\n * This function xSubtract the first array by the second array or a constant value from each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function xSubtract(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (isAnyArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - array2[i];\n    }\n  }\n\n  return array3;\n}\n","import xCheck from './xCheck';\n\n/**\n * Calculate the sum of the values\n * @param {DataXY} [array={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.fromIndex=0] - First point for xSum\n * @param {number} [options.toIndex=x.length-1] - Last point for xSum\n * @return {number} xSum value on the specified range\n */\n\nexport function xSum(array, options = {}) {\n  const { fromIndex = 0, toIndex = array.length - 1 } = options;\n  xCheck(array);\n\n  let sumValue = array[fromIndex];\n  for (let i = fromIndex + 1; i <= toIndex; i++) {\n    sumValue += array[i];\n  }\n  return sumValue;\n}\n","/**\n * Sort object of array, x has to be monotone.\n * @param {object} data Object of kind {x:[], re:[], im:[]}.\n * @return {SD}\n */\n\nexport function xreimSortX(data) {\n  const { x, re, im } = data;\n\n  if (x.length !== re.length || x.length !== im.length) {\n    throw TypeError('xreimSortX: length of x, re and im must be identical');\n  }\n\n  if (x.length < 2 || x[0] < x[1]) return data;\n\n  return {\n    x: x.slice(0).reverse(),\n    re: re.slice(0).reverse(),\n    im: im.slice(0).reverse(),\n  };\n}\n","/**\n * This function make a zero filling to re and im part.\n * @param {object} data Object of kind {x:[], re:[], im:[]}.\n * @param {number} totalLength - final number of points\n * @return {SD}\n */\nexport function xreimZeroFilling(data, totalLength) {\n  let length = data.x.length;\n  if (totalLength === 0 || length === totalLength) return data;\n\n  if (length > totalLength) {\n    return {\n      x: data.x.slice(0, totalLength),\n      re: data.re.slice(0, totalLength),\n      im: data.im.slice(0, totalLength),\n    };\n  }\n\n  const x = data.x;\n  const re = data.re;\n  const im = data.im;\n\n  const newX = new Float64Array(totalLength);\n  const newRE = new Float64Array(totalLength);\n  const newIM = new Float64Array(totalLength);\n\n  for (let i = 0; i < length; i++) {\n    newX[i] = x[i];\n    newRE[i] = re[i];\n    newIM[i] = im[i];\n  }\n  const deltaX = (x[x.length - 1] - x[0]) / (length - 1);\n  for (let i = length; i < totalLength; i++) {\n    newX[i] = newX[i - 1] + deltaX;\n  }\n\n  return {\n    x: newX,\n    re: newRE,\n    im: newIM,\n  };\n}\n","/**\n * xyAlign will align data of two spectra by verifying wether x values are in a certain range (`delta`).\n * The two spectra should not have two consecutive x values which difference is\n * smaller than `delta` to achieve good results!\n * @param {DataXY} data1 First spectrum data\n * @param {DataXY} data2 Second spectrum data\n * @param {object} [options={}]\n * @param {number|function} [options.delta=1] The range in which the two x values of the spectra must be to be placed on the same line. It may also be a function that allows to change `delta` depending on the X values of the spectrum\n * @param {boolean} [options.common=true] If `true`, only the data considered as common to both spectra is kept. If `false`, the data y arrays are completed with zeroes where no common values are found\n * @param {string} [options.x='x1'] Defines what x values should be kept (`x1` : spectrum 1 x values, `x2` spectrum 2 x values, `weighted`: weighted average of both spectra x values)\n */\nexport function xyAlign(data1, data2, options = {}) {\n  const { delta = 1, common = true, x = 'x1' } = options;\n\n  let result = {\n    x: [],\n    y1: [],\n    y2: [],\n  };\n\n  let i = 0;\n  let j = 0;\n\n  let length1 = data1.x.length;\n  let length2 = data2.x.length;\n\n  while (i < length1 && j < length2) {\n    let maxDiff = 0;\n\n    if (typeof delta === 'function') {\n      let mean = (data1.x[i] + data2.x[j]) / 2; // is this a good thing to do?\n      maxDiff = delta(mean);\n    } else {\n      maxDiff = delta;\n    }\n\n    let difference = data1.x[i] - data2.x[j];\n\n    if (Math.abs(difference) > maxDiff) {\n      if (difference > 0) {\n        if (!common) {\n          result.x.push(data2.x[j]);\n          result.y1.push(0);\n          result.y2.push(data2.y[j]);\n          if (j === length2 - 1) {\n            while (i < length1) {\n              result.x.push(data1.x[i]);\n              result.y1.push(data1.y[i]);\n              result.y2.push(0);\n              i++;\n            }\n          }\n        }\n        // console.log({ i, j }, result);\n        j++;\n      } else {\n        if (!common) {\n          result.x.push(data1.x[i]);\n          result.y1.push(data1.y[i]);\n          result.y2.push(0);\n          if (i === length1 - 1) {\n            while (j < length2) {\n              result.x.push(data2.x[j]);\n              result.y1.push(0);\n              result.y2.push(data2.y[j]);\n              j++;\n            }\n          }\n        }\n        // console.log({ i, j }, result);\n        i++;\n      }\n    } else {\n      let weightedX =\n        (data1.x[i] * data1.y[i] + data2.x[j] * data2.y[j]) /\n        (data1.y[i] + data2.y[j]);\n\n      switch (x) {\n        case 'x1':\n          result.x.push(data1.x[i]);\n          break;\n        case 'x2':\n          result.x.push(data2.x[j]);\n          break;\n        case 'weighted':\n          result.x.push(weightedX);\n          break;\n        default:\n          throw new Error(`Error: Unknown x option value: ${x}`);\n      }\n\n      result.y1.push(data1.y[i]);\n      result.y2.push(data2.y[j]);\n\n      // console.log({ i, j }, result);\n\n      i++;\n      j++;\n    }\n  }\n  return result;\n}\n","import { xyJoinX } from '../xy/xyJoinX';\n\n/**\n * Aligns spectra\n * @param {Array<DataXY>} spectra\n * @param {object} [options={}]\n * @param {number|function} [options.delta=1] The range in which the two x values of the spectra must be to be placed on the same line. It may also be a function that allows to change `delta` depending on the X values of the spectrum\n */\nexport function xyArrayAlign(spectra, options = {}) {\n  const { delta = 1 } = options;\n  const deltaIsFunction = typeof delta === 'function';\n\n  // we start by checking that the spectra don't have peaks too close and we simplify them\n  spectra = spectra.map((spectrum) => xyJoinX(spectrum, { delta }));\n\n  // at first we will calculate the X values (simple mean)\n  let possibleXs = Float64Array.from(\n    [].concat(...spectra.map((spectrum) => spectrum.x)),\n  ).sort();\n\n  if (possibleXs.length < 1) {\n    throw new Error('xyArrayAlign can not process empty arrays');\n  }\n\n  let currentSlot = {\n    from: possibleXs[0],\n    to: possibleXs[0],\n    average: possibleXs[0],\n    sum: possibleXs[0],\n    number: 1,\n  };\n  let slots = [currentSlot];\n  for (let i = 1; i < possibleXs.length; i++) {\n    let currentDelta = deltaIsFunction ? delta(possibleXs[i]) : delta;\n    if (possibleXs[i] - currentSlot.to <= currentDelta) {\n      currentSlot.to = possibleXs[i];\n      currentSlot.number++;\n      currentSlot.sum += possibleXs[i];\n      currentSlot.average = currentSlot.sum / currentSlot.number;\n    } else {\n      currentSlot = {\n        from: possibleXs[i],\n        to: possibleXs[i],\n        average: possibleXs[i],\n        sum: possibleXs[i],\n        number: 1,\n      };\n      slots.push(currentSlot);\n    }\n  }\n\n  let x = Float64Array.from(slots.map((slot) => slot.average));\n  let ys = new Array(spectra.length)\n    .fill()\n    .map(() => new Float64Array(x.length));\n\n  let positions = new Uint32Array(spectra.length);\n  for (let i = 0; i < slots.length; i++) {\n    let slot = slots[i];\n    for (let j = 0; j < spectra.length; j++) {\n      let spectrum = spectra[j];\n      while (\n        positions[j] < spectrum.x.length &&\n        spectrum.x[positions[j]] <= slot.to\n      ) {\n        ys[j][i] += spectrum.y[positions[j]];\n        positions[j]++;\n      }\n    }\n  }\n\n  return { x, ys };\n}\n","import mean from 'ml-array-mean';\nimport { gsd } from 'ml-gsd';\n\nimport { xFindClosestIndex } from '../x/xFindClosestIndex';\n\n/**\n * Calibrates the data based on a range and means of peaks in this range\n * Based on a range we will make a peak picking using global spectra deconvolution\n * The selected nbPeaks will then be taken into account to calculate an average X value.\n * The difference between the targetX and the averageX value will be returned\n * @param {DataXY} [data] array of points {x,y}\n * @param {Object} [range={}]\n * @param {number} [range.from] - Beginning of the range where the interest signal is localed\n * @param {number} [range.to] - End of the range where the interest signal is localed\n * @param {Object} [options={}]\n * @param {number} [options.nbPeaks=1] Number of peaks to consider to calculate mean (sorted by height)\n * @param {number} [options.targetX=0] Expected value for the mean of the peaks position\n * @param {number} [options.gsd={}] GSD options. You may check options here: http://mljs.github.io/global-spectral-deconvolution/#gsd\n * @param {number} [options.gsd.minMaxRatio=0.2] - GSD Threshold to determine if a given peak should be considered as a noise.\n * @returns {number} difference between targetX and currentX\n */\n\nexport function xyCalibrate(data, range = {}, options = {}) {\n  const {\n    targetX = 0,\n    nbPeaks = 1,\n    gsd: gsdOptions = {\n      minMaxRatio: 0.1,\n      realTopDetection: true,\n      smoothY: true,\n      sgOptions: {\n        windowSize: 7,\n        polynomial: 3,\n      },\n    },\n  } = options;\n  let { from, to } = range;\n  if (from === undefined || to === undefined) return 0;\n\n  const fromIndex = xFindClosestIndex(data.x, from);\n  const toIndex = xFindClosestIndex(data.x, to);\n  const sliceddata = {\n    x: data.x.slice(fromIndex, toIndex),\n    y: data.y.slice(fromIndex, toIndex),\n  };\n\n  let peaks = gsd(sliceddata, gsdOptions)\n    .sort((a, b) => b.y - a.y)\n    .slice(0, nbPeaks);\n\n  if (peaks.length === 0) return 0;\n\n  const middle = mean(peaks.map((peak) => peak.x));\n\n  return targetX - middle;\n}\n","import { zonesNormalize } from '../zones/zonesNormalize';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * xyExtract zones from a XY data\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {Array} [options.zones=[]]\n * @return {Array} Array of points\n */\n\nexport function xyExtract(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  let { zones } = options;\n\n  zones = zonesNormalize(zones);\n\n  if (!Array.isArray(zones) || zones.length === 0) return data;\n\n  let newX = [];\n  let newY = [];\n\n  let currentZone = zones[0];\n  let position = 0;\n  loop: for (let i = 0; i < x.length; i++) {\n    while (currentZone.to < x[i]) {\n      position++;\n      currentZone = zones[position];\n      if (!currentZone) {\n        i = x.length;\n        break loop;\n      }\n    }\n    if (x[i] >= currentZone.from) {\n      newX.push(x[i]);\n      newY.push(y[i]);\n    }\n  }\n  return { x: newX, y: newY };\n}\n","import { xyCheck } from './xyCheck';\n\n/**\n * Returns the numberMaxPoints points with the bigger y.\n * @param {DataXY} data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {number} numberMaxPoints Number of points to keep\n * @returns {object} The points filtered to keep the `numberMaxPoints` most intense points of the input\n */\nexport function xyGetNMaxY(data, numberMaxPoints) {\n  xyCheck(data);\n  if (data.x.length <= numberMaxPoints) {\n    return data;\n  } else {\n    let newX = new Array(numberMaxPoints);\n    let newY = new Array(numberMaxPoints);\n\n    // slice() is used to make a copy of the array, because sort() is IPM\n    let threshold = data.y.slice().sort((a, b) => b - a)[numberMaxPoints - 1];\n\n    let index = 0;\n    for (let i = 0; i < data.x.length; i++) {\n      if (data.y[i] >= threshold) {\n        newX[index] = data.x[i];\n        newY[index] = data.y[i];\n        index++;\n      }\n      if (index === numberMaxPoints) {\n        return { x: newX, y: newY };\n      }\n    }\n  }\n}\n","/**\n * Order object of array, x has to be monotone.\n * Ensure x is growing\n * @param {DataXY} data Object of kind {x:[], y:[]}.\n * @return {SD}\n */\n\nexport function xyGrowingX(data) {\n  const { x, y } = data;\n\n  if (x.length !== y.length) {\n    throw TypeError('sortX: length of x and y must be identical');\n  }\n\n  if (x.length < 2 || x[0] < x[1]) return data;\n\n  return {\n    x: x.slice(0).reverse(),\n    y: y.slice(0).reverse(),\n  };\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n/**\n * Generate a X / Y of the xyIntegral\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @param {boolean} [options.reverse=false] - Integrate from the larger value to the smallest value\n * @return {{x:[],y:[]}} An object with the xyIntegration function\n */\n\nexport function xyIntegral(data = {}, options = {}) {\n  const { reverse = false } = options;\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n\n  let xyIntegration = 0;\n  let currentxyIntegral;\n  if (reverse) {\n    currentxyIntegral = { x: [x[toIndex]], y: [0] };\n    for (let i = toIndex; i > fromIndex; i--) {\n      xyIntegration += ((x[i] - x[i - 1]) * (y[i - 1] + y[i])) / 2;\n      currentxyIntegral.x.push(x[i - 1]);\n      currentxyIntegral.y.push(xyIntegration);\n    }\n    currentxyIntegral.x.reverse();\n    currentxyIntegral.y.reverse();\n  } else {\n    currentxyIntegral = { x: [x[fromIndex]], y: [0] };\n    for (let i = fromIndex; i < toIndex; i++) {\n      xyIntegration += ((x[i + 1] - x[i]) * (y[i + 1] + y[i])) / 2;\n      currentxyIntegral.x.push(x[i + 1]);\n      currentxyIntegral.y.push(xyIntegration);\n    }\n  }\n\n  return currentxyIntegral;\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * Calculate integration\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number} xyIntegration value on the specified range\n */\n\nexport function xyIntegration(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) return 0;\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n  let currentxyIntegration = 0;\n  for (let i = fromIndex; i < toIndex; i++) {\n    currentxyIntegration += ((x[i + 1] - x[i]) * (y[i + 1] + y[i])) / 2;\n  }\n\n  return currentxyIntegration;\n}\n","import { xFindClosestIndex } from '../x/xFindClosestIndex';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * Find the closest maximum going up hill\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function xyMaxClosestYPoint(data, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n\n  let { target, targetIndex } = options;\n\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = xFindClosestIndex(x, target);\n    } else {\n      targetIndex = 0;\n    }\n  }\n\n  let previousIndex = Number.MIN_SAFE_INTEGER;\n  let currentIndex = targetIndex;\n\n  let xyMaxY = y[targetIndex];\n\n  while (currentIndex !== previousIndex) {\n    previousIndex = currentIndex;\n    if (currentIndex > 0 && y[currentIndex - 1] > xyMaxY) {\n      currentIndex--;\n    } else if (currentIndex < x.length - 1 && y[currentIndex + 1] > xyMaxY) {\n      currentIndex++;\n    }\n    xyMaxY = y[currentIndex];\n  }\n  return {\n    x: x[currentIndex],\n    y: y[currentIndex],\n    index: currentIndex,\n  };\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max value in a zone\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number} Max y on the specified range\n */\n\nexport function xyMaxY(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n\n  let currentxyMaxY = y[fromIndex];\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] > currentxyMaxY) currentxyMaxY = y[i];\n  }\n\n  return currentxyMaxY;\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max y value in a range and return a {x,y} point\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {object}\n */\n\nexport function xyMaxYPoint(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n\n  let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] > current.y) current = { x: x[i], y: y[i], index: i };\n  }\n\n  return current;\n}\n","import { xyCheck } from './xyCheck';\n/**\n * Finds all the max values\n * If the values are equal the middle\n * of the equal part will be the position of the signal!\n *\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {Array} Array of points\n */\n\nexport function xyMaximaY(data = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 3) return [];\n  let maxima = [];\n  let startEqualIndex = -1;\n  for (let i = 1; i < x.length - 1; i++) {\n    if (y[i - 1] < y[i] && y[i + 1] < y[i]) {\n      maxima.push({ x: x[i], y: y[i], index: i });\n    } else if (y[i - 1] < y[i] && y[i + 1] === y[i]) {\n      startEqualIndex = i;\n    } else if (y[i - 1] === y[i] && y[i + 1] < y[i]) {\n      let index = ((i + startEqualIndex) / 2) >> 0;\n      maxima.push({ x: x[index], y: y[index], index });\n    }\n  }\n  return maxima;\n}\n","import { xFindClosestIndex } from '../x/xFindClosestIndex';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * Find the closest minimum going down hill\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function xyMinClosestYPoint(data, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n\n  let { target, targetIndex } = options;\n\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = xFindClosestIndex(x, target);\n    } else {\n      targetIndex = 0;\n    }\n  }\n\n  let previousIndex = Number.MIN_SAFE_INTEGER;\n  let currentIndex = targetIndex;\n\n  let minY = y[targetIndex];\n\n  while (currentIndex !== previousIndex) {\n    previousIndex = currentIndex;\n    if (currentIndex > 0 && y[currentIndex - 1] < minY) {\n      currentIndex--;\n    } else if (currentIndex < x.length - 1 && y[currentIndex + 1] < minY) {\n      currentIndex++;\n    }\n    minY = y[currentIndex];\n  }\n  return {\n    x: x[currentIndex],\n    y: y[currentIndex],\n    index: currentIndex,\n  };\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max y value in a range and return a {x,y} point\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {object}\n */\n\nexport function xyMinYPoint(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n\n  let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] < current.y) current = { x: x[i], y: y[i], index: i };\n  }\n\n  return current;\n}\n","import { xyCheck } from './xyCheck';\n/**\n * Finds all the min values\n * If the values are equal the middle\n * of the equal part will be the position of the signal!\n *\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {Array} Array of points\n */\n\nexport function xyMinimaY(data = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 3) return [];\n  let maxima = [];\n  let startEqualIndex = -1;\n  for (let i = 1; i < x.length - 1; i++) {\n    if (y[i - 1] > y[i] && y[i + 1] > y[i]) {\n      maxima.push({ x: x[i], y: y[i], index: i });\n    } else if (y[i - 1] > y[i] && y[i + 1] === y[i]) {\n      startEqualIndex = i;\n    } else if (y[i - 1] === y[i] && y[i + 1] > y[i]) {\n      let index = ((i + startEqualIndex) / 2) >> 0;\n      maxima.push({ x: x[index], y: y[index], index });\n    }\n  }\n  return maxima;\n}\n","import { xyObjectMaxXPoint } from './xyObjectMaxXPoint';\nimport { xyObjectMinXPoint } from './xyObjectMinXPoint';\n\n/**\n * Filter the array by taking the higher points (max y value) and only\n * keep one per slot.\n * There are 2 different slots, the smallest one will have the\n * new property `close` to true\n * @param {array} points - array of all the points\n * @param {object} [options={}]\n * @param {number} [options.from] - min X value of the window to consider\n * @param {number} [options.to] - max X value of the window to consider\n * @param {number} [options.limit=20] - max number of points\n * @param {number} [options.threshold=0.01] - minimal intensity compare to more intense point\n * @param {number} [options.numberSlots=10] - define the number of slots and indirectly the slot width\n * @param {number} [options.numberCloseSlots=50]\n * @returns {array} - copy of points with 'close' property\n */\n\nexport function xyObjectBestPoints(points, options = {}) {\n  const {\n    from = xyObjectMinXPoint(points).x,\n    to = xyObjectMaxXPoint(points).x,\n    limit = 20,\n    threshold = 0.01,\n    numberCloseSlots = 50,\n    numberSlots = 10,\n  } = options;\n  let slot = (to - from) / numberSlots;\n  let closeSlot = (to - from) / numberCloseSlots;\n  let selected = points\n    .filter((point) => point.x >= from && point.x <= to)\n    .map((point) => {\n      return {\n        point,\n        monoisotopic: false,\n      };\n    });\n\n  selected = selected.sort((a, b) => {\n    if (a.monoisotopic && !b.monoisotopic) return -1;\n    if (b.monoisotopic && !a.monoisotopic) return 1;\n    return b.point.y - a.point.y;\n  });\n\n  let toReturn = [];\n  if (selected.length === 0) return [];\n  let minY = selected[0].point.y * threshold;\n  peakLoop: for (let item of selected) {\n    if (item.point.y < minY) {\n      if (item.monoisotopic) {\n        continue;\n      } else {\n        break;\n      }\n    }\n    let close = false;\n    for (let existing of toReturn) {\n      if (Math.abs(existing.x - item.point.x) < closeSlot) {\n        continue peakLoop;\n      }\n      if (Math.abs(existing.x - item.point.x) < slot) {\n        close = true;\n      }\n    }\n    let newPeak = JSON.parse(JSON.stringify(item.point));\n    newPeak.close = close;\n    toReturn.push(newPeak);\n    if (toReturn.length === limit) break;\n  }\n  return toReturn.sort((a, b) => a.x - b.x);\n}\n","/**\n *\n * @param {ArrayPoints} [points] array of growing points {x,y}\n * @param {object} [options={}]\n * @param {object} [xError=Number.EPSILON] limit to join the data\n */\nexport function xyObjectJoinX(points, options = {}) {\n  const { xError = Number.EPSILON } = options;\n\n  // when we join we will use the center of mass\n  let result = [];\n  let current = {\n    x: Number.MIN_SAFE_INTEGER,\n    y: 0,\n  };\n  for (let point of points) {\n    if (point.x - current.x <= xError) {\n      // weighted sum\n      current.x =\n        (point.y / (current.y + point.y)) * (point.x - current.x) + current.x;\n      current.y += point.y;\n    } else {\n      current = {\n        x: point.x,\n        y: point.y,\n      };\n      result.push(current);\n    }\n  }\n  return result;\n}\n","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the max y value and return a {x,y,index} point\n * @param {DataXY} [points=[]] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {object}\n */\n\nexport function xyObjectMaxYPoint(points = []) {\n  xyObjectCheck(points);\n\n  if (points.length < 1) return {};\n\n  let current = {\n    x: points[0].x,\n    y: points[0].y,\n    index: 0,\n  };\n\n  for (let i = 1; i < points.length; i++) {\n    if (points[i].y > current.y) {\n      current = {\n        x: points[i].x,\n        y: points[i].y,\n        index: i,\n      };\n    }\n  }\n\n  return current;\n}\n","import { xyObjectCheck } from './xyObjectCheck';\n\n/**\n * Finds the min y value and return a {x,y,index} point\n * @param {DataXY} [points=[]] - Object that contains property x (an ordered increasing array) and y (an array)\n * @return {object}\n */\n\nexport function xyObjectMinYPoint(points = []) {\n  xyObjectCheck(points);\n\n  if (points.length < 1) return {};\n\n  let current = {\n    x: points[0].x,\n    y: points[0].y,\n    index: 0,\n  };\n\n  for (let i = 1; i < points.length; i++) {\n    if (points[i].y < current.y) {\n      current = {\n        x: points[i].x,\n        y: points[i].y,\n        index: i,\n      };\n    }\n  }\n\n  return current;\n}\n","/**\n *\n * @param {ArrayPoints} [points] array of growing points {x,y}\n * @param {object} [options={}]\n * @param {object} [slotWidth=1] limit to join the data\n */\nexport function xyObjectSlotX(points, options = {}) {\n  const { slotWidth = 1 } = options;\n  const halfSlot = slotWidth / 2;\n\n  // when we join we will use the center of mass\n  let result = [];\n  let current = {\n    x: Number.MIN_VALUE,\n    y: 0,\n  };\n  for (let point of points) {\n    let slot = point.x - ((point.x + halfSlot) % slotWidth) + halfSlot;\n    if (Math.abs(current.x - slot) > Number.EPSILON) {\n      current = {\n        x: slot,\n        y: 0,\n      };\n      result.push(current);\n    }\n    current.y += point.y;\n  }\n  return result;\n}\n","/**\n * Sorts an array of points\n * @param {ArrayPoints} [points] array of points {x,y}\n */\n\nexport function xyObjectSortX(points) {\n  return points.sort((a, b) => a.x - b.x);\n}\n","/**\n *\n * @param {ArrayPoints} [points] array of points {x,y}\n */\nexport function xyObjectToXY(points) {\n  return {\n    x: points.map((entry) => entry.x),\n    y: points.map((entry) => entry.y),\n  };\n}\n","import { xFindClosestIndex } from '../x/xFindClosestIndex';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * Returns an information about a signal\n *\n * We expect ordered data and equidistant X axis\n * You can use the method helper if required:\n * ML.ArrayPoints.uniqueX\n * ML.ArrayPoints.sortX\n * ML.ArrayPoints.equallySpaced\n *\n * @param {object} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex]\n * @return {object} Information about signal\n */\n\nexport function xyPeakInfo(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 3) return undefined;\n  let { targetIndex, target } = options;\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = xFindClosestIndex(x, target);\n    }\n  }\n\n  if (targetIndex === undefined) {\n    throw new Error('xyPeakInfo: need to specify target or targetIndex');\n  }\n\n  let i = targetIndex;\n  let currentDiff = y[i] - y[i + 1];\n\n  let multiplier = currentDiff < 0 ? -1 : 1;\n  currentDiff *= multiplier;\n  while (i < x.length - 1) {\n    i++;\n    let newDiff = (y[i] - y[i + 1]) * multiplier;\n    if (newDiff < currentDiff) break;\n    currentDiff = newDiff;\n  }\n  let after = { x: x[i], y: y[i] };\n\n  i = targetIndex;\n  currentDiff = (y[i] - y[i - 1]) * multiplier;\n  while (i > 1) {\n    i--;\n    let newDiff = (y[i] - y[i - 1]) * multiplier;\n    if (newDiff < currentDiff) break;\n    currentDiff = newDiff;\n  }\n  let before = { x: x[i], y: y[i] };\n\n  return {\n    inflectionBefore: before,\n    inflectionAfter: after,\n    extrema: { x: x[targetIndex], y: y[targetIndex] },\n    inflectionMiddle: {\n      x: (before.x + after.x) / 2,\n      y: (before.y + after.y) / 2,\n    },\n    width: Math.abs(before.x - after.x),\n  };\n}\n","import { xGetTargetIndex } from '../x/xGetTargetIndex';\n\nimport { xyCheck } from './xyCheck';\n/**\n * Find the closest minimum going down hill\n * @param {object} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function xyRealMaxYPoint(data, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  const targetIndex = xGetTargetIndex(x, options);\n  // interpolation to a sin() function\n  if (\n    y[targetIndex - 1] > 0 &&\n    y[targetIndex + 1] > 0 &&\n    y[targetIndex] >= y[targetIndex - 1] &&\n    y[targetIndex] >= y[targetIndex + 1]\n  ) {\n    let alpha = 20 * Math.log10(y[targetIndex - 1]);\n    let beta = 20 * Math.log10(y[targetIndex]);\n    let gamma = 20 * Math.log10(y[targetIndex + 1]);\n    let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n    return {\n      x: x[targetIndex] + (x[targetIndex] - x[targetIndex - 1]) * p,\n      y: y[targetIndex] - 0.25 * (y[targetIndex - 1] - y[targetIndex + 1]) * p,\n      index: targetIndex,\n    };\n  } else {\n    return {\n      x: x[targetIndex],\n      y: y[targetIndex],\n      index: targetIndex,\n    };\n  }\n}\n","import { xGetTargetIndex } from '../x/xGetTargetIndex';\n\nimport { xyCheck } from './xyCheck';\n\nexport function xyRealMinYPoint(data, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n\n  const targetIndex = xGetTargetIndex(x, options);\n  // interpolation to a sin() function\n  if (\n    y[targetIndex - 1] < 0 &&\n    y[targetIndex + 1] < 0 &&\n    y[targetIndex] <= y[targetIndex - 1] &&\n    y[targetIndex] <= y[targetIndex + 1]\n  ) {\n    let alpha = 20 * Math.log10(-y[targetIndex - 1]);\n    let beta = 20 * Math.log10(-y[targetIndex]);\n    let gamma = 20 * Math.log10(-y[targetIndex + 1]);\n    let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n    return {\n      x: x[targetIndex] + (x[targetIndex] - x[targetIndex - 1]) * p,\n      y: y[targetIndex] - 0.25 * (y[targetIndex - 1] - y[targetIndex + 1]) * p,\n      index: targetIndex,\n    };\n  } else {\n    return {\n      x: x[targetIndex],\n      y: y[targetIndex],\n      index: targetIndex,\n    };\n  }\n}\n","import { xFindClosestIndex } from '../x/xFindClosestIndex';\nimport { zonesNormalize } from '../zones/zonesNormalize';\n\nimport { xyCheck } from './xyCheck';\n/**\n * xyReduce the number of points while keeping visually the same noise. Practical to\n * display many spectra as SVG.\n * SHOULD NOT BE USED FOR DATA PROCESSING !!!\n * You should rather use ml-xy-equally-spaced to make further processing\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from=x[0]]\n * @param {number} [options.to=x[x.length-1]]\n * @param {number} [options.nbPoints=4001] Number of points\n * @param {number} [options.zones=[]] Array of zones to keep (from/to object)\n * @param {number} [options.optimize=false] If optimize we may have less than nbPoints at the end\n */\n\nexport function xyReduce(data, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  let {\n    from = x[0],\n    to = x[x.length - 1],\n    nbPoints = 4001,\n    optimize = false,\n    zones = [],\n  } = options;\n\n  zones = zonesNormalize(zones, { from, to });\n  if (zones.length === 0) zones = [{ from, to }]; // we take everything\n\n  // for each zone we should know the first index, the last index and the number of points\n\n  let totalPoints = 0;\n  for (let zone of zones) {\n    zone.fromIndex = xFindClosestIndex(x, zone.from);\n    zone.toIndex = xFindClosestIndex(x, zone.to);\n    if (zone.fromIndex > 0 && x[zone.fromIndex] > zone.from) {\n      zone.fromIndex--;\n    }\n    if (zone.toIndex < x.length - 1 && x[zone.toIndex] < zone.to) {\n      zone.toIndex++;\n    }\n\n    zone.nbPoints = zone.toIndex - zone.fromIndex + 1;\n    totalPoints += zone.nbPoints;\n  }\n  // we calculate the number of points per zone that we should keep\n  if (totalPoints > nbPoints) {\n    // need to xyReduce number of points\n    let ratio = nbPoints / totalPoints;\n    let currentTotal = 0;\n    for (let i = 0; i < zones.length - 1; i++) {\n      const zone = zones[i];\n      zone.nbPoints = Math.round(zone.nbPoints * ratio);\n      currentTotal += zone.nbPoints;\n    }\n    zones[zones.length - 1].nbPoints = nbPoints - currentTotal;\n  } else {\n    let newX = new Float64Array(totalPoints);\n    let newY = new Float64Array(totalPoints);\n    let index = 0;\n    for (let zone of zones) {\n      for (let i = zone.fromIndex; i < zone.toIndex + 1; i++) {\n        newX[index] = x[i];\n        newY[index] = y[i];\n        index++;\n      }\n    }\n    return {\n      x: newX,\n      y: newY,\n    };\n  }\n\n  let newX = [];\n  let newY = [];\n  for (let zone of zones) {\n    if (!zone.nbPoints) continue;\n    appendFromTo(zone.fromIndex, zone.toIndex, zone.nbPoints);\n  }\n  return { x: newX, y: newY };\n\n  function appendFromTo(fromIndex, toIndex, zoneNbPoints) {\n    if (zoneNbPoints === 1) {\n      newX.push(x[Math.round((toIndex - fromIndex) / 2)]);\n      newY.push(y[Math.round((toIndex - fromIndex) / 2)]);\n      return;\n    }\n    if (zoneNbPoints === 2) {\n      newX.push(x[fromIndex], x[toIndex]);\n      newY.push(y[fromIndex], y[toIndex]);\n      return;\n    }\n    newX.push(x[fromIndex]);\n    newY.push(y[fromIndex]);\n    let minY = Number.MAX_VALUE;\n    let xyMaxY = Number.MIN_VALUE;\n    if (zoneNbPoints % 2 === 0) {\n      zoneNbPoints = zoneNbPoints / 2 + 1;\n    } else {\n      zoneNbPoints = (zoneNbPoints - 1) / 2 + 1;\n    }\n\n    // we will need to make some kind of min / max because there are too many points\n    // we will always keep the first point and the last point\n    let slot = (x[toIndex] - x[fromIndex]) / (zoneNbPoints - 1);\n    let currentX = x[fromIndex] + slot;\n    let first = true;\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n      if (first) {\n        minY = y[i];\n        xyMaxY = y[i];\n        first = false;\n      } else {\n        if (y[i] < minY) minY = y[i];\n        if (y[i] > xyMaxY) xyMaxY = y[i];\n      }\n      if (x[i] >= currentX || i === toIndex) {\n        if (optimize) {\n          if (minY > newY[newX.length - 1]) {\n            // we can skip the intermediate value\n          } else if (xyMaxY < newY[newX.length - 1]) {\n            // we can skip the intermediate value\n            xyMaxY = minY;\n          } else {\n            newX.push(currentX - slot / 2);\n            newY.push(minY);\n          }\n        } else {\n          newX.push(currentX - slot / 2);\n          newY.push(minY);\n        }\n\n        newX.push(currentX);\n        newY.push(xyMaxY);\n\n        currentX += slot;\n        first = true;\n      }\n    }\n  }\n}\n","import { xRolling } from '../x/xRolling';\nimport { xRollingAverage } from '../x/xRollingAverage';\n/**\n * This function calculates a rolling average\n *\n * This methods will recalculate the x values by using xRollingAverage\n * @param {ArrayPoints} [points] array of points {x,y}\n * @param {object} [options={}]\n * @param {number} [options.window=5] rolling window\n * @param {function} [fct] callback function that from an array returns a value.\n * @param {string} [options.padding.size=0] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='value'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @return {Array<Number>}\n */\nexport function xyRolling(points, fct, options = {}) {\n  let { x, y } = points;\n\n  y = xRolling(y, fct, options);\n\n  if (x.length !== y.length) {\n    x = xRollingAverage(x, options);\n  }\n\n  return { x, y };\n}\n","import { xyCheck } from './xyCheck';\n\n/**\n * Convert a DataXY to an array of array containing x,y\n * @param {DataXY} [data] array of points {x,y}\n * @returns {Array<Array<number,number>>}\n */\nexport function xyToXYArray(data) {\n  xyCheck(data);\n  const { x, y } = data;\n  let objectArray = [];\n  for (let i = 0; i < x.length; i++) {\n    objectArray.push([x[i], y[i]]);\n  }\n\n  return objectArray;\n}\n","import { xyCheck } from './xyCheck';\n\n/**\n *\n * @param {DataXY} [data] array of points {x,y}\n * @returns {DataPoints}\n */\nexport function xyToXYObject(data) {\n  xyCheck(data);\n  const { x, y } = data;\n  let objectArray = [];\n  for (let i = 0; i < x.length; i++) {\n    objectArray.push({ x: x[i], y: y[i] });\n  }\n  return objectArray;\n}\n","import { xyCheck } from './xyCheck';\nimport { xySortX } from './xySortX';\n\n/**\n * Ensure x values are unique\n * @param {DataXY} [data] Object that contains property x (Array) and y (Array)\n * @param {Object} [options={}] Object containing a property algorithm (can be 'sum' or 'average', the latter being the default value), and a property isSorted (boolean indicating if the x-array is sorted).\n * @param {string} [options.algorithm='average'] either 'average' or 'sum'\n * @param {boolean} [options.isSorted=true] if false the DataXY has to be sorted first\n * @returns {DataXY}\n */\nexport function xyUniqueX(data, options = {}) {\n  xyCheck(data);\n\n  const { algorithm = 'average', isSorted = true } = options;\n\n  if (!isSorted) {\n    data = xySortX(data);\n  }\n\n  switch (algorithm) {\n    case 'average':\n      return average(data);\n    case 'sum':\n      return sum(data);\n    default:\n      throw new Error(`xyUniqueX: unknown algorithm: ${algorithm}`);\n  }\n}\n\nfunction average(data) {\n  let x = [];\n  let y = [];\n  let cumulativeY = data.y[0];\n  let divider = 1;\n  for (let i = 1; i < data.x.length; i++) {\n    if (!(data.x[i] === data.x[i - 1])) {\n      x.push(data.x[i - 1]);\n      y.push(cumulativeY / divider);\n      cumulativeY = 0;\n      divider = 0;\n    }\n    cumulativeY += data.y[i];\n    divider++;\n  }\n  x.push(data.x[data.x.length - 1]);\n  y.push(cumulativeY / divider);\n  return { x, y };\n}\n\nfunction sum(data) {\n  let x = [];\n  let y = [];\n  let cumulativeY = data.y[0];\n  for (let i = 1; i < data.x.length; i++) {\n    if (!(data.x[i] === data.x[i - 1])) {\n      x.push(data.x[i - 1]);\n      y.push(cumulativeY);\n      cumulativeY = 0;\n    }\n    cumulativeY += data.y[i];\n  }\n  x.push(data.x[data.x.length - 1]);\n  y.push(cumulativeY);\n  return { x, y };\n}\n","export function zoneToX(zone, size) {\n  const { from, to } = zone;\n  let array = new Float64Array(size);\n  let step = (to - from) / (size - 1);\n  for (let i = 0; i < size; i++) {\n    array[i] = from + step * i;\n  }\n  return array;\n}\n"],"names":["xAbsolute","array","tmpArray","slice","i","length","Math","abs","toString","Object","prototype","isAnyArray","object","call","endsWith","a","d","e","f","g","h","j","c","b","_ref","module","exports","window","median","input","isArray","TypeError","quickSelectMedian","xMultiply","array1","array2","constant","isConstant","Error","Number","array3","Float64Array","xDotProduct","A","B","result","xCrossCorrelation","options","tau","lag","n","q","k","w","l","xFindClosestIndex","target","low","high","middle","xGetFromToIndex","x","fromIndex","toIndex","from","to","undefined","xGetTargetIndex","targetIndex","xCheck","xCheckLengths","ascending","NaN","bisector","compare","ascendingComparator","left","lo","hi","mid","right","ascendingBisect","bisectRight","bisectLeft","descending","number$1","variance","m","s","isNaN","deviation","v","sqrt","extent","identity","range","start","stop","step","arguments","max","ceil","Array","e10","e5","e2","ticks","count","tickStep","floor","step0","step1","pow","log","LN10","error","sturges","values","LN2","number","histogram","value","domain","threshold","data","xz","x0","x1","tz","shift","pop","bin","bins","push","_","thresholds","map","quantile","p","freedmanDiaconis","min","sort","scott","mean","numbers","merge","arrays","merged","pairs","permute","indexes","permutes","scan","xi","xj","shuffle","i0","i1","t","random","sum","transpose","matrix","row","zip","version","bisect","thresholdFreedmanDiaconis","thresholdScott","thresholdSturges","factory","require$$0","constructor","xIn","yIn","lambda","indices","y","sigma","params","r","u","mu","quincunx","smoothingSpline","interpolate","this","xStart","delta","maxValue","Infinity","minValue","curve","nInterval","vals","P1","Q1","P2","Q2","P3","Q3","P4","Q4","P5","Q5","polyval","coef","calc","P","Q","Y","erfcinv","val","sign","RangeError","POSITIVE_INFINITY","NEGATIVE_INFINITY","rayleighCdf","expm1","xNoiseSanPlot","mask","cutOff","refine","magnitudeMode","scaleFactor","factorStd","fixOffset","filter","_e","medianIndex","firstNegativeValueIndex","findIndex","lastPositiveValueIndex","initialNoiseLevelNegative","signPositive","signNegative","cutOffDist","considerList","indexMax","round","simpleNormInv","minKi","MAX_SAFE_INTEGER","whereToCutStat","top","elementsOfCutOff","averageValue","reduce","kiSqrt","determineCutOff","initialNoiseLevelPositive","skyPoint","noiseLevelPositive","noiseLevelNegative","cloneSignPositive","cloneSignNegative","cutOffSignalsIndexPlus","cutOffSignalsIndexNeg","cutOffSignals","effectiveCutOffDist","refinedCorrectionFactor","correctionFactor","positive","negative","snr","xTraining","Float32Array","createArray","yTraining","factor","finalInput","interp","SplineInterpolator","yValue","SQRT2","sumValue","_options$unbiased","unbiased","_options$mean","arrayMean","sqrError","xPadding","size","algorithm","fromEnd","toEnd","toLowerCase","xRotate","set","xRolling","fct","padding","newArray","subArray","buffer","xRollingAverage","_options$fromIndex","_options$toIndex","isInteger","reimAbsolute","re","im","reimPhaseCorrection","phi0","phi1","isFinite","alpha","sin","beta","cosTheta","cos","sinTheta","newRe","newIm","newSinTheta","defaultOptions","minRegSize","maxDistanceToJoin","factorNoise","autoPhaseRegion","maxSteps","bestAng","minArea","dAng","phased","toRadians","negArea","getNegArea","area","sumX","ph0","robustBaseLineRegionsDetection","change","prev","degree","PI","FFT","_csize","table","angle","power","_width","_bitrev","revShift","_out","_data","_inv","fromComplexArray","complex","storage","res","createComplexArray","toComplexArray","completeSpectrum","spectrum","half","transform","out","_transform4","realTransform","_realTransform4","inverseTransform","outOff","len","bitrev","off","_singleTransform2","_singleTransform4","inv","quarterLen","limit","C","D","Ar","Ai","Br","Bi","Cr","Ci","Dr","Di","MAr","MAi","tableBr","tableBi","MBr","MBi","tableCr","tableCi","MCr","MCi","tableDr","tableDi","MDr","MDi","T0r","T0i","T1r","T1i","T2r","T2i","T3r","T3i","FAr","FAi","FCr","FCi","FBr","FBi","FDr","FDi","evenR","evenI","oddR","oddI","leftR","leftI","rightR","rightI","step2","step3","_singleRealTransform2","_singleRealTransform4","halfLen","hquarterLen","SFAr","SFAi","SFBr","SFBi","SA","SB","zeroShift","inverse","xyCheck","xyJoinX","deltaIsFunction","position","zonesNormalize","zones","JSON","parse","stringify","zone","forEach","currentZone","GAUSSIAN_EXP_FACTOR","ROOT_PI_OVER_LN2","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","Gaussian","fwhm","sd","widthToFWHM","height","getData","getFactor","center","getArea","width","fwhmToWidth","setFWHM","setHeight","exp","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","erfinv","Lorentzian","squareFWHM","tan","PseudoVoigt","setMu","SavitzkyGolay","ys","xs","windowSize","derivative","polynomial","console","warn","np","ans","weights","Weight","fullWeights","hs","constantH","wg1","wg2","d1","d2","getHs","wg","GramPoly","Grampoly","GenFact","gf","gsd","noiseLevel","sgOptions","shape","smoothY","heightFactor","broadRatio","maxCriteria","minMaxRatio","derivativeThreshold","realTopDetection","equalSpaced","isEqualSpaced","getNoiseLevel","yCorrection","dY","ddY","yData","SG","xData","dX","maxDdy","maxY","lastMax","lastMin","minddY","intervalL","intervalR","broadMask","index","possible","frequency","distanceJ","minDistance","gettingCloser","widthProcessor","kind","shapeOptions","replace","getShapeGenerator","signals","lastK","MAX_VALUE","soft","yLeft","yRight","determineRealTop","base","tmp","maxDx","minDx","stddev","averageDeviations","peakList","gamma","currentPoint","log10","isEnumerable","propertyIsEnumerable","getSymbols","getOwnPropertySymbols","args","Symbol","arg","names","key","rescale","output","currentMin","currentMax","_options$min","autoMinMax","_options$max","isValidKey","assign","isObject","keys","assignSymbols","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","name","rows","columns","maxI","maxJ","line","formatNumber","get","join","inspectData","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","column","fill","interval","zeros","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","dot","vector2","vector1","mmul","other","Bcolj","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","scaleColumns","flipRows","first","last","flipColumns","kroneckerProduct","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","eye","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","xySortX","xyObject","response","xyObjectCheck","points","xyObjectMaxXPoint","current","xyObjectMinXPoint","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cosh","fround","log1p","log2","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","nbRows","nbColumns","normalizationFactor","referenceSpectrum","currentVariable","medianOfQuotients","quotients","magnitudeData","peaksDs","dk","holoborodko","peaksSp","finalPeaks","reTmp","imTmp","ph1","sxtw","swx","sw","sxtwy","swy","detMx","inMx","weightedLinearRegression","applyZeroShift","csize","complexArray","fft","q1max","q3min","info","middleOver","sumA","sumA2","sumB","sumB2","sumAB","sqrtSD","item","reverse","totalLength","newX","newRE","newIM","deltaX","data1","data2","common","y1","y2","length1","length2","maxDiff","difference","weightedX","spectra","possibleXs","concat","currentSlot","average","slots","currentDelta","slot","positions","Uint32Array","targetX","nbPeaks","gsdOptions","peaks","peak","newY","loop","numberMaxPoints","currentxyIntegral","xyIntegration","currentxyIntegration","previousIndex","MIN_SAFE_INTEGER","currentIndex","xyMaxY","currentxyMaxY","maxima","startEqualIndex","minY","numberCloseSlots","numberSlots","closeSlot","selected","point","monoisotopic","toReturn","peakLoop","close","existing","newPeak","xError","EPSILON","slotWidth","halfSlot","MIN_VALUE","entry","currentDiff","multiplier","newDiff","after","before","inflectionBefore","inflectionAfter","extrema","inflectionMiddle","nbPoints","optimize","totalPoints","ratio","currentTotal","appendFromTo","zoneNbPoints","currentX","objectArray","isSorted","cumulativeY"],"mappings":"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"}