{"version":3,"file":"ml-spectra-processing.min.js","sources":["../lib-esm/reim/reimAbsolute.js","../node_modules/d3-array/build/d3-array.js","../node_modules/spline-interpolator/index.js","../lib-esm/utils/createFromToArray.js","../lib-esm/x/erfcinv.js","../lib-esm/x/rayleighCdf.js","../lib-esm/x/xNoiseSanPlot.js","../lib-esm/reim/reimPhaseCorrection.js","../lib-esm/reim/reimAutoPhaseCorrection.js","../node_modules/fft.js/lib/fft.js","../lib-esm/x/xRotate.js","../lib-esm/reim/reimFFT.js","../lib-esm/x/xAbsolute.js","../node_modules/is-any-array/lib-esm/index.js","../lib-esm/x/xMedian.js","../lib-esm/x/utils/getOutputArray.js","../lib-esm/x/xMultiply.js","../lib-esm/x/xDotProduct.js","../lib-esm/x/xCrossCorrelation.js","../lib-esm/x/xCheck.js","../lib-esm/x/xCorrelation.js","../lib-esm/x/xCumulative.js","../lib-esm/x/xFindClosestIndex.js","../lib-esm/x/xGetFromToIndex.js","../lib-esm/x/xGetTargetIndex.js","../lib-esm/x/xMaxValue.js","../lib-esm/x/xMinValue.js","../lib-esm/x/xHistogram.js","../lib-esm/x/xIsMonotone.js","../lib-esm/x/xIsMonotoneIncreasing.js","../lib-esm/x/xMean.js","../lib-esm/x/xCheckLengths.js","../lib-esm/x/xMedianAbsoluteDeviation.js","../lib-esm/x/xMinMaxValues.js","../lib-esm/x/xNoiseStandardDeviation.js","../lib-esm/x/xSum.js","../lib-esm/x/xNormed.js","../lib-esm/x/xPadding.js","../lib-esm/x/xVariance.js","../lib-esm/x/xStandardDeviation.js","../lib-esm/x/xRolling.js","../lib-esm/x/xRollingAverage.js","../lib-esm/xy/xyCheck.js","../lib-esm/xy/xyMaxYPoint.js","../lib-esm/xy/xyCumulativeDistributionStatistics.js","../lib-esm/zones/zonesNormalize.js","../lib-esm/zones/zonesWithPoints.js","../lib-esm/xy/utils/integral.js","../lib-esm/xy/xyEquallySpaced.js","../lib-esm/xy/utils/equallySpacedSlot.js","../lib-esm/xy/utils/equallySpacedSmooth.js","../lib-esm/xy/xyJoinX.js","../lib-esm/xy/xySortX.js","../lib-esm/xy/xyUniqueX.js","../lib-esm/xyArray/utils/getSlots.js","../lib-esm/xyArray/xyArrayWeightedMerge.js","../lib-esm/xyArray/utils/getSlotsToFirst.js","../lib-esm/xyObject/xyObjectCheck.js","../lib-esm/xyObject/xyObjectMaxXPoint.js","../lib-esm/xyObject/xyObjectMinXPoint.js","../lib-esm/matrix/matrixClone.js","../lib-esm/matrix/matrixCreateEmpty.js","../lib-esm/matrix/matrixMinMaxAbsoluteZ.js","../lib-esm/matrix/matrixCheck.js","../lib-esm/matrix/matrixMinMaxZ.js","../lib-esm/matrix/matrixMaxAbsoluteZ.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/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","../lib-esm/matrix/matrixToArray.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-xsadd/lib-es6/xsadd.js","../lib-esm/utils/createRandomArray.js","../lib-esm/utils/createStepArray.js","../lib-esm/matrix/matrixAbsoluteMedian.js","../lib-esm/matrix/matrixApplyNumericalEncoding.js","../lib-esm/matrix/matrixAutoCorrelation.js","../lib-esm/matrix/matrixBoxPlot.js","../lib-esm/matrix/matrixCenterZMean.js","../lib-esm/matrix/matrixHistogram.js","../lib-esm/matrix/matrixMedian.js","../lib-esm/matrix/matrixNoiseStandardDeviation.js","../lib-esm/matrix/matrixNumericalDecoding.js","../lib-esm/matrix/matrixNumericalEncoding.js","../lib-esm/matrix/matrixPQN.js","../lib-esm/matrix/matrixZPivotRescale.js","../lib-esm/matrix/matrixZRescale.js","../lib-esm/matrix/matrixZRescalePerColumn.js","../lib-esm/x/xAbsoluteMedian.js","../lib-esm/x/xAdd.js","../lib-esm/x/xApplyFunctionStr.js","../lib-esm/x/xAutoCorrelation.js","../lib-esm/x/xBoxPlot.js","../lib-esm/x/xDivide.js","../lib-esm/x/xEnsureFloat64.js","../lib-esm/x/xHilbertTransform.js","../lib-esm/x/xIsEquallySpaced.js","../lib-esm/x/xMaxAbsoluteValue.js","../lib-esm/x/xMaxIndex.js","../lib-esm/x/xMeanAbsoluteError.js","../lib-esm/x/xMeanSquaredError.js","../lib-esm/x/xMinIndex.js","../lib-esm/x/xMode.js","../lib-esm/x/xNorm.js","../lib-esm/x/xParetoNormalization.js","../lib-esm/x/xRescale.js","../lib-esm/x/xRollingMax.js","../lib-esm/x/xRollingMedian.js","../lib-esm/x/xRollingMin.js","../lib-esm/x/xSampling.js","../lib-esm/x/xSequentialFill.js","../lib-esm/x/xSubtract.js","../lib-esm/x/xUniqueSorted.js","../lib-esm/xreim/xreimSortX.js","../lib-esm/xreim/xreimZeroFilling.js","../lib-esm/xy/xyAlign.js","../lib-esm/xyArray/xyArrayAlign.js","../lib-esm/xyArray/xyArrayAlignToFirst.js","../lib-esm/xyArray/xyArrayMerge.js","../lib-esm/xy/xyCovariance.js","../lib-esm/xy/xyEnsureGrowingX.js","../lib-esm/xy/xyExtract.js","../lib-esm/xy/xyFilterMinYValue.js","../lib-esm/xy/xyFilterTopYValues.js","../lib-esm/x/xSort.js","../lib-esm/xy/xyFilterX.js","../lib-esm/xy/xyFilterXPositive.js","../lib-esm/xy/xyFindClosestPoint.js","../lib-esm/xy/xyGetNMaxY.js","../lib-esm/xy/xyGrowingX.js","../lib-esm/xy/xyIntegral.js","../lib-esm/xy/xyIntegration.js","../lib-esm/xy/xyMaxClosestYPoint.js","../lib-esm/xy/xyMaxMerge.js","../lib-esm/xy/xyMaxY.js","../lib-esm/xy/xyMaximaY.js","../lib-esm/xy/xyMedian.js","../lib-esm/xy/xyMergeByCentroids.js","../lib-esm/xy/xyMinClosestYPoint.js","../lib-esm/xy/xyMinYPoint.js","../lib-esm/xy/xyMinimaY.js","../lib-esm/xyObject/xyObjectBestPoints.js","../lib-esm/xyObject/xyObjectJoinX.js","../lib-esm/xyObject/xyObjectMaxYPoint.js","../lib-esm/xyObject/xyObjectMinYPoint.js","../lib-esm/xyObject/xyObjectSlotX.js","../lib-esm/xyObject/xyObjectSortX.js","../lib-esm/xyObject/xyObjectSumY.js","../lib-esm/xyObject/xyObjectToXY.js","../lib-esm/xy/xyPeakInfo.js","../lib-esm/xy/xyRealMaxYPoint.js","../lib-esm/xy/xyRealMinYPoint.js","../lib-esm/xy/xyReduce.js","../lib-esm/xy/xyRolling.js","../lib-esm/xy/xySetYValue.js","../lib-esm/xy/xyToXYArray.js","../lib-esm/xy/xyToXYObject.js","../lib-esm/xy/xyWeightedMerge.js","../lib-esm/zone/zoneToX.js"],"sourcesContent":["/**\n * Calculates reimAbsolute value of a complex spectrum\n *\n * @param data - complex spectrum\n * @returns - reimAbsolute value\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    return newArray;\n}\n//# sourceMappingURL=reimAbsolute.js.map","(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","/**\n * Create an array with numbers between \"from\" and \"to\" of length \"length\"\n *\n * @param options - options\n * @return - array of distributed numbers between \"from\" and \"to\"\n */\nexport function createFromToArray(options = {}) {\n    let { from = 0, to = 1, length = 1000, includeFrom = true, includeTo = true, distribution = 'uniform', } = options;\n    const array = new Float64Array(length);\n    let div = length;\n    if (includeFrom && includeTo) {\n        div = length - 1;\n    }\n    else if ((!includeFrom && includeTo) || (includeFrom && !includeTo)) {\n        div = length;\n    }\n    else if (!includeFrom && !includeTo) {\n        div = length + 1;\n    }\n    let delta = (to - from) / div;\n    if (distribution === 'uniform') {\n        if (includeFrom) {\n            let index = 0;\n            while (index < length) {\n                array[index] = from + delta * index;\n                index++;\n            }\n        }\n        else {\n            let index = 0;\n            while (index < length) {\n                array[index] = from + delta * (index + 1);\n                index++;\n            }\n        }\n    }\n    else if (distribution === 'log') {\n        let base = (to / from) ** (1 / div);\n        let firstExponent = Math.log(from) / Math.log(base);\n        if (includeFrom) {\n            let index = 0;\n            while (index < length) {\n                array[index] = base ** (firstExponent + index);\n                index++;\n            }\n        }\n        else {\n            let index = 0;\n            while (index < length) {\n                array[index] = base ** (firstExponent + index + 1);\n                index++;\n            }\n        }\n    }\n    else {\n        throw new Error('Please choose for the distribution either uniform or log. By default the distribution chosen is uniform.');\n    }\n    return array;\n}\n//# sourceMappingURL=createFromToArray.js.map","/* eslint-disable @typescript-eslint/no-loss-of-precision */\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// Coefficients for erfcinv on [0, 0.5]:\nconst Y1 = 8.91314744949340820313e-2;\nconst P1 = [\n    -5.38772965071242932965e-3, 8.22687874676915743155e-3,\n    2.19878681111168899165e-2, -3.65637971411762664006e-2,\n    -1.26926147662974029034e-2, 3.34806625409744615033e-2,\n    -8.36874819741736770379e-3, -5.08781949658280665617e-4,\n];\nconst Q1 = [\n    8.86216390456424707504e-4, -2.33393759374190016776e-3,\n    7.95283687341571680018e-2, -5.27396382340099713954e-2,\n    -7.1228902341542847553e-1, 6.62328840472002992063e-1, 1.56221558398423026363,\n    -1.56574558234175846809, -9.70005043303290640362e-1, 1,\n];\n// Coefficients for erfcinv for 0.5 > 1-x >= 0:\nconst Y2 = 2.249481201171875;\nconst P2 = [\n    -3.67192254707729348546, 2.11294655448340526258e1, 1.7445385985570866523e1,\n    -4.46382324441786960818e1, -1.88510648058714251895e1,\n    1.76447298408374015486e1, 8.37050328343119927838, 1.05264680699391713268e-1,\n    -2.02433508355938759655e-1,\n];\nconst Q2 = [\n    1.72114765761200282724, -2.26436933413139721736e1, 1.08268667355460159008e1,\n    4.85609213108739935468e1, -2.01432634680485188801e1,\n    -2.86608180499800029974e1, 3.9713437953343869095, 6.24264124854247537712, 1,\n];\n// Coefficients for erfcinv for sqrt( -log(1-x)):\nconst Y3 = 8.07220458984375e-1;\nconst P3 = [\n    -6.81149956853776992068e-10, 2.85225331782217055858e-8,\n    -6.79465575181126350155e-7, 2.14558995388805277169e-3,\n    2.90157910005329060432e-2, 1.42869534408157156766e-1,\n    3.37785538912035898924e-1, 3.87079738972604337464e-1,\n    1.17030156341995252019e-1, -1.63794047193317060787e-1,\n    -1.31102781679951906451e-1,\n];\nconst Q3 = [\n    1.105924229346489121e-2, 1.52264338295331783612e-1, 8.48854343457902036425e-1,\n    2.59301921623620271374, 4.77846592945843778382, 5.38168345707006855425,\n    3.46625407242567245975, 1,\n];\nconst Y4 = 9.3995571136474609375e-1;\nconst P4 = [\n    2.66339227425782031962e-12, -2.30404776911882601748e-10,\n    4.60469890584317994083e-6, 1.57544617424960554631e-4,\n    1.87123492819559223345e-3, 9.50804701325919603619e-3,\n    1.85573306514231072324e-2, -2.22426529213447927281e-3,\n    -3.50353787183177984712e-2,\n];\nconst Q4 = [\n    7.64675292302794483503e-5, 2.63861676657015992959e-3,\n    3.41589143670947727934e-2, 2.20091105764131249824e-1,\n    7.62059164553623404043e-1, 1.3653349817554063097, 1,\n];\nconst Y5 = 9.8362827301025390625e-1;\nconst P5 = [\n    9.9055709973310326855e-17, -2.81128735628831791805e-14,\n    4.62596163522878599135e-9, 4.49696789927706453732e-7,\n    1.49624783758342370182e-5, 2.09386317487588078668e-4,\n    1.05628862152492910091e-3, -1.12951438745580278863e-3,\n    -1.67431005076633737133e-2,\n];\nconst Q5 = [\n    2.82243172016108031869e-7, 2.75335474764726041141e-5,\n    9.64011807005165528527e-4, 1.60746087093676504695e-2,\n    1.38151865749083321638e-1, 5.91429344886417493481e-1, 1,\n];\n/**\n * Polyval.\n *\n * @param c - Array of Number.\n * @param x - Number.\n * @returns Number.\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 * Calculates a rational approximation.\n *\n * @private\n * @param x - Number.\n * @param v - Number.\n * @param P - Array of polynomial coefficients.\n * @param Q - Array of polynomial coefficients.\n * @param Y - Number.\n * @returns 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 * Evaluates the complementary inverse error function for an input value.\n *\n * @private\n * @param x - Input value.\n * @returns 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    // [1] Special cases...\n    // NaN:\n    if (Number.isNaN(x)) {\n        return Number.NaN;\n    }\n    // x not on the interval: [0,2]\n    if (x < 0 || x > 2) {\n        throw new RangeError(`erfcinv()::invalid input argument. Value must be on the interval [0,2]. Value: \\`${x}\\`.`);\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    }\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    // [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    // [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    // 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//# sourceMappingURL=erfcinv.js.map","/**\n * RayleighCdf.\n *\n * @param x - data\n * @param sigma - standard deviation\n * @returns - rayleigh cdf\n */\nexport 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//# sourceMappingURL=rayleighCdf.js.map","import SplineInterpolator from 'spline-interpolator';\nimport { createFromToArray } from '../utils/createFromToArray';\nimport erfcinv from './erfcinv';\nimport rayleighCdf from './rayleighCdf';\n/**\n * Determine noise level by san plot methodology (https://doi.org/10.1002/mrc.4882)\n *\n * @param array - real or magnitude spectra data.\n * @param options - options\n * @returns noise level\n */\nexport function xNoiseSanPlot(array, options = {}) {\n    const { mask, cutOff, refine = true, magnitudeMode = false, scaleFactor = 1, factorStd = 5, fixOffset = true, } = options;\n    let input;\n    if (Array.isArray(mask) && mask.length === array.length) {\n        input = new Float64Array(array.filter((_e, i) => !mask[i]));\n    }\n    else {\n        input = new Float64Array(array);\n    }\n    if (scaleFactor > 1) {\n        for (let i = 0; i < input.length; i++) {\n            input[i] *= scaleFactor;\n        }\n    }\n    input = input.sort().reverse();\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    let firstNegativeValueIndex = input[input.length - 1] >= 0 ? input.length : 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    let signPositive = input.slice(0, lastPositiveValueIndex + 1);\n    let signNegative = input.slice(firstNegativeValueIndex);\n    let cutOffDist = cutOff || determineCutOff(signPositive, { magnitudeMode });\n    let pIndex = Math.floor(signPositive.length * cutOffDist);\n    let initialNoiseLevelPositive = signPositive[pIndex];\n    let skyPoint = signPositive[0];\n    let initialNoiseLevelNegative;\n    if (signNegative.length > 0) {\n        let nIndex = Math.floor(signNegative.length * (1 - cutOffDist));\n        initialNoiseLevelNegative = -1 * signNegative[nIndex];\n    }\n    else {\n        initialNoiseLevelNegative = 0;\n    }\n    let noiseLevelPositive = initialNoiseLevelPositive;\n    let noiseLevelNegative = initialNoiseLevelNegative;\n    let cloneSignPositive = signPositive.slice();\n    let cloneSignNegative = signNegative.slice();\n    let cutOffSignalsIndexPlus = 0;\n    let cutOffSignalsIndexNeg = 2;\n    if (refine) {\n        let cutOffSignals = noiseLevelPositive * factorStd;\n        cutOffSignalsIndexPlus = signPositive.findIndex((e) => e < cutOffSignals);\n        if (cutOffSignalsIndexPlus > -1) {\n            cloneSignPositive = signPositive.slice(cutOffSignalsIndexPlus);\n            noiseLevelPositive =\n                cloneSignPositive[Math.floor(cloneSignPositive.length * cutOffDist)];\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[Math.floor(cloneSignNegative.length * (1 - cutOffDist))];\n        }\n    }\n    let correctionFactor = -simpleNormInv(cutOffDist / 2, { magnitudeMode });\n    initialNoiseLevelPositive = initialNoiseLevelPositive / correctionFactor;\n    initialNoiseLevelNegative = initialNoiseLevelNegative / correctionFactor;\n    let effectiveCutOffDist, refinedCorrectionFactor;\n    if (refine && cutOffSignalsIndexPlus > -1) {\n        effectiveCutOffDist =\n            (cutOffDist * cloneSignPositive.length + cutOffSignalsIndexPlus) /\n                (cloneSignPositive.length + cutOffSignalsIndexPlus);\n        refinedCorrectionFactor =\n            -1 *\n                simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n        noiseLevelPositive /= refinedCorrectionFactor;\n        if (cutOffSignalsIndexNeg > -1) {\n            effectiveCutOffDist =\n                (cutOffDist * cloneSignNegative.length + cutOffSignalsIndexNeg) /\n                    (cloneSignNegative.length + cutOffSignalsIndexNeg);\n            refinedCorrectionFactor =\n                -1 *\n                    simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n            if (noiseLevelNegative !== 0) {\n                noiseLevelNegative /= refinedCorrectionFactor;\n            }\n        }\n    }\n    else {\n        noiseLevelPositive /= correctionFactor;\n        noiseLevelNegative /= correctionFactor;\n    }\n    return {\n        positive: noiseLevelPositive,\n        negative: noiseLevelNegative,\n        snr: skyPoint / noiseLevelPositive,\n        sanplot: generateSanPlot(input, {\n            fromTo: {\n                positive: { from: 0, to: lastPositiveValueIndex },\n                negative: { from: firstNegativeValueIndex, to: input.length },\n            },\n        }),\n    };\n}\n/**\n * DetermineCutOff.\n *\n * @param signPositive - Array of numbers.\n * @param [options = {}] - Options.\n * @param [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 [options.scaleFactor=1] - Factor to scale the data input[i]*=scaleFactor.\n * @param [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 [options.factorStd=5] - Factor times std to determine what will be marked as signals.\n * @param [options.refine=true] - If true the noise level will be recalculated get out the signals using factorStd.\n * @param [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. If true, the distribution will be centered.\n * @param [options.logBaseY=2] - Log scale to apply in the intensity axis in order to avoid big numbers.\n * @param options.magnitudeMode -\n * @param options.considerList -\n * @param options.considerList.from -\n * @param options.considerList.step -\n * @param options.considerList.to -\n * @param options.fromTo -\n * @returns Result.\n */\nfunction determineCutOff(signPositive, options = {}) {\n    let { magnitudeMode = false, considerList = { from: 0.5, step: 0.1, to: 0.9 }, } = 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 = -signPositive[index] /\n            simpleNormInv([i / 2], { magnitudeMode });\n        cutOff.push([i, value]);\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 (const element of elementsOfCutOff) {\n            kiSqrt += Math.pow(element[1] - averageValue, 2);\n        }\n        if (kiSqrt < minKi) {\n            minKi = kiSqrt;\n            whereToCutStat = i;\n        }\n    }\n    return whereToCutStat;\n}\n/**\n * SimpleNormInvs.\n *\n * @param data - Data array.\n * @param [options = {}] - Options.\n * @param [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 [options.scaleFactor=1] - Factor to scale the data input[i]*=scaleFactor.\n * @param [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 [options.factorStd=5] - Factor times std to determine what will be marked as signals.\n * @param [options.refine=true] - If true the noise level will be recalculated get out the signals using factorStd.\n * @param [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. If true, the distribution will be centered.\n * @param [options.logBaseY=2] - Log scale to apply in the intensity axis in order to avoid big numbers.\n * @param options.magnitudeMode -\n * @param options.considerList -\n * @param options.considerList.from -\n * @param options.considerList.step -\n * @param options.considerList.to -\n * @param options.fromTo -\n * @returns Result.\n */\nfunction simpleNormInv(data, options = {}) {\n    const { magnitudeMode = false } = options;\n    if (!Array.isArray(data))\n        data = [data];\n    let from = 0;\n    let to = 2;\n    let step = 0.01;\n    let xTraining = Array.from(createArray(from, to, step));\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    }\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/**\n * CreateArray.\n *\n * @param from - From.\n * @param to - To.\n * @param step - Step.\n * @returns Array of results.\n */\nfunction createArray(from, to, step) {\n    // Changed Array to Float64Array\n    let result = new Float64Array(Math.abs((from - to) / step + 1));\n    for (let i = 0; i < result.length; i++) {\n        result[i] = from + i * step;\n    }\n    return result;\n}\n/**\n * GenerateSanPlot.\n *\n * @param array - Array.\n * @param [options = {}] - Options.\n * @param [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 [options.scaleFactor=1] - Factor to scale the data input[i]*=scaleFactor.\n * @param [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 [options.factorStd=5] - Factor times std to determine what will be marked as signals.\n * @param [options.refine=true] - If true the noise level will be recalculated get out the signals using factorStd.\n * @param [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. If true, the distribution will be centered.\n * @param [options.logBaseY=2] - Log scale to apply in the intensity axis in order to avoid big numbers.\n * @param options.magnitudeMode -\n * @param options.considerList -\n * @param options.considerList.from -\n * @param options.considerList.step -\n * @param options.considerList.to -\n * @param options.fromTo -\n * @returns Results.\n */\nfunction generateSanPlot(array, options = {}) {\n    const { fromTo, logBaseY = 2 } = options;\n    let sanplot = {};\n    for (let key in fromTo) {\n        let { from, to } = fromTo[key];\n        sanplot[key] =\n            from !== to\n                ? scale(array.slice(from, to), {\n                    logBaseY,\n                })\n                : { x: [], y: [] };\n        if (key === 'negative') {\n            sanplot[key].y.reverse();\n        }\n    }\n    return sanplot;\n}\n/**\n * Scale.\n *\n * @param array - Array.\n * @param [options = {}] - Options.\n * @param [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 [options.scaleFactor=1] - Factor to scale the data input[i]*=scaleFactor.\n * @param [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 [options.factorStd=5] - Factor times std to determine what will be marked as signals.\n * @param [options.refine=true] - If true the noise level will be recalculated get out the signals using factorStd.\n * @param [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. If true, the distribution will be centered.\n * @param [options.logBaseY=2] - Log scale to apply in the intensity axis in order to avoid big numbers.\n * @param options.magnitudeMode -\n * @param options.considerList -\n * @param options.considerList.from -\n * @param options.considerList.step -\n * @param options.considerList.to -\n * @param options.fromTo -\n * @returns Results.\n */\nfunction scale(array, options = {}) {\n    const { log10, abs } = Math;\n    const { logBaseY } = options;\n    if (logBaseY) {\n        array = array.slice();\n        const logOfBase = log10(logBaseY);\n        for (let i = 0; i < array.length; i++) {\n            array[i] = log10(abs(array[i])) / logOfBase;\n        }\n    }\n    const xAxis = createFromToArray({\n        from: 0,\n        to: array.length - 1,\n        length: array.length,\n    });\n    return { x: xAxis, y: array };\n}\n//# sourceMappingURL=xNoiseSanPlot.js.map","/**\n * Phase correction filter\n *\n * @param data - complex spectrum\n * @param phi0 - Angle in radians for zero order phase correction\n * @param phi1 - Angle in radians for first order phase correction\n * @returns - returns a new object {re:[], im:[]}\n */\nexport function reimPhaseCorrection(data, phi0 = 0, phi1 = 0) {\n    phi0 = Number.isFinite(phi0) ? phi0 : 0;\n    phi1 = Number.isFinite(phi1) ? phi1 : 0;\n    const re = data.re;\n    const im = data.im;\n    const length = data.re.length;\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    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    return { re: newRe, im: newIm };\n}\n//# sourceMappingURL=reimPhaseCorrection.js.map","import { xNoiseSanPlot } from '../x/xNoiseSanPlot';\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 *\n * @param data - complex spectrum\n * @param options - options\n */\nexport function reimAutoPhaseCorrection(data, options = {}) {\n    const { re, im } = data;\n    const length = re.length;\n    const { magnitudeMode = true, minRegSize = 30, factorNoise = 3, maxDistanceToJoin = 256, } = options;\n    let magnitudeData = magnitudeMode ? reimAbsolute(data) : re;\n    let ds = holoborodko(magnitudeData);\n    let peaksDs = robustBaseLineRegionsDetection(ds, {\n        maxDistanceToJoin,\n        magnitudeMode,\n        factorNoise,\n    });\n    let peaksSp = robustBaseLineRegionsDetection(magnitudeData, {\n        maxDistanceToJoin,\n        magnitudeMode,\n        factorNoise,\n    });\n    let finalPeaks = new Uint8Array(length);\n    for (let i = 0; i < length; i++) {\n        finalPeaks[i] = peaksSp[i] && peaksDs[i];\n    }\n    // Once the regions are detected, we auto phase each of them separately.\n    // 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        //Look for the first 1 in the array\n        while (!finalPeaks[++i] && i < length) {\n            //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        if (reTmp.length > minRegSize) {\n            res.push(autoPhaseRegion(reTmp, imTmp, x0));\n        }\n    }\n    // 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(res.map((r) => r.x0 / length), res.map((r) => r.ph0), res.map((r) => r.area / 1e11));\n    let phased = reimPhaseCorrection({ re, im }, (ph0 * Math.PI) / 180, (ph1 * Math.PI) / 180);\n    return { data: phased, ph0, ph1 };\n}\n/**\n * AutoPhaseRegion.\n *\n * @param re - Array of Number.\n * @param im - Array of Number.\n * @param x0 - Number.\n * @returns Region.\n */\nfunction autoPhaseRegion(re, im, x0) {\n    let start = -180;\n    let stop = 180;\n    let nSteps = 6;\n    let maxSteps = 5;\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    // 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    return { ph0: bestAng, area, x0: sumX / area };\n}\n/**\n * Holoborodko.\n *\n * @param s - Array of float.\n * @returns Array of float.\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    return dk;\n}\n/**\n * RobustBaseLineRegionsDetection.\n *\n * @param s\n * @param options\n * @param options.magnitudeMode\n * @param options.maxDistanceToJoin\n * @param options.factorNoise\n */\nfunction robustBaseLineRegionsDetection(s, options) {\n    const { maxDistanceToJoin, magnitudeMode, factorNoise } = options;\n    let mask = new Uint8Array(s.length);\n    for (let i = 0; i < s.length; i++) {\n        mask[i] = 0;\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] = 1;\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        }\n        else {\n            if (count < maxDistanceToJoin) {\n                for (let j = 0; j <= count; j++) {\n                    mask[prev + j] = 1;\n                }\n            }\n            while (mask[++i] && i < s.length)\n                ;\n            prev = i;\n            count = 0;\n        }\n    }\n    return mask;\n}\n/**\n * WeightedLinearRegression.\n *\n * @param x\n * @param y\n * @param w\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    /* 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    //Mx inverse\n    let detMx = sxtw * sw - swx * swx;\n    let inMx = [\n        [sw / detMx, -swx / detMx],\n        [-swx / detMx, sxtw / detMx],\n    ];\n    return [\n        inMx[0][0] * sxtwy + inMx[0][1] * swy,\n        inMx[1][0] * sxtwy + inMx[1][1] * swy,\n    ];\n}\nconst toRadians = (degree) => (degree * Math.PI) / 180;\nconst getNegArea = (data) => {\n    let area = 0;\n    for (let element of data) {\n        if (element < 0)\n            area -= element;\n    }\n    return area;\n};\n//# sourceMappingURL=reimAutoPhaseCorrection.js.map","'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","/**\n * This function performs a circular shift to an array\n * Positive values of shifts will shift to the right and negative values will do to the left\n *\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\n * @param shift - shift\n * @returns - rotated array\n */\nexport function xRotate(array, shift) {\n    shift = shift % array.length;\n    if (shift < 0)\n        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//# sourceMappingURL=xRotate.js.map","import FFT from 'fft.js';\nimport { xRotate } from '../x/xRotate';\n/**\n * ReimFFT.\n *\n * @param data - complex spectrum\n * @param options - options.\n * @returns FFT of complex spectrum.\n */\nexport function reimFFT(data, options = {}) {\n    const { inverse = false, applyZeroShift = false } = options;\n    let { re, im } = data;\n    const size = re.length;\n    const csize = size << 1;\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    let fft = new FFT(size);\n    let output = new Float64Array(csize);\n    if (inverse) {\n        if (applyZeroShift)\n            complexArray = zeroShift(complexArray, true);\n        fft.inverseTransform(output, complexArray);\n    }\n    else {\n        fft.transform(output, complexArray);\n        if (applyZeroShift)\n            output = zeroShift(output);\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    return { re: newRe, im: newIm };\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//# sourceMappingURL=reimFFT.js.map","/**\n * This function returns an array with absolute values\n *\n * @param array - array of data\n * @returns - array with absolute values\n */\nexport function xAbsolute(array) {\n    let tmpArray = array.slice();\n    for (let i = 0; i < tmpArray.length; i++) {\n        if (tmpArray[i] < 0)\n            tmpArray[i] *= -1;\n    }\n    return tmpArray;\n}\n//# sourceMappingURL=xAbsolute.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Calculates the median of an array\n *\n * @param input - Array containing values\n * @returns - median\n */\nexport function xMedian(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const array = input.slice();\n    let low = 0;\n    let high = array.length - 1;\n    let middle, ll, hh;\n    let median = calcMiddle(low, high);\n    while (true) {\n        if (high <= low) {\n            return array[median];\n        }\n        if (high === low + 1) {\n            if (array[low] > array[high]) {\n                swap(array, low, high);\n            }\n            return array[median];\n        }\n        // Find median of low, middle and high items; swap into position low\n        middle = calcMiddle(low, high);\n        if (array[middle] > array[high])\n            swap(array, middle, high);\n        if (array[low] > array[high])\n            swap(array, low, high);\n        if (array[middle] > array[low])\n            swap(array, middle, low);\n        // Swap low item (now in position middle) into position (low+1)\n        swap(array, middle, low + 1);\n        // Nibble from each end towards middle, swapping items when stuck\n        ll = low + 1;\n        hh = high;\n        while (true) {\n            do\n                ll++;\n            while (array[low] > array[ll]);\n            do\n                hh--;\n            while (array[hh] > array[low]);\n            if (hh < ll) {\n                break;\n            }\n            swap(array, ll, hh);\n        }\n        // Swap middle item (in position low) back into correct position\n        swap(array, low, hh);\n        // Re-set active partition\n        if (hh <= median) {\n            low = ll;\n        }\n        if (hh >= median) {\n            high = hh - 1;\n        }\n    }\n}\nfunction swap(array, i, j) {\n    const temp = array[j];\n    array[j] = array[i];\n    array[i] = temp;\n}\nfunction calcMiddle(i, j) {\n    return ~~((i + j) / 2);\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function\n * @param output - undefined or a new array\n * @param length - length of the output array\n * @returns\n */\nexport function getOutputArray(output, length) {\n    if (output !== undefined) {\n        if (!isAnyArray(output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        if (output.length !== length) {\n            throw new TypeError('the output array does not have the correct length');\n        }\n        return output;\n    }\n    else {\n        return new Float64Array(length);\n    }\n}\n//# sourceMappingURL=getOutputArray.js.map","import { isAnyArray } from 'is-any-array';\nimport { getOutputArray } from './utils/getOutputArray';\n/**\n * This function xMultiply the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - first array\n * @param array2 - second array\n * @param options - options\n */\nexport function xMultiply(array1, array2, options = {}) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xMultiply: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\n    }\n    let array3 = getOutputArray(options.output, array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] * constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] * array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xMultiply.js.map","import { xMultiply } from './xMultiply';\n/**\n * Dot product between two arrays\n *\n * @param A - First array.\n * @param B - Second array.\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//# sourceMappingURL=xDotProduct.js.map","import { xDotProduct } from './xDotProduct';\n/**\n * Calculates the cross-correlation between 2 arrays\n *\n * @param A - fixed array\n * @param B - sweeping array\n * @param options - Options\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//# sourceMappingURL=xCrossCorrelation.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Calculates the correlation between 2 vectors\n * https://en.wikipedia.org/wiki/Correlation_and_dependence\n *\n * @param A - first array\n * @param B - sencond 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 * sumAB - sumA * sumB) /\n        (Math.sqrt(n * sumA2 - sumA ** 2) * Math.sqrt(n * sumB2 - sumB ** 2)));\n}\n//# sourceMappingURL=xCorrelation.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Calculate an array of the same size that is the cumulative values\n *\n * @param array - initial array\n */\nexport function xCumulative(array) {\n    if (!isAnyArray(array)) {\n        throw new TypeError('input must be an array');\n    }\n    let newArray = new Float64Array(array.length);\n    if (array.length === 0)\n        return newArray;\n    newArray[0] = array[0];\n    for (let i = 1; i < array.length; i++) {\n        newArray[i] = newArray[i - 1] + array[i];\n    }\n    return newArray;\n}\n//# sourceMappingURL=xCumulative.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\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            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\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            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n *  Returns the targetIndex\n *\n * @param x - array of numbers\n * @param options - options\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        }\n        else {\n            return 0;\n        }\n    }\n    return targetIndex;\n}\n//# sourceMappingURL=xGetTargetIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\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//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\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//# sourceMappingURL=xMinValue.js.map","import { createFromToArray } from '../utils/createFromToArray';\nimport { xAbsolute } from './xAbsolute';\nimport { xCheck } from './xCheck';\nimport { xMaxValue } from './xMaxValue';\nimport { xMinValue } from './xMinValue';\n/**\n * Calculates a histogram of defined number of slots\n *\n * @param array - Array containing values\n * @param options - options\n * @returns - result of the histogram\n */\nexport function xHistogram(array, options = {}) {\n    xCheck(array);\n    let histogram = options.histogram;\n    const { centerX = true, nbSlots = histogram === undefined ? 256 : histogram.x.length, logBaseX, logBaseY, absolute = false, } = options;\n    if (absolute) {\n        array = xAbsolute(array);\n    }\n    if (logBaseX) {\n        array = array.slice();\n        const logOfBase = Math.log10(logBaseX);\n        for (let i = 0; i < array.length; i++) {\n            array[i] = Math.log10(array[i]) / logOfBase;\n        }\n    }\n    const { min = xMinValue(array), max = xMaxValue(array) } = options;\n    const slotSize = (max - min) / (nbSlots + Number.EPSILON);\n    const y = histogram === undefined ? new Float64Array(nbSlots) : histogram.y;\n    const x = histogram === undefined\n        ? Array.from(createFromToArray({\n            from: min + (centerX ? slotSize / 2 : 0),\n            to: max - (centerX ? slotSize / 2 : 0),\n            length: nbSlots,\n        }))\n        : histogram.x;\n    for (const element of array) {\n        const index = Math.max(Math.min(((element - min - Number.EPSILON) / slotSize) >> 0, nbSlots - 1), 0);\n        y[index]++;\n    }\n    if (logBaseY) {\n        const logOfBase = Math.log10(logBaseY);\n        for (let i = 0; i < y.length; i++) {\n            y[i] = Math.log10(y[i] + 1) / logOfBase;\n        }\n    }\n    return { x, y };\n}\n//# sourceMappingURL=xHistogram.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\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])\n                return false;\n        }\n        return true;\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])\n                return false;\n        }\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return false;\n        }\n    }\n    return true;\n}\n//# sourceMappingURL=xIsMonotone.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\n */\nexport function xIsMonotoneIncreasing(array) {\n    if (array.length < 2) {\n        return true;\n    }\n    for (let i = 0; i < array.length - 1; i++) {\n        if (array[i] >= array[i + 1])\n            return false;\n    }\n    return true;\n}\n//# sourceMappingURL=xIsMonotoneIncreasing.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the mean value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMean(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue / (toIndex - fromIndex + 1);\n}\n//# sourceMappingURL=xMean.js.map","/**\n * XCheckLengths.\n *\n * @param array1 - First array.\n * @param array2 - Second array.\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//# sourceMappingURL=xCheckLengths.js.map","import { xMedian } from './xMedian';\n/**\n * This function calculates the median absolute deviation (MAD)\n * https://en.wikipedia.org/wiki/Median_absolute_deviation\n * @param array\n */\nexport function xMedianAbsoluteDeviation(array) {\n    const median = xMedian(array);\n    const averageDeviations = new Float64Array(array.length);\n    for (let i = 0; i < array.length; i++) {\n        averageDeviations[i] = Math.abs(array[i] - median);\n    }\n    return {\n        median,\n        mad: xMedian(averageDeviations),\n    };\n}\n//# sourceMappingURL=xMedianAbsoluteDeviation.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { xMedianAbsoluteDeviation } from '..';\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param array\n * @returns noise level corresponding to one standard deviation\n */\nexport function xNoiseStandardDeviation(array) {\n    const { mad, median } = xMedianAbsoluteDeviation(array);\n    return { sd: mad / 0.6744897501960817, mad, median };\n}\n//# sourceMappingURL=xNoiseStandardDeviation.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Calculate the sum of the values\n *\n * @param array - Object that contains property x (an ordered increasing array) and y (an array).\n * @param options - Options.\n * @returns XSum value on the specified range.\n */\nexport function xSum(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xSum.js.map","import { getOutputArray } from './utils/getOutputArray';\nimport { xCheck } from './xCheck';\nimport { xMaxValue } from './xMaxValue';\nimport { xSum } from './xSum';\n/**\n * Divides the data with either the sum, the absolute sum or the maximum of the data\n * @param array - Array containing values\n * @param options - options\n * @returns - normalized data\n */\nexport function xNormed(input, options = {}) {\n    const { algorithm = 'absolute', value = 1 } = options;\n    xCheck(input);\n    const output = getOutputArray(options.output, input.length);\n    if (input.length === 0) {\n        throw new Error('input must not be empty');\n    }\n    switch (algorithm.toLowerCase()) {\n        case 'absolute': {\n            let absoluteSumValue = absoluteSum(input) / value;\n            if (absoluteSumValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / absoluteSumValue;\n            }\n            return output;\n        }\n        case 'max': {\n            let currentMaxValue = xMaxValue(input);\n            if (currentMaxValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            const factor = value / currentMaxValue;\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] * factor;\n            }\n            return output;\n        }\n        case 'sum': {\n            let sumFactor = xSum(input) / value;\n            if (sumFactor === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / sumFactor;\n            }\n            return output;\n        }\n        default:\n            throw new Error(`norm: unknown algorithm: ${algorithm}`);\n    }\n}\nfunction absoluteSum(input) {\n    let sumValue = 0;\n    for (let i = 0; i < input.length; i++) {\n        sumValue += Math.abs(input[i]);\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xNormed.js.map","import { xCheck } from './xCheck';\n/**\n * This function pads an array\n *s\n * @param array - the array that will be padded\n * @param options - options\n */\nexport function xPadding(array, options = {}) {\n    const { size = 0, value = 0, algorithm = '' } = options;\n    xCheck(array);\n    if (!algorithm) {\n        if (array instanceof Float64Array) {\n            return array.slice();\n        }\n        else {\n            return Float64Array.from(array);\n        }\n    }\n    let result = new Float64Array(array.length + size * 2);\n    for (let i = 0; i < array.length; i++) {\n        result[i + size] = array[i];\n    }\n    let fromEnd = size + array.length;\n    let toEnd = 2 * size + array.length;\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 new Error('xPadding: unknown algorithm');\n    }\n    return result;\n}\n//# sourceMappingURL=xPadding.js.map","import { isAnyArray } from 'is-any-array';\nimport { xMean } from './xMean';\n/** Finds the variance of the data\n *\n * @param values - the values of the array\n * @param options - options\n * @returns variance\n */\nexport function xVariance(values, options = {}) {\n    if (!isAnyArray(values)) {\n        throw new TypeError('input must be an array');\n    }\n    const { unbiased = true, mean = xMean(values) } = options;\n    let sqrError = 0;\n    for (let i = 0; i < values.length; i++) {\n        let x = values[i] - mean;\n        sqrError += x * x;\n    }\n    if (unbiased) {\n        return sqrError / (values.length - 1);\n    }\n    else {\n        return sqrError / values.length;\n    }\n}\n//# sourceMappingURL=xVariance.js.map","import { xVariance } from './xVariance';\n/** Finds the standard deviation for the data at hand\n *\n * @param values - values in the data\n * @param options - options\n * @returns standard deviation\n */\nexport function xStandardDeviation(values, options = {}) {\n    return Math.sqrt(xVariance(values, options));\n}\n//# sourceMappingURL=xStandardDeviation.js.map","import { xCheck } from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param fct - callback function that from an array returns a value\n * @param options - options\n */\nexport function xRolling(array, fct, options = {}) {\n    xCheck(array);\n    if (typeof fct !== 'function')\n        throw new Error('fct has to be a function');\n    const { window = 5, padding = {} } = options;\n    const { size = window - 1, algorithm, value } = padding;\n    array = xPadding(array, { size, algorithm, value }); // ensure we get a copy and it is float64\n    const newArray = [];\n    for (let i = 0; i < array.length - window + 1; i++) {\n        // we will send a view to the original buffer\n        newArray.push(fct(array.subarray(i, i + window)));\n    }\n    return newArray;\n}\n//# sourceMappingURL=xRolling.js.map","import { xMean } from './xMean';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param options - option\n */\nexport function xRollingAverage(array, options = {}) {\n    return xRolling(array, xMean, options);\n}\n//# sourceMappingURL=xRollingAverage.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Throw an error in no an object of x,y arrays\n *\n * @param data - array of points {x,y,z}\n */\nexport function xyCheck(data, options = {}) {\n    const { minLength } = options;\n    if (typeof data !== 'object' || !isAnyArray(data.x) || !isAnyArray(data.y)) {\n        throw new Error('Data 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 must have the same length');\n    }\n    if (minLength && data.x.length < minLength) {\n        throw new Error(`data.x must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xyCheck.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max y value in a range and return a {x,y} point\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options Options\n */\nexport function xyMaxYPoint(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1) {\n        return { x: x[0], y: y[0], index: 0 };\n    }\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\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)\n            current = { x: x[i], y: y[i], index: i };\n    }\n    return current;\n}\n//# sourceMappingURL=xyMaxYPoint.js.map","import { xCumulative } from '../x/xCumulative';\nimport { xMaxValue } from '../x/xMaxValue';\nimport { xyCheck } from './xyCheck';\nimport { xyMaxYPoint } from './xyMaxYPoint';\nconst STEPS = [0.25, 0.5, 0.75];\n/** Cumulative Distribution Statistics\n *\n * @param data - array of points {x,y}\n * @returns x0, x25, x50, x75, x100, mode (x for maxY)\n */\nexport function xyCumulativeDistributionStatistics(data) {\n    xyCheck(data);\n    const { x, y } = data;\n    if (x.length === 0) {\n        throw new Error('xyCumulativeDistributionStatistics: Array length must be greater than 0');\n    }\n    const cumulativeSum = xCumulative(y);\n    const maxY = xMaxValue(cumulativeSum);\n    for (let i = 0; i < cumulativeSum.length; i++) {\n        cumulativeSum[i] /= maxY;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const result = {};\n    // need to find the x values closest to STEPS/100\n    result.x0 = x[0];\n    result.x100 = x[x.length - 1];\n    let currentStep = 0;\n    breakPoint: for (let i = 1; i < cumulativeSum.length; i++) {\n        while (STEPS[currentStep] < cumulativeSum[i]) {\n            result[`x${STEPS[currentStep] * 100}`] =\n                x[i - 1] +\n                    (x[i] - x[i - 1]) *\n                        ((STEPS[currentStep] - cumulativeSum[i - 1]) /\n                            (cumulativeSum[i] - cumulativeSum[i - 1]));\n            currentStep++;\n            if (currentStep === STEPS.length)\n                break breakPoint;\n        }\n    }\n    result.xMode = xyMaxYPoint(data).x;\n    let sumXY = 0;\n    let sumY = 0;\n    for (let i = 0; i < x.length; i++) {\n        sumXY += x[i] * y[i];\n        sumY += y[i];\n    }\n    result.xMean = sumXY / sumY;\n    return result;\n}\n//# sourceMappingURL=xyCumulativeDistributionStatistics.js.map","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n * - deal with exclusions zones\n * - if no zones is specified add one between -Infinity and +Infinity\n * @param zones - array of zones\n * @param options - options\n * @returns array of zones\n */\nexport function zonesNormalize(zones = [], options = {}) {\n    let { from = Number.NEGATIVE_INFINITY, to = Number.POSITIVE_INFINITY, exclusions = [], } = options;\n    if (from > to)\n        [from, to] = [to, from];\n    zones = JSON.parse(JSON.stringify(zones)).map((zone) => zone.from > zone.to ? { from: zone.to, to: zone.from } : zone);\n    zones = zones.sort((a, b) => {\n        if (a.from !== b.from)\n            return a.from - b.from;\n        return a.to - b.to;\n    });\n    if (zones.length === 0) {\n        zones.push({ from, to });\n    }\n    for (const zone of zones) {\n        if (from > zone.from)\n            zone.from = from;\n        if (to < zone.to)\n            zone.to = to;\n    }\n    zones = zones.filter((zone) => zone.from <= zone.to);\n    if (zones.length === 0)\n        return [];\n    let currentZone = zones[0];\n    let beforeExclusionsZones = [currentZone];\n    for (let i = 1; i < zones.length; i++) {\n        let zone = zones[i];\n        if (zone.from <= currentZone.to) {\n            if (currentZone.to < zone.to) {\n                currentZone.to = zone.to;\n            }\n        }\n        else {\n            currentZone = zone;\n            beforeExclusionsZones.push(currentZone);\n        }\n    }\n    if (exclusions.length === 0)\n        return beforeExclusionsZones;\n    const normalizedExclusions = zonesNormalize(exclusions);\n    let currentExclusionIndex = 0;\n    const results = [];\n    let counter = 0;\n    for (let zoneIndex = 0; zoneIndex < beforeExclusionsZones.length; zoneIndex++) {\n        if (counter++ > 5)\n            break;\n        const zone = beforeExclusionsZones[zoneIndex];\n        if (currentExclusionIndex === normalizedExclusions.length) {\n            // we analysed all the exclusion zones\n            results.push(zone);\n            continue;\n        }\n        while (currentExclusionIndex < normalizedExclusions.length &&\n            normalizedExclusions[currentExclusionIndex].to <= zone.from) {\n            currentExclusionIndex++;\n        }\n        if (currentExclusionIndex === normalizedExclusions.length) {\n            // we analysed all the exclusion zones\n            results.push(zone);\n            continue;\n        }\n        if (zone.to < normalizedExclusions[currentExclusionIndex].from) {\n            // no problems, not yet in exclusion\n            results.push(zone);\n            continue;\n        }\n        if (normalizedExclusions[currentExclusionIndex].to >= zone.to) {\n            // could be totally excluded\n            if (normalizedExclusions[currentExclusionIndex].from <= zone.from) {\n                continue;\n            }\n            results.push({\n                from: normalizedExclusions[currentExclusionIndex].to,\n                to: zone.to,\n            });\n        }\n        // we cut in the middle, we need to create more zones, annoying !\n        if (normalizedExclusions[currentExclusionIndex].from > zone.from) {\n            results.push({\n                from: zone.from,\n                to: normalizedExclusions[currentExclusionIndex].from,\n            });\n        }\n        zone.from = normalizedExclusions[currentExclusionIndex].to;\n        zoneIndex--;\n    }\n    return results;\n}\n//# sourceMappingURL=zonesNormalize.js.map","import { zonesNormalize } from './zonesNormalize';\n/**\n * Add the number of points per zone to reach a specified total\n *\n * @param zones - array of zones\n * @param numberOfPoints - total number of points to distribute between zones\n * @param options - options\n * @returns array of zones with points\n */\nexport function zonesWithPoints(zones = [], \n/**\n * total number of points to distribute between zones\n * @default 10\n */\nnumberOfPoints = 10, options = {}) {\n    if (zones.length === 0)\n        return zones;\n    let returnZones = zonesNormalize(zones, options);\n    const totalSize = returnZones.reduce((previous, current) => {\n        return previous + (current.to - current.from);\n    }, 0);\n    let unitsPerPoint = totalSize / numberOfPoints;\n    let currentTotal = 0;\n    for (let i = 0; i < returnZones.length - 1; i++) {\n        let zone = returnZones[i];\n        zone.numberOfPoints = Math.min(Math.round((zone.to - zone.from) / unitsPerPoint), numberOfPoints - currentTotal);\n        currentTotal += zone.numberOfPoints;\n    }\n    let zone = returnZones[returnZones.length - 1];\n    zone.numberOfPoints = numberOfPoints - currentTotal;\n    return returnZones;\n}\n//# sourceMappingURL=zonesWithPoints.js.map","/**\n * Function that calculates the integral of the line between two\n * x-coordinates, given the slope and intercept of the line.\n * @param x0\n * @param x1\n * @param slope\n * @param intercept\n * @return integral value.\n */\nexport default function integral(\n/** first coordinate of point */\nx0, \n/** second coordinate of point */\nx1, \n/** slope of the line */\nslope, \n/** intercept of the line on the y axis */\nintercept) {\n    return (0.5 * slope * x1 * x1 +\n        intercept * x1 -\n        (0.5 * slope * x0 * x0 + intercept * x0));\n}\n//# sourceMappingURL=integral.js.map","import { createFromToArray } from '../utils/createFromToArray';\nimport { zonesNormalize } from '../zones/zonesNormalize';\nimport { zonesWithPoints } from '../zones/zonesWithPoints';\nimport equallySpacedSlot from './utils/equallySpacedSlot';\nimport equallySpacedSmooth from './utils/equallySpacedSmooth';\nimport { xyCheck } from './xyCheck';\n/**\n * Function that returns a Number array of equally spaced numberOfPoints\n * containing a representation of intensities of the spectra arguments x\n * and y.\n *\n * The options parameter contains an object in the following form:\n * from: starting point\n * to: last point\n * numberOfPoints: number of points between from and to\n * variant: \"slot\" or \"smooth\" - smooth is the default option\n *\n * The slot variant consist that each point in an array is calculated\n * averaging the existing points between the slot that belongs to the current\n * value. The smooth variant is the same but takes the integral of the range\n * of the slot and divide by the step size between two points in an array.\n *\n * If exclusions zone are present, zones are ignored !\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return new object with x / y array with the equally spaced data.\n */\nexport function xyEquallySpaced(data, options = {}) {\n    let { x, y } = data;\n    let xLength = x.length;\n    const { from = x[0], to = x[xLength - 1], variant = 'smooth', numberOfPoints = 100, exclusions = [], zones = [{ from, to }], } = options;\n    if (from > to) {\n        throw new RangeError('from should be larger than to');\n    }\n    xyCheck(data);\n    if (numberOfPoints < 2) {\n        throw new RangeError(\"'numberOfPoints' option must be greater than 1\");\n    }\n    const normalizedZones = zonesNormalize(zones, { from, to, exclusions });\n    const zonesWithPointsRes = zonesWithPoints(normalizedZones, numberOfPoints, {\n        from,\n        to,\n    });\n    let xResult = [];\n    let yResult = [];\n    for (let zone of zonesWithPointsRes) {\n        if (!zone.numberOfPoints) {\n            zone.numberOfPoints = 0;\n        }\n        let zoneResult = processZone(Array.from(x), Array.from(y), zone.from, zone.to, zone.numberOfPoints, variant);\n        xResult = xResult.concat(zoneResult.x);\n        yResult = yResult.concat(zoneResult.y);\n    }\n    return { x: xResult, y: yResult };\n}\nfunction processZone(x, y, from, to, numberOfPoints, variant) {\n    if (numberOfPoints < 1) {\n        throw new RangeError('the number of points must be at least 1');\n    }\n    let output = variant === 'slot'\n        ? Array.from(equallySpacedSlot(x, y, from, to, numberOfPoints))\n        : Array.from(equallySpacedSmooth(x, y, from, to, numberOfPoints));\n    return {\n        x: Array.from(createFromToArray({\n            from,\n            to,\n            length: numberOfPoints,\n        })),\n        y: output,\n    };\n}\n//# sourceMappingURL=xyEquallySpaced.js.map","/**\n * function that retrieves the getEquallySpacedData with the variant \"slot\"\n *\n * @param x\n * @param y\n * @param from\n * @param to\n * @param numberOfPoints\n * @return Array of y's equally spaced with the variant \"slot\"\n */\nexport default function equallySpacedSlot(\n/** x coordinates */\nx, \n/** y coordinates */\ny, \n/** from value */\nfrom, \n/** to value */\nto, \n/** number of points */\nnumberOfPoints) {\n    let xLength = x.length;\n    let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n    let halfStep = step / 2;\n    let lastStep = x[x.length - 1] - x[x.length - 2];\n    let start = from - halfStep;\n    // Changed Array to Float64Array\n    let output = new Float64Array(numberOfPoints);\n    // Init main variables\n    let min = start;\n    let max = start + step;\n    let previousX = -Number.MAX_VALUE;\n    let previousY = 0;\n    let nextX = x[0];\n    let nextY = y[0];\n    let frontOutsideSpectra = 0;\n    let backOutsideSpectra = true;\n    let currentValue = 0;\n    // for slot algorithm\n    let currentPoints = 0;\n    let i = 1; // index of input\n    let j = 0; // index of output\n    main: while (true) {\n        if (previousX >= nextX)\n            throw new Error('x must be a growing series');\n        while (previousX - max > 0) {\n            // no overlap with original point, just consume current value\n            if (backOutsideSpectra) {\n                currentPoints++;\n                backOutsideSpectra = false;\n            }\n            output[j] = currentPoints <= 0 ? 0 : currentValue / currentPoints;\n            j++;\n            if (j === numberOfPoints) {\n                break main;\n            }\n            min = max;\n            max += step;\n            currentValue = 0;\n            currentPoints = 0;\n        }\n        if (previousX > min) {\n            currentValue += previousY;\n            currentPoints++;\n        }\n        if (previousX === -Number.MAX_VALUE || frontOutsideSpectra > 1) {\n            currentPoints--;\n        }\n        previousX = nextX;\n        previousY = nextY;\n        if (i < xLength) {\n            nextX = x[i];\n            nextY = y[i];\n            i++;\n        }\n        else {\n            nextX += lastStep;\n            nextY = 0;\n            frontOutsideSpectra++;\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=equallySpacedSlot.js.map","import integral from './integral';\n/**\n * function that retrieves the getEquallySpacedData with the variant \"smooth\"\n *\n * @param x\n * @param y\n * @param from\n * @param to\n * @param numberOfPoints\n * @return - Array of y's equally spaced with the variant \"smooth\"\n */\nexport default function equallySpacedSmooth(\n/** x coordinates */\nx, \n/** y coordinates */\ny, \n/** from value */\nfrom, \n/** to value */\nto, \n/** number of points */\nnumberOfPoints) {\n    let xLength = x.length;\n    let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n    let halfStep = step / 2;\n    // Changed Array to Float64Array\n    let output = new Float64Array(numberOfPoints);\n    let initialOriginalStep = x[1] - x[0];\n    let lastOriginalStep = x[xLength - 1] - x[xLength - 2];\n    // Init main variables\n    let min = from - halfStep;\n    let max = from + halfStep;\n    let previousX = Number.MIN_SAFE_INTEGER;\n    let previousY = 0;\n    let nextX = x[0] - initialOriginalStep;\n    let nextY = 0;\n    let currentValue = 0;\n    let slope = 0;\n    let intercept = 0;\n    let sumAtMin = 0;\n    let sumAtMax = 0;\n    let i = 0; // index of input\n    let j = 0; // index of output\n    let add = 0;\n    main: while (true) {\n        if (previousX >= nextX)\n            throw new Error('x must be a growing series');\n        if (previousX <= min && min <= nextX) {\n            add = integral(0, min - previousX, slope, previousY);\n            sumAtMin = currentValue + add;\n        }\n        while (nextX - max >= 0) {\n            // no overlap with original point, just consume current value\n            add = integral(0, max - previousX, slope, previousY);\n            sumAtMax = currentValue + add;\n            output[j++] = (sumAtMax - sumAtMin) / step;\n            if (j === numberOfPoints) {\n                break main;\n            }\n            min = max;\n            max += step;\n            sumAtMin = sumAtMax;\n        }\n        currentValue += integral(previousX, nextX, slope, intercept);\n        previousX = nextX;\n        previousY = nextY;\n        if (i < xLength) {\n            nextX = x[i];\n            nextY = y[i];\n            i++;\n        }\n        else if (i === xLength) {\n            nextX += lastOriginalStep;\n            nextY = 0;\n        }\n        slope = getSlope(previousX, previousY, nextX, nextY);\n        intercept = -slope * previousX + previousY;\n    }\n    return output;\n}\nfunction getSlope(x0, y0, x1, y1) {\n    return (y1 - y0) / (x1 - x0);\n}\n//# sourceMappingURL=equallySpacedSmooth.js.map","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 *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - An object with the xyIntegration function\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    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        if (difference <= currentDelta) {\n            // we join\n            if (y[position] !== 0 || y[i] !== 0) {\n                x[position] =\n                    (x[position] * y[position] + x[i] * y[i]) / (y[position] + y[i]);\n                y[position] += y[i];\n            }\n        }\n        else {\n            position++;\n            x[position] = x[i];\n            y[position] = y[i];\n        }\n    }\n    x.length = position + 1;\n    y.length = position + 1;\n    return { x, y };\n}\n//# sourceMappingURL=xyJoinX.js.map","import { xIsMonotone } from '../x/xIsMonotone';\n/**\n * This function performs a quick sort of the x array while transforming the y array to preserve the coordinates.\n *\n * @param data - Object that contains property x (Array) and y (Array)\n */\nexport function xySortX(data) {\n    const { x, y } = data;\n    if (xIsMonotone(x) && x.length > 1) {\n        if (x[0] < x[1]) {\n            return {\n                x: Float64Array.from(x),\n                y: Float64Array.from(y),\n            };\n        }\n        else {\n            return {\n                x: Float64Array.from(x).reverse(),\n                y: Float64Array.from(y).reverse(),\n            };\n        }\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    let response = {\n        x: new Float64Array(x.length),\n        y: new Float64Array(y.length),\n    };\n    for (let i = 0; i < x.length; i++) {\n        response.x[i] = xyObject[i].x;\n        response.y[i] = xyObject[i].y;\n    }\n    return response;\n}\n//# sourceMappingURL=xySortX.js.map","import { xyCheck } from './xyCheck';\nimport { xySortX } from './xySortX';\n/**\n * Ensure x values are unique\n *\n * @param data - Object that contains property x (Array) and y (Array)\n * @param 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 */\nexport function xyUniqueX(data, options = {}) {\n    xyCheck(data);\n    const { algorithm = 'average', isSorted = true } = options;\n    if (!isSorted) {\n        data = xySortX(data);\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/**\n * Average.\n *\n * @param data - Input.\n * @returns Result.\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/**\n * Sum.\n *\n * @param data - Input.\n * @returns Result.\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//# sourceMappingURL=xyUniqueX.js.map","/**\n * GetSlots.\n *\n * @param data - data.\n * @param options - Options.\n */\nexport function getSlots(data, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let possibleXs = Float64Array.from([].concat(...data.map((spectrum) => spectrum.x))).sort();\n    if (possibleXs.length === 0) {\n        throw new Error('xyArrayMerge can not process empty arrays');\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        }\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    return slots;\n}\n//# sourceMappingURL=getSlots.js.map","/**\n * Merge DataXY\n * We have an array of DataXY and the goal is to merge all the values for which the deltaX is small or equal to delta.\n * X values are weighted average\n *\n * @param data - data\n * @param options - Options\n */\nexport function xyArrayWeightedMerge(data, options = {}) {\n    let { delta = 1 } = options;\n    if (typeof delta === 'number') {\n        let deltaNumber = delta;\n        delta = () => deltaNumber;\n    }\n    data = data.filter((spectrum) => spectrum.x.length > 0);\n    if (data.length === 0)\n        return { x: [], y: [] };\n    let x = [];\n    let y = [];\n    const positions = new Array(data.length).fill(0);\n    const point = { x: 0, y: 0 };\n    nextValue(data, positions, point);\n    let slot = {\n        maxX: point.x + delta(point.x),\n        sumY: point.y,\n        sumXY: point.y * point.x,\n    };\n    while (data.length > 0) {\n        nextValue(data, positions, point);\n        let sameSlot = point.x <= slot.maxX;\n        if (!sameSlot) {\n            if (slot.sumY > 0) {\n                x.push(slot.sumXY / slot.sumY);\n                y.push(slot.sumY);\n            }\n            slot.sumY = 0;\n            slot.sumXY = 0;\n        }\n        slot.sumY += point.y;\n        slot.sumXY += point.x * point.y;\n        slot.maxX = point.x + delta(point.x);\n        if (data.length === 0 && slot.sumY > 0) {\n            x.push(slot.sumXY / slot.sumY);\n            y.push(slot.sumY);\n        }\n    }\n    return { x, y };\n}\n/**\n * NextValue.\n *\n * @param data - data.\n * @param positions - Positions array.\n * @param point - Point.\n */\nfunction nextValue(data, positions, point) {\n    let minIndex = 0;\n    let minX = data[0].x[positions[0]];\n    for (let i = 1; i < data.length; i++) {\n        let currentX = data[i].x[positions[i]];\n        if (currentX < minX) {\n            minX = currentX;\n            minIndex = i;\n        }\n    }\n    point.x = minX;\n    point.y = data[minIndex].y[positions[minIndex]];\n    positions[minIndex]++;\n    if (positions[minIndex] === data[minIndex].x.length) {\n        positions.splice(minIndex, 1);\n        data.splice(minIndex, 1);\n    }\n}\n//# sourceMappingURL=xyArrayWeightedMerge.js.map","import { xyArrayWeightedMerge } from '../xyArrayWeightedMerge';\n/**\n * GetSlotsToFirst.\n *\n * @param data - data.\n * @param options - Options.\n */\nexport function getSlotsToFirst(data, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let firstXs = data[0].x;\n    let slots = [];\n    // we first create the slots based on the first spectrum\n    for (const element of firstXs) {\n        let currentDelta = deltaIsFunction ? delta(element) : delta;\n        slots.push({\n            from: element - currentDelta,\n            to: element + currentDelta,\n            value: element,\n        });\n    }\n    let otherXs = xyArrayWeightedMerge(data.slice(1), options).x;\n    let currentPosition = 0;\n    for (let slot of slots) {\n        while (otherXs[currentPosition] < slot.to &&\n            currentPosition < otherXs.length) {\n            if (otherXs[currentPosition] < slot.from) {\n                let currentDelta = deltaIsFunction\n                    ? delta(otherXs[currentPosition])\n                    : delta;\n                slots.push({\n                    from: otherXs[currentPosition] - currentDelta,\n                    to: otherXs[currentPosition] + currentDelta,\n                    value: otherXs[currentPosition],\n                });\n            }\n            currentPosition++;\n        }\n    }\n    for (let i = currentPosition; i < otherXs.length; i++) {\n        let currentDelta = deltaIsFunction ? delta(otherXs[i]) : delta;\n        slots.push({\n            from: otherXs[i] - currentDelta,\n            to: otherXs[i] + currentDelta,\n            value: otherXs[i],\n        });\n    }\n    slots.sort((a, b) => a.value - b.value);\n    // we prevent slots overlap in the first spectrum\n    for (let i = 0; i < slots.length - 1; i++) {\n        if (slots[i].to > slots[i + 1].from) {\n            let middle = (slots[i].value + slots[i + 1].value) / 2;\n            slots[i].to = middle;\n            slots[i + 1].from = middle;\n        }\n    }\n    return slots;\n}\n//# sourceMappingURL=getSlotsToFirst.js.map","/**\n * Throw an error in no an object of x,y arrays\n *\n * @param points - list of 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 (points.length > 0 &&\n        (points[0].x === undefined || points[0].y === undefined)) {\n        throw new Error('ArrayPoints must be an array of {x,y} object');\n    }\n}\n//# sourceMappingURL=xyObjectCheck.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the max x value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMaxXPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\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    return current;\n}\n//# sourceMappingURL=xyObjectMaxXPoint.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the min x value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMinXPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\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    return current;\n}\n//# sourceMappingURL=xyObjectMinXPoint.js.map","/**\n * Clone the matrix\n */\nexport function matrixClone(matrix) {\n    return matrix.map((row) => row.slice(0));\n}\n//# sourceMappingURL=matrixClone.js.map","/**\n * Create a new matrix based on the size of the current one\n */\nexport function matrixCreateEmpty(options) {\n    const { matrix, nbRows = matrix?.length || 1, nbColumns = matrix?.[0].length || 1, ArrayConstructor = Float64Array, } = options;\n    const newMatrix = new Array(nbRows);\n    for (let row = 0; row < nbRows; row++) {\n        newMatrix[row] = new ArrayConstructor(nbColumns);\n    }\n    return newMatrix;\n}\n//# sourceMappingURL=matrixCreateEmpty.js.map","/**\n * Get min and max of the absolute values of Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMinMaxAbsoluteZ(matrix) {\n    if (matrix.length === 0 || matrix[0].length === 0) {\n        throw new Error('matrixMinMaxAbsoluteZ requires at least 1 row and 1 column');\n    }\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    let min = Number.POSITIVE_INFINITY;\n    let max = Number.NEGATIVE_INFINITY;\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            let value = matrix[row][column];\n            if (value < 0)\n                value *= -1;\n            if (value < min)\n                min = value;\n            if (value > max)\n                max = value;\n        }\n    }\n    return { min, max };\n}\n//# sourceMappingURL=matrixMinMaxAbsoluteZ.js.map","export function matrixCheck(data) {\n    if (data.length === 0 || data[0].length === 0) {\n        throw new RangeError('matrix should contain data');\n    }\n    const firstLength = data[0].length;\n    for (let i = 1; i < data.length; i++) {\n        if (data[i].length !== firstLength) {\n            throw new RangeError('All rows should has the same length');\n        }\n    }\n}\n//# sourceMappingURL=matrixCheck.js.map","import { matrixCheck } from './matrixCheck';\n/**\n * Get min and max Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMinMaxZ(matrix) {\n    matrixCheck(matrix);\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    let min = matrix[0][0];\n    let max = matrix[0][0];\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            if (matrix[row][column] < min)\n                min = matrix[row][column];\n            if (matrix[row][column] > max)\n                max = matrix[row][column];\n        }\n    }\n    return { min, max };\n}\n//# sourceMappingURL=matrixMinMaxZ.js.map","/**\n * Returns the max absolute values of Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMaxAbsoluteZ(matrix) {\n    if (matrix.length === 0 || matrix[0].length === 0) {\n        throw new Error('matrixMaxAbsoluteZ requires at least 1 row and 1 column');\n    }\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    let max = Number.NEGATIVE_INFINITY;\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            let value = matrix[row][column];\n            if (value < 0)\n                value *= -1;\n            if (value > max)\n                max = value;\n        }\n    }\n    return max;\n}\n//# sourceMappingURL=matrixMaxAbsoluteZ.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(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 { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(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 { min as default };\n","import { isAnyArray } 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 (!isAnyArray(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 (!isAnyArray(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 { rescale as default };\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 {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\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, padMinus));\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, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\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 checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\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 { isAnyArray } from 'is-any-array';\nimport 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  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\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(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\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(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\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\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  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\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    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[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 (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(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 (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(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 (!isAnyArray(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 (!isAnyArray(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[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\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 (isAnyArray(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        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\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","import { matrixCheck } from './matrixCheck';\nexport function matrixToArray(matrix) {\n    matrixCheck(matrix);\n    const nbColumns = matrix[0].length;\n    const flatten = new Float64Array(matrix.length * nbColumns);\n    for (let row = 0; row < matrix.length; row++) {\n        const currentRow = row * nbColumns;\n        for (let column = 0; column < nbColumns; column++) {\n            flatten[currentRow + column] = matrix[row][column];\n        }\n    }\n    return flatten;\n}\n//# sourceMappingURL=matrixToArray.js.map","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","const LOOP = 8;\nconst FLOAT_MUL = 1 / 16777216;\nconst sh1 = 15;\nconst sh2 = 18;\nconst sh3 = 11;\nfunction multiply_uint32(n, m) {\n    n >>>= 0;\n    m >>>= 0;\n    const nlo = n & 0xffff;\n    const nhi = n - nlo;\n    return (((nhi * m) >>> 0) + nlo * m) >>> 0;\n}\nexport default class XSadd {\n    constructor(seed = Date.now()) {\n        this.state = new Uint32Array(4);\n        this.init(seed);\n        this.random = this.getFloat.bind(this);\n    }\n    /**\n     * Returns a 32-bit integer r (0 <= r < 2^32)\n     */\n    getUint32() {\n        this.nextState();\n        return (this.state[3] + this.state[2]) >>> 0;\n    }\n    /**\n     * Returns a floating point number r (0.0 <= r < 1.0)\n     */\n    getFloat() {\n        return (this.getUint32() >>> 8) * FLOAT_MUL;\n    }\n    init(seed) {\n        if (!Number.isInteger(seed)) {\n            throw new TypeError('seed must be an integer');\n        }\n        this.state[0] = seed;\n        this.state[1] = 0;\n        this.state[2] = 0;\n        this.state[3] = 0;\n        for (let i = 1; i < LOOP; i++) {\n            this.state[i & 3] ^=\n                (i +\n                    multiply_uint32(1812433253, this.state[(i - 1) & 3] ^ ((this.state[(i - 1) & 3] >>> 30) >>> 0))) >>>\n                    0;\n        }\n        this.periodCertification();\n        for (let i = 0; i < LOOP; i++) {\n            this.nextState();\n        }\n    }\n    periodCertification() {\n        if (this.state[0] === 0 &&\n            this.state[1] === 0 &&\n            this.state[2] === 0 &&\n            this.state[3] === 0) {\n            this.state[0] = 88; // X\n            this.state[1] = 83; // S\n            this.state[2] = 65; // A\n            this.state[3] = 68; // D\n        }\n    }\n    nextState() {\n        let t = this.state[0];\n        t ^= t << sh1;\n        t ^= t >>> sh2;\n        t ^= this.state[3] << sh3;\n        this.state[0] = this.state[1];\n        this.state[1] = this.state[2];\n        this.state[2] = this.state[3];\n        this.state[3] = t;\n    }\n}\n","import XSAdd from 'ml-xsadd';\n/**\n * Create a random array of numbers of a specific length\n *\n * @return - array of random floats normally distributed\n */\nlet spare;\nlet hasSpare = false;\nexport function createRandomArray(options = {}) {\n    const { mean = 0, standardDeviation = 1, length = 1000, range = 1, seed, distribution = 'normal', } = options;\n    const generator = new XSAdd(seed);\n    let returnArray = new Float64Array(length);\n    switch (distribution) {\n        case 'normal':\n            for (let i = 0; i < length; i++) {\n                returnArray[i] = generateGaussian(mean, standardDeviation, generator);\n            }\n            break;\n        case 'uniform':\n            for (let i = 0; i < length; i++) {\n                returnArray[i] = (generator.random() - 0.5) * range + mean;\n            }\n            break;\n        default:\n            // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n            throw new Error(`unknown distribution: ${distribution}`);\n    }\n    return returnArray;\n}\nfunction generateGaussian(mean, standardDeviation, generator) {\n    let val, u, v, s;\n    if (hasSpare) {\n        hasSpare = false;\n        val = spare * standardDeviation + mean;\n    }\n    else {\n        do {\n            u = generator.random() * 2 - 1;\n            v = generator.random() * 2 - 1;\n            s = u * u + v * v;\n        } while (s >= 1 || s === 0);\n        s = Math.sqrt((-2 * Math.log(s)) / s);\n        spare = v * s;\n        hasSpare = true;\n        val = mean + standardDeviation * u * s;\n    }\n    return val;\n}\n//# sourceMappingURL=createRandomArray.js.map","/**\n * Create an array with numbers starting from \"from\" with step \"step\" of length \"length\"\n *\n * @param options - options\n * @return - array of distributed numbers with step \"step\" from \"from\"\n */\nexport function createStepArray(options = {}) {\n    let { from = 0, step = 1, length = 1000 } = options;\n    const array = new Float64Array(length);\n    let index = 0;\n    while (index < length) {\n        array[index] = from + step * index;\n        index++;\n    }\n    return array;\n}\n//# sourceMappingURL=createStepArray.js.map","import { xMedian } from '..';\n/**\n * returns the median of the absolute matrix\n */\nexport function matrixAbsoluteMedian(matrix) {\n    const nbColumns = matrix[0].length;\n    const flatten = new Float64Array(matrix.length * nbColumns);\n    for (let row = 0; row < matrix.length; row++) {\n        const currentRow = row * nbColumns;\n        for (let column = 0; column < nbColumns; column++) {\n            const value = matrix[row][column];\n            flatten[currentRow + column] = value < 0 ? -value : value;\n        }\n    }\n    return xMedian(flatten);\n}\n//# sourceMappingURL=matrixAbsoluteMedian.js.map","import { xMaxValue } from '../x/xMaxValue';\nimport { matrixClone } from './matrixClone';\n/**\n * Numerically encodes the strings in the matrix with an encoding dictionary\n * @param matrixInitial - original matrix before encoding\n * @param dictionnary - dictionary against which to do the encoding\n * @returns - encoded matrix\n */\nexport function matrixApplyNumericalEncoding(matrixInitial, dictionnary) {\n    const matrix = matrixClone(matrixInitial);\n    let arrayOfValues = [];\n    for (let key in dictionnary) {\n        arrayOfValues.push(dictionnary[key]);\n    }\n    let k = xMaxValue(arrayOfValues);\n    for (let i = 0; i < matrix.length; i++) {\n        for (let j = 0; j < matrix[0].length; j++) {\n            if (typeof matrix[i][j] === 'string') {\n                if (matrix[i][j] in dictionnary) {\n                    matrix[i][j] = dictionnary[matrix[i][j]];\n                }\n                else {\n                    k++;\n                    dictionnary[matrix[i][j]] = k;\n                    matrix[i][j] = k;\n                }\n            }\n        }\n    }\n    return matrix;\n}\n//# sourceMappingURL=matrixApplyNumericalEncoding.js.map","import { xCorrelation } from '..';\n/**\n * returns the median of the matrix\n */\nexport function matrixAutoCorrelation(matrix, index = 0) {\n    let nbRows = matrix.length;\n    let nbColumns = matrix[0].length;\n    if (nbRows < 2) {\n        throw new Error('matrixAutoCorrelation: can not calculate info if matrix contains less than 2 rows');\n    }\n    let targetArray = new Float64Array(nbRows);\n    let sourceArray = new Float64Array(nbRows);\n    let result = new Float64Array(nbColumns);\n    for (let j = 0; j < nbRows; j++) {\n        targetArray[j] = matrix[j][index];\n    }\n    for (let i = 0; i < nbColumns; i++) {\n        for (let j = 0; j < nbRows; j++) {\n            sourceArray[j] = matrix[j][i];\n        }\n        result[i] = xCorrelation(targetArray, sourceArray);\n    }\n    return result;\n}\n//# sourceMappingURL=matrixAutoCorrelation.js.map","/**\n * returns the median of the matrix\n */\nexport function matrixBoxPlot(matrix) {\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    if (nbRows < 5) {\n        throw new Error('matrixBoxPlot: can not calculate info if matrix contains less than 5 rows');\n    }\n    let info = {\n        q1: new Float64Array(nbColumns),\n        median: new Float64Array(nbColumns),\n        q3: new Float64Array(nbColumns),\n        min: Float64Array.from(matrix[0]),\n        max: Float64Array.from(matrix[matrix.length - 1]),\n    };\n    const columnArray = new Float64Array(matrix.length);\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            columnArray[row] = matrix[row][column];\n        }\n        let q1max = 0;\n        let q3min = 0;\n        if (nbRows % 2 === 1) {\n            // odd\n            let middle = (nbRows - 1) / 2;\n            info.median[column] = columnArray[middle];\n            q1max = middle - 1;\n            q3min = middle + 1;\n        }\n        else {\n            // even\n            q3min = nbRows / 2;\n            q1max = q3min - 1;\n            info.median[column] = (columnArray[q1max] + columnArray[q3min]) / 2;\n        }\n        if (q1max % 2 === 0) {\n            info.q1[column] = columnArray[q1max / 2];\n            info.q3[column] = columnArray[(nbRows + q3min - 1) / 2];\n        }\n        else {\n            info.q1[column] =\n                (columnArray[(q1max + 1) / 2] + columnArray[(q1max - 1) / 2]) / 2;\n            let middleOver = (columnArray.length + q3min) / 2;\n            info.q3[column] =\n                (columnArray[middleOver] + columnArray[middleOver - 1]) / 2;\n        }\n    }\n    return info;\n}\n//# sourceMappingURL=matrixBoxPlot.js.map","import { matrixCreateEmpty } from './matrixCreateEmpty';\n/**\n * Center mean of columns\n *\n * @param matrix - matrix [rows][cols]\n */\nexport function matrixCenterZMean(matrix) {\n    const nbColumns = matrix[0].length;\n    const nbRows = matrix.length;\n    const newMatrix = matrixCreateEmpty({ nbColumns, nbRows });\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//# sourceMappingURL=matrixCenterZMean.js.map","import { xHistogram } from '../x/xHistogram';\nimport { matrixMinMaxAbsoluteZ } from './matrixMinMaxAbsoluteZ';\nimport { matrixMinMaxZ } from './matrixMinMaxZ';\n/**\n * Calculates an histogram of defined number of slots\n *\n * @param matrix - matrix [rows][cols].\n * @param options - options\n * @returns - result of the histogram\n */\nexport function matrixHistogram(matrix, options = {}) {\n    const { logBaseY, logBaseX, absolute, min, max } = options;\n    options = JSON.parse(JSON.stringify(options));\n    delete options.logBaseY;\n    if (matrix.length === 0 || matrix[0].length === 0) {\n        throw new Error('matrixHistogram: matrix should have at least one column and one row');\n    }\n    if (min === undefined || max === undefined) {\n        const minMax = absolute\n            ? matrixMinMaxAbsoluteZ(matrix)\n            : matrixMinMaxZ(matrix);\n        if (min === undefined) {\n            options.min =\n                logBaseX && minMax.min\n                    ? Math.log(minMax.min) / Math.log(logBaseX)\n                    : minMax.min;\n        }\n        if (max === undefined) {\n            options.max =\n                logBaseX && minMax.max\n                    ? Math.log(minMax.max) / Math.log(logBaseX)\n                    : minMax.max;\n        }\n    }\n    let histogram = xHistogram(matrix[0], options);\n    options.histogram = histogram;\n    const nbRows = matrix.length;\n    for (let row = 1; row < nbRows; row++) {\n        xHistogram(matrix[row], options);\n    }\n    const y = histogram.y;\n    if (logBaseY) {\n        const logOfBase = Math.log10(logBaseY);\n        for (let i = 0; i < y.length; i++) {\n            y[i] = Math.log10(y[i] + 1) / logOfBase;\n        }\n    }\n    return histogram;\n}\n//# sourceMappingURL=matrixHistogram.js.map","import { xMedian } from '..';\nimport { matrixToArray } from './matrixToArray';\n/**\n * returns the median of the matrix\n */\nexport function matrixMedian(matrix) {\n    return xMedian(matrixToArray(matrix));\n}\n//# sourceMappingURL=matrixMedian.js.map","import { xNoiseStandardDeviation } from '../x/xNoiseStandardDeviation';\nimport { matrixToArray } from './matrixToArray';\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param matrix\n * @returns noise level corresponding to one standard deviation\n */\nexport function matrixNoiseStandardDeviation(matrix) {\n    return xNoiseStandardDeviation(matrixToArray(matrix));\n}\n//# sourceMappingURL=matrixNoiseStandardDeviation.js.map","import { matrixClone } from './matrixClone';\n/**\n * Numerically decodes the matrix using the dictionnary\n * @param matrixInitial - original matrix before encoding\n * @param dictionnary - dictionary against which to do the encoding\n * @returns - decoded matrix\n */\nfunction swap(dictionnary) {\n    let ret = {};\n    for (let key in dictionnary) {\n        ret[Number(dictionnary[key])] = key;\n    }\n    return ret;\n}\nexport function matrixNumericalDecoding(matrixInitial, dictionnary) {\n    const matrix = matrixClone(matrixInitial);\n    let invertedDictionnary = swap(dictionnary);\n    for (let i = 0; i < matrix.length; i++) {\n        for (let j = 0; j < matrix[0].length; j++) {\n            if (matrix[i][j] in invertedDictionnary) {\n                matrix[i][j] = invertedDictionnary[matrix[i][j]];\n            }\n        }\n    }\n    return matrix;\n}\n//# sourceMappingURL=matrixNumericalDecoding.js.map","import { matrixClone } from './matrixClone';\n/**\n * Numerically encodes the strings in the matrix and returns an encoding dictionnary which can be used to encode other matrices\n * @param matrix - original matrix before encoding\n * @param dictCategoricalToNumerical - dictionnary for encoding\n * @returns - dictionnary from string to number\n */\nexport function matrixNumericalEncoding(matrixInitial) {\n    const matrix = matrixClone(matrixInitial);\n    let nRows = matrix.length;\n    let nColumns = matrix[0].length;\n    let dictCategoricalToNumerical = {};\n    let k = 0;\n    for (let i = 0; i < nRows; i++) {\n        for (let j = 0; j < nColumns; j++) {\n            if (typeof matrix[i][j] === 'number' && matrix[i][j] > k) {\n                k = matrix[i][j];\n            }\n        }\n    }\n    for (let i = 0; i < nRows; i++) {\n        for (let j = 0; j < nColumns; j++) {\n            if (typeof matrix[i][j] === 'string') {\n                if (matrix[i][j] in dictCategoricalToNumerical) {\n                    matrix[i][j] = dictCategoricalToNumerical[matrix[i][j]];\n                }\n                else {\n                    k++;\n                    dictCategoricalToNumerical[matrix[i][j]] = k;\n                    matrix[i][j] = k;\n                }\n            }\n        }\n    }\n    return { matrix, dictCategoricalToNumerical };\n}\n//# sourceMappingURL=matrixNumericalEncoding.js.map","import { Matrix } from 'ml-matrix';\nimport { xMedian } from '../x/xMedian';\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 *\n * @param matrix - matrix [rows][cols].\n * @param options - options\n * @returns - {data: Normalized dataset, medianOfQuotients: The median of quotients of each variables}\n */\nexport function matrixPQN(matrix, options = {}) {\n    const { max = 100 } = options;\n    let matrixB = new Matrix(matrix);\n    for (let i = 0; i < matrixB.rows; i++) {\n        const normalizationFactor = matrixB.getRowVector(i).norm('frobenius') / max;\n        const row = matrixB.getRowVector(i).div(normalizationFactor);\n        matrixB.setRow(i, row);\n    }\n    let referenceSpectrum = [];\n    for (let i = 0; i < matrixB.columns; i++) {\n        const currentVariable = matrixB.getColumn(i);\n        referenceSpectrum.push(xMedian(currentVariable));\n    }\n    let medianOfQuotients = [];\n    for (let i = 0; i < matrixB.columns; i++) {\n        let quotients = matrixB.getColumnVector(i).div(referenceSpectrum[i]);\n        medianOfQuotients.push(xMedian(quotients.getColumn(0)));\n    }\n    for (let i = 0; i < matrixB.rows; i++) {\n        matrixB.mulRow(i, 1 / medianOfQuotients[i]);\n    }\n    return {\n        data: matrixB.to2DArray(),\n        medianOfQuotients,\n    };\n}\n//# sourceMappingURL=matrixPQN.js.map","import { matrixCreateEmpty } from './matrixCreateEmpty';\nimport { matrixMaxAbsoluteZ } from './matrixMaxAbsoluteZ';\n/**\n * Rescale a matrix around 0 taking into account the absolute max value\n *\n * @param matrix - matrix [rows][cols].\n * @param options - Options\n */\nexport function matrixZPivotRescale(matrix, options = {}) {\n    const { max = 1, ArrayConstructor } = options;\n    const nbColumns = matrix[0].length;\n    const nbRows = matrix.length;\n    const newMatrix = matrixCreateEmpty({ nbColumns, nbRows, ArrayConstructor });\n    const currentMax = matrixMaxAbsoluteZ(matrix);\n    for (let column = 0; column < nbColumns; column++) {\n        const factor = max / currentMax;\n        for (let row = 0; row < nbRows; row++) {\n            newMatrix[row][column] = matrix[row][column] * factor;\n        }\n    }\n    return newMatrix;\n}\n//# sourceMappingURL=matrixZPivotRescale.js.map","import { matrixCreateEmpty } from './matrixCreateEmpty';\nimport { matrixMinMaxZ } from './matrixMinMaxZ';\n/**\n * Rescale a matrix between min and max values\n *\n * @param matrix - matrix [rows][cols].\n * @param options - Options\n */\nexport function matrixZRescale(matrix, options = {}) {\n    const { min = 0, max = 1, ArrayConstructor } = options;\n    const nbColumns = matrix[0].length;\n    const nbRows = matrix.length;\n    const newMatrix = matrixCreateEmpty({ nbColumns, nbRows, ArrayConstructor });\n    const { min: currentMin, max: currentMax } = matrixMinMaxZ(matrix);\n    for (let column = 0; column < nbColumns; column++) {\n        const factor = (max - min) / (currentMax - currentMin);\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//# sourceMappingURL=matrixZRescale.js.map","import { matrixCreateEmpty } from './matrixCreateEmpty';\n/**\n * Rescale the matrix per column for which we get the min and max values\n *\n * @param matrix - matrix [rows][cols].\n * @param options - Options\n */\nexport function matrixZRescalePerColumn(matrix, options = {}) {\n    const { min = 0, max = 1 } = options;\n    const nbColumns = matrix[0].length;\n    const nbRows = matrix.length;\n    const newMatrix = matrixCreateEmpty({ nbColumns, nbRows });\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)\n                currentMin = matrix[row][column];\n            if (matrix[row][column] > currentMax)\n                currentMax = matrix[row][column];\n        }\n        const factor = (max - min) / (currentMax - currentMin);\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//# sourceMappingURL=matrixZRescalePerColumn.js.map","import { xAbsolute } from './xAbsolute';\nimport { xMedian } from './xMedian';\n/**\n * This function calculates the median after taking the reimAbsolute values of the points\n *\n * @param array - the array for which we want to calculate the absolute value\n * @returns - median\n */\nexport function xAbsoluteMedian(array) {\n    return xMedian(xAbsolute(array));\n}\n//# sourceMappingURL=xAbsoluteMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function xAdd the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - the first array\n * @param array2 - the second array or number\n */\nexport function xAdd(array1, array2) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xAdd: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = array2;\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    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] + array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xAdd.js.map","/**\n * Will apply a function on each element of the array described as a string\n * By default we will use as variable 'x'\n * In front of sequence of lowercase we will add 'Math.'. This allows to write\n * `sin(x) + cos(x)` and it will be replace internally by (x) => (Math.sin(x) + Math.cos(x))\n * @param array\n * @param options\n * @returns\n */\nexport function xApplyFunctionStr(array, options = {}) {\n    const { variableLabel = 'x', fctString = variableLabel } = options;\n    const fct = new Function(variableLabel, `return Number(${fctString\n        .replace(/(?<before>^|\\W)(?<after>[\\da-z]{2,}\\()/g, '$<before>Math.$<after>')\n        .replace(/Math\\.Math/g, 'Math')})`);\n    const toReturn = Float64Array.from(array);\n    for (let i = 0; i < array.length; i++) {\n        toReturn[i] = fct(array[i]);\n        if (Number.isNaN(toReturn[i])) {\n            throw new Error(`The callback ${fctString} does not return a number: ${array[i]}`);\n        }\n    }\n    return toReturn;\n}\n//# sourceMappingURL=xApplyFunctionStr.js.map","import { xCrossCorrelation } from './xCrossCorrelation';\n/**\n * Calculates the auto-correlation of an array\n *\n * @param A - the array for which to calculate the auto-correlation\n * @param options - Options\n */\nexport function xAutoCorrelation(A, options = {}) {\n    return xCrossCorrelation(A, A, options);\n}\n//# sourceMappingURL=xAutoCorrelation.js.map","/**\n * Calculating the box plot of the array\n *\n * @param array - data\n */\nexport function xBoxPlot(array) {\n    array = Float64Array.from(array).sort();\n    if (array.length < 5) {\n        throw new Error('xBoxPlot: can not calculate info if array contains less than 5 elements');\n    }\n    let info = {\n        q1: 0,\n        median: 0,\n        q3: 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.median = array[middle];\n        q1max = middle - 1;\n        q3min = middle + 1;\n    }\n    else {\n        // even\n        q3min = array.length / 2;\n        q1max = q3min - 1;\n        info.median = (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    }\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//# sourceMappingURL=xBoxPlot.js.map","import { isAnyArray } from 'is-any-array';\nimport { getOutputArray } from '..';\n/**\n * This function divide the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - first array\n * @param array2 - second array or number\n * @param options - options\n */\nexport function xDivide(array1, array2, options = {}) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xDivide: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\n    }\n    let array3 = getOutputArray(options.output, array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] / constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] / array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xDivide.js.map","import { xCheck } from './xCheck';\n/**\n * Returns a copy of the data as Float64\n *\n * @param array - array of numbers\n */\nexport function xEnsureFloat64(array) {\n    xCheck(array);\n    if (array instanceof Float64Array) {\n        return array.slice(0);\n    }\n    return Float64Array.from(array);\n}\n//# sourceMappingURL=xEnsureFloat64.js.map","/**\n * Performs the Hilbert transform\n * @returns A new vector with 90 degree shift regarding the phase of the original function\n */\nexport function xHilbertTransform(input, options = {}) {\n    const { inClockwise = true } = options;\n    const array = [0, ...input, 0];\n    const result = new Float64Array(input.length);\n    for (let k = 1; k < array.length - 1; k++) {\n        let aSum = 0;\n        for (let i = 0; i < k - 1; i++) {\n            const log = Math.log((k - i) / (k - i - 1));\n            aSum += array[i] * log + (array[i + 1] - array[i]) * (-1 + (k - i) * log);\n        }\n        const b = array[k - 1] - array[k + 1];\n        let cSum = 0;\n        for (let i = k + 1; i < array.length - 1; i++) {\n            const log = Math.log((i - k) / (i - k + 1));\n            cSum += array[i] * log + (array[i - 1] - array[i]) * (1 + (i - k) * log);\n        }\n        result[k - 1] = ((inClockwise ? 1 : -1) * (aSum + b + cSum)) / Math.PI;\n    }\n    return result;\n}\n//# sourceMappingURL=xHilbertTransform.js.map","/**\n * Check if the values are separated always by the same difference\n *\n * @param array - Monotone growing array of number\n */\nexport function xIsEquallySpaced(array, options = {}) {\n    if (array.length < 3)\n        return true;\n    const { tolerance = 0.05 } = options;\n    let maxDx = 0;\n    let minDx = Number.MAX_SAFE_INTEGER;\n    for (let i = 0; i < array.length - 1; ++i) {\n        let absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxAbsoluteValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] >= 0) {\n            if (array[i] > maxValue) {\n                maxValue = array[i];\n            }\n        }\n        else if (-array[i] > maxValue) {\n            maxValue = -array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxAbsoluteValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the index of the maximum of the given values\n *\n * @param array - array of numbers\n * @param  options - options\n * @returns - index\n */\nexport function xMaxIndex(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxIndex = fromIndex;\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > array[maxIndex]) {\n            maxIndex = i;\n        }\n    }\n    return maxIndex;\n}\n//# sourceMappingURL=xMaxIndex.js.map","import { xCheckLengths } from './xCheckLengths';\n/**\n * This function calculates the mean absolute error\n *\n * @param array1 - first array\n * @param array2 - second array\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//# sourceMappingURL=xMeanAbsoluteError.js.map","import { xCheckLengths } from './xCheckLengths';\n/**\n * This function calculates the mean squared error\n *\n * @param array1 -first array\n * @param array2 - second array\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//# sourceMappingURL=xMeanSquaredError.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the index of the minimum of the given values\n *\n * @param array - array of numbers\n * @param options - options\n * @returns - index\n */\nexport function xMinIndex(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minIndex = fromIndex;\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < array[minIndex]) {\n            minIndex = i;\n        }\n    }\n    return minIndex;\n}\n//# sourceMappingURL=xMinIndex.js.map","/**\n * Calculates the mode of an array\n *\n * @param input - Array containing values\n * @returns - mode\n */\nexport function xMode(input) {\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    let maxValue = 0;\n    let maxCount = 0;\n    let count = 0;\n    let counts = {};\n    for (let i = 0; i < input.length; ++i) {\n        let element = input[i];\n        count = counts[element];\n        if (count) {\n            counts[element]++;\n            count++;\n        }\n        else {\n            counts[element] = 1;\n            count = 1;\n        }\n        if (count > maxCount) {\n            maxCount = count;\n            maxValue = input[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMode.js.map","/**\n * This function calculate the norm of a vector\n *\n * @example xNorm([3, 4]) -> 5\n * @param array - array\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    for (const element of array) {\n        result += element ** 2;\n    }\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","import { xCheck } from './xCheck';\nimport { xStandardDeviation } from './xStandardDeviation';\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 *\n * @param array - array of number\n */\nexport function xParetoNormalization(array) {\n    xCheck(array);\n    let result = [];\n    const sqrtSD = Math.sqrt(xStandardDeviation(array));\n    for (let item of array) {\n        result.push(item / sqrtSD);\n    }\n    return result;\n}\n//# sourceMappingURL=xParetoNormalization.js.map","import { xCheck } from '..';\nimport { getOutputArray } from './utils/getOutputArray';\nimport { xMaxValue } from './xMaxValue';\nimport { xMinValue } from './xMinValue';\n/** Function used to rescale data\n *\n * @param input - input for the rescale\n * @param options - options\n * @returns rescaled data\n */\nexport function xRescale(input, options = {}) {\n    xCheck(input);\n    const output = getOutputArray(options.output, input.length);\n    const currentMin = xMinValue(input);\n    const currentMax = xMaxValue(input);\n    if (currentMin === currentMax) {\n        throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n    }\n    const { min = 0, max = 1 } = options;\n    if (min >= max) {\n        throw new RangeError('min option must be smaller than max option');\n    }\n    const factor = (max - min) / (currentMax - currentMin);\n    for (let i = 0; i < input.length; i++) {\n        output[i] = (input[i] - currentMin) * factor + min;\n    }\n    return output;\n}\n//# sourceMappingURL=xRescale.js.map","import { xMaxValue } from './xMaxValue';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a maximum within a rolling window\n *\n * @param array - array\n * @param options - options\n */\nexport function xRollingMax(array, options = {}) {\n    return xRolling(array, xMaxValue, options);\n}\n//# sourceMappingURL=xRollingMax.js.map","import { xMedian } from './xMedian';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param options - options\n */\nexport function xRollingMedian(array, options = {}) {\n    return xRolling(array, xMedian, options);\n}\n//# sourceMappingURL=xRollingMedian.js.map","import { xMinValue } from './xMinValue';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a minimum within a rolling window\n *\n * @param array - array\n * @param options - options\n */\nexport function xRollingMin(array, options = {}) {\n    return xRolling(array, xMinValue, options);\n}\n//# sourceMappingURL=xRollingMin.js.map","/**\n * Sample within the array\n *\n * @param array - array from which to sample\n * @param options - options\n * @return - array with evenly spaced elements\n */\nexport function xSampling(array, options = {}) {\n    const { length = 10 } = options;\n    let returnArray = [];\n    if (length > array.length) {\n        throw new Error('Choose sample number smaller than the number of elements in the array');\n    }\n    let clonedArray = array.slice();\n    returnArray.push(clonedArray[0]);\n    clonedArray.shift();\n    let delta = Math.floor(clonedArray.length / (length - 1));\n    for (let i = delta - 1, j = 0; i < clonedArray.length && j < length - 1; i = i + delta, j++) {\n        returnArray.push(clonedArray[i]);\n    }\n    return returnArray;\n}\n//# sourceMappingURL=xSampling.js.map","import { isAnyArray } from 'is-any-array';\n/** Fill an array with sequential numbers\n *\n * @param input - optional destination array (if not provided a new array will be created)\n * @param options - options\n * @return array with sequential numbers\n */\nexport function xSequentialFill(input = [], options = {}) {\n    if (typeof input === 'object' && !isAnyArray(input)) {\n        options = input;\n        input = [];\n    }\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    // maybe should not specify default step and size\n    let { from = 0, to = 10, size = Array.isArray(input) ||\n        input.constructor === Float64Array ||\n        input.constructor === Uint16Array\n        ? input.length\n        : 0, step = null, } = options;\n    if (!size) {\n        if (step) {\n            size = Math.floor((to - from) / step) + 1;\n        }\n        else {\n            size = to - from + 1;\n        }\n    }\n    if (!step && size) {\n        step = (to - from) / (size - 1);\n    }\n    if (Array.isArray(input)) {\n        // only works with normal array\n        input.length = 0;\n        for (let i = 0; i < size; i++) {\n            input.push(from);\n            if (step)\n                from += step;\n        }\n    }\n    else {\n        if (Array.isArray(input) ||\n            input.constructor === Float64Array ||\n            (input.constructor === Uint16Array && input.length !== size)) {\n            throw new Error('sequentialFill typed array must have the correct length');\n        }\n        for (let i = 0; i < size; i++) {\n            if (Array.isArray(input) ||\n                input.constructor === Float64Array ||\n                input.constructor === Uint16Array) {\n                input[i] = from;\n            }\n            if (step) {\n                from += step;\n            }\n        }\n    }\n    return Array.isArray(input) ||\n        input.constructor === Float64Array ||\n        input.constructor === Uint16Array\n        ? Array.from(input)\n        : [];\n}\n//# sourceMappingURL=xSequentialFill.js.map","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 *\n * @param array1 - the array that will be rotated\n * @param array2 - second array or number\n * @returns array after subtraction\n */\nexport function xSubtract(array1, array2) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xSubtract: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\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    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] - array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xSubtract.js.map","/**\n * XUniqueSorted.\n *\n * @param array - array of numbers\n * @returns - sorted array\n */\nexport function xUniqueSorted(array) {\n    return Float64Array.from(new Set(array)).sort();\n}\n//# sourceMappingURL=xUniqueSorted.js.map","/**\n * Sort object of array, x has to be monotone.\n *\n * @param data - object of kind {x:[], re:[], im:[]}\n * @returns - sorted array\n */\nexport function xreimSortX(data) {\n    const { x, re, im } = data;\n    if (x.length !== re.length || x.length !== im.length) {\n        throw new TypeError('xreimSortX: length of x, re and im must be identical');\n    }\n    if (x.length < 2 || x[0] < x[1])\n        return data;\n    return {\n        x: x.slice(0).reverse(),\n        re: re.slice(0).reverse(),\n        im: im.slice(0).reverse(),\n    };\n}\n//# sourceMappingURL=xreimSortX.js.map","/**\n * This function make a zero filling to re and im part.\n *\n * @param data - object of kind {x:[], re:[], im:[]}\n * @param totalLength - final number of points\n * @returns - data.\n */\nexport function xreimZeroFilling(data, totalLength) {\n    let length = data.x.length;\n    if (totalLength === 0 || length === totalLength)\n        return data;\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    const x = data.x;\n    const re = data.re;\n    const im = data.im;\n    const newX = new Float64Array(totalLength);\n    const newRE = new Float64Array(totalLength);\n    const newIM = new Float64Array(totalLength);\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    return {\n        x: newX,\n        re: newRE,\n        im: newIM,\n    };\n}\n//# sourceMappingURL=xreimZeroFilling.js.map","/**\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 *\n * @param data1 - First spectrum data\n * @param data2 - Second spectrum data\n * @param options - Options\n */\nexport function xyAlign(data1, data2, options = {}) {\n    const { delta = 1, common = true, x = 'x1' } = options;\n    let result = {\n        x: [],\n        y1: [],\n        y2: [],\n    };\n    let i = 0;\n    let j = 0;\n    let length1 = data1.x.length;\n    let length2 = data2.x.length;\n    while (i < length1 && j < length2) {\n        let maxDiff = 0;\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        }\n        else {\n            maxDiff = delta;\n        }\n        let difference = data1.x[i] - data2.x[j];\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            }\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        }\n        else {\n            let weightedX = (data1.x[i] * data1.y[i] + data2.x[j] * data2.y[j]) /\n                (data1.y[i] + data2.y[j]);\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            result.y1.push(data1.y[i]);\n            result.y2.push(data2.y[j]);\n            // console.log({ i, j }, result);\n            i++;\n            j++;\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=xyAlign.js.map","import { xyJoinX } from '../xy/xyJoinX';\nimport { getSlots } from './utils/getSlots';\n/**\n * Aligns data, can be used for spectra\n *\n * @param data - data\n * @param options - Options\n */\nexport function xyArrayAlign(data, options = {}) {\n    const { delta = 1 } = options;\n    data = data.map((spectrum) => xyJoinX(spectrum, { delta }));\n    const slots = getSlots(data, options);\n    let x = Float64Array.from(slots.map((slot) => slot.average));\n    let ys = new Array(data.length).fill(0).map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(data.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < data.length; j++) {\n            let spectrum = data[j];\n            while (positions[j] < spectrum.x.length &&\n                spectrum.x[positions[j]] <= slot.to) {\n                ys[j][i] += spectrum.y[positions[j]];\n                positions[j]++;\n            }\n        }\n    }\n    return { x, ys };\n}\n//# sourceMappingURL=xyArrayAlign.js.map","import { getSlotsToFirst } from './utils/getSlotsToFirst';\n/**\n * We align all the data/spectra to the first array of X.\n * The alignment is based on the X values of the first spectrum and the `delta` error allowed. If some x values are missing in the first spectrum we will add them\n *\n * @param data data\n * @param options options\n */\nexport function xyArrayAlignToFirst(data, options = {}) {\n    const slots = getSlotsToFirst(data, options);\n    let x = Float64Array.from(slots.map((slot) => slot.value));\n    let ys = new Array(data.length).fill(0).map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(data.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < data.length; j++) {\n            let spectrum = data[j];\n            while (positions[j] < spectrum.x.length &&\n                spectrum.x[positions[j]] < slot.to) {\n                ys[j][i] += spectrum.y[positions[j]];\n                positions[j]++;\n            }\n        }\n    }\n    return { x, ys };\n}\n//# sourceMappingURL=xyArrayAlignToFirst.js.map","import { xyJoinX } from '../xy/xyJoinX';\nimport { getSlots } from './utils/getSlots';\n/**\n * Merge DataXY\n * We have an array of DataXY and the goal is to merge all the values that are the closest possible\n *\n * @param data - data\n * @param options - Options\n */\nexport function xyArrayMerge(data, options = {}) {\n    const { delta = 1 } = options;\n    // we start by checking that the data/spectra don't have peaks too close and we simplify them\n    data = data.map((spectrum) => xyJoinX(spectrum, { delta }));\n    // at first we will calculate the X values (simple mean)\n    let slots = getSlots(data, options);\n    let x = Float64Array.from(slots.map((slot) => slot.average));\n    let y = new Float64Array(x.length);\n    let positions = new Uint32Array(data.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < data.length; j++) {\n            let spectrum = data[j];\n            while (positions[j] < spectrum.x.length &&\n                spectrum.x[positions[j]] <= slot.to) {\n                y[i] += spectrum.y[positions[j]];\n                positions[j]++;\n            }\n        }\n    }\n    return { x, y };\n}\n//# sourceMappingURL=xyArrayMerge.js.map","import { xMean } from '../x/xMean';\n/**Finds the covariance of the points\n *\n * @param data\n * @param options\n * @return the covariance\n */\nexport function xyCovariance(data, options = {}) {\n    const { x, y } = data;\n    const { unbiased = true } = options;\n    const meanX = xMean(x);\n    const meanY = xMean(y);\n    let error = 0;\n    for (let i = 0; i < x.length; i++) {\n        error += (x[i] - meanX) * (y[i] - meanY);\n    }\n    if (unbiased) {\n        return error / (x.length - 1);\n    }\n    else {\n        return error / x.length;\n    }\n}\n//# sourceMappingURL=xyCovariance.js.map","import { xIsMonotoneIncreasing } from '../x/xIsMonotoneIncreasing';\nimport { xyCheck } from './xyCheck';\n/**\n * Filters x,y values to allow strictly growing values in x axis.\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array).\n */\nexport function xyEnsureGrowingX(data) {\n    xyCheck(data);\n    if (xIsMonotoneIncreasing(data.x))\n        return data;\n    const x = Array.from(data.x);\n    const y = Array.from(data.y);\n    let prevX = Number.NEGATIVE_INFINITY;\n    let currentIndex = 0;\n    for (let index = 0; index < x.length; index++) {\n        if (prevX < x[index]) {\n            if (currentIndex < index) {\n                x[currentIndex] = x[index];\n                y[currentIndex] = y[index];\n            }\n            currentIndex++;\n            prevX = x[index];\n        }\n    }\n    x.length = currentIndex;\n    y.length = currentIndex;\n    return { x, y };\n}\n//# sourceMappingURL=xyEnsureGrowingX.js.map","import { zonesNormalize } from '../zones/zonesNormalize';\nimport { xyCheck } from './xyCheck';\n/**\n * XyExtract zones from a XY data\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n * @returns - Array of points\n */\nexport function xyExtract(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    let { zones } = options;\n    zones = zonesNormalize(zones);\n    if (x === undefined ||\n        y === undefined ||\n        !Array.isArray(zones) ||\n        zones.length === 0) {\n        return data;\n    }\n    let newX = [];\n    let newY = [];\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//# sourceMappingURL=xyExtract.js.map","import { xMinMaxValues } from '../x/xMinMaxValues';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - object containing 2 properties x and y\n * @param minRelativeYValue - the minimum relative value compare to the Y max value\n * @return filtered data\n */\nexport function xyFilterMinYValue(data, minRelativeYValue) {\n    if (minRelativeYValue === undefined)\n        return data;\n    const { x, y } = data;\n    const { min, max } = xMinMaxValues(y);\n    const threshold = max * minRelativeYValue;\n    if (min >= threshold)\n        return data;\n    const newX = [];\n    const newY = [];\n    for (let i = 0; i < x.length; i++) {\n        if (y[i] >= threshold) {\n            newX.push(x[i]);\n            newY.push(y[i]);\n        }\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterMinYValue.js.map","import { xSortDescending } from '../x/xSort';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return filtered data\n */\nexport function xyFilterTopYValues(data, nbPeaks) {\n    if (nbPeaks === undefined)\n        return data;\n    if (nbPeaks > data.x.length)\n        return data;\n    const { x, y } = data;\n    const newX = [];\n    const newY = [];\n    const descending = xSortDescending(y.slice());\n    const threshold = descending[nbPeaks - 1];\n    let nbThreshold = 0;\n    for (let i = 0; i < nbPeaks; i++) {\n        if (descending[i] === threshold) {\n            nbThreshold++;\n        }\n    }\n    for (let i = 0; i < x.length; i++) {\n        if (y[i] > threshold) {\n            newX.push(x[i]);\n            newY.push(y[i]);\n        }\n        else if (y[i] === threshold) {\n            nbThreshold--;\n            if (nbThreshold >= 0) {\n                newX.push(x[i]);\n                newY.push(y[i]);\n            }\n        }\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterTopYValues.js.map","/** Function that sorts arrays or Float64Arrays in ascending order\n *\n * @param array - array to sort\n * @returns sorted array\n */\nexport function xSortAscending(array) {\n    if (array instanceof Float64Array) {\n        return array.sort();\n    }\n    else if (Array.isArray(array)) {\n        return array.sort((a, b) => a - b);\n    }\n    throw new Error('Trying to sort non aray');\n}\n/** Function that sorts arrays or Float64Arrays in descending order\n *\n * @param array - array to sort\n * @returns sorted array\n */\nexport function xSortDescending(array) {\n    if (array instanceof Float64Array) {\n        return array.sort().reverse();\n    }\n    else if (Array.isArray(array)) {\n        return array.sort((a, b) => b - a);\n    }\n    throw new Error('Trying to sort non aray');\n}\n//# sourceMappingURL=xSort.js.map","import { zonesNormalize } from '../zones/zonesNormalize';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return filtered array\n */\nexport function xyFilterX(data, options = {}) {\n    const { x, y } = data;\n    const { from = x[0], to = x[x.length - 1], zones = [{ from, to }], exclusions = [], } = options;\n    let normalizedZones = zonesNormalize(zones, { from, to, exclusions });\n    let currentZoneIndex = 0;\n    let newX = [];\n    let newY = [];\n    let position = 0;\n    while (position < x.length) {\n        if (x[position] <= normalizedZones[currentZoneIndex].to &&\n            x[position] >= normalizedZones[currentZoneIndex].from) {\n            newX.push(x[position]);\n            newY.push(y[position]);\n        }\n        else if (x[position] > normalizedZones[currentZoneIndex].to) {\n            currentZoneIndex++;\n            if (!normalizedZones[currentZoneIndex])\n                break;\n        }\n        position++;\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterX.js.map","import { xyCheck } from './xyCheck';\n/**\n * Filter out all the points for which x <= 0. Useful to display log scale data\n *\n * @param data - data\n * @returns - An object with the filtered data\n */\nexport function xyFilterXPositive(data) {\n    xyCheck(data);\n    const { x, y } = data;\n    const newX = [];\n    const newY = [];\n    if (x === undefined || y === undefined)\n        return { x: newX, y: newY };\n    for (let i = 0; i < x.length; i++) {\n        if (x[i] > 0) {\n            newX.push(x[i]);\n            newY.push(y[i]);\n        }\n    }\n    return { x: newX, y: newY };\n}\n//# sourceMappingURL=xyFilterXPositive.js.map","import { xFindClosestIndex } from '../x/xFindClosestIndex';\n/**\n * Finds the closest point\n *\n * @param data - x array should be sorted and ascending\n * @param target - target to search\n * @returns - closest point\n */\nexport function xyFindClosestPoint(\n/** points */\ndata, target) {\n    const { x, y } = data;\n    const index = xFindClosestIndex(x, target);\n    return {\n        x: x[index],\n        y: y[index],\n    };\n}\n//# sourceMappingURL=xyFindClosestPoint.js.map","import { xyCheck } from './xyCheck';\n/**\n * Returns the numberMaxPoints points with the bigger y.\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param numberMaxPoints - Number of points to keep\n * @returns - 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    }\n    else {\n        let newX = new Float64Array(numberMaxPoints);\n        let newY = new Float64Array(numberMaxPoints);\n        // slice() is used to make a copy of the array, because sort() is IPM\n        let threshold = Float64Array.from(data.y).sort().reverse()[numberMaxPoints - 1];\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        return data;\n    }\n}\n//# sourceMappingURL=xyGetNMaxY.js.map","/**\n * Order object of array, x has to be monotone. Ensure x is growing\n *\n * @param data - Object of kind {x:[], y:[]}.\n */\nexport function xyGrowingX(data) {\n    const { x, y } = data;\n    if (x.length !== y.length) {\n        throw new TypeError('sortX: length of x and y must be identical');\n    }\n    if (x.length < 2 || x[0] < x[1])\n        return data;\n    return {\n        x: x.slice(0).reverse(),\n        y: y.slice(0).reverse(),\n    };\n}\n//# sourceMappingURL=xyGrowingX.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Generate a X / Y of the xyIntegral\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - An object with the xyIntegration function\n */\nexport function xyIntegral(data, options = {}) {\n    const { reverse = false } = options;\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\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    }\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    return currentxyIntegral;\n}\n//# sourceMappingURL=xyIntegral.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Calculate integration\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - xyIntegration value on the specified range\n */\nexport function xyIntegration(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1)\n        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    return currentxyIntegration;\n}\n//# sourceMappingURL=xyIntegration.js.map","import { xFindClosestIndex } from '../x/xFindClosestIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Find the closest maximum going up hill\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n * @returns - An object with the x/y value\n */\nexport function xyMaxClosestYPoint(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    let { target, targetIndex } = options;\n    if (targetIndex === undefined) {\n        if (target !== undefined) {\n            targetIndex = xFindClosestIndex(x, target);\n        }\n        else {\n            targetIndex = 0;\n        }\n    }\n    let previousIndex = Number.MIN_SAFE_INTEGER;\n    let currentIndex = targetIndex;\n    let xyMaxY = y[targetIndex];\n    while (currentIndex !== previousIndex) {\n        previousIndex = currentIndex;\n        if (currentIndex > 0 && y[currentIndex - 1] > xyMaxY) {\n            currentIndex--;\n        }\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//# sourceMappingURL=xyMaxClosestYPoint.js.map","/**\n * Merge abscissas values on similar ordinates and weight the group of abscissas\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return array of merged and weighted points\n */\nexport function xyMaxMerge(data, options = {}) {\n    const { x, y } = data;\n    const { groupWidth = 0.001 } = options;\n    let merged = { x: [], y: [] };\n    let maxAbscissa = { x: [], y: [] };\n    let size = 0;\n    let index = 0;\n    while (index < x.length) {\n        if (size === 0 || x[index] - merged.x[size - 1] > groupWidth) {\n            maxAbscissa.x.push(x[index]);\n            maxAbscissa.y.push(y[index]);\n            merged.x.push(x[index]);\n            merged.y.push(y[index]);\n            index++;\n            size++;\n        }\n        else {\n            if (y[index] > maxAbscissa.y[size - 1]) {\n                maxAbscissa.x[size - 1] = x[index];\n                maxAbscissa.y[size - 1] = y[index];\n            }\n            merged.x[size - 1] = x[index];\n            merged.y[size - 1] += y[index];\n            index++;\n        }\n    }\n    merged.x = maxAbscissa.x.slice();\n    return merged;\n}\n//# sourceMappingURL=xyMaxMerge.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max value in a zone\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - Max y on the specified range\n */\nexport function xyMaxY(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n    let currentxyMaxY = y[fromIndex];\n    for (let i = fromIndex; i <= toIndex; i++) {\n        if (y[i] > currentxyMaxY)\n            currentxyMaxY = y[i];\n    }\n    return currentxyMaxY;\n}\n//# sourceMappingURL=xyMaxY.js.map","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 data - Object that contains property x (an ordered increasing array) and y (an array)\n * @returns - Array of points\n */\nexport function xyMaximaY(data) {\n    xyCheck(data, { minLength: 2 });\n    const { x, y } = data;\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        }\n        else if (y[i - 1] < y[i] && y[i + 1] === y[i]) {\n            startEqualIndex = i;\n        }\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//# sourceMappingURL=xyMaximaY.js.map","/**\n * Finds the median x value for an object with properties x and y (arrays of the same length)\n *\n * @param data - x should be sorted in increasing order\n * @returns - the median of x values\n */\nexport function xyMedian(data) {\n    const { x, y } = data;\n    let sumY = 0;\n    let cumSumY = 0;\n    let i;\n    if (x.length === 0) {\n        return Number.NaN;\n    }\n    if (x.length === 1) {\n        return x[0];\n    }\n    for (i = 0; i < y.length; i++) {\n        sumY += y[i];\n    }\n    for (i = 0; i < y.length; i++) {\n        cumSumY += y[i];\n        if (cumSumY > sumY / 2) {\n            return x[i];\n        }\n        else if (cumSumY === sumY / 2) {\n            return 0.5 * (x[i] + x[i + 1]);\n        }\n    }\n    return Number.NaN;\n}\n//# sourceMappingURL=xyMedian.js.map","/**\n * Merge abscissa values if the ordinate value is in a list of centroids\n *\n * @param data - object containing 2 properties x and y\n * @param centroids - centroids\n * @param options - options\n * @return merged points\n */\nexport function xyMergeByCentroids(data, centroids, options = {}) {\n    const { window = 0.01 } = options;\n    let mergedPoints = {\n        x: centroids.slice(),\n        y: new Float64Array(centroids.length).fill(0),\n    };\n    let originalIndex = 0;\n    let mergedIndex = 0;\n    while (originalIndex < data.x.length && mergedIndex < centroids.length) {\n        let diff = data.x[originalIndex] - centroids[mergedIndex];\n        if (Math.abs(diff) < window) {\n            mergedPoints.y[mergedIndex] += data.y[originalIndex++];\n        }\n        else if (diff < 0) {\n            originalIndex++;\n        }\n        else {\n            mergedIndex++;\n        }\n    }\n    return mergedPoints;\n}\n//# sourceMappingURL=xyMergeByCentroids.js.map","import { xFindClosestIndex } from '../x/xFindClosestIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Find the closest minimum going down hill\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - An object with the x/y value\n */\nexport function xyMinClosestYPoint(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    let { target, targetIndex } = options;\n    if (targetIndex === undefined) {\n        if (target !== undefined) {\n            targetIndex = xFindClosestIndex(x, target);\n        }\n        else {\n            targetIndex = 0;\n        }\n    }\n    let previousIndex = Number.MIN_SAFE_INTEGER;\n    let currentIndex = targetIndex;\n    let minY = y[targetIndex];\n    while (currentIndex !== previousIndex) {\n        previousIndex = currentIndex;\n        if (currentIndex > 0 && y[currentIndex - 1] < minY) {\n            currentIndex--;\n        }\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//# sourceMappingURL=xyMinClosestYPoint.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the min y value in a range and return a {x,y} point\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n */\nexport function xyMinYPoint(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1)\n        return { x: x[0], y: y[0], index: 0 };\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\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)\n            current = { x: x[i], y: y[i], index: i };\n    }\n    return current;\n}\n//# sourceMappingURL=xyMinYPoint.js.map","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 data - Object that contains property X (an ordered increasing array) and y (an arraY)\n * @returns - Array of points.\n */\nexport function xyMinimaY(data) {\n    xyCheck(data, { minLength: 2 });\n    const { x, y } = data;\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        }\n        else if (y[i - 1] > y[i] && y[i + 1] === y[i]) {\n            startEqualIndex = i;\n        }\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//# sourceMappingURL=xyMinimaY.js.map","import { xyObjectMaxXPoint } from './xyObjectMaxXPoint';\nimport { xyObjectMinXPoint } from './xyObjectMinXPoint';\n/**\n * Filter the array by taking the higher points (max y value) and only.\n * Keep one per slot. There are 2 different slots, the smallest one will have the\n * new property `close` to true\n *\n * @param points - array of all the points\n * @param options - Options\n * @returns - copy of points with 'close' property\n */\nexport function xyObjectBestPoints(points, options = {}) {\n    const { from = xyObjectMinXPoint(points).x, to = xyObjectMaxXPoint(points).x, limit = 20, threshold = 0.01, numberCloseSlots = 50, numberSlots = 10, } = 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    selected = selected.sort((a, b) => {\n        if (a.monoisotopic && !b.monoisotopic)\n            return -1;\n        if (b.monoisotopic && !a.monoisotopic)\n            return 1;\n        return b.point.y - a.point.y;\n    });\n    let toReturn = [];\n    if (selected.length === 0)\n        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            }\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)\n            break;\n    }\n    return toReturn.sort((a, b) => a.x - b.x);\n}\n//# sourceMappingURL=xyObjectBestPoints.js.map","/**\n * xyObjectJoinX.\n *\n * @param points - Array of growing points {x,y}.\n * @param options - Options.\n */\nexport function xyObjectJoinX(points, options = {}) {\n    const { xError = Number.EPSILON } = options;\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            if (current.y !== 0 || point.y !== 0) {\n                current.x =\n                    (point.y / (current.y + point.y)) * (point.x - current.x) + current.x;\n                current.y += point.y;\n            }\n        }\n        else {\n            current = {\n                x: point.x,\n                y: point.y,\n            };\n            result.push(current);\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=xyObjectJoinX.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the max y value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMaxYPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\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    return current;\n}\n//# sourceMappingURL=xyObjectMaxYPoint.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the min y value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMinYPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\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    return current;\n}\n//# sourceMappingURL=xyObjectMinYPoint.js.map","/**\n * XyObjectSlotX\n *\n * @param points - Array of growing points {x,y}.\n * @param options - Options.\n */\nexport function xyObjectSlotX(points, options = {}) {\n    const { slotWidth = 1 } = options;\n    const halfSlot = slotWidth / 2;\n    // when we join we will use the center of mass\n    let result = [];\n    let current = {\n        x: Number.NEGATIVE_INFINITY,\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//# sourceMappingURL=xyObjectSlotX.js.map","/**\n * Sorts an array of points\n *\n * @param points - array of points {x,y}\n * @returns - sorted array of points {x,y}\n */\nexport function xyObjectSortX(points) {\n    return points.sort((a, b) => a.x - b.x);\n}\n//# sourceMappingURL=xyObjectSortX.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Calculate the sum of Y values\n *\n * @param points - Object that contains property x and y (an array)\n */\nexport function xyObjectSumY(points = []) {\n    xyObjectCheck(points);\n    let sum = 0;\n    for (let point of points) {\n        sum += point.y;\n    }\n    return sum;\n}\n//# sourceMappingURL=xyObjectSumY.js.map","/**\n * XyObjectToXY.\n *\n * @param 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//# sourceMappingURL=xyObjectToXY.js.map","import { xFindClosestIndex } from '../x/xFindClosestIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Returns an information about a signal.\n *\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 data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n * @returns - Information about signal\n */\nexport function xyPeakInfo(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 3)\n        return undefined;\n    let { targetIndex, target } = options;\n    if (targetIndex === undefined && target !== undefined) {\n        targetIndex = xFindClosestIndex(x, target);\n    }\n    if (targetIndex === undefined) {\n        throw new Error('xyPeakInfo: need to specify target or targetIndex');\n    }\n    let i = targetIndex;\n    let currentDiff = y[i] - y[i + 1];\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)\n            break;\n        currentDiff = newDiff;\n    }\n    let after = { x: x[i], y: y[i] };\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)\n            break;\n        currentDiff = newDiff;\n    }\n    let before = { x: x[i], y: y[i] };\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//# sourceMappingURL=xyPeakInfo.js.map","import { xGetTargetIndex } from '../x/xGetTargetIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Find the closest minimum going down hill\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n * @returns - An object with the x/y value\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 (y[targetIndex - 1] > 0 &&\n        y[targetIndex + 1] > 0 &&\n        y[targetIndex] >= y[targetIndex - 1] &&\n        y[targetIndex] >= y[targetIndex + 1]) {\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    }\n    else {\n        return {\n            x: x[targetIndex],\n            y: y[targetIndex],\n            index: targetIndex,\n        };\n    }\n}\n//# sourceMappingURL=xyRealMaxYPoint.js.map","import { xGetTargetIndex } from '../x/xGetTargetIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * XyRealMinYPoint.\n *\n * @param data - Data.\n * @param options - Options.\n */\nexport function xyRealMinYPoint(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    const targetIndex = xGetTargetIndex(x, options);\n    // interpolation to a sin() function\n    if (y[targetIndex - 1] < 0 &&\n        y[targetIndex + 1] < 0 &&\n        y[targetIndex] <= y[targetIndex - 1] &&\n        y[targetIndex] <= y[targetIndex + 1]) {\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    }\n    else {\n        return {\n            x: x[targetIndex],\n            y: y[targetIndex],\n            index: targetIndex,\n        };\n    }\n}\n//# sourceMappingURL=xyRealMinYPoint.js.map","import { xFindClosestIndex } from '../x/xFindClosestIndex';\nimport { zonesNormalize } from '../zones/zonesNormalize';\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. If you want a similar looking spectrum you should still however generate 4x the nbPoints that is being displayed.\n * SHOULD NOT BE USED FOR DATA PROCESSING !!!\n * You should rather use ml-xy-equally-spaced to make further processing\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n */\nexport function xyReduce(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    let { from = x[0], to = x[x.length - 1], nbPoints = 4001, optimize = false, zones = [], } = options;\n    zones = zonesNormalize(zones, { from, to });\n    if (zones.length === 0)\n        zones = [{ from, to }]; // we take everything\n    // for each zone we should know the first index, the last index and the number of points\n    const internalZones = zones;\n    let totalPoints = 0;\n    for (let zone of internalZones) {\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        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 < internalZones.length - 1; i++) {\n            const zone = internalZones[i];\n            zone.nbPoints = Math.round(zone.nbPoints * ratio);\n            currentTotal += zone.nbPoints;\n        }\n        internalZones[internalZones.length - 1].nbPoints = nbPoints - currentTotal;\n    }\n    else {\n        let newX = new Float64Array(totalPoints);\n        let newY = new Float64Array(totalPoints);\n        let index = 0;\n        for (let zone of internalZones) {\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    let newX = [];\n    let newY = [];\n    for (let zone of internalZones) {\n        if (!zone.nbPoints)\n            continue;\n        appendFromTo(zone.fromIndex, zone.toIndex, zone.nbPoints);\n    }\n    return { x: newX, y: newY };\n    /**\n     * AppendFromTo.\n     *\n     * @param fromIndex - From.\n     * @param  toIndex - To.\n     * @param zoneNbPoints - NbPoints.\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        if (zoneNbPoints % 2 === 0) {\n            zoneNbPoints = zoneNbPoints / 2 + 1;\n        }\n        else {\n            zoneNbPoints = (zoneNbPoints - 1) / 2 + 1;\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        let minY = Number.POSITIVE_INFINITY;\n        let xyMaxY = Number.NEGATIVE_INFINITY;\n        for (let i = fromIndex + 1; i <= toIndex; i++) {\n            if (first) {\n                minY = y[i];\n                xyMaxY = y[i];\n                first = false;\n            }\n            else {\n                if (y[i] < minY)\n                    minY = y[i];\n                if (y[i] > xyMaxY)\n                    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                    }\n                    else if (xyMaxY < newY[newX.length - 1]) {\n                        // we can skip the intermediate value\n                        xyMaxY = minY;\n                    }\n                    else {\n                        newX.push(currentX - slot / 2);\n                        newY.push(minY);\n                    }\n                }\n                else {\n                    newX.push(currentX - slot / 2);\n                    newY.push(minY);\n                }\n                newX.push(currentX);\n                newY.push(xyMaxY);\n                currentX += slot;\n                first = true;\n            }\n        }\n    }\n}\n//# sourceMappingURL=xyReduce.js.map","import { xRolling } from '../x/xRolling';\nimport { xRollingAverage } from '../x/xRollingAverage';\n/**\n * This function calculates a rolling average.\n * This methods will recalculate the x values by using xRollingAverage\n *\n * @param data - array of points {x,y}\n * @param fct - callback function that from an array returns a value.\n * @param options - options\n */\nexport function xyRolling(data, fct, options = {}) {\n    let { x, y } = data;\n    y = xRolling(y, fct, options);\n    if (x.length !== y.length) {\n        x = xRollingAverage(x, options);\n    }\n    return { x, y };\n}\n//# sourceMappingURL=xyRolling.js.map","import { zonesNormalize } from '../zones/zonesNormalize';\nimport { xyCheck } from './xyCheck';\n/**\n * Set a value (default 0) to specific zones.\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - options\n * @returns - Array of points\n */\nexport function xySetYValue(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    let { zones, value = 0 } = options;\n    if (!Array.isArray(zones) || zones.length === 0) {\n        return data;\n    }\n    zones = zonesNormalize(zones);\n    const newX = x.slice();\n    const newY = y.slice();\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            newY[i] = value;\n        }\n    }\n    return { x: newX, y: newY };\n}\n//# sourceMappingURL=xySetYValue.js.map","import { xyCheck } from './xyCheck';\n/**\n * Convert a DataXY to an array of array containing x,y\n *\n * @param data - array of points {x,y}\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    return objectArray;\n}\n//# sourceMappingURL=xyToXYArray.js.map","import { xyCheck } from './xyCheck';\n/**\n * XyToXYObject.\n *\n * @param data - Array of points {x,y}.\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//# sourceMappingURL=xyToXYObject.js.map","/**\n * Merge abscissas values on similar ordinates and weight the group of abscissas\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return array of merged and weighted points\n */\nexport function xyWeightedMerge(data, options = {}) {\n    const { x, y } = data;\n    const { groupWidth = 0.001 } = options;\n    let merged = { x: [], y: [] };\n    let weightedAbscissa = { x: [], y: [] };\n    let size = 0;\n    let index = 0;\n    while (index < x.length) {\n        if (size === 0 || x[index] - merged.x[size - 1] > groupWidth) {\n            weightedAbscissa.x.push(x[index] * y[index]);\n            weightedAbscissa.y.push(y[index]);\n            merged.x.push(x[index]);\n            merged.y.push(y[index]);\n            index++;\n            size++;\n        }\n        else {\n            weightedAbscissa.x[size - 1] += x[index] * y[index];\n            weightedAbscissa.y[size - 1] += y[index];\n            merged.x[size - 1] = x[index];\n            merged.y[size - 1] += y[index];\n            index++;\n        }\n    }\n    for (let i = 0; i < merged.x.length; i++) {\n        merged.x[i] = weightedAbscissa.x[i] / weightedAbscissa.y[i];\n    }\n    return merged;\n}\n//# sourceMappingURL=xyWeightedMerge.js.map","/**\n * Deprecated !!! Should use utils/createFromToArray\n *\n * @param zone.\n * @param size - Size.\n * @returns - Array of float.\n */\nexport 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//# sourceMappingURL=zoneToX.js.map"],"names":["reimAbsolute","data","length","re","im","newArray","Float64Array","i","Math","sqrt","exports","ascending","a","b","NaN","bisector","compare","ascendingComparator","left","x","lo","hi","mid","right","f","d","ascendingBisect","bisectRight","bisectLeft","descending","number$1","variance","array","n","m","s","j","isNaN","deviation","v","extent","c","constant","identity","range","start","stop","step","arguments","max","ceil","Array","e10","e5","e2","ticks","count","tickStep","floor","step0","abs","step1","pow","log","LN10","error","sturges","values","LN2","number","histogram","value","domain","threshold","xz","x0","x1","tz","isArray","shift","pop","bin","bins","push","_","thresholds","prototype","map","call","quantile","p","h","freedmanDiaconis","min","sort","scott","mean","median","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","splineInterpolator","constructor","xIn","yIn","lambda","indices","y","sigma","this","params","r","q","u","w","mu","quincunx","smoothingSpline","interpolate","xStart","delta","maxValue","Infinity","minValue","curve","nInterval","vals","createFromToArray","options","from","to","includeFrom","includeTo","distribution","div","index","Error","base","firstExponent","P1","Q1","P2","Q2","P3","Q3","P4","Q4","P5","Q5","polyval","coef","calc","P","Q","Y","erfcinv","val","g","sign","Number","RangeError","POSITIVE_INFINITY","NEGATIVE_INFINITY","rayleighCdf","expm1","xNoiseSanPlot","mask","cutOff","refine","magnitudeMode","scaleFactor","factorStd","fixOffset","input","filter","_e","reverse","medianIndex","firstNegativeValueIndex","findIndex","e","lastPositiveValueIndex","initialNoiseLevelNegative","signPositive","slice","signNegative","cutOffDist","determineCutOff","pIndex","initialNoiseLevelPositive","skyPoint","noiseLevelPositive","noiseLevelNegative","cloneSignPositive","cloneSignNegative","cutOffSignalsIndexPlus","cutOffSignalsIndexNeg","cutOffSignals","effectiveCutOffDist","refinedCorrectionFactor","correctionFactor","simpleNormInv","positive","negative","snr","sanplot","generateSanPlot","fromTo","considerList","indexMax","round","minKi","MAX_SAFE_INTEGER","whereToCutStat","top","elementsOfCutOff","averageValue","reduce","kiSqrt","element","xTraining","createArray","result","yTraining","factor","finalInput","interp","SplineInterpolator","yValue","SQRT2","logBaseY","key","scale","log10","logOfBase","xAxis","reimPhaseCorrection","phi0","phi1","isFinite","alpha","sin","beta","cosTheta","cos","sinTheta","newRe","newIm","newSinTheta","autoPhaseRegion","maxSteps","bestAng","minArea","dAng","phased","toRadians","negArea","getNegArea","area","sumX","ph0","holoborodko","dk","robustBaseLineRegionsDetection","maxDistanceToJoin","factorNoise","Uint8Array","change","prev","weightedLinearRegression","sxtw","swx","sw","sxtwy","swy","detMx","inMx","degree","PI","FFT","size","_csize","table","angle","power","_width","_bitrev","revShift","_out","_data","_inv","fft","fromComplexArray","complex","storage","res","createComplexArray","toComplexArray","completeSpectrum","spectrum","half","transform","out","_transform4","realTransform","_realTransform4","inverseTransform","outOff","len","bitrev","off","_singleTransform2","_singleTransform4","inv","quarterLen","limit","k","A","B","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","xRotate","set","zeroShift","inverse","xAbsolute","tmpArray","toString","Object","isAnyArray","endsWith","xMedian","TypeError","middle","ll","hh","low","high","calcMiddle","swap","temp","getOutputArray","output","undefined","xMultiply","array1","array2","isConstant","array3","xDotProduct","xCrossCorrelation","tau","lag","l","xCheck","xCorrelation","sumA","sumA2","sumB","sumB2","sumAB","xCumulative","xFindClosestIndex","target","sorted","diff","currentDiff","xGetFromToIndex","fromIndex","toIndex","xGetTargetIndex","targetIndex","xMaxValue","xMinValue","xHistogram","centerX","nbSlots","logBaseX","absolute","slotSize","EPSILON","xIsMonotone","xIsMonotoneIncreasing","xMean","sumValue","xCheckLengths","xMedianAbsoluteDeviation","averageDeviations","mad","xMinMaxValues","xNoiseStandardDeviation","sd","xSum","absoluteSum","xPadding","algorithm","fromEnd","toEnd","toLowerCase","xVariance","unbiased","sqrError","xStandardDeviation","xRolling","fct","window","padding","subarray","xRollingAverage","xyCheck","minLength","xyMaxYPoint","current","STEPS","zonesNormalize","zones","exclusions","JSON","parse","stringify","zone","currentZone","beforeExclusionsZones","normalizedExclusions","currentExclusionIndex","results","counter","zoneIndex","zonesWithPoints","numberOfPoints","returnZones","totalSize","previous","unitsPerPoint","currentTotal","integral","slope","intercept","processZone","variant","xLength","halfStep","lastStep","previousX","MAX_VALUE","previousY","nextX","nextY","frontOutsideSpectra","backOutsideSpectra","currentValue","currentPoints","main","equallySpacedSlot","initialOriginalStep","lastOriginalStep","MIN_SAFE_INTEGER","sumAtMin","sumAtMax","add","equallySpacedSmooth","xyJoinX","deltaIsFunction","position","xySortX","xyObject","response","average","cumulativeY","divider","getSlots","possibleXs","concat","currentSlot","slots","currentDelta","xyArrayWeightedMerge","deltaNumber","positions","fill","point","nextValue","slot","maxX","sumY","sumXY","minIndex","minX","currentX","splice","getSlotsToFirst","firstXs","otherXs","currentPosition","xyObjectCheck","points","xyObjectMaxXPoint","xyObjectMinXPoint","matrixClone","matrixCreateEmpty","nbRows","nbColumns","ArrayConstructor","newMatrix","matrixMinMaxAbsoluteZ","column","matrixCheck","firstLength","matrixMinMaxZ","matrixMaxAbsoluteZ","_options$fromIndex","_options$toIndex","isInteger","rescale","currentMin","currentMax","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","name","inspectData","rows","columns","maxI","maxJ","loop","get","line","formatNumber","join","num","formatNumber2","padEnd","str","fix","toFixed","startsWith","exp","toExponential","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","Matrix","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","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","maxIndex","idx","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","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","scaleColumns","flipRows","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","negate","tensorProduct","nRows","nColumns","super","arrayData","every","removeRow","addRow","removeColumn","newRow","addColumn","matrixToArray","flatten","currentRow","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","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","tan","tanh","trunc","arg0","powS","powM","installMathOperations","multiply_uint32","nlo","XSadd","seed","Date","now","state","Uint32Array","init","getFloat","bind","getUint32","nextState","periodCertification","spare","hasSpare","generateGaussian","generator","XSAdd","returnArray","matrixInitial","dictionnary","arrayOfValues","targetArray","sourceArray","info","q1","q3","columnArray","q1max","q3min","middleOver","minMax","invertedDictionnary","ret","dictCategoricalToNumerical","matrixB","normalizationFactor","referenceSpectrum","currentVariable","medianOfQuotients","quotients","minRegSize","magnitudeData","ds","peaksDs","peaksSp","finalPeaks","reTmp","imTmp","ph1","applyZeroShift","csize","complexArray","variableLabel","fctString","Function","replace","toReturn","inClockwise","aSum","cSum","tolerance","maxDx","minDx","absoluteDifference","maxCount","counts","absoluteSumValue","currentMaxValue","sumFactor","sqrtSD","item","clonedArray","Uint16Array","Set","totalLength","newX","newRE","newIM","deltaX","data1","data2","common","y1","y2","length1","length2","maxDiff","difference","weightedX","ys","meanX","meanY","maxY","x100","currentStep","breakPoint","xMode","prevX","currentIndex","normalizedZones","zonesWithPointsRes","xResult","yResult","zoneResult","newY","minRelativeYValue","nbPeaks","xSortDescending","nbThreshold","currentZoneIndex","numberMaxPoints","currentxyIntegral","xyIntegration","currentxyIntegration","previousIndex","xyMaxY","groupWidth","maxAbscissa","currentxyMaxY","maxima","startEqualIndex","cumSumY","centroids","mergedPoints","originalIndex","mergedIndex","minY","numberCloseSlots","numberSlots","closeSlot","selected","monoisotopic","peakLoop","close","existing","newPeak","xError","slotWidth","halfSlot","entry","multiplier","newDiff","after","before","inflectionBefore","inflectionAfter","extrema","inflectionMiddle","width","gamma","nbPoints","optimize","internalZones","totalPoints","ratio","appendFromTo","zoneNbPoints","objectArray","isSorted","weightedAbscissa"],"mappings":"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"}