{"version":3,"file":"ml-gsd.min.js","sources":["../node_modules/@lukeed/uuid/dist/index.mjs","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-savitzky-golay-generalized/lib-esm/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedian.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsEquallySpaced.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsMonotoneIncreasing.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xNoiseStandardDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedianAbsoluteDeviation.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/decompositions.js","../lib-esm/utils/optimizeTop.js","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/getShape1D.js","../node_modules/ml-spectra-fitting/lib-esm/shapes/getSumOfShapes.js","../node_modules/ml-spectra-fitting/lib-esm/util/assert.js","../node_modules/ml-spectra-fitting/lib-esm/util/internalPeaks/DefaultParameters.js","../node_modules/ml-spectra-fitting/lib-esm/util/internalPeaks/getInternalPeaks.js","../node_modules/ml-levenberg-marquardt/lib-esm/checkOptions.js","../node_modules/ml-levenberg-marquardt/lib-esm/errorCalculation.js","../node_modules/ml-levenberg-marquardt/lib-esm/step.js","../node_modules/ml-levenberg-marquardt/lib-esm/gradientFunction.js","../node_modules/ml-levenberg-marquardt/lib-esm/index.js","../node_modules/ml-spectra-fitting/lib-esm/util/selectMethod.js","../node_modules/ml-spectra-fitting/lib-esm/index.js","../lib-esm/utils/addMissingShape.js","../lib-esm/utils/groupPeaks.js","../lib-esm/post/optimizePeaksWithLogs.js","../lib-esm/post/optimizePeaks.js","../lib-esm/utils/addMissingIDs.js","../lib-esm/post/joinBroadPeaks.js","../lib-esm/post/broadenPeaks.js","../lib-esm/utils/setShape.js","../lib-esm/gsd.js"],"sourcesContent":["var IDX=256, HEX=[], BUFFER;\nwhile (IDX--) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\nexport function v4() {\n\tvar i=0, num, out='';\n\n\tif (!BUFFER || ((IDX + 16) > 256)) {\n\t\tBUFFER = Array(i=256);\n\t\twhile (i--) BUFFER[i] = 256 * Math.random() | 0;\n\t\ti = IDX = 0;\n\t}\n\n\tfor (; i < 16; i++) {\n\t\tnum = BUFFER[IDX + i];\n\t\tif (i==6) out += HEX[num & 15 | 64];\n\t\telse if (i==8) out += HEX[num & 63 | 128];\n\t\telse out += HEX[num];\n\n\t\tif (i & 1 && i > 1 && i < 11) out += '-';\n\t}\n\n\tIDX++;\n\treturn out;\n}\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 * Apply Savitzky Golay algorithm\n * @param [ys] Array of y values\n * @param [xs] Array of X or deltaX\n * @return  Array containing the new ys (same length)\n */\nexport function sgg(ys, xs, options = {}) {\n    let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n    if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n        throw new RangeError('Invalid window size (should be odd and at least 5 integer number)');\n    }\n    if (!isAnyArray(ys)) {\n        throw new TypeError('Y values must be an array');\n    }\n    if (typeof xs === 'undefined') {\n        throw new TypeError('X must be defined');\n    }\n    if (windowSize > ys.length) {\n        throw new RangeError(`Window size is higher than the data length ${windowSize}>${ys.length}`);\n    }\n    if (derivative < 0 || !Number.isInteger(derivative)) {\n        throw new RangeError('Derivative should be a positive integer');\n    }\n    if (polynomial < 1 || !Number.isInteger(polynomial)) {\n        throw new RangeError('Polynomial should be a positive integer');\n    }\n    if (polynomial >= 6) {\n        // eslint-disable-next-line no-console\n        console.warn('You should not use polynomial grade higher than 5 if you are' +\n            ' not sure that your data arises from such a model. Possible polynomial oscillation problems');\n    }\n    let half = Math.floor(windowSize / 2);\n    let np = ys.length;\n    let ans = new Float64Array(np);\n    let weights = fullWeights(windowSize, polynomial, derivative);\n    let hs = 0;\n    let constantH = true;\n    if (isAnyArray(xs)) {\n        constantH = false;\n    }\n    else {\n        hs = Math.pow(xs, derivative);\n    }\n    //For the borders\n    for (let i = 0; i < half; i++) {\n        let wg1 = weights[half - i - 1];\n        let wg2 = weights[half + i + 1];\n        let d1 = 0;\n        let d2 = 0;\n        for (let l = 0; l < windowSize; l++) {\n            d1 += wg1[l] * ys[l];\n            d2 += wg2[l] * ys[np - windowSize + l];\n        }\n        if (constantH) {\n            ans[half - i - 1] = d1 / hs;\n            ans[np - half + i] = d2 / hs;\n        }\n        else {\n            hs = getHs(xs, half - i - 1, half, derivative);\n            ans[half - i - 1] = d1 / hs;\n            hs = getHs(xs, np - half + i, half, derivative);\n            ans[np - half + i] = d2 / hs;\n        }\n    }\n    //For the internal points\n    let wg = weights[half];\n    for (let i = windowSize; i <= np; i++) {\n        let d = 0;\n        for (let l = 0; l < windowSize; l++)\n            d += wg[l] * ys[l + i - windowSize];\n        if (!constantH) {\n            hs = getHs(xs, i - half - 1, half, derivative);\n        }\n        ans[i - half - 1] = d / hs;\n    }\n    return ans;\n}\nfunction getHs(h, center, half, derivative) {\n    let hs = 0;\n    let count = 0;\n    for (let i = center - half; i < center + half; i++) {\n        if (i >= 0 && i < h.length - 1) {\n            hs += h[i + 1] - h[i];\n            count++;\n        }\n    }\n    return Math.pow(hs / count, derivative);\n}\nfunction gramPoly(i, m, k, s) {\n    let Grampoly = 0;\n    if (k > 0) {\n        Grampoly =\n            ((4 * k - 2) / (k * (2 * m - k + 1))) *\n                (i * gramPoly(i, m, k - 1, s) + s * gramPoly(i, m, k - 1, s - 1)) -\n                (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n                    gramPoly(i, m, k - 2, s);\n    }\n    else {\n        if (k === 0 && s === 0) {\n            Grampoly = 1;\n        }\n        else {\n            Grampoly = 0;\n        }\n    }\n    return Grampoly;\n}\nfunction genFact(a, b) {\n    let gf = 1;\n    if (a >= b) {\n        for (let j = a - b + 1; j <= a; j++) {\n            gf *= j;\n        }\n    }\n    return gf;\n}\nfunction weight(i, t, m, n, s) {\n    let sum = 0;\n    for (let k = 0; k <= n; k++) {\n        sum +=\n            (2 * k + 1) *\n                (genFact(2 * m, k) / genFact(2 * m + k + 1, k + 1)) *\n                gramPoly(i, m, k, 0) *\n                gramPoly(t, m, k, s);\n    }\n    return sum;\n}\n/**\n * @private\n * @param m  Number of points\n * @param n  Polynomial grade\n * @param s  Derivative\n */\nfunction fullWeights(m, n, s) {\n    let weights = new Array(m);\n    let np = Math.floor(m / 2);\n    for (let t = -np; t <= np; t++) {\n        weights[t + np] = new Float64Array(m);\n        for (let j = -np; j <= np; j++) {\n            weights[t + np][j + np] = weight(j, t, np, n, s);\n        }\n    }\n    return weights;\n}\n//# sourceMappingURL=index.js.map","(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 { isAnyArray } from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n/**\n * Calculates the median of an array\n *\n * @param input - Array containing values\n * @returns - median\n */\nexport function xMedian(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    // we need to slice because the order of elements is changed in the quickselect\n    // https://github.com/mad-gooze/median-quickselect\n    return quickSelectMedian(input.slice());\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","/**\n * Check if the values are separated always by the same difference\n *\n * @param array - Monotone growing array of number\n */\nexport function xIsEquallySpaced(array, options = {}) {\n    if (array.length < 3)\n        return true;\n    const { tolerance = 0.05 } = options;\n    let maxDx = 0;\n    let minDx = Number.MAX_SAFE_INTEGER;\n    for (let i = 0; i < array.length - 1; ++i) {\n        let absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\n */\nexport function xIsMonotoneIncreasing(array) {\n    if (array.length < 2) {\n        return true;\n    }\n    for (let i = 0; i < array.length - 1; i++) {\n        if (array[i] >= array[i + 1])\n            return false;\n    }\n    return true;\n}\n//# sourceMappingURL=xIsMonotoneIncreasing.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { xMedianAbsoluteDeviation } from '..';\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param array\n * @returns noise level corresponding to one standard deviation\n */\nexport function xNoiseStandardDeviation(array) {\n    const { mad, median } = xMedianAbsoluteDeviation(array);\n    return { sd: mad / 0.6744897501960817, mad, median };\n}\n//# sourceMappingURL=xNoiseStandardDeviation.js.map","import { xMedian } from './xMedian';\n/**\n * This function calculates the median absolute deviation (MAD)\n * https://en.wikipedia.org/wiki/Median_absolute_deviation\n * @param array\n */\nexport function xMedianAbsoluteDeviation(array) {\n    const median = xMedian(array);\n    const averageDeviations = new Float64Array(array.length);\n    for (let i = 0; i < array.length; i++) {\n        averageDeviations[i] = Math.abs(array[i] - median);\n    }\n    return {\n        median,\n        mad: xMedian(averageDeviations),\n    };\n}\n//# sourceMappingURL=xMedianAbsoluteDeviation.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { 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","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","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","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","/**\n * Correction of the x and y coordinates using a quadratic optimizations with the peak and its 3 closest neighbors to determine the true x,y values of the peak.\n * This process is done in place and is very fast.\n * @param data\n * @param peaks\n */\nexport function optimizeTop(data, peaks) {\n    const { x, y } = data;\n    for (const peak of peaks) {\n        let currentIndex = peak.index;\n        // The detected peak could be moved 1 or 2 units to left or right.\n        if (y[currentIndex - 1] >= y[currentIndex - 2] &&\n            y[currentIndex - 1] >= y[currentIndex]) {\n            currentIndex--;\n        }\n        else {\n            if (y[currentIndex + 1] >= y[currentIndex] &&\n                y[currentIndex + 1] >= y[currentIndex + 2]) {\n                currentIndex++;\n            }\n            else {\n                if (y[currentIndex - 2] >= y[currentIndex - 3] &&\n                    y[currentIndex - 2] >= y[currentIndex - 1]) {\n                    currentIndex -= 2;\n                }\n                else {\n                    if (y[currentIndex + 2] >= y[currentIndex + 1] &&\n                        y[currentIndex + 2] >= y[currentIndex + 3]) {\n                        currentIndex += 2;\n                    }\n                }\n            }\n        }\n        // interpolation to a sin() function\n        if (y[currentIndex - 1] > 0 &&\n            y[currentIndex + 1] > 0 &&\n            y[currentIndex] >= y[currentIndex - 1] &&\n            y[currentIndex] >= y[currentIndex + 1] &&\n            (y[currentIndex] !== y[currentIndex - 1] ||\n                y[currentIndex] !== y[currentIndex + 1])) {\n            let alpha = 20 * Math.log10(y[currentIndex - 1]);\n            let beta = 20 * Math.log10(y[currentIndex]);\n            let gamma = 20 * Math.log10(y[currentIndex + 1]);\n            let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n            peak.x = x[currentIndex] + (x[currentIndex] - x[currentIndex - 1]) * p;\n            peak.y =\n                y[currentIndex] -\n                    0.25 * (y[currentIndex - 1] - y[currentIndex + 1]) * p;\n        }\n    }\n}\n//# sourceMappingURL=optimizeTop.js.map","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        return 0;\n    let ln1MinusXSqrd = Math.log(1 - x * x);\n    let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nexport class Gaussian {\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport function calculateGaussianHeight(options) {\n    let { fwhm = 500, area = 1, sd } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\n/**\n * Calculate the height of the gaussian function of a specific width (fwhm) at a speicifc\n * x position (the gaussian is centered on x=0)\n * @param x\n * @param fwhm\n * @returns y\n */\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\nexport function getGaussianArea(options) {\n    let { fwhm = 500, sd, height = 1 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\nexport function getGaussianFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\nexport function getGaussianData(shape = {}, options = {}) {\n    let { fwhm = 500, sd } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    let { length, factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = gaussianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","import { ROOT_THREE } from '../../../util/constants';\nexport class Lorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2);\n};\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    const quantileFunction = (p) => Math.tan(Math.PI * (p - 0.5));\n    return ((quantileFunction(1 - halfResidual) - quantileFunction(halfResidual)) / 2);\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500 } = shape;\n    let { length, factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = lorentzianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport { gaussianFct, getGaussianFactor } from '../gaussian/Gaussian';\nimport { lorentzianFct, getLorentzianFactor } from '../lorentzian/Lorentzian';\nexport class PseudoVoigt {\n    constructor(options = {}) {\n        const { fwhm = 500, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this.fwhm, this.mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this.fwhm, height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this.fwhm,\n            mu: this.mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({ fwhm: this.fwhm, mu: this.mu, area });\n    }\n    getParameters() {\n        return ['fwhm', 'mu'];\n    }\n}\nexport const calculatePseudoVoigtHeight = (options = {}) => {\n    let { fwhm = 1, mu = 0.5, area = 1 } = options;\n    return (2 * area) / (fwhm * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI));\n};\nexport const pseudoVoigtFct = (x, fwhm, mu) => {\n    return (1 - mu) * lorentzianFct(x, fwhm) + mu * gaussianFct(x, fwhm);\n};\nexport const pseudoVoigtWidthToFWHM = (width, mu = 0.5) => {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const pseudoVoigtFwhmToWidth = (fwhm, mu = 0.5) => {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const getPseudoVoigtArea = (options) => {\n    const { fwhm = 500, height = 1, mu = 0.5 } = options;\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\nexport const getPseudoVoigtFactor = (area = 0.9999, mu = 0.5) => {\n    return mu < 1 ? getLorentzianFactor(area) : getGaussianFactor(area);\n};\nexport const getPseudoVoigtData = (shape = {}, options = {}) => {\n    let { fwhm = 500, mu = 0.5 } = shape;\n    let { length, factor = getPseudoVoigtFactor(0.999, mu), height = calculatePseudoVoigtHeight({ fwhm, mu, area: 1 }), } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = pseudoVoigtFct(i - center, fwhm, mu) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=PseudoVoigt.js.map","import { Gaussian } from './gaussian/Gaussian';\nimport { Lorentzian } from './lorentzian/Lorentzian';\nimport { PseudoVoigt } from './pseudoVoigt/PseudoVoigt';\n/**\n * Generate a instance of a specific kind of shape.\n */\nexport function getShape1D(shape) {\n    const { kind } = shape;\n    switch (kind) {\n        case 'gaussian':\n            return new Gaussian(shape);\n        case 'lorentzian':\n            return new Lorentzian(shape);\n        case 'pseudoVoigt':\n            return new PseudoVoigt(shape);\n        default: {\n            throw Error(`Unknown distribution ${kind}`);\n        }\n    }\n}\n//# sourceMappingURL=getShape1D.js.map","/**\n * This function returns the sumOfShapes function\n * This function gives sumOfShapes access to the peak list and the associated data\n * @param parameters - parameters\n */\nexport function getSumOfShapes(internalPeaks) {\n    return function sumOfShapes(parameters) {\n        return (x) => {\n            let totalY = 0;\n            for (const peak of internalPeaks) {\n                const peakX = parameters[peak.fromIndex];\n                const y = parameters[peak.fromIndex + 1];\n                for (let i = 2; i <= peak.toIndex; i++) {\n                    //@ts-expect-error Not simply to solve the issue\n                    peak.shapeFct[peak.parameters[i]] = parameters[peak.fromIndex + i];\n                }\n                totalY += y * peak.shapeFct.fct(x - peakX);\n            }\n            return totalY;\n        };\n    };\n}\n//# sourceMappingURL=getSumOfShapes.js.map","/**\n * Asserts that value is truthy.\n *\n * @param value - Value to check.\n * @param message - Optional error message to throw.\n */\nexport function assert(value, message) {\n    if (!value) {\n        throw new Error(message ? message : 'unreachable');\n    }\n}\n//# sourceMappingURL=assert.js.map","export const DefaultParameters = {\n    x: {\n        init: (peak) => peak.x,\n        min: (peak, peakShape) => peak.x - peakShape.fwhm * 2,\n        max: (peak, peakShape) => peak.x + peakShape.fwhm * 2,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    y: {\n        init: (peak) => peak.y,\n        min: (peak) => (peak.y < 0 ? -1.1 : 0),\n        max: (peak) => (peak.y < 0 ? 0 : 1.1),\n        gradientDifference: () => 1e-3,\n    },\n    fwhm: {\n        init: (peak, peakShape) => peakShape.fwhm,\n        min: (peak, peakShape) => peakShape.fwhm * 0.25,\n        max: (peak, peakShape) => peakShape.fwhm * 4,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    mu: {\n        init: (peak, peakShape) => peakShape.mu,\n        min: () => 0,\n        max: () => 1,\n        gradientDifference: () => 0.01,\n    },\n};\n//# sourceMappingURL=DefaultParameters.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { assert } from '../assert';\nimport { DefaultParameters } from './DefaultParameters';\nconst properties = ['init', 'min', 'max', 'gradientDifference'];\n/**\n * Return an array of internalPeaks that contains the exact init, min, max values based on the options\n * @param peaks\n * @param options\n * @returns\n */\nexport function getInternalPeaks(peaks, minMaxY, options = {}) {\n    let index = 0;\n    let internalPeaks = [];\n    const { baseline: shiftValue = minMaxY.min } = options;\n    const normalizedPeaks = peaks.map((peak) => {\n        return {\n            ...peak,\n            y: (peak.y - shiftValue) / minMaxY.range,\n        };\n    });\n    for (const peak of normalizedPeaks) {\n        const { id, shape = options.shape ? options.shape : { kind: 'gaussian' } } = peak;\n        const shapeFct = getShape1D(shape);\n        const parameters = ['x', 'y', ...shapeFct.getParameters()];\n        const propertiesValues = {\n            min: [],\n            max: [],\n            init: [],\n            gradientDifference: [],\n        };\n        for (let parameter of parameters) {\n            for (let property of properties) {\n                // check if the property is specified in the peak\n                let propertyValue = peak?.parameters?.[parameter]?.[property];\n                if (propertyValue) {\n                    propertyValue = getNormalizedValue(propertyValue, parameter, property, minMaxY, options.baseline);\n                    propertiesValues[property].push(propertyValue);\n                    continue;\n                }\n                // check if there are some global option, it could be a number or a callback\n                let generalParameterValue = options?.parameters?.[parameter]?.[property];\n                if (generalParameterValue) {\n                    if (typeof generalParameterValue === 'number') {\n                        generalParameterValue = getNormalizedValue(generalParameterValue, parameter, property, minMaxY, options.baseline);\n                        propertiesValues[property].push(generalParameterValue);\n                        continue;\n                    }\n                    else {\n                        let value = generalParameterValue(peak);\n                        value = getNormalizedValue(value, parameter, property, minMaxY, options.baseline);\n                        propertiesValues[property].push(value);\n                        continue;\n                    }\n                }\n                // we just need to take the default parameters\n                assert(DefaultParameters[parameter], `No default parameter for ${parameter}`);\n                const defaultParameterValues = DefaultParameters[parameter][property];\n                //@ts-expect-error should never happen\n                propertiesValues[property].push(defaultParameterValues(peak, shapeFct));\n            }\n        }\n        const fromIndex = index;\n        const toIndex = fromIndex + parameters.length - 1;\n        index += toIndex - fromIndex + 1;\n        internalPeaks.push({\n            id,\n            shape,\n            shapeFct,\n            parameters,\n            propertiesValues,\n            fromIndex,\n            toIndex,\n        });\n    }\n    return internalPeaks;\n}\nfunction getNormalizedValue(value, parameter, property, minMaxY, baseline) {\n    if (parameter === 'y') {\n        if (property === 'gradientDifference') {\n            return value;\n        }\n        else {\n            return baseline !== undefined\n                ? (value - baseline) / minMaxY.range\n                : (value - minMaxY.min) / minMaxY.range;\n        }\n    }\n    return value;\n}\n//# sourceMappingURL=getInternalPeaks.js.map","import { isAnyArray } from 'is-any-array';\nexport default function checkOptions(data, parameterizedFunction, options) {\n    let { timeout, minValues, maxValues, initialValues, weights = 1, damping = 1e-2, dampingStepUp = 11, dampingStepDown = 9, maxIterations = 100, errorTolerance = 1e-7, centralDifference = false, gradientDifference = 10e-2, improvementThreshold = 1e-3, } = options;\n    if (damping <= 0) {\n        throw new Error('The damping option must be a positive number');\n    }\n    else if (!data.x || !data.y) {\n        throw new Error('The data parameter must have x and y elements');\n    }\n    else if (!isAnyArray(data.x) ||\n        data.x.length < 2 ||\n        !isAnyArray(data.y) ||\n        data.y.length < 2) {\n        throw new Error('The data parameter elements must be an array with more than 2 points');\n    }\n    else if (data.x.length !== data.y.length) {\n        throw new Error('The data parameter elements must have the same size');\n    }\n    let parameters = initialValues || new Array(parameterizedFunction.length).fill(1);\n    let nbPoints = data.y.length;\n    let parLen = parameters.length;\n    maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n    minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n    if (maxValues.length !== minValues.length) {\n        throw new Error('minValues and maxValues must be the same size');\n    }\n    if (!isAnyArray(parameters)) {\n        throw new Error('initialValues must be an array');\n    }\n    if (typeof gradientDifference === 'number') {\n        gradientDifference = new Array(parameters.length).fill(gradientDifference);\n    }\n    else if (isAnyArray(gradientDifference)) {\n        if (gradientDifference.length !== parLen) {\n            gradientDifference = new Array(parLen).fill(gradientDifference[0]);\n        }\n    }\n    else {\n        throw new Error('gradientDifference should be a number or array with length equal to the number of parameters');\n    }\n    let filler;\n    if (typeof weights === 'number') {\n        let value = 1 / weights ** 2;\n        filler = () => value;\n    }\n    else if (isAnyArray(weights)) {\n        if (weights.length < data.x.length) {\n            let value = 1 / weights[0] ** 2;\n            filler = () => value;\n        }\n        else {\n            filler = (i) => 1 / weights[i] ** 2;\n        }\n    }\n    else {\n        throw new Error('weights should be a number or array with length equal to the number of data points');\n    }\n    let checkTimeout;\n    if (timeout !== undefined) {\n        if (typeof timeout !== 'number') {\n            throw new Error('timeout should be a number');\n        }\n        let endTime = Date.now() + timeout * 1000;\n        checkTimeout = () => Date.now() > endTime;\n    }\n    else {\n        checkTimeout = () => false;\n    }\n    let weightSquare = new Array(data.x.length);\n    for (let i = 0; i < nbPoints; i++) {\n        weightSquare[i] = filler(i);\n    }\n    return {\n        checkTimeout,\n        minValues,\n        maxValues,\n        parameters,\n        weightSquare,\n        damping,\n        dampingStepUp,\n        dampingStepDown,\n        maxIterations,\n        errorTolerance,\n        centralDifference,\n        gradientDifference,\n        improvementThreshold,\n    };\n}\n//# sourceMappingURL=checkOptions.js.map","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {ArrayLike<number>} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(data, parameters, parameterizedFunction, weightSquare) {\n    let error = 0;\n    const func = parameterizedFunction(parameters);\n    for (let i = 0; i < data.x.length; i++) {\n        error += Math.pow(data.y[i] - func(data.x[i]), 2) / weightSquare[i];\n    }\n    return error;\n}\n//# sourceMappingURL=errorCalculation.js.map","import { inverse, Matrix } from 'ml-matrix';\nimport gradientFunction from './gradientFunction';\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    let ans = new Matrix(m, 1);\n    for (let point = 0; point < m; point++) {\n        ans.set(point, 0, data.y[point] - evaluatedData[point]);\n    }\n    return ans;\n}\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights) {\n    let value = damping;\n    let identity = Matrix.eye(params.length, params.length, value);\n    const func = parameterizedFunction(params);\n    let evaluatedData = new Float64Array(data.x.length);\n    for (let i = 0; i < data.x.length; i++) {\n        evaluatedData[i] = func(data.x[i]);\n    }\n    let gradientFunc = gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    let residualError = matrixFunction(data, evaluatedData);\n    let inverseMatrix = inverse(identity.add(gradientFunc.mmul(gradientFunc.transpose().scale('row', { scale: weights }))));\n    let jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    let perturbations = inverseMatrix.mmul(jacobianWeightResidualError);\n    return {\n        perturbations,\n        jacobianWeightResidualError,\n    };\n}\n//# sourceMappingURL=step.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    let ans = Matrix.zeros(nbParams, nbPoints);\n    let rowIndex = 0;\n    for (let param = 0; param < nbParams; param++) {\n        if (gradientDifference[param] === 0)\n            continue;\n        let delta = gradientDifference[param];\n        let auxParams = params.slice();\n        auxParams[param] += delta;\n        let funcParam = paramFunction(auxParams);\n        if (!centralDifference) {\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (evaluatedData[point] - funcParam(data.x[point])) / delta);\n            }\n        }\n        else {\n            auxParams = params.slice();\n            auxParams[param] -= delta;\n            delta *= 2;\n            let funcParam2 = paramFunction(auxParams);\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta);\n            }\n        }\n        rowIndex++;\n    }\n    return ans;\n}\n//# sourceMappingURL=gradientFunction.js.map","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n/**\n * Curve fitting algorithm\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number|ArrayLike<number>} [options.weights = 1] - weighting vector, if the length does not match with the number of data points, the vector is reconstructed with first value.\n * @param {number} [options.damping = 1e-2] - Levenberg-Marquardt parameter, small values of the damping parameter λ result in a Gauss-Newton update and large\nvalues of λ result in a gradient descent update\n * @param {number} [options.dampingStepDown = 9] - factor to reduce the damping (Levenberg-Marquardt parameter) when there is not an improvement when updating parameters.\n * @param {number} [options.dampingStepUp = 11] - factor to increase the damping (Levenberg-Marquardt parameter) when there is an improvement when updating parameters.\n * @param {number} [options.improvementThreshold = 1e-3] - the threshold to define an improvement through an update of parameters\n * @param {number|ArrayLike<number>} [options.gradientDifference = 10e-2] - The step size to approximate the jacobian matrix\n * @param {boolean} [options.centralDifference = false] - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {ArrayLike<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {ArrayLike<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {ArrayLike<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point.\n * @param {number} [options.timeout] - maximum time running before throw in seconds.\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport function levenbergMarquardt(data, parameterizedFunction, options = {}) {\n    let { checkTimeout, minValues, maxValues, parameters, weightSquare, damping, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkOptions(data, parameterizedFunction, options);\n    let error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n    let optimalError = error;\n    let optimalParameters = parameters.slice();\n    let converged = error <= errorTolerance;\n    let iteration = 0;\n    for (; iteration < maxIterations && !converged; iteration++) {\n        let previousError = error;\n        let { perturbations, jacobianWeightResidualError } = step(data, parameters, damping, gradientDifference, parameterizedFunction, centralDifference, weightSquare);\n        for (let k = 0; k < parameters.length; k++) {\n            parameters[k] = Math.min(Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)), maxValues[k]);\n        }\n        error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n        if (isNaN(error))\n            break;\n        if (error < optimalError - errorTolerance) {\n            optimalError = error;\n            optimalParameters = parameters.slice();\n        }\n        let improvementMetric = (previousError - error) /\n            perturbations\n                .transpose()\n                .mmul(perturbations.mul(damping).add(jacobianWeightResidualError))\n                .get(0, 0);\n        if (improvementMetric > improvementThreshold) {\n            damping = Math.max(damping / dampingStepDown, 1e-7);\n        }\n        else {\n            damping = Math.min(damping * dampingStepUp, 1e7);\n        }\n        if (checkTimeout()) {\n            throw new Error(`The execution time is over to ${options.timeout} seconds`);\n        }\n        converged = error <= errorTolerance;\n    }\n    return {\n        parameterValues: optimalParameters,\n        parameterError: optimalError,\n        iterations: iteration,\n    };\n}\n//# sourceMappingURL=index.js.map","import { levenbergMarquardt } from 'ml-levenberg-marquardt';\n/** Algorithm to select the method.\n * @param optimizationOptions - Optimization options\n * @returns - The algorithm and optimization options\n */\nexport function selectMethod(optimizationOptions = {}) {\n    let { kind = 'lm', options } = optimizationOptions;\n    switch (kind) {\n        case 'lm':\n        case 'levenbergMarquardt':\n            return {\n                algorithm: levenbergMarquardt,\n                optimizationOptions: {\n                    damping: 1.5,\n                    maxIterations: 100,\n                    errorTolerance: 1e-8,\n                    ...options,\n                },\n            };\n        default:\n            throw new Error(`Unknown fitting algorithm`);\n    }\n}\n//# sourceMappingURL=selectMethod.js.map","import { xMinMaxValues } from 'ml-spectra-processing';\nimport { getSumOfShapes } from './shapes/getSumOfShapes';\nimport { getInternalPeaks } from './util/internalPeaks/getInternalPeaks';\nimport { selectMethod } from './util/selectMethod';\n/**\n * Fits a set of points to the sum of a set of bell functions.\n *\n * @param data - An object containing the x and y data to be fitted.\n * @param peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Options for optimize\n * @returns - An object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peaks, options = {}) {\n    // rescale data\n    let temp = xMinMaxValues(data.y);\n    const minMaxY = { ...temp, range: temp.max - temp.min };\n    const internalPeaks = getInternalPeaks(peaks, minMaxY, options);\n    // need to rescale what is related to Y\n    const { baseline: shiftValue = minMaxY.min } = options;\n    let normalizedY = new Float64Array(data.y.length);\n    for (let i = 0; i < data.y.length; i++) {\n        normalizedY[i] = (data.y[i] - shiftValue) / minMaxY.range;\n    }\n    const nbParams = internalPeaks[internalPeaks.length - 1].toIndex + 1;\n    const minValues = new Float64Array(nbParams);\n    const maxValues = new Float64Array(nbParams);\n    const initialValues = new Float64Array(nbParams);\n    const gradientDifferences = new Float64Array(nbParams);\n    let index = 0;\n    for (const peak of internalPeaks) {\n        for (let i = 0; i < peak.parameters.length; i++) {\n            minValues[index] = peak.propertiesValues.min[i];\n            maxValues[index] = peak.propertiesValues.max[i];\n            initialValues[index] = peak.propertiesValues.init[i];\n            gradientDifferences[index] = peak.propertiesValues.gradientDifference[i];\n            index++;\n        }\n    }\n    let { algorithm, optimizationOptions } = selectMethod(options.optimization);\n    let sumOfShapes = getSumOfShapes(internalPeaks);\n    let fitted = algorithm({ x: data.x, y: normalizedY }, sumOfShapes, {\n        minValues,\n        maxValues,\n        initialValues,\n        gradientDifference: gradientDifferences,\n        ...optimizationOptions,\n    });\n    const fittedValues = fitted.parameterValues;\n    let newPeaks = [];\n    for (let peak of internalPeaks) {\n        const { id, shape, parameters, fromIndex } = peak;\n        let newPeak = { x: 0, y: 0, shape };\n        if (id) {\n            newPeak = { ...newPeak, id };\n        }\n        newPeak.x = fittedValues[fromIndex];\n        newPeak.y = fittedValues[fromIndex + 1] * minMaxY.range + shiftValue;\n        for (let i = 2; i < parameters.length; i++) {\n            //@ts-expect-error should be fixed once\n            newPeak.shape[parameters[i]] = fittedValues[fromIndex + i];\n        }\n        newPeaks.push(newPeak);\n    }\n    return {\n        error: fitted.parameterError,\n        iterations: fitted.iterations,\n        peaks: newPeaks,\n    };\n}\n//# sourceMappingURL=index.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nconst { parse, stringify } = JSON;\n/**\n * add missing property if it does not exist in the peak,\n * if shape exists but fwhm doesn't, it will be calculated from peak.width\n */\nexport function addMissingShape(peaks, options = {}) {\n    const { shape = { kind: 'gaussian' }, output = parse(stringify(peaks)) } = options;\n    let shapeInstance = getShape1D(shape);\n    return output.map((peak) => {\n        if (hasShape(peak)) {\n            if (!('fwhm' in peak.shape)) {\n                const shapeInstance = getShape1D(peak.shape);\n                peak.shape.fwhm = shapeInstance.widthToFWHM(peak.width);\n            }\n            return peak;\n        }\n        return {\n            ...peak,\n            shape: { fwhm: shapeInstance.widthToFWHM(peak.width), ...shape },\n        };\n    });\n}\nfunction hasShape(peak) {\n    return 'shape' in peak;\n}\n//# sourceMappingURL=addMissingShape.js.map","/**\n * Group peaks based on factor\n * In order to group peaks we only need the x and width value. This means that\n * in the current implementation we don't take into account the asymmetry of peaks\n */\nexport function groupPeaks(peaks, options = {}) {\n    if (peaks && peaks.length === 0)\n        return [];\n    const { factor = 1 } = options;\n    peaks = JSON.parse(JSON.stringify(peaks));\n    peaks.sort((a, b) => a.x - b.x);\n    let previousPeak = peaks[0];\n    let currentGroup = [previousPeak];\n    let groups = [currentGroup];\n    for (let i = 1; i < peaks.length; i++) {\n        const peak = peaks[i];\n        if ((peak.x - previousPeak.x) / ((peak.width + previousPeak.width) / 2) <=\n            factor) {\n            currentGroup.push(peak);\n        }\n        else {\n            currentGroup = [peak];\n            groups.push(currentGroup);\n        }\n        previousPeak = peak;\n    }\n    return groups;\n}\n//# sourceMappingURL=groupPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { optimize } from 'ml-spectra-fitting';\nimport { xGetFromToIndex } from 'ml-spectra-processing';\nimport { addMissingShape } from '../utils/addMissingShape';\nimport { groupPeaks } from '../utils/groupPeaks';\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (fwhm)\n * and the ratio of gaussian contribution (mu) if it's required. It currently supports three kind of shapes: gaussian, lorentzian and pseudovoigt\n * @param data - An object containing the x and y data to be fitted.\n * @param peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n */\nexport function optimizePeaksWithLogs(data, peakList, options = {}) {\n    const { fromTo = {}, baseline, shape = { kind: 'gaussian' }, groupingFactor = 1, factorLimits = 2, optimization = {\n        kind: 'lm',\n        options: {\n            timeout: 10,\n        },\n    }, } = options;\n    /*\n    The optimization algorithm will take some group of peaks.\n    We can not simply optimize everything because there would be too many variables to optimize\n    and it would be too time consuming.\n  */\n    let groups = groupPeaks(peakList, { factor: groupingFactor });\n    let logs = [];\n    let results = [];\n    groups.forEach((peakGroup) => {\n        const start = Date.now();\n        // In order to make optimization we will add fwhm and shape on all the peaks\n        const peaks = addMissingShape(peakGroup, { shape });\n        const firstPeak = peaks[0];\n        const lastPeak = peaks[peaks.length - 1];\n        const { from = firstPeak.x - firstPeak.width * factorLimits, to = lastPeak.x + lastPeak.width * factorLimits, } = fromTo;\n        const { fromIndex, toIndex } = xGetFromToIndex(data.x, { from, to });\n        const x = data.x instanceof Float64Array\n            ? data.x.subarray(fromIndex, toIndex)\n            : data.x.slice(fromIndex, toIndex);\n        const y = data.y instanceof Float64Array\n            ? data.y.subarray(fromIndex, toIndex)\n            : data.y.slice(fromIndex, toIndex);\n        const log = {\n            range: { from, to },\n            parameters: optimization,\n            groupSize: peakGroup.length,\n            time: Date.now() - start,\n        };\n        if (x.length > 5) {\n            const { iterations, error, peaks: optimizedPeaks, } = optimize({ x, y }, peaks, {\n                shape,\n                baseline,\n                optimization,\n            });\n            for (let i = 0; i < peaks.length; i++) {\n                results.push({\n                    ...optimizedPeaks[i],\n                    width: getShape1D(peaks[i].shape).fwhmToWidth(optimizedPeaks[i].shape.fwhm),\n                });\n            }\n            logs.push({\n                ...log,\n                iterations,\n                error,\n                message: 'optimization successful',\n            });\n        }\n        else {\n            results.push(...peaks);\n            logs.push({\n                ...log,\n                iterations: 0,\n                message: 'x length too small for optimization',\n            });\n        }\n    });\n    return { logs, optimizedPeaks: results };\n}\n//# sourceMappingURL=optimizePeaksWithLogs.js.map","import { optimizePeaksWithLogs } from './optimizePeaksWithLogs';\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (fwhm)\n * and the ratio of gaussian contribution (mu) if it's required. It currently supports three kind of shapes: gaussian, lorentzian and pseudovoigt\n * @param data - An object containing the x and y data to be fitted.\n * @param peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n */\nexport function optimizePeaks(data, peakList, options = {}) {\n    return optimizePeaksWithLogs(data, peakList, options).optimizedPeaks;\n}\n//# sourceMappingURL=optimizePeaks.js.map","import { v4 as generateID } from '@lukeed/uuid';\nconst { parse, stringify } = JSON;\nexport function addMissingIDs(peaks, options = {}) {\n    const { output = parse(stringify(peaks)) } = options;\n    for (const peak of output) {\n        if (!('id' in peak)) {\n            peak.id = generateID();\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=addMissingIDs.js.map","import { v4 as generateID } from '@lukeed/uuid';\nimport { addMissingIDs } from '../utils/addMissingIDs';\nimport { addMissingShape } from '../utils/addMissingShape';\nimport { optimizePeaks } from './optimizePeaks';\nexport function joinBroadPeaks(peakList, options = {}) {\n    let { shape = { kind: 'gaussian' }, optimization = { kind: 'lm', options: { timeout: 10 } }, broadWidth = 0.25, broadRatio = 0.0025, } = options;\n    let max = 0;\n    let maxI = 0;\n    let count = 1;\n    const broadLines = [];\n    if (peakList.length < 2) {\n        return addMissingIDs(addMissingShape(peakList.map(getGSDPeakOptimizedStructure), { shape }));\n    }\n    let maxDdy = peakList[0].ddY;\n    for (let i = 1; i < peakList.length; i++) {\n        if (Math.abs(peakList[i].ddY) > maxDdy)\n            maxDdy = Math.abs(peakList[i].ddY);\n    }\n    const newPeaks = [];\n    for (const peak of peakList) {\n        if (Math.abs(peak.ddY) <= broadRatio * maxDdy) {\n            broadLines.push(peak);\n        }\n        else {\n            newPeaks.push(getGSDPeakOptimizedStructure(peak));\n        }\n    }\n    //@ts-expect-error Push a feke peak\n    broadLines.push({ x: Number.MAX_VALUE, y: 0 });\n    let candidates = {\n        x: [broadLines[0].x],\n        y: [broadLines[0].y],\n    };\n    let indexes = [0];\n    for (let i = 1; i < broadLines.length; i++) {\n        if (Math.abs(broadLines[i - 1].x - broadLines[i].x) < broadWidth) {\n            candidates.x.push(broadLines[i].x);\n            candidates.y.push(broadLines[i].y);\n            if (broadLines[i].y > max) {\n                max = broadLines[i].y;\n                maxI = i;\n            }\n            indexes.push(i);\n            count++;\n        }\n        else {\n            if (count > 2) {\n                let fitted = optimizePeaks(candidates, [\n                    {\n                        id: generateID(),\n                        x: broadLines[maxI].x,\n                        y: max,\n                        width: candidates.x[0] - candidates.x[candidates.x.length - 1],\n                    },\n                ], { shape, optimization });\n                newPeaks.push(fitted[0]);\n            }\n            else {\n                // Put back the candidates to the peak list\n                for (const index of indexes) {\n                    newPeaks.push(getGSDPeakOptimizedStructure(broadLines[index]));\n                }\n            }\n            candidates = { x: [broadLines[i].x], y: [broadLines[i].y] };\n            indexes = [i];\n            max = broadLines[i].y;\n            maxI = i;\n            count = 1;\n        }\n    }\n    newPeaks.sort((a, b) => {\n        return a.x - b.x;\n    });\n    return addMissingIDs(newPeaks, { output: newPeaks });\n}\nfunction getGSDPeakOptimizedStructure(peak) {\n    const { id, shape, x, y, width } = peak;\n    let newPeak = {\n        x,\n        y,\n        width,\n        shape,\n    };\n    if (id)\n        newPeak.id = id;\n    return newPeak;\n}\n//# sourceMappingURL=joinBroadPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\n/**\n * This method will allow to enlarge peaks while preventing overlap between peaks\n * A typical application in chromatography peak picking.\n * We should not make the hypothesis that x is equidistant\n * Because peaks may not be symmetric after we add 2 properties, from and to.\n * @return {Array} peakList\n */\nexport function broadenPeaks(peakList, options = {}) {\n    const { factor = 2, overlap = false } = options;\n    const peaks = mapPeaks(peakList, factor);\n    if (!overlap) {\n        for (let i = 0; i < peaks.length - 1; i++) {\n            let peak = peaks[i];\n            let nextPeak = peaks[i + 1];\n            if (peak.to.x > nextPeak.from.x) {\n                // we do it proportional to the width of the peaks\n                peak.to.x = nextPeak.from.x =\n                    (peak.width / (nextPeak.width + peak.width)) * (nextPeak.x - peak.x) +\n                        peak.x;\n            }\n        }\n    }\n    for (const peak of peaks) {\n        peak.width = peak.to.x - peak.from.x;\n        if (peak.shape) {\n            const { shape, width } = peak;\n            if (shape.fwhm !== undefined) {\n                const shapeFct = getShape1D(shape);\n                peak.shape.fwhm = shapeFct.widthToFWHM(width);\n            }\n        }\n    }\n    return peaks;\n}\nfunction mapPeaks(peaks, factor) {\n    return peaks.map((peak) => {\n        const { id, shape } = peak;\n        const xFrom = peak.x - (peak.x - peak.inflectionPoints.from.x) * factor;\n        const xTo = peak.x + (peak.inflectionPoints.to.x - peak.x) * factor;\n        let result = {\n            x: peak.x,\n            y: peak.y,\n            index: peak.index,\n            width: xTo - xFrom,\n            from: { x: xFrom },\n            to: { x: xTo },\n        };\n        if (id) {\n            result = { ...result, id };\n        }\n        if (shape) {\n            result = { ...result, shape };\n        }\n        return result;\n    });\n}\n//# sourceMappingURL=broadenPeaks.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nconst { parse, stringify } = JSON;\n/**\n * Append 2 properties to the peaks, shape and fwhm\n */\nexport function setShape(peaks, options = {}) {\n    let { shape = { kind: 'gaussian' }, output = parse(stringify(peaks)), } = options;\n    let shapeInstance = getShape1D(shape);\n    return output.map((peak) => ({\n        ...peak,\n        shape: { fwhm: shapeInstance.widthToFWHM(peak.width), ...shape },\n    }));\n}\n//# sourceMappingURL=setShape.js.map","import { v4 as generateID } from '@lukeed/uuid';\nimport { sgg } from 'ml-savitzky-golay-generalized';\nimport { xIsEquallySpaced, xIsMonotoneIncreasing, xMinValue, xMaxValue, xNoiseStandardDeviation, } from 'ml-spectra-processing';\nimport { optimizeTop } from './utils/optimizeTop';\n/**\n * Global spectra deconvolution\n * @param  data - Object data with x and y arrays. Values in x has to be growing\n * @param {number} [options.broadRatio = 0.00] - If `broadRatio` is higher than 0, then all the peaks which second derivative\n * smaller than `broadRatio * maxAbsSecondDerivative` will be marked with the soft mask equal to true.\n\n */\nexport function gsd(data, options = {}) {\n    let { sgOptions = {\n        windowSize: 9,\n        polynomial: 3,\n    }, noiseLevel, smoothY = false, maxCriteria = true, minMaxRatio = 0.00025, realTopDetection = false, } = options;\n    let { x, y } = data;\n    if (!xIsMonotoneIncreasing(x)) {\n        throw new Error('GSD only accepts monotone increasing x values');\n    }\n    //rescale;\n    y = y.slice();\n    // If the max difference between delta x is less than 5%, then,\n    // we can assume it to be equally spaced variable\n    let equallySpaced = xIsEquallySpaced(x);\n    if (noiseLevel === undefined) {\n        if (equallySpaced) {\n            const noiseInfo = xNoiseStandardDeviation(y);\n            if (maxCriteria) {\n                noiseLevel = noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n            else {\n                noiseLevel = -noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n        }\n        else {\n            noiseLevel = 0;\n        }\n    }\n    else {\n        if (maxCriteria === false) {\n            noiseLevel *= -1;\n        }\n    }\n    if (maxCriteria === false) {\n        for (let i = 0; i < y.length; i++) {\n            y[i] *= -1;\n        }\n    }\n    if (noiseLevel !== undefined) {\n        for (let i = 0; i < y.length; i++) {\n            if (y[i] < noiseLevel) {\n                y[i] = noiseLevel;\n            }\n        }\n    }\n    let yData = y;\n    let dY, ddY;\n    const { windowSize, polynomial } = sgOptions;\n    if (equallySpaced) {\n        if (smoothY) {\n            yData = sgg(y, x[1] - x[0], {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    else {\n        if (smoothY) {\n            yData = sgg(y, x, {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    const minY = xMinValue(yData);\n    const maxY = xMaxValue(yData);\n    if (minY > maxY || minY === maxY)\n        return [];\n    const yThreshold = minY + (maxY - minY) * minMaxRatio;\n    const dX = x[1] - x[0];\n    let lastMax = null;\n    let lastMin = null;\n    let minddY = [];\n    let intervalL = [];\n    let intervalR = [];\n    // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n    for (let i = 1; i < yData.length - 1; ++i) {\n        if ((dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n            (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])) {\n            lastMin = {\n                x: x[i],\n                index: i,\n            };\n            if (dX > 0 && lastMax !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Maximum in first derivative\n        if ((dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n            (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])) {\n            lastMax = {\n                x: x[i],\n                index: i,\n            };\n            if (dX < 0 && lastMin !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    let lastK = -1;\n    const peaks = [];\n    for (const minddYIndex of minddY) {\n        let deltaX = x[minddYIndex];\n        let possible = -1;\n        let k = lastK + 1;\n        let minDistance = Number.POSITIVE_INFINITY;\n        let currentDistance = 0;\n        while (possible === -1 && k < intervalL.length) {\n            currentDistance = Math.abs(deltaX - (intervalL[k].x + intervalR[k].x) / 2);\n            if (currentDistance < (intervalR[k].x - intervalL[k].x) / 2) {\n                possible = k;\n                lastK = k;\n            }\n            ++k;\n            // Not getting closer?\n            if (currentDistance >= minDistance) {\n                break;\n            }\n            minDistance = currentDistance;\n        }\n        if (possible !== -1) {\n            if (yData[minddYIndex] > yThreshold) {\n                let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n                peaks.push({\n                    id: generateID(),\n                    x: deltaX,\n                    y: yData[minddYIndex],\n                    width,\n                    index: minddYIndex,\n                    ddY: ddY[minddYIndex],\n                    inflectionPoints: {\n                        from: intervalL[possible],\n                        to: intervalR[possible],\n                    },\n                });\n            }\n        }\n    }\n    if (realTopDetection) {\n        optimizeTop({ x, y: yData }, peaks);\n    }\n    peaks.forEach((peak) => {\n        if (!maxCriteria) {\n            peak.y *= -1;\n            peak.ddY = peak.ddY * -1;\n        }\n    });\n    peaks.sort((a, b) => {\n        return a.x - b.x;\n    });\n    return peaks;\n}\n//# sourceMappingURL=gsd.js.map"],"names":["BUFFER","IDX","HEX","toString","substring","v4","num","i","out","Array","Math","random","Object","prototype","isAnyArray","value","call","endsWith","sgg","ys","xs","options","windowSize","derivative","polynomial","Number","isInteger","RangeError","TypeError","length","console","warn","half","floor","np","ans","Float64Array","weights","fullWeights","hs","constantH","pow","wg1","wg2","d1","d2","l","getHs","wg","d","h","center","count","gramPoly","m","k","s","Grampoly","genFact","a","b","gf","j","weight","t","n","sum","e","f","g","c","_ref","module","exports","window","median","xMedian","input","quickSelectMedian","slice","xCheck","xFindClosestIndex","array","target","sorted","low","high","middle","abs","index","diff","POSITIVE_INFINITY","currentDiff","xGetFromToIndex","x","fromIndex","toIndex","from","to","undefined","xMaxValue","maxValue","xMinValue","minValue","xIsEquallySpaced","tolerance","maxDx","minDx","MAX_SAFE_INTEGER","absoluteDifference","xIsMonotoneIncreasing","xMinMaxValues","min","max","xNoiseStandardDeviation","mad","averageDeviations","xMedianAbsoluteDeviation","sd","arguments","_options$fromIndex","_options$toIndex","Error","rescale","output","currentMin","currentMax","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","constructor","name","inspectData","rows","columns","maxI","maxJ","result","line","push","formatNumber","get","join","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","fill","interval","round","this","zeros","data","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","maxRow","p","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","by","NaN","NEGATIVE_INFINITY","maxIndex","v","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","sqrt","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","y","r1","c1","r2","c2","embed","mat","cols","r","resultat","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","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","cos","cosh","exp","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","cs","sn","sp","spm1","epm1","sk","ek","shift","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","leftHandSide","rightHandSide","useSVD","optimizeTop","peaks","peak","currentIndex","beta","gamma","GAUSSIAN_EXP_FACTOR","LN2","ROOT_PI_OVER_LN2","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","Gaussian","fwhm","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","widthToFWHM","width","fct","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","shape","getGaussianData","calculateHeight","getParameters","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","halfResidual","quantileFunction","PseudoVoigt","mu","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","getShape1D","kind","getSumOfShapes","internalPeaks","parameters","totalY","peakX","shapeFct","assert","message","DefaultParameters","init","peakShape","gradientDifference","properties","getInternalPeaks","minMaxY","baseline","shiftValue","normalizedPeaks","map","range","id","propertiesValues","parameter","property","propertyValue","getNormalizedValue","generalParameterValue","defaultParameterValues","checkOptions","parameterizedFunction","timeout","minValues","maxValues","initialValues","damping","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","centralDifference","improvementThreshold","filler","checkTimeout","nbPoints","parLen","MIN_SAFE_INTEGER","endTime","Date","now","weightSquare","errorCalculation","error","func","step","params","evaluatedData","gradientFunc","paramFunction","nbParams","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeightResidualError","perturbations","levenbergMarquardt","optimalError","optimalParameters","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","algorithm","optimize","normalizedY","gradientDifferences","optimization","sumOfShapes","fitted","fittedValues","newPeaks","newPeak","parse","stringify","JSON","addMissingShape","shapeInstance","hasShape","groupPeaks","previousPeak","currentGroup","groups","optimizePeaksWithLogs","peakList","fromTo","groupingFactor","factorLimits","logs","results","forEach","peakGroup","start","firstPeak","lastPeak","subarray","groupSize","time","optimizedPeaks","optimizePeaks","addMissingIDs","generateID","getGSDPeakOptimizedStructure","mapPeaks","xFrom","inflectionPoints","xTo","overlap","nextPeak","sgOptions","noiseLevel","smoothY","maxCriteria","minMaxRatio","realTopDetection","equallySpaced","noiseInfo","dY","ddY","yData","minY","maxY","yThreshold","dX","lastMax","lastMin","minddY","intervalL","intervalR","lastK","minddYIndex","deltaX","possible","minDistance","currentDistance","broadWidth","broadRatio","broadLines","maxDdy","MAX_VALUE","candidates","indexes"],"mappings":"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"}