{"version":3,"file":"ml-spectra-processing.min.js","sources":["../lib-esm/x/xAbsolute.js","../node_modules/ml-array-median/node_modules/is-any-array/src/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/is-any-array/lib-esm/index.js","../lib-esm/x/xMultiply.js","../lib-esm/x/xDotProduct.js","../lib-esm/x/xCrossCorrelation.js","../lib-esm/x/xCumulative.js","../lib-esm/x/xFindClosestIndex.js","../lib-esm/x/xGetFromToIndex.js","../lib-esm/x/xGetTargetIndex.js","../node_modules/ml-array-sequential-fill/node_modules/is-any-array/src/index.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../lib-esm/x/xCheck.js","../lib-esm/x/xMaxValue.js","../lib-esm/x/xMinValue.js","../lib-esm/x/xHistogram.js","../lib-esm/x/xIsMonotone.js","../node_modules/d3-array/build/d3-array.js","../node_modules/spline-interpolator/index.js","../lib-esm/x/erfcinv.js","../lib-esm/x/rayleighCdf.js","../lib-esm/x/xNoiseSanPlot.js","../node_modules/ml-array-variance/node_modules/is-any-array/src/index.js","../node_modules/ml-array-sum/node_modules/is-any-array/src/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-array-variance/lib-es6/index.js","../lib-esm/x/xPadding.js","../lib-esm/x/xRotate.js","../lib-esm/x/xRolling.js","../lib-esm/x/xRollingAverage.js","../node_modules/ml-array-min/node_modules/is-any-array/src/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/node_modules/is-any-array/src/index.js","../node_modules/ml-array-max/lib-es6/index.js","../lib-esm/reim/reimAbsolute.js","../lib-esm/reim/reimPhaseCorrection.js","../lib-esm/reim/reimAutoPhaseCorrection.js","../node_modules/fft.js/lib/fft.js","../lib-esm/reim/reimFFT.js","../lib-esm/xy/xyCheck.js","../lib-esm/xy/xyJoinX.js","../lib-esm/xyArray/utils/getSlots.js","../lib-esm/xyArray/xyArrayWeightedMerge.js","../lib-esm/xyArray/utils/getSlotsToFirst.js","../lib-esm/xy/xyMaxYPoint.js","../lib-esm/xy/xyCumulativeDistributionStatistics.js","../lib-esm/zones/zonesNormalize.js","../lib-esm/xy/xySortX.js","../lib-esm/xy/xyUniqueX.js","../lib-esm/xyObject/xyObjectCheck.js","../lib-esm/xyObject/xyObjectMaxXPoint.js","../lib-esm/xyObject/xyObjectMinXPoint.js","../lib-esm/matrix/matrixMinMaxAbsoluteZ.js","../lib-esm/matrix/matrixMinMaxZ.js","../node_modules/ml-array-rescale/node_modules/is-any-array/src/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/matrixClone.js","../node_modules/ml-matrix/src/mathOperations.js","../lib-esm/utils/createSequentialArray.js","../lib-esm/matrix/matrixApplyNumericalEncoding.js","../lib-esm/matrix/matrixCenterZMean.js","../lib-esm/matrix/matrixHistogram.js","../lib-esm/matrix/matrixNumericalDecoding.js","../lib-esm/matrix/matrixNumericalEncoding.js","../lib-esm/matrix/matrixPQN.js","../lib-esm/matrix/matrixZRescale.js","../lib-esm/x/xAbsoluteMedian.js","../lib-esm/x/xAdd.js","../lib-esm/x/xAutoCorrelation.js","../lib-esm/x/xBoxPlot.js","../lib-esm/x/xCorrelation.js","../lib-esm/x/xDivide.js","../lib-esm/x/xMaxIndex.js","../lib-esm/x/xMean.js","../lib-esm/x/xMeanAbsoluteError.js","../lib-esm/x/xMeanSquaredError.js","../lib-esm/x/xMinIndex.js","../lib-esm/x/xMinMaxValues.js","../lib-esm/x/xNorm.js","../lib-esm/x/xParetoNormalization.js","../node_modules/ml-array-standard-deviation/lib-es6/index.js","../lib-esm/x/xRollingMax.js","../lib-esm/x/xRollingMedian.js","../lib-esm/x/xRollingMin.js","../lib-esm/x/xSubtract.js","../lib-esm/x/xSum.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/xyEnsureGrowingX.js","../lib-esm/xy/xyExtract.js","../lib-esm/xy/xyFilterXPositive.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/xyMaxY.js","../lib-esm/xy/xyMaximaY.js","../lib-esm/xy/xyMedian.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/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/xyToXYArray.js","../lib-esm/xy/xyToXYObject.js","../lib-esm/zone/zoneToX.js"],"sourcesContent":["/**\n * This function returns an array with absolute values\n *\n * @param array - array of number\n * @returns - absolute array\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\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","(function(){function a(d){for(var e=0,f=d.length-1,g=void 0,h=void 0,i=void 0,j=c(e,f);!0;){if(f<=e)return d[j];if(f==e+1)return d[e]>d[f]&&b(d,e,f),d[j];for(g=c(e,f),d[g]>d[f]&&b(d,g,f),d[e]>d[f]&&b(d,e,f),d[g]>d[e]&&b(d,g,e),b(d,g,e+1),h=e+1,i=f;!0;){do h++;while(d[e]>d[h]);do i--;while(d[i]>d[e]);if(i<h)break;b(d,h,i)}b(d,e,i),i<=j&&(e=h),i>=j&&(f=i-1)}}var b=function b(d,e,f){var _ref;return _ref=[d[f],d[e]],d[e]=_ref[0],d[f]=_ref[1],_ref},c=function c(d,e){return~~((d+e)/2)};'undefined'!=typeof module&&module.exports?module.exports=a:window.median=a})();\n","import isArray from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n\nfunction median(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  return quickSelectMedian(input.slice());\n}\n\nexport default median;\n","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 * 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 - the array that will be rotated\n * @param array2 - second array\n */\nexport function xMultiply(array1, array2) {\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 = 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=xMultiply.js.map","import { xMultiply } from './xMultiply';\n/**\n * XDotProduct.\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 vectors\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 * Calculate a new array of the same size that is the cumulative values\n *\n * @param array - DoubleArray\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 < 1)\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 > 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","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n/**\n * Fill an array with sequential numbers\n * @param {Array<number>} [input] - optional destination array (if not provided a new array will be created)\n * @param {object} [options={}]\n * @param {number} [options.from=0] - first value in the array\n * @param {number} [options.to=10] - last value in the array\n * @param {number} [options.size=input.length] - size of the array (if not provided calculated from step)\n * @param {number} [options.step] - if not provided calculated from size\n * @return {Array<number>}\n */\n\nfunction sequentialFill() {\n  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (_typeof(input) === 'object' && !isArray(input)) {\n    options = input;\n    input = [];\n  }\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options = options,\n      _options$from = _options.from,\n      from = _options$from === void 0 ? 0 : _options$from,\n      _options$to = _options.to,\n      to = _options$to === void 0 ? 10 : _options$to,\n      _options$size = _options.size,\n      size = _options$size === void 0 ? input.length : _options$size,\n      step = _options.step;\n\n  if (size !== 0 && step) {\n    throw new Error('step is defined by the array size');\n  }\n\n  if (!size) {\n    if (step) {\n      size = Math.floor((to - from) / step) + 1;\n    } else {\n      size = to - from + 1;\n    }\n  }\n\n  if (!step && size) {\n    step = (to - from) / (size - 1);\n  }\n\n  if (Array.isArray(input)) {\n    // only works with normal array\n    input.length = 0;\n\n    for (var i = 0; i < size; i++) {\n      input.push(from);\n      from += step;\n    }\n  } else {\n    if (input.length !== size) {\n      throw new Error('sequentialFill typed array must have the correct length');\n    }\n\n    for (var _i = 0; _i < size; _i++) {\n      input[_i] = from;\n      from += step;\n    }\n  }\n\n  return input;\n}\n\nexport { sequentialFill as default };\n","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is valdi\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/**\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=xCheck.js.map","import { xCheck } from './xCheck';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of number\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex = 0, toIndex = array.length - 1 } = 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';\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 = 0, toIndex = array.length - 1 } = 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 fill from 'ml-array-sequential-fill';\nimport { xAbsolute } from './xAbsolute';\nimport { xCheck } from './xCheck';\nimport { xMaxValue } from './xMaxValue';\nimport { xMinValue } from './xMinValue';\n/**\n * Calculates an 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        ? fill({\n            from: min + (centerX ? slotSize / 2 : 0),\n            to: max - (centerX ? slotSize / 2 : 0),\n            size: nbSlots,\n        })\n        : histogram.x;\n    array.forEach((element) => {\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","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.d3_array = {})));\n}(this, function (exports) { 'use strict';\n\n  function ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n\n  function bisector(compare) {\n    if (compare.length === 1) compare = ascendingComparator(compare);\n    return {\n      left: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1;\n          else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid;\n          else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n\n  function ascendingComparator(f) {\n    return function(d, x) {\n      return ascending(f(d), x);\n    };\n  }\n\n  var ascendingBisect = bisector(ascending);\n  var bisectRight = ascendingBisect.right;\n  var bisectLeft = ascendingBisect.left;\n\n  function descending(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  }\n\n  function number$1(x) {\n    return x === null ? NaN : +x;\n  }\n\n  function variance(array, f) {\n    var n = array.length,\n        m = 0,\n        a,\n        d,\n        s = 0,\n        i = -1,\n        j = 0;\n\n    if (f == null) {\n      while (++i < n) {\n        if (!isNaN(a = number$1(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    else {\n      while (++i < n) {\n        if (!isNaN(a = number$1(f(array[i], i, array)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    if (j > 1) return s / (j - 1);\n  }\n\n  function deviation(array, f) {\n    var v = variance(array, f);\n    return v ? Math.sqrt(v) : v;\n  }\n\n  function extent(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b,\n        c;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    return [a, c];\n  }\n\n  function constant(x) {\n    return function() {\n      return x;\n    };\n  }\n\n  function identity(x) {\n    return x;\n  }\n\n  function range(start, stop, step) {\n    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n    var i = -1,\n        n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n        range = new Array(n);\n\n    while (++i < n) {\n      range[i] = start + i * step;\n    }\n\n    return range;\n  }\n\n  var e10 = Math.sqrt(50);\n  var e5 = Math.sqrt(10);\n  var e2 = Math.sqrt(2);\n  function ticks(start, stop, count) {\n    var step = tickStep(start, stop, count);\n    return range(\n      Math.ceil(start / step) * step,\n      Math.floor(stop / step) * step + step / 2, // inclusive\n      step\n    );\n  }\n\n  function tickStep(start, stop, count) {\n    var step0 = Math.abs(stop - start) / Math.max(0, count),\n        step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n        error = step0 / step1;\n    if (error >= e10) step1 *= 10;\n    else if (error >= e5) step1 *= 5;\n    else if (error >= e2) step1 *= 2;\n    return stop < start ? -step1 : step1;\n  }\n\n  function sturges(values) {\n    return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n  }\n\n  function number(x) {\n    return +x;\n  }\n\n  function histogram() {\n    var value = identity,\n        domain = extent,\n        threshold = sturges;\n\n    function histogram(data) {\n      var i,\n          n = data.length,\n          x,\n          values = new Array(n);\n\n      // Coerce values to numbers.\n      for (i = 0; i < n; ++i) {\n        values[i] = +value(data[i], i, data);\n      }\n\n      var xz = domain(values),\n          x0 = +xz[0],\n          x1 = +xz[1],\n          tz = threshold(values, x0, x1);\n\n      // Convert number of thresholds into uniform thresholds.\n      if (!Array.isArray(tz)) tz = ticks(x0, x1, +tz);\n\n      // Coerce thresholds to numbers, ignoring any outside the domain.\n      var m = tz.length;\n      for (i = 0; i < m; ++i) tz[i] = +tz[i];\n      while (tz[0] <= x0) tz.shift(), --m;\n      while (tz[m - 1] >= x1) tz.pop(), --m;\n\n      var bins = new Array(m + 1),\n          bin;\n\n      // Initialize bins.\n      for (i = 0; i <= m; ++i) {\n        bin = bins[i] = [];\n        bin.x0 = i > 0 ? tz[i - 1] : x0;\n        bin.x1 = i < m ? tz[i] : x1;\n      }\n\n      // Assign data to bins by value, ignoring any outside the domain.\n      for (i = 0; i < n; ++i) {\n        x = values[i];\n        if (x0 <= x && x <= x1) {\n          bins[bisectRight(tz, x, 0, m)].push(data[i]);\n        }\n      }\n\n      return bins;\n    }\n\n    histogram.value = function(_) {\n      return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), histogram) : value;\n    };\n\n    histogram.domain = function(_) {\n      return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), histogram) : domain;\n    };\n\n    histogram.thresholds = function(_) {\n      if (!arguments.length) return threshold;\n      threshold = typeof _ === \"function\" ? _\n          : Array.isArray(_) ? constant(Array.prototype.map.call(_, number))\n          : constant(+_);\n      return histogram;\n    };\n\n    return histogram;\n  }\n\n  function quantile(array, p, f) {\n    if (f == null) f = number$1;\n    if (!(n = array.length)) return;\n    if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array);\n    if (p >= 1) return +f(array[n - 1], n - 1, array);\n    var n,\n        h = (n - 1) * p,\n        i = Math.floor(h),\n        a = +f(array[i], i, array),\n        b = +f(array[i + 1], i + 1, array);\n    return a + (b - a) * (h - i);\n  }\n\n  function freedmanDiaconis(values, min, max) {\n    values.sort(ascending);\n    return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function scott(values, min, max) {\n    return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function max(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b;\n    }\n\n    return a;\n  }\n\n  function mean(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1,\n        j = n;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) s += a; else --j;\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) s += a; else --j;\n    }\n\n    if (j) return s / j;\n  }\n\n  function median(array, f) {\n    var numbers = [],\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) numbers.push(a);\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) numbers.push(a);\n    }\n\n    return quantile(numbers.sort(ascending), 0.5);\n  }\n\n  function merge(arrays) {\n    var n = arrays.length,\n        m,\n        i = -1,\n        j = 0,\n        merged,\n        array;\n\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n\n    return merged;\n  }\n\n  function min(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b;\n    }\n\n    return a;\n  }\n\n  function pairs(array) {\n    var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [p, p = array[++i]];\n    return pairs;\n  }\n\n  function permute(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  }\n\n  function scan(array, compare) {\n    if (!(n = array.length)) return;\n    var i = 0,\n        n,\n        j = 0,\n        xi,\n        xj = array[j];\n\n    if (!compare) compare = ascending;\n\n    while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i;\n\n    if (compare(xj, xj) === 0) return j;\n  }\n\n  function shuffle(array, i0, i1) {\n    var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n        t,\n        i;\n\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0];\n      array[m + i0] = array[i + i0];\n      array[i + i0] = t;\n    }\n\n    return array;\n  }\n\n  function sum(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent.\n    }\n\n    else {\n      while (++i < n) if (a = +f(array[i], i, array)) s += a;\n    }\n\n    return s;\n  }\n\n  function transpose(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  }\n\n  function length(d) {\n    return d.length;\n  }\n\n  function zip() {\n    return transpose(arguments);\n  }\n\n  var version = \"0.7.1\";\n\n  exports.version = version;\n  exports.bisect = bisectRight;\n  exports.bisectRight = bisectRight;\n  exports.bisectLeft = bisectLeft;\n  exports.ascending = ascending;\n  exports.bisector = bisector;\n  exports.descending = descending;\n  exports.deviation = deviation;\n  exports.extent = extent;\n  exports.histogram = histogram;\n  exports.thresholdFreedmanDiaconis = freedmanDiaconis;\n  exports.thresholdScott = scott;\n  exports.thresholdSturges = sturges;\n  exports.max = max;\n  exports.mean = mean;\n  exports.median = median;\n  exports.merge = merge;\n  exports.min = min;\n  exports.pairs = pairs;\n  exports.permute = permute;\n  exports.quantile = quantile;\n  exports.range = range;\n  exports.scan = scan;\n  exports.shuffle = shuffle;\n  exports.sum = sum;\n  exports.ticks = ticks;\n  exports.tickStep = tickStep;\n  exports.transpose = transpose;\n  exports.variance = variance;\n  exports.zip = zip;\n\n}));","const {bisectRight} = require('d3-array')\n\nconst quincunx = (u, v, w, q) => {\n  const n = u.length - 1\n\n  u[0] = 0\n  v[0] = 0\n  w[0] = 0\n  v[1] = v[1] / u[1]\n  w[1] = w[1] / u[1]\n  for (let i = 2; i < n; ++i) {\n    u[i] = u[i] - u[i - 2] * w[i - 2] * w[i - 2] - u[i - 1] * v[i - 1] * v[i - 1]\n    v[i] = (v[i] - u[i - 1] * v[i - 1] * w[i - 1]) / u[i]\n    w[i] = w[i] / u[i]\n  }\n\n  for (let i = 2; i < n; ++i) {\n    q[i] = q[i] - v[i - 1] * q[i - 1] - w[i - 2] * q[i - 2]\n  }\n  for (let i = 1; i < n; ++i) {\n    q[i] = q[i] / u[i]\n  }\n\n  q[n - 2] = q[n - 2] - v[n - 2] * q[n - 1]\n  for (let i = n - 3; i > 0; --i) {\n    q[i] = q[i] - v[i] * q[i + 1] - w[i] * q[i + 2]\n  }\n}\n\nconst smoothingSpline = (x, y, sigma, lambda) => {\n  const n = x.length - 1\n  const h = new Array(n + 1)\n  const r = new Array(n + 1)\n  const f = new Array(n + 1)\n  const p = new Array(n + 1)\n  const q = new Array(n + 1)\n  const u = new Array(n + 1)\n  const v = new Array(n + 1)\n  const w = new Array(n + 1)\n  const params = x.map(() => [0, 0, 0, 0])\n  params.pop()\n\n  const mu = 2 * (1 - lambda) / (3 * lambda)\n  for (let i = 0; i < n; ++i) {\n    h[i] = x[i + 1] - x[i]\n    r[i] = 3 / h[i]\n  }\n  q[0] = 0\n  for (let i = 1; i < n; ++i) {\n    f[i] = -(r[i - 1] + r[i])\n    p[i] = 2 * (x[i + 1] - x[i - 1])\n    q[i] = 3 * (y[i + 1] - y[i]) / h[i] - 3 * (y[i] - y[i - 1]) / h[i - 1]\n  }\n  q[n] = 0\n\n  for (let i = 1; i < n; ++i) {\n    u[i] = r[i - 1] * r[i - 1] * sigma[i - 1] + f[i] * f[i] * sigma[i] + r[i] * r[i] * sigma[i + 1]\n    u[i] = mu * u[i] + p[i]\n  }\n  for (let i = 1; i < n - 1; ++i) {\n    v[i] = f[i] * r[i] * sigma[i] + r[i] * f[i + 1] * sigma[i + 1]\n    v[i] = mu * v[i] + h[i]\n  }\n  for (let i = 1; i < n - 2; ++i) {\n    w[i] = mu * r[i] * r[i + 1] * sigma[i + 1]\n  }\n\n  quincunx(u, v, w, q)\n\n  params[0][3] = y[0] - mu * r[0] * q[1] * sigma[0]\n  params[1][3] = y[1] - mu * (f[1] * q[1] + r[1] * q[2]) * sigma[0]\n  params[0][0] = q[1] / (3 * h[0])\n  params[0][1] = 0\n  params[0][2] = (params[1][3] - params[0][3]) / h[0] - q[1] * h[0] / 3\n  r[0] = 0\n  for (let i = 1; i < n; ++i) {\n    params[i][0] = (q[i + 1] - q[i]) / (3 * h[i])\n    params[i][1] = q[i]\n    params[i][2] = (q[i] + q[i - 1]) * h[i - 1] + params[i - 1][2]\n    params[i][3] = r[i - 1] * q[i - 1] + f[i] * q[i] + r[i] * q[i + 1]\n    params[i][3] = y[i] - mu * params[i][3] * sigma[i]\n  }\n  return params\n}\n\nclass SplineInterpolator {\n  constructor (xIn, yIn, lambda = 1) {\n    const indices = xIn.map((_, i) => i)\n    indices.sort((i, j) => xIn[i] - xIn[j])\n    const x = indices.map((i) => xIn[i])\n    const y = indices.map((i) => yIn[i])\n    const n = indices.length\n    const sigma = indices.map(() => 1)\n    this.n = n\n    this.x = x\n    this.y = y\n    this.params = smoothingSpline(x, y, sigma, lambda)\n  }\n\n  interpolate (v) {\n    if (v === this.x[this.n - 1]) {\n      return this.y[this.n - 1]\n    }\n    const i = Math.min(Math.max(0, bisectRight(this.x, v) - 1), this.n - 2)\n    const [a, b, c, d] = this.params[i]\n    v = v - this.x[i]\n    return a * v * v * v + b * v * v + c * v + d\n  }\n\n  max (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let maxValue = -Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y > maxValue) {\n        maxValue = y\n      }\n    }\n    return maxValue\n  }\n\n  min (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let minValue = Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y < minValue) {\n        minValue = y\n      }\n    }\n    return minValue\n  }\n\n  domain () {\n    return [this.x[0], this.x[this.x.length - 1]]\n  }\n\n  range () {\n    return [this.min(), this.max()]\n  }\n\n  curve (nInterval, domain = null) {\n    domain = domain || this.domain()\n    const delta = (domain[1] - domain[0]) / (nInterval - 1)\n    const vals = new Array(nInterval)\n    for (let i = 0; i < nInterval; ++i) {\n      const x = delta * i + domain[0]\n      vals[i] = [x, this.interpolate(x)]\n    }\n    return vals\n  }\n}\n\nmodule.exports = SplineInterpolator\n","/* eslint-disable @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 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 - Number.\n * @param sigma - Number.\n * @returns Number.\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 fill from 'ml-array-sequential-fill';\n// @ts-expect-error javascript package used\nimport SplineInterpolator from 'spline-interpolator';\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 data - real or magnitude spectra data.\n * @param options - options\n */\nexport function xNoiseSanPlot(data, 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 === data.length) {\n        input = new Float64Array(data.filter((_e, i) => !mask[i]));\n    }\n    else {\n        input = new Float64Array(data);\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        elementsOfCutOff.forEach((element) => {\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 = 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    let result = new Array(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 = fill({\n        from: 0,\n        to: array.length - 1,\n        size: array.length,\n    });\n    return { x: xAxis, y: array };\n}\n//# sourceMappingURL=xNoiseSanPlot.js.map","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction sum(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport default sum;\n","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport default mean;\n","import isArray from 'is-any-array';\nimport arrayMean from 'ml-array-mean';\n\nfunction variance(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(values)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options$unbiased = options.unbiased,\n      unbiased = _options$unbiased === void 0 ? true : _options$unbiased,\n      _options$mean = options.mean,\n      mean = _options$mean === void 0 ? arrayMean(values) : _options$mean;\n  var sqrError = 0;\n\n  for (var i = 0; i < values.length; i++) {\n    var x = values[i] - mean;\n    sqrError += x * x;\n  }\n\n  if (unbiased) {\n    return sqrError / (values.length - 1);\n  } else {\n    return sqrError / values.length;\n  }\n}\n\nexport { variance as default };\n","import { xCheck } from './xCheck';\n/**\n * This function pads an array\n *\n *\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 Error('xPadding: unknown algorithm');\n    }\n    return result;\n}\n//# sourceMappingURL=xPadding.js.map","/**\n * This function performs a circular shift to a new array\n * Positive values of shifts will shift to the right and negative values will do to the left\n *\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 - the array that will be rotated\n * @param shift - number\n * @returns - array of float\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 { xCheck } from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\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 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        let subArray = new Float64Array(array.buffer, i * 8, window);\n        // we will send a view to the original buffer\n        newArray.push(fct(subArray));\n    }\n    return newArray;\n}\n//# sourceMappingURL=xRolling.js.map","import mean from 'ml-array-mean';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - option\n */\nexport function xRollingAverage(array, options = {}) {\n    return xRolling(array, mean, options);\n}\n//# sourceMappingURL=xRollingAverage.js.map","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport default min;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","/**\n * Calculates reimAbsolute value of a complex spectrum\n *\n * @param data - DATA\n * @returns - array of float\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","/**\n * Phase correction filter\n *\n * @param data DataReIm\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 - DataReim.\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 Array(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 Array(s.length);\n    for (let i = 0; i < s.length; i++) {\n        mask[i] = false;\n    }\n    let change = true;\n    while (change) {\n        let noiseLevel = xNoiseSanPlot(s, { magnitudeMode });\n        let cutOff = factorNoise * noiseLevel.positive;\n        change = false;\n        for (let i = 0; i < s.length; i++) {\n            if (Math.abs(s[i]) > cutOff && !mask[i]) {\n                change = true;\n                mask[i] = true;\n            }\n        }\n    }\n    // Clean up mask by merging peaks blocks, separated by just a few points(4??).\n    let count = 0;\n    let prev = 0;\n    for (let i = 0; i < s.length; i++) {\n        if (!mask[i]) {\n            count++;\n        }\n        else {\n            if (count < maxDistanceToJoin) {\n                for (let j = 0; j <= count; j++) {\n                    mask[prev + j] = true;\n                }\n            }\n            while (mask[++i] && i < s.length)\n                ;\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    data.forEach((element) => {\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","import FFT from 'fft.js';\nimport { xRotate } from '../x/xRotate';\n/**\n * ReimFFT.\n *\n * @param data - DataReim.\n * @param options - Options.\n * @returns DataReim.\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","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 = {}) {\n    if (!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 mush have the same length');\n    }\n}\n//# sourceMappingURL=xyCheck.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","/**\n * GetSlots.\n *\n * @param spectra - Spectra.\n * @param options - Options.\n */\nexport function getSlots(spectra, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let possibleXs = Float64Array.from([].concat(...spectra.map((spectrum) => spectrum.x))).sort();\n    if (possibleXs.length < 1) {\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 spectra - spectra\n * @param options - Options\n */\nexport function xyArrayWeightedMerge(spectra, options = {}) {\n    let { delta = 1 } = options;\n    if (typeof delta === 'number') {\n        let deltaNumber = delta;\n        delta = () => deltaNumber;\n    }\n    spectra = spectra.filter((spectrum) => spectrum.x.length > 0);\n    if (spectra.length === 0)\n        return { x: [], y: [] };\n    let x = [];\n    let y = [];\n    const positions = new Array(spectra.length).fill(0);\n    const point = { x: 0, y: 0 };\n    nextValue(spectra, 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 (spectra.length !== 0) {\n        nextValue(spectra, 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 (spectra.length === 0) {\n            if (slot.sumY > 0) {\n                x.push(slot.sumXY / slot.sumY);\n                y.push(slot.sumY);\n            }\n        }\n    }\n    return { x, y };\n}\n/**\n * NextValue.\n *\n * @param spectra - Spectra.\n * @param positions - Positions array.\n * @param point - Point.\n */\nfunction nextValue(spectra, positions, point) {\n    let minIndex = 0;\n    let minX = spectra[0].x[positions[0]];\n    for (let i = 1; i < spectra.length; i++) {\n        let currentX = spectra[i].x[positions[i]];\n        if (currentX < minX) {\n            minX = currentX;\n            minIndex = i;\n        }\n    }\n    point.x = minX;\n    point.y = spectra[minIndex].y[positions[minIndex]];\n    positions[minIndex]++;\n    if (positions[minIndex] === spectra[minIndex].x.length) {\n        positions.splice(minIndex, 1);\n        spectra.splice(minIndex, 1);\n    }\n}\n//# sourceMappingURL=xyArrayWeightedMerge.js.map","import { xyArrayWeightedMerge } from '../xyArrayWeightedMerge';\n/**\n * GetSlotsToFirst.\n *\n * @param spectra - Spectra.\n * @param options - Options.\n */\nexport function getSlotsToFirst(spectra, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let firstXs = spectra[0].x;\n    let slots = [];\n    // we first create the slots based on the first spectrum\n    firstXs.forEach((element) => {\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(spectra.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","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);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 2) {\n        return { x: 0, 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 max from 'ml-array-max';\nimport { xCumulative } from '../x/xCumulative';\nimport { xyCheck } from './xyCheck';\nimport { xyMaxYPoint } from './xyMaxYPoint';\nconst STEPS = [0.25, 0.5, 0.75];\n/**\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 = max(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 *\n * @param zones - array of zones\n * @param options - Options\n * @returns array of zones\n */\nexport function zonesNormalize(zones = [], options = {}) {\n    if (zones.length === 0)\n        return [];\n    zones = JSON.parse(JSON.stringify(zones)).map((zone) => zone.from > zone.to ? { from: zone.to, to: zone.from } : zone);\n    let { from = Number.NEGATIVE_INFINITY, to = Number.POSITIVE_INFINITY } = options;\n    if (from > to) {\n        [from, to] = [to, from];\n    }\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    zones.forEach((zone) => {\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 result = [currentZone];\n    for (let zone of zones) {\n        if (zone.from <= currentZone.to) {\n            currentZone.to = zone.to;\n        }\n        else {\n            currentZone = zone;\n            result.push(currentZone);\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=zonesNormalize.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    // no need to sort if it is already sorted\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 * 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 < 1)\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 < 1)\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 * 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        return { min: undefined, max: undefined };\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","/**\n * Get min and max Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMinMaxZ(matrix) {\n    if (matrix.length === 0 || matrix[0].length === 0) {\n        return { min: undefined, max: undefined };\n    }\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","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { 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 { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkIndices,\n  checkNonEmpty,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\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    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","/**\n * Creates a clone of a matrix\n * @param options - Options\n * @param options.from - from\n * @param options.to - to\n * @param options.length - length\n * @returns - array of floats\n */\nexport function matrixClone(matrix) {\n    return matrix.map((row) => row.slice(0));\n}\n//# sourceMappingURL=matrixClone.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","/**\n * Create an array with sequential numbers between from and to of length\n *\n * @param options - Options\n * @param options.from - from\n * @param options.to - to\n * @param options.length - length\n * @returns - array of floats\n */\nexport function createSequentialArray(options = {}) {\n    const { from = 0, to = 1, length = 1000 } = options;\n    const array = new Float64Array(length);\n    let step = (to - from) / (array.length - 1);\n    for (let i = 0; i < array.length; i++) {\n        array[i] = from + step * i;\n    }\n    return array;\n}\n//# sourceMappingURL=createSequentialArray.js.map","import max from 'ml-array-max';\nimport { matrixClone } from './matrixClone';\n/**\n * Numerically encodes the strings in the matrix with an encoding dictionary\n * @param array - 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    let matrix = matrixClone(matrixInitial);\n    let arrayOfValues = [];\n    for (let key in dictionnary) {\n        arrayOfValues.push(dictionnary[key]);\n    }\n    let k = max(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","/**\n * Center mean of columns\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixCenterZMean(matrix) {\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    const newMatrix = new Array(nbRows);\n    for (let row = 0; row < nbRows; row++) {\n        newMatrix[row] = new Float64Array(nbColumns);\n    }\n    for (let column = 0; column < nbColumns; column++) {\n        let mean = 0;\n        for (let row = 0; row < nbRows; row++) {\n            mean += matrix[row][column];\n        }\n        mean /= nbRows;\n        for (let row = 0; row < nbRows; row++) {\n            newMatrix[row][column] = matrix[row][column] - mean;\n        }\n    }\n    return newMatrix;\n}\n//# 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 } = 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 (options.min === undefined || options.max === undefined) {\n        const minMax = absolute\n            ? matrixMinMaxAbsoluteZ(matrix)\n            : matrixMinMaxZ(matrix);\n        if (options.min === undefined) {\n            options.min = logBaseX\n                ? Math.log(minMax.min) / Math.log(logBaseX)\n                : minMax.min;\n        }\n        if (options.max === undefined) {\n            options.max = logBaseX\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 { matrixClone } from './matrixClone';\n/**\n * Numerically decodes the matrix using the dictionnary\n * @param array - 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    let 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 * @returns - dictionnary from string to number\n */\nexport function matrixNumericalEncoding(matrixInitial) {\n    let 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 median from 'ml-array-median';\nimport { Matrix } from 'ml-matrix';\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 * data: Normalized dataset.\n * 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(median(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(median(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: medianOfQuotients,\n    };\n}\n//# sourceMappingURL=matrixPQN.js.map","/**\n * Rescale columns\n *\n * @param matrix - matrix [rows][cols].\n * @param options - Options\n */\nexport function matrixZRescale(matrix, options = {}) {\n    const { min = 0, max = 1 } = options;\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    const newMatrix = new Array(nbRows);\n    for (let row = 0; row < nbRows; row++) {\n        newMatrix[row] = new Float64Array(nbColumns);\n    }\n    for (let column = 0; column < nbColumns; column++) {\n        let currentMin = matrix[0][column];\n        let currentMax = matrix[0][column];\n        for (let row = 1; row < nbRows; row++) {\n            if (matrix[row][column] < currentMin)\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=matrixZRescale.js.map","import median from 'ml-array-median';\nimport { xAbsolute } from './xAbsolute';\n/**\n * This function calculates the median after taking the reimAbsolute values of the points\n *\n * @param array - the array that will be rotated\n * @returns - median\n */\nexport function xAbsoluteMedian(array) {\n    return median(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 array that will be rotated\n * @param array2 - the second array\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 = Number(array2);\n    }\n    let array3 = new Array(array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] + constant;\n        }\n    }\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","import { xCrossCorrelation } from './xCrossCorrelation';\n/**\n * Calculates the auto-correlation of a vector\n *\n * @param A - the array that will be fixed\n * @param options - Options\n */\nexport function xAutoCorrelation(A, options = {}) {\n    return xCrossCorrelation(A, A, options);\n}\n//# sourceMappingURL=xAutoCorrelation.js.map","/**\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 array - the array that will be rotated\n */\nexport function xBoxPlot(array) {\n    array = array.slice(0).sort((a, b) => a - b);\n    if (array.length < 5) {\n        throw Error('xBoxPlot: can not calculate info if array contains less than 3 elements');\n    }\n    let info = {\n        Q1: 0.0,\n        Q2: 0.0,\n        Q3: 0.0,\n        min: array[0],\n        max: array[array.length - 1],\n    };\n    let q1max, q3min;\n    if (array.length % 2 === 1) {\n        // odd\n        let middle = (array.length - 1) / 2;\n        info.Q2 = array[middle];\n        q1max = middle - 1;\n        q3min = middle + 1;\n    }\n    else {\n        // even\n        q3min = array.length / 2;\n        q1max = q3min - 1;\n        info.Q2 = (array[q1max] + array[q3min]) / 2;\n    }\n    if (q1max % 2 === 0) {\n        info.Q1 = array[q1max / 2];\n        info.Q3 = array[(array.length + q3min - 1) / 2];\n    }\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","/**\n * Calculates the correlation between 2 vectors\n * https://en.wikipedia.org/wiki/Correlation_and_dependence\n *\n * @param A - the array that will be rotated\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 * 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 - the array that will be rotated\n * @param array2 - second array or number\n *\n */\nexport function xDivide(array1, array2) {\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 = new Array(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 * Computes the index of the maximum of the given values\n *\n * @param array - array of numbers\n * @returns - indexe\n */\nexport function xMaxIndex(array) {\n    xCheck(array);\n    let maxIndex = 0;\n    for (let i = 1; i < array.length; i++) {\n        if (array[i] > array[maxIndex]) {\n            maxIndex = i;\n        }\n    }\n    return maxIndex;\n}\n//# sourceMappingURL=xMaxIndex.js.map","import { xCheck } from './xCheck';\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 xMean(array, options = {}) {\n    xCheck(array);\n    const { fromIndex = 0, toIndex = array.length - 1 } = 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","import { xCheckLengths } from './xCheck';\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 './xCheck';\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';\n/**\n * Computes the index of the minimum of the given values\n *\n * @param array - array of numbers\n */\nexport function xMinIndex(array) {\n    xCheck(array);\n    let minIndex = 0;\n    for (let i = 1; i < array.length; i++) {\n        if (array[i] < array[minIndex]) {\n            minIndex = i;\n        }\n    }\n    return minIndex;\n}\n//# sourceMappingURL=xMinIndex.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","/**\n * This function calculate the norm of a vector\n *\n * @example xNorm([3, 4]) -> 5\n * @param array - the array that will be rotated\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    array.forEach((element) => {\n        result += element ** 2;\n    });\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","import sd from 'ml-array-standard-deviation';\nimport { xCheck } from './xCheck';\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(sd(array));\n    for (let item of array) {\n        result.push(item / sqrtSD);\n    }\n    return result;\n}\n//# sourceMappingURL=xParetoNormalization.js.map","import variance from 'ml-array-variance';\n\nfunction standardDeviation(values) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return Math.sqrt(variance(values, options));\n}\n\nexport { standardDeviation as default };\n","import max from 'ml-array-max';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a maximum within a rolling window\n *\n * @param array - the array that will be rotated\n * @param options - options\n */\nexport function xRollingMax(array, options = {}) {\n    return xRolling(array, max, options);\n}\n//# sourceMappingURL=xRollingMax.js.map","import median from 'ml-array-median';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - options\n */\nexport function xRollingMedian(array, options = {}) {\n    return xRolling(array, median, options);\n}\n//# sourceMappingURL=xRollingMedian.js.map","import min from 'ml-array-min';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a minimum within a rolling window\n *\n * @param array - the array that will be rotated\n * @param options - options\n */\nexport function xRollingMin(array, options = {}) {\n    return xRolling(array, min, options);\n}\n//# sourceMappingURL=xRollingMin.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 */\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 Array(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","import { xCheck } from './xCheck';\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    const { fromIndex = 0, toIndex = array.length - 1 } = options;\n    xCheck(array);\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","/**\n * XUniqueSorted.\n *\n * @param array - Array of number.\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 - Data.\n */\nexport function xreimSortX(data) {\n    const { x, re, im } = data;\n    if (x.length !== re.length || x.length !== im.length) {\n        throw TypeError('xreimSortX: length of x, re and im must be identical');\n    }\n    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\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 spectra\n *\n * @param spectra - spectra\n * @param options - Options\n */\nexport function xyArrayAlign(spectra, options = {}) {\n    const { delta = 1 } = options;\n    // we start by checking that the spectra don't have peaks too close and we simplify them\n    spectra = spectra.map((spectrum) => xyJoinX(spectrum, { delta }));\n    const slots = getSlots(spectra, options);\n    let x = Float64Array.from(slots.map((slot) => slot.average));\n    let ys = new Array(spectra.length)\n        .fill(0)\n        .map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(spectra.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < spectra.length; j++) {\n            let spectrum = spectra[j];\n            while (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 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 specdtrum we will add them\n *\n * @param spectra spectra\n * @param options options\n */\nexport function xyArrayAlignToFirst(spectra, options = {}) {\n    const slots = getSlotsToFirst(spectra, options);\n    let x = Float64Array.from(slots.map((slot) => slot.value));\n    let ys = new Array(spectra.length)\n        .fill(0)\n        .map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(spectra.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < spectra.length; j++) {\n            let spectrum = spectra[j];\n            while (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 spectra - Spectra\n * @param options - Options\n */\nexport function xyArrayMerge(spectra, options = {}) {\n    const { delta = 1 } = options;\n    // we start by checking that the spectra don't have peaks too close and we simplify them\n    spectra = spectra.map((spectrum) => xyJoinX(spectrum, { delta }));\n    // at first we will calculate the X values (simple mean)\n    let slots = getSlots(spectra, options);\n    let x = Float64Array.from(slots.map((slot) => slot.average));\n    let y = new Float64Array(x.length);\n    let positions = new Uint32Array(spectra.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < spectra.length; j++) {\n            let spectrum = spectra[j];\n            while (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 { 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\n */\nexport function xyEnsureGrowingX(data) {\n    xyCheck(data);\n    if (data.x === undefined || data.y === undefined)\n        return data;\n    const x = Array.from(data.x);\n    const y = Array.from(data.y);\n    let prevX = -Infinity;\n    let ansX = [];\n    let ansY = [];\n    for (let index = 0; index < x.length; index++) {\n        if (prevX < x[index]) {\n            ansX.push(x[index]);\n            ansY.push(y[index]);\n            prevX = x[index];\n        }\n    }\n    return { x: ansX, y: ansY };\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 { 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 { 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 Array(numberMaxPoints);\n        let newY = new Array(numberMaxPoints);\n        // slice() is used to make a copy of the array, because sort() is IPM\n        let threshold = data.y.slice().sort((a, b) => b - a)[numberMaxPoints - 1];\n        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.\n * 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 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);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 2)\n        return 0;\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);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 2)\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","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    if (x === undefined || y === undefined || x.length < 2)\n        return 0;\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 * @param options - Options.\n * @returns - Array of points.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function xyMaximaY(data = {}, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 3)\n        return [];\n    let maxima = [];\n    let startEqualIndex = -1;\n    for (let i = 1; i < x.length - 1; i++) {\n        if (y[i - 1] < y[i] && y[i + 1] < y[i]) {\n            maxima.push({ x: x[i], y: y[i], index: i });\n        }\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 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 NaN;\n}\n//# sourceMappingURL=xyMedian.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 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 xyMinYPoint(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 2)\n        return 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 * @param options - Options.\n * @returns - Array of points.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function xyMinimaY(data, options = {}) {\n    xyCheck(data);\n    const { x, y } = data;\n    if (x === undefined || y === undefined || x.length < 3)\n        return [];\n    let maxima = [];\n    let startEqualIndex = -1;\n    for (let i = 1; i < x.length - 1; i++) {\n        if (y[i - 1] > y[i] && y[i + 1] > y[i]) {\n            maxima.push({ x: x[i], y: y[i], index: i });\n        }\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 *\n * Filter the array by taking the higher points (max y value) and only.\n * Keep one per slot.\n * There are 2 different slots, the smallest one will have the\n * new property `close` to true\n *\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 *\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 < 1)\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 < 1)\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 *\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.MIN_VALUE,\n        y: 0,\n    };\n    for (let point of points) {\n        let slot = point.x - ((point.x + halfSlot) % slotWidth) + halfSlot;\n        if (Math.abs(current.x - slot) > Number.EPSILON) {\n            current = {\n                x: slot,\n                y: 0,\n            };\n            result.push(current);\n        }\n        current.y += point.y;\n    }\n    return result;\n}\n//# 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","/**\n *\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) {\n        if (target !== undefined) {\n            targetIndex = xFindClosestIndex(x, target);\n        }\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    let totalPoints = 0;\n    for (let zone of zones) {\n        zone.fromIndex = xFindClosestIndex(x, zone.from);\n        zone.toIndex = xFindClosestIndex(x, zone.to);\n        if (zone.fromIndex > 0 && x[zone.fromIndex] > zone.from) {\n            zone.fromIndex--;\n        }\n        if (zone.toIndex < x.length - 1 && x[zone.toIndex] < zone.to) {\n            zone.toIndex++;\n        }\n        zone.nbPoints = zone.toIndex - zone.fromIndex + 1;\n        totalPoints += zone.nbPoints;\n    }\n    // we calculate the number of points per zone that we should keep\n    if (totalPoints > nbPoints) {\n        // need to xyReduce number of points\n        let ratio = nbPoints / totalPoints;\n        let currentTotal = 0;\n        for (let i = 0; i < zones.length - 1; i++) {\n            const zone = zones[i];\n            zone.nbPoints = Math.round(zone.nbPoints * ratio);\n            currentTotal += zone.nbPoints;\n        }\n        zones[zones.length - 1].nbPoints = nbPoints - currentTotal;\n    }\n    else {\n        let newX = new Float64Array(totalPoints);\n        let newY = new Float64Array(totalPoints);\n        let index = 0;\n        for (let zone of zones) {\n            for (let i = zone.fromIndex; i < zone.toIndex + 1; i++) {\n                newX[index] = x[i];\n                newY[index] = y[i];\n                index++;\n            }\n        }\n        return {\n            x: newX,\n            y: newY,\n        };\n    }\n    let newX = [];\n    let newY = [];\n    for (let zone of zones) {\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        let minY = Number.MAX_VALUE;\n        let xyMaxY = Number.MIN_VALUE;\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        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 *\n * This methods will recalculate the x values by using xRollingAverage\n *\n * @param points - 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(points, fct, options = {}) {\n    let { x, y } = points;\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 { 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 * ZoneToX.\n *\n * @param zone - 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":["xAbsolute","array","tmpArray","slice","i","length","toString","Object","prototype","a","d","e","f","g","h","j","c","b","_ref","module","exports","window","median","input","object","call","endsWith","TypeError","quickSelectMedian","isAnyArray","value","xMultiply","array1","array2","isConstant","constant","Error","Number","array3","Float64Array","xDotProduct","A","B","result","xCrossCorrelation","options","tau","lag","n","q","k","w","l","xCumulative","newArray","xFindClosestIndex","target","sorted","low","high","middle","Math","abs","index","diff","POSITIVE_INFINITY","currentDiff","xGetFromToIndex","x","fromIndex","toIndex","from","to","undefined","xGetTargetIndex","targetIndex","_typeof","obj","Symbol","iterator","constructor","sequentialFill","arguments","isArray","_options","_options$from","_options$to","_options$size","size","step","floor","Array","push","_i","xCheck","xCheckLengths","xMaxValue","maxValue","xMinValue","minValue","xHistogram","histogram","centerX","nbSlots","logBaseX","logBaseY","absolute","logOfBase","log10","min","max","slotSize","EPSILON","y","fill","forEach","element","xIsMonotone","ascending","NaN","bisector","compare","ascendingComparator","left","lo","hi","mid","right","ascendingBisect","bisectRight","bisectLeft","descending","number$1","variance","m","s","isNaN","deviation","v","sqrt","extent","identity","range","start","stop","ceil","e10","e5","e2","ticks","count","tickStep","step0","step1","pow","log","LN10","error","sturges","values","LN2","number","domain","threshold","data","xz","x0","x1","tz","shift","pop","bin","bins","_","thresholds","map","quantile","p","freedmanDiaconis","sort","scott","mean","numbers","merge","arrays","merged","pairs","permute","indexes","permutes","scan","xi","xj","shuffle","i0","i1","t","random","sum","transpose","matrix","row","zip","version","bisect","thresholdFreedmanDiaconis","thresholdScott","thresholdSturges","factory","require$$0","splineInterpolator","xIn","yIn","lambda","indices","sigma","params","r","u","mu","quincunx","smoothingSpline","interpolate","this","xStart","delta","Infinity","curve","nInterval","vals","P1","Q1","P2","Q2","P3","Q3","P4","Q4","P5","Q5","polyval","coef","calc","P","Q","Y","erfcinv","val","sign","RangeError","NEGATIVE_INFINITY","rayleighCdf","expm1","xNoiseSanPlot","mask","cutOff","refine","magnitudeMode","scaleFactor","factorStd","fixOffset","filter","_e","reverse","medianIndex","firstNegativeValueIndex","findIndex","lastPositiveValueIndex","initialNoiseLevelNegative","signPositive","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","xTraining","createArray","yTraining","factor","finalInput","interp","SplineInterpolator","yValue","SQRT2","key","scale","xAxis","sumValue","_options$unbiased","unbiased","_options$mean","arrayMean","sqrError","xPadding","algorithm","fromEnd","toEnd","toLowerCase","xRotate","set","xRolling","fct","padding","subArray","buffer","xRollingAverage","_options$fromIndex","_options$toIndex","isInteger","reimAbsolute","re","im","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","change","prev","weightedLinearRegression","sxtw","swx","sw","sxtwy","swy","detMx","inMx","degree","PI","FFT","_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","C","D","Ar","Ai","Br","Bi","Cr","Ci","Dr","Di","MAr","MAi","tableBr","tableBi","MBr","MBi","tableCr","tableCi","MCr","MCi","tableDr","tableDi","MDr","MDi","T0r","T0i","T1r","T1i","T2r","T2i","T3r","T3i","FAr","FAi","FCr","FCi","FBr","FBi","FDr","FDi","evenR","evenI","oddR","oddI","leftR","leftI","rightR","rightI","step2","step3","_singleRealTransform2","_singleRealTransform4","halfLen","hquarterLen","SFAr","SFAi","SFBr","SFBi","SA","SB","zeroShift","inverse","xyCheck","xyJoinX","deltaIsFunction","position","getSlots","spectra","possibleXs","concat","currentSlot","average","slots","currentDelta","xyArrayWeightedMerge","deltaNumber","positions","point","nextValue","slot","maxX","sumY","sumXY","minIndex","minX","currentX","splice","getSlotsToFirst","firstXs","otherXs","currentPosition","xyMaxYPoint","current","STEPS","zonesNormalize","zones","JSON","parse","stringify","zone","currentZone","xySortX","xyObject","response","cumulativeY","divider","xyObjectCheck","points","xyObjectMaxXPoint","xyObjectMinXPoint","matrixMinMaxAbsoluteZ","nbRows","nbColumns","column","matrixMinMaxZ","rescale","output","currentMin","currentMax","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","name","inspectData","rows","columns","maxI","maxJ","line","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","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","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","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","add","sub","scaleRows","scaleColumns","flipRows","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","addRow","removeColumn","newRow","addColumn","matrixClone","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cosh","exp","fround","log1p","log2","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","matrixInitial","dictionnary","arrayOfValues","minMax","invertedDictionnary","ret","swap","dictCategoricalToNumerical","matrixB","normalizationFactor","referenceSpectrum","currentVariable","medianOfQuotients","quotients","minRegSize","magnitudeData","ds","peaksDs","peaksSp","finalPeaks","reTmp","imTmp","ph1","applyZeroShift","csize","complexArray","q1max","q3min","info","middleOver","sumA","sumA2","sumB","sumB2","sumAB","sqrtSD","sd","item","Set","totalLength","newX","newRE","newIM","deltaX","data1","data2","common","y1","y2","length1","length2","maxDiff","difference","weightedX","ys","Uint32Array","maxY","x100","currentStep","breakPoint","xMode","xMean","prevX","ansX","ansY","newY","loop","numberMaxPoints","currentxyIntegral","xyIntegration","currentxyIntegration","previousIndex","MIN_SAFE_INTEGER","currentIndex","xyMaxY","currentxyMaxY","maxima","startEqualIndex","cumSumY","minY","numberCloseSlots","numberSlots","closeSlot","selected","monoisotopic","toReturn","peakLoop","close","existing","newPeak","xError","slotWidth","halfSlot","MIN_VALUE","entry","multiplier","newDiff","after","before","inflectionBefore","inflectionAfter","extrema","inflectionMiddle","width","gamma","nbPoints","optimize","totalPoints","ratio","currentTotal","appendFromTo","zoneNbPoints","MAX_VALUE","objectArray","isSorted"],"mappings":"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"}