{"version":3,"file":"ml-gsd.esm.min.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-savitzky-golay-generalized/lib-esm/index.js","../node_modules/ml-spectra-processing/lib/x/xMedian.js","../node_modules/ml-spectra-processing/lib/x/xCheck.js","../node_modules/ml-spectra-processing/lib/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib/x/xGetFromToIndex.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-matrix/matrix.js","../node_modules/ml-matrix/matrix.mjs","../node_modules/ml-spectra-processing/lib/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib/x/xMinValue.js","../node_modules/ml-spectra-processing/lib/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib/x/xNoiseStandardDeviation.js","../node_modules/ml-spectra-processing/lib/x/xMedianAbsoluteDeviation.js","../node_modules/ml-spectra-processing/lib/x/xNorm.js","../lib/algorithms/getMinMaxIntervals.js","../lib/algorithms/tryMatchOneIntervalWithMinData.js","../lib/algorithms/getPeaksFromIntervals.js","../lib/algorithms/xGetCrossZeroPoints.js","../lib/algorithms/firstDerivative.js","../lib/gsd.js","../node_modules/ml-spectra-processing/lib/x/xIsMonotonic.js","../node_modules/ml-spectra-processing/lib/x/xIsEquallySpaced.js","../lib/algorithms/secondDerivative.js","../lib/algorithms/autoAlgorithm.js","../lib/utils/optimizeTop.js","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzianDispersive/LorentzianDispersive.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/generalizedLorentzian/GeneralizedLorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/getShape1D.js","../node_modules/ml-spectra-fitting/lib/util/assert.js","../node_modules/ml-spectra-fitting/lib/util/internalPeaks/DefaultParameters.js","../node_modules/ml-spectra-fitting/lib/util/internalPeaks/getInternalPeaks.js","../node_modules/ml-levenberg-marquardt/lib/check_options.js","../node_modules/ml-levenberg-marquardt/lib/error_calculation.js","../node_modules/ml-levenberg-marquardt/lib/step.js","../node_modules/ml-levenberg-marquardt/lib/gradient_function.js","../node_modules/ml-levenberg-marquardt/lib/levenberg_marquardt.js","../node_modules/ml-direct/src/util/antiLowerConvexHull.js","../node_modules/ml-direct/src/index.js","../node_modules/ml-spectra-fitting/lib/util/wrappers/directOptimization.js","../node_modules/ml-spectra-fitting/lib/index.js","../node_modules/ml-spectra-fitting/lib/util/selectMethod.js","../node_modules/ml-spectra-fitting/lib/shapes/getSumOfShapes.js","../lib/utils/addMissingShape.js","../lib/post/optimizePeaksWithLogs.js","../lib/utils/groupPeaks.js","../lib/post/optimizePeaks.js","../lib/utils/addMissingIDs.js","../lib/post/joinBroadPeaks.js","../lib/post/broadenPeaks.js","../lib/utils/setShape.js"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\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    const { 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    const half = Math.floor(windowSize / 2);\n    const np = ys.length;\n    const ans = new Float64Array(np);\n    const 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 = xs ** derivative;\n    }\n    //For the borders\n    for (let i = 0; i < half; i++) {\n        const wg1 = weights[half - i - 1];\n        const 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    const 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 (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 if (k === 0 && s === 0) {\n        Grampoly = 1;\n    }\n    else {\n        Grampoly = 0;\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    const weights = new Array(m);\n    const 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","import { isAnyArray } from 'is-any-array';\n/**\n * Calculates the median of an array.\n * @param input - Array containing values\n * @param options\n * @returns - median\n */\nexport function xMedian(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const { exact = false } = options || {};\n    const array = input.slice();\n    const middleIndex = calcMiddle(0, array.length - 1);\n    const median = quickSelect(array, middleIndex);\n    if (array.length % 2 === 1 || !exact) {\n        return median;\n    }\n    const medianNext = quickSelect(array, middleIndex + 1);\n    return (median + medianNext) / 2;\n}\nfunction quickSelect(array, middleIndex) {\n    let low = 0;\n    let high = array.length - 1;\n    let middle = 0;\n    let currentLow = 0;\n    let currentHigh = 0;\n    while (true) {\n        if (high <= low) {\n            return array[middleIndex];\n        }\n        if (high === low + 1) {\n            if (array[low] > array[high]) {\n                swap(array, low, high);\n            }\n            return array[middleIndex];\n        }\n        // Find median of low, middle and high items; swap into position low\n        middle = calcMiddle(low, high);\n        if (array[middle] > array[high])\n            swap(array, middle, high);\n        if (array[low] > array[high])\n            swap(array, low, high);\n        if (array[middle] > array[low])\n            swap(array, middle, low);\n        // Swap low item (now in position middle) into position (low+1)\n        swap(array, middle, low + 1);\n        // Nibble from each end towards middle, swapping items when stuck\n        currentLow = low + 1;\n        currentHigh = high;\n        while (true) {\n            do\n                currentLow++;\n            while (array[low] > array[currentLow]);\n            do\n                currentHigh--;\n            while (array[currentHigh] > array[low]);\n            if (currentHigh < currentLow) {\n                break;\n            }\n            swap(array, currentLow, currentHigh);\n        }\n        // Swap middle item (in position low) back into correct position\n        swap(array, low, currentHigh);\n        // Re-set active partition\n        if (currentHigh <= middleIndex) {\n            low = currentLow;\n        }\n        if (currentHigh >= middleIndex) {\n            high = currentHigh - 1;\n        }\n    }\n}\nfunction swap(array, i, j) {\n    const temp = array[j];\n    array[j] = array[i];\n    array[i] = temp;\n}\nfunction calcMiddle(i, j) {\n    return Math.floor((i + j) / 2);\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if the input is a non-empty array of numbers.\n * Only checks the first element.\n * @param input - Array to check.\n * @param options - Additional checks.\n */\nexport function xCheck(input, options = {}) {\n    const { minLength } = options;\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    if (typeof input[0] !== 'number') {\n        throw new TypeError('input must contain numbers');\n    }\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n * @param array - array of numbers\n * @param target - target\n * @param options\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.js\";\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex } = options;\n    const { 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 { 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","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';\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","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar isAnyArray = require('is-any-array');\nvar rescale = require('ml-array-rescale');\n\nconst indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\n/**\n * @this {Matrix}\n * @returns {string}\n */\nfunction inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nfunction inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n\nfunction 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, 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, this.get(i, j) ** matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n}\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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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\nfunction checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray.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\nfunction checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray.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\nfunction 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\nfunction 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\nfunction checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nfunction 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\nclass 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  isDistance() {\n    if (!this.isSymmetric()) return false;\n\n    for (let i = 0; i < this.rows; i++) {\n      if (this.get(i, i) !== 0) return false;\n    }\n\n    return true;\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    switch (type) {\n      case 'max':\n        return this.max();\n      case 'frobenius':\n        return Math.sqrt(this.dot(this));\n      default:\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  mpow(scalar) {\n    if (!this.isSquare()) {\n      throw new RangeError('Matrix must be square');\n    }\n    if (!Number.isInteger(scalar) || scalar < 0) {\n      throw new RangeError('Exponent must be a non-negative integer');\n    }\n    // Russian Peasant exponentiation, i.e. exponentiation by squaring\n    let result = Matrix.eye(this.rows);\n    let bb = this;\n    // Note: Don't bit shift. In JS, that would truncate at 32 bits\n    for (let e = scalar; e >= 1; e /= 2) {\n      if ((e & 1) !== 0) {\n        result = result.mmul(bb);\n      }\n      bb = bb.mmul(bb);\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 result = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      result = result.setSubMatrix(c11, 0, 0);\n      result = result.setSubMatrix(c12, c11.rows, 0);\n      result = result.setSubMatrix(c21, 0, c11.columns);\n      result = result.setSubMatrix(c22, c11.rows, c11.columns);\n      return result.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,\n          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    return this.constructor.copy(this, new Matrix(this.rows, this.columns));\n  }\n\n  /**\n   * @template {AbstractMatrix} M\n   * @param {AbstractMatrix} from\n   * @param {M} to\n   * @return {M}\n   */\n  static copy(from, to) {\n    for (const [row, column, value] of from.entries()) {\n      to.set(row, column, value);\n    }\n\n    return to;\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.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.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.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.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.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.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  [Symbol.iterator]() {\n    return this.entries();\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield [row, column, value]\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *entries() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield [row, col, this.get(row, col)];\n      }\n    }\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield value\n   * @returns {Generator<number, void, void>}\n   */\n  *values() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield this.get(row, col);\n      }\n    }\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\nclass Matrix extends AbstractMatrix {\n  /**\n   * @type {Float64Array[]}\n   */\n  data;\n\n  /**\n   * Init an empty matrix\n   * @param {number} nRows\n   * @param {number} nColumns\n   */\n  #initData(nRows, nColumns) {\n    this.data = [];\n\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\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      this.#initData(nRows.rows, nRows.columns);\n      Matrix.copy(nRows, this);\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      this.#initData(nRows, nColumns);\n    } else if (isAnyArray.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\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\n      this.rows = nRows;\n      this.columns = nColumns;\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\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\n/**\n * @typedef {0 | 1 | number | boolean} Mask\n */\n\nclass SymmetricMatrix extends AbstractMatrix {\n  /** @type {Matrix} */\n  #matrix;\n\n  get size() {\n    return this.#matrix.size;\n  }\n\n  get rows() {\n    return this.#matrix.rows;\n  }\n\n  get columns() {\n    return this.#matrix.columns;\n  }\n\n  get diagonalSize() {\n    return this.rows;\n  }\n\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isSymmetricMatrix(value) {\n    return Matrix.isMatrix(value) && value.klassType === 'SymmetricMatrix';\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static zeros(diagonalSize) {\n    return new this(diagonalSize);\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static ones(diagonalSize) {\n    return new this(diagonalSize).fill(1);\n  }\n\n  /**\n   * @param {number | AbstractMatrix | ArrayLike<ArrayLike<number>>} diagonalSize\n   * @return {this}\n   */\n  constructor(diagonalSize) {\n    super();\n\n    if (Matrix.isMatrix(diagonalSize)) {\n      if (!diagonalSize.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n\n      this.#matrix = Matrix.copy(\n        diagonalSize,\n        new Matrix(diagonalSize.rows, diagonalSize.rows),\n      );\n    } else if (Number.isInteger(diagonalSize) && diagonalSize >= 0) {\n      this.#matrix = new Matrix(diagonalSize, diagonalSize);\n    } else {\n      this.#matrix = new Matrix(diagonalSize);\n\n      if (!this.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n    }\n  }\n\n  clone() {\n    const matrix = new SymmetricMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  toMatrix() {\n    return new Matrix(this);\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.#matrix.get(rowIndex, columnIndex);\n  }\n  set(rowIndex, columnIndex, value) {\n    // symmetric set\n    this.#matrix.set(rowIndex, columnIndex, value);\n    this.#matrix.set(columnIndex, rowIndex, value);\n\n    return this;\n  }\n\n  removeCross(index) {\n    // symmetric remove side\n    this.#matrix.removeRow(index);\n    this.#matrix.removeColumn(index);\n\n    return this;\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    const row = array.slice();\n    row.splice(index, 1);\n\n    this.#matrix.addRow(index, row);\n    this.#matrix.addColumn(index, array);\n\n    return this;\n  }\n\n  /**\n   * @param {Mask[]} mask\n   */\n  applyMask(mask) {\n    if (mask.length !== this.diagonalSize) {\n      throw new RangeError('Mask size do not match with matrix size');\n    }\n\n    // prepare sides to remove from matrix from mask\n    /** @type {number[]} */\n    const sidesToRemove = [];\n    for (const [index, passthroughs] of mask.entries()) {\n      if (passthroughs) continue;\n      sidesToRemove.push(index);\n    }\n    // to remove from highest to lowest for no mutation shifting\n    sidesToRemove.reverse();\n\n    // remove sides\n    for (const sideIndex of sidesToRemove) {\n      this.removeCross(sideIndex);\n    }\n\n    return this;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * iterate from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 1 2 3 4\n   * B 2 5 6 7\n   * C 3 6 8 9\n   * D 4 7 9 10\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`\n   *\n   * length is S(i=0, n=sideSize) => 10 for a 4 sideSized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n\n    /** @type {number[]} */\n    const compact = new Array((diagonalSize * (diagonalSize + 1)) / 2);\n    for (let col = 0, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   * @return {SymmetricMatrix}\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n    // compactSize = (sideSize * (sideSize + 1)) / 2\n    // https://mathsolver.microsoft.com/fr/solve-problem/y%20%3D%20%20x%20%60cdot%20%20%20%60frac%7B%20%20%60left(%20x%2B1%20%20%60right)%20%20%20%20%7D%7B%202%20%20%7D\n    // sideSize = (Sqrt(8 × compactSize + 1) - 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) - 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a Symmetric Matrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new SymmetricMatrix(diagonalSize);\n    for (let col = 0, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return matrix;\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield [row, column, value]\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightEntries() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield [row, col, value];\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield value\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightValues() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield value;\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n}\nSymmetricMatrix.prototype.klassType = 'SymmetricMatrix';\n\nclass DistanceMatrix extends SymmetricMatrix {\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isDistanceMatrix(value) {\n    return (\n      SymmetricMatrix.isSymmetricMatrix(value) &&\n      value.klassSubType === 'DistanceMatrix'\n    );\n  }\n\n  constructor(sideSize) {\n    super(sideSize);\n\n    if (!this.isDistance()) {\n      throw new TypeError('Provided arguments do no produce a distance matrix');\n    }\n  }\n\n  set(rowIndex, columnIndex, value) {\n    // distance matrix diagonal is 0\n    if (rowIndex === columnIndex) value = 0;\n\n    return super.set(rowIndex, columnIndex, value);\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    // ensure distance\n    array = array.slice();\n    array[index] = 0;\n\n    return super.addCross(index, array);\n  }\n\n  toSymmetricMatrix() {\n    return new SymmetricMatrix(this);\n  }\n\n  clone() {\n    const matrix = new DistanceMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      if (row === col) continue;\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * no diagonal (only zeros)\n   * iterable from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 0 1 2 3\n   * B 1 0 4 5\n   * C 2 4 0 6\n   * D 3 5 6 0\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6]`\n   *\n   * length is S(i=0, n=sideSize-1) => 6 for a 4 side sized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n    const compactLength = ((diagonalSize - 1) * diagonalSize) / 2;\n\n    /** @type {number[]} */\n    const compact = new Array(compactLength);\n    for (let col = 1, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n\n    if (compactSize === 0) {\n      return new this(0);\n    }\n\n    // compactSize in Natural integer range ]0;∞]\n    // compactSize = (sideSize * (sideSize - 1)) / 2\n    // sideSize = (Sqrt(8 × compactSize + 1) + 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) + 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a DistanceMatrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new this(diagonalSize);\n    for (let col = 1, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return matrix;\n  }\n}\nDistanceMatrix.prototype.klassSubType = 'DistanceMatrix';\n\nclass BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n\nclass MatrixColumnView extends BaseView {\n  constructor(matrix, column) {\n    checkColumnIndex(matrix, column);\n    super(matrix, matrix.rows, 1);\n    this.column = column;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.column, value);\n    return this;\n  }\n\n  get(rowIndex) {\n    return this.matrix.get(rowIndex, this.column);\n  }\n}\n\nclass MatrixColumnSelectionView extends BaseView {\n  constructor(matrix, columnIndices) {\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, matrix.rows, columnIndices.length);\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columnIndices[columnIndex], value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columnIndices[columnIndex]);\n  }\n}\n\nclass MatrixFlipColumnView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columns - columnIndex - 1, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columns - columnIndex - 1);\n  }\n}\n\nclass MatrixFlipRowView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rows - rowIndex - 1, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rows - rowIndex - 1, columnIndex);\n  }\n}\n\nclass MatrixRowView extends BaseView {\n  constructor(matrix, row) {\n    checkRowIndex(matrix, row);\n    super(matrix, 1, matrix.columns);\n    this.row = row;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.row, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.row, columnIndex);\n  }\n}\n\nclass MatrixRowSelectionView extends BaseView {\n  constructor(matrix, rowIndices) {\n    checkRowIndices(matrix, rowIndices);\n    super(matrix, rowIndices.length, matrix.columns);\n    this.rowIndices = rowIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rowIndices[rowIndex], columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rowIndices[rowIndex], columnIndex);\n  }\n}\n\nclass MatrixSelectionView extends BaseView {\n  constructor(matrix, rowIndices, columnIndices) {\n    checkRowIndices(matrix, rowIndices);\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, rowIndices.length, columnIndices.length);\n    this.rowIndices = rowIndices;\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n    );\n  }\n}\n\nclass MatrixSubView extends BaseView {\n  constructor(matrix, startRow, endRow, startColumn, endColumn) {\n    checkRange(matrix, startRow, endRow, startColumn, endColumn);\n    super(matrix, endRow - startRow + 1, endColumn - startColumn + 1);\n    this.startRow = startRow;\n    this.startColumn = startColumn;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n    );\n  }\n}\n\nclass MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n\nclass WrapperMatrix1D extends AbstractMatrix {\n  constructor(data, options = {}) {\n    const { rows = 1 } = options;\n\n    if (data.length % rows !== 0) {\n      throw new Error('the data length is not divisible by the number of rows');\n    }\n    super();\n    this.rows = rows;\n    this.columns = data.length / rows;\n    this.data = data;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    this.data[index] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    return this.data[index];\n  }\n\n  _calculateIndex(row, column) {\n    return row * this.columns + column;\n  }\n}\n\nclass 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\nfunction wrap(array, options) {\n  if (isAnyArray.isAnyArray(array)) {\n    if (array[0] && isAnyArray.isAnyArray(array[0])) {\n      return new WrapperMatrix2D(array);\n    } else {\n      return new WrapperMatrix1D(array, options);\n    }\n  } else {\n    throw new Error('the argument is not an array');\n  }\n}\n\nclass 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\nfunction 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\nclass 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\nclass 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 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          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          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\nfunction 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\nfunction 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\nfunction determinant(matrix) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isSquare()) {\n    if (matrix.columns === 0) {\n      return 1;\n    }\n\n    let a, b, c, d;\n    if (matrix.columns === 2) {\n      // 2 x 2 matrix\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(1, 0);\n      d = matrix.get(1, 1);\n\n      return a * d - b * c;\n    } else if (matrix.columns === 3) {\n      // 3 x 3 matrix\n      let subMatrix0, subMatrix1, subMatrix2;\n      subMatrix0 = new MatrixSelectionView(matrix, [1, 2], [1, 2]);\n      subMatrix1 = new MatrixSelectionView(matrix, [1, 2], [0, 2]);\n      subMatrix2 = new MatrixSelectionView(matrix, [1, 2], [0, 1]);\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(0, 2);\n\n      return (\n        a * determinant(subMatrix0) -\n        b * determinant(subMatrix1) +\n        c * determinant(subMatrix2)\n      );\n    } else {\n      // general purpose determinant using the LU decomposition\n      return new LuDecomposition(matrix).determinant;\n    }\n  } else {\n    throw Error('determinant can only be calculated for a square matrix');\n  }\n}\n\nfunction xrange(n, exception) {\n  let range = [];\n  for (let i = 0; i < n; i++) {\n    if (i !== exception) {\n      range.push(i);\n    }\n  }\n  return range;\n}\n\nfunction dependenciesOneRow(\n  error,\n  matrix,\n  index,\n  thresholdValue = 10e-10,\n  thresholdError = 10e-10,\n) {\n  if (error > thresholdError) {\n    return new Array(matrix.rows + 1).fill(0);\n  } else {\n    let returnArray = matrix.addRow(index, [0]);\n    for (let i = 0; i < returnArray.rows; i++) {\n      if (Math.abs(returnArray.get(i, 0)) < thresholdValue) {\n        returnArray.set(i, 0, 0);\n      }\n    }\n    return returnArray.to1DArray();\n  }\n}\n\nfunction linearDependencies(matrix, options = {}) {\n  const { thresholdValue = 10e-10, thresholdError = 10e-10 } = options;\n  matrix = Matrix.checkMatrix(matrix);\n\n  let n = matrix.rows;\n  let results = new Matrix(n, n);\n\n  for (let i = 0; i < n; i++) {\n    let b = Matrix.columnVector(matrix.getRow(i));\n    let Abis = matrix.subMatrixRow(xrange(n, i)).transpose();\n    let svd = new SingularValueDecomposition(Abis);\n    let x = svd.solve(b);\n    let error = Matrix.sub(b, Abis.mmul(x)).abs().max();\n    results.setRow(\n      i,\n      dependenciesOneRow(error, x, i, thresholdValue, thresholdError),\n    );\n  }\n  return results;\n}\n\nfunction pseudoInverse(matrix, threshold = Number.EPSILON) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isEmpty()) {\n    // with a zero dimension, the pseudo-inverse is the transpose, since all 0xn and nx0 matrices are singular\n    // (0xn)*(nx0)*(0xn) = 0xn\n    // (nx0)*(0xn)*(nx0) = nx0\n    return matrix.transpose();\n  }\n  let svdSolution = new SingularValueDecomposition(matrix, { autoTranspose: true });\n\n  let U = svdSolution.leftSingularVectors;\n  let V = svdSolution.rightSingularVectors;\n  let s = svdSolution.diagonal;\n\n  for (let i = 0; i < s.length; i++) {\n    if (Math.abs(s[i]) > threshold) {\n      s[i] = 1.0 / s[i];\n    } else {\n      s[i] = 0.0;\n    }\n  }\n\n  return V.mmul(Matrix.diag(s).mmul(U.transpose()));\n}\n\nfunction covariance(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray.isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n  const { center = true } = options;\n  if (center) {\n    xMatrix = xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix = yMatrix.center('column');\n    }\n  }\n  const cov = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < cov.rows; i++) {\n    for (let j = 0; j < cov.columns; j++) {\n      cov.set(i, j, cov.get(i, j) * (1 / (xMatrix.rows - 1)));\n    }\n  }\n  return cov;\n}\n\nfunction correlation(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray.isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n\n  const { center = true, scale = true } = options;\n  if (center) {\n    xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix.center('column');\n    }\n  }\n  if (scale) {\n    xMatrix.scale('column');\n    if (!yIsSame) {\n      yMatrix.scale('column');\n    }\n  }\n\n  const sdx = xMatrix.standardDeviation('column', { unbiased: true });\n  const sdy = yIsSame\n    ? sdx\n    : yMatrix.standardDeviation('column', { unbiased: true });\n\n  const corr = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < corr.rows; i++) {\n    for (let j = 0; j < corr.columns; j++) {\n      corr.set(\n        i,\n        j,\n        corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)),\n      );\n    }\n  }\n  return corr;\n}\n\nclass EigenvalueDecomposition {\n  constructor(matrix, options = {}) {\n    const { assumeSymmetric = false } = options;\n\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n    if (!matrix.isSquare()) {\n      throw new Error('Matrix is not a square matrix');\n    }\n\n    if (matrix.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let n = matrix.columns;\n    let V = new Matrix(n, n);\n    let d = new Float64Array(n);\n    let e = new Float64Array(n);\n    let value = matrix;\n    let i, j;\n\n    let isSymmetric = false;\n    if (assumeSymmetric) {\n      isSymmetric = true;\n    } else {\n      isSymmetric = matrix.isSymmetric();\n    }\n\n    if (isSymmetric) {\n      for (i = 0; i < n; i++) {\n        for (j = 0; j < n; j++) {\n          V.set(i, j, value.get(i, j));\n        }\n      }\n      tred2(n, e, d, V);\n      tql2(n, e, d, V);\n    } else {\n      let H = new Matrix(n, n);\n      let ort = new Float64Array(n);\n      for (j = 0; j < n; j++) {\n        for (i = 0; i < n; i++) {\n          H.set(i, j, value.get(i, j));\n        }\n      }\n      orthes(n, H, ort, V);\n      hqr2(n, e, d, V, H);\n    }\n\n    this.n = n;\n    this.e = e;\n    this.d = d;\n    this.V = V;\n  }\n\n  get realEigenvalues() {\n    return Array.from(this.d);\n  }\n\n  get imaginaryEigenvalues() {\n    return Array.from(this.e);\n  }\n\n  get eigenvectorMatrix() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    let n = this.n;\n    let e = this.e;\n    let d = this.d;\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        X.set(i, j, 0);\n      }\n      X.set(i, i, d[i]);\n      if (e[i] > 0) {\n        X.set(i, i + 1, e[i]);\n      } else if (e[i] < 0) {\n        X.set(i, i - 1, e[i]);\n      }\n    }\n    return X;\n  }\n}\n\nfunction tred2(n, e, d, V) {\n  let f, g, h, i, j, k, hh, scale;\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n  }\n\n  for (i = n - 1; i > 0; i--) {\n    scale = 0;\n    h = 0;\n    for (k = 0; k < i; k++) {\n      scale = scale + Math.abs(d[k]);\n    }\n\n    if (scale === 0) {\n      e[i] = d[i - 1];\n      for (j = 0; j < i; j++) {\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n        V.set(j, i, 0);\n      }\n    } else {\n      for (k = 0; k < i; k++) {\n        d[k] /= scale;\n        h += d[k] * d[k];\n      }\n\n      f = d[i - 1];\n      g = Math.sqrt(h);\n      if (f > 0) {\n        g = -g;\n      }\n\n      e[i] = scale * g;\n      h = h - f * g;\n      d[i - 1] = f - g;\n      for (j = 0; j < i; j++) {\n        e[j] = 0;\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        V.set(j, i, f);\n        g = e[j] + V.get(j, j) * f;\n        for (k = j + 1; k <= i - 1; k++) {\n          g += V.get(k, j) * d[k];\n          e[k] += V.get(k, j) * f;\n        }\n        e[j] = g;\n      }\n\n      f = 0;\n      for (j = 0; j < i; j++) {\n        e[j] /= h;\n        f += e[j] * d[j];\n      }\n\n      hh = f / (h + h);\n      for (j = 0; j < i; j++) {\n        e[j] -= hh * d[j];\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        g = e[j];\n        for (k = j; k <= i - 1; k++) {\n          V.set(k, j, V.get(k, j) - (f * e[k] + g * d[k]));\n        }\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n      }\n    }\n    d[i] = h;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    V.set(n - 1, i, V.get(i, i));\n    V.set(i, i, 1);\n    h = d[i + 1];\n    if (h !== 0) {\n      for (k = 0; k <= i; k++) {\n        d[k] = V.get(k, i + 1) / h;\n      }\n\n      for (j = 0; j <= i; j++) {\n        g = 0;\n        for (k = 0; k <= i; k++) {\n          g += V.get(k, i + 1) * V.get(k, j);\n        }\n        for (k = 0; k <= i; k++) {\n          V.set(k, j, V.get(k, j) - g * d[k]);\n        }\n      }\n    }\n\n    for (k = 0; k <= i; k++) {\n      V.set(k, i + 1, 0);\n    }\n  }\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n    V.set(n - 1, j, 0);\n  }\n\n  V.set(n - 1, n - 1, 1);\n  e[0] = 0;\n}\n\nfunction tql2(n, e, d, V) {\n  let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2;\n\n  for (i = 1; i < n; i++) {\n    e[i - 1] = e[i];\n  }\n\n  e[n - 1] = 0;\n\n  let f = 0;\n  let tst1 = 0;\n  let eps = Number.EPSILON;\n\n  for (l = 0; l < n; l++) {\n    tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));\n    m = l;\n    while (m < n) {\n      if (Math.abs(e[m]) <= eps * tst1) {\n        break;\n      }\n      m++;\n    }\n\n    if (m > l) {\n      do {\n\n        g = d[l];\n        p = (d[l + 1] - g) / (2 * e[l]);\n        r = hypotenuse(p, 1);\n        if (p < 0) {\n          r = -r;\n        }\n\n        d[l] = e[l] / (p + r);\n        d[l + 1] = e[l] * (p + r);\n        dl1 = d[l + 1];\n        h = g - d[l];\n        for (i = l + 2; i < n; i++) {\n          d[i] -= h;\n        }\n\n        f = f + h;\n\n        p = d[m];\n        c = 1;\n        c2 = c;\n        c3 = c;\n        el1 = e[l + 1];\n        s = 0;\n        s2 = 0;\n        for (i = m - 1; i >= l; i--) {\n          c3 = c2;\n          c2 = c;\n          s2 = s;\n          g = c * e[i];\n          h = c * p;\n          r = hypotenuse(p, e[i]);\n          e[i + 1] = s * r;\n          s = e[i] / r;\n          c = p / r;\n          p = c * d[i] - s * g;\n          d[i + 1] = h + s * (c * g + s * d[i]);\n\n          for (k = 0; k < n; k++) {\n            h = V.get(k, i + 1);\n            V.set(k, i + 1, s * V.get(k, i) + c * h);\n            V.set(k, i, c * V.get(k, i) - s * h);\n          }\n        }\n\n        p = (-s * s2 * c3 * el1 * e[l]) / dl1;\n        e[l] = s * p;\n        d[l] = c * p;\n      } while (Math.abs(e[l]) > eps * tst1);\n    }\n    d[l] = d[l] + f;\n    e[l] = 0;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    k = i;\n    p = d[i];\n    for (j = i + 1; j < n; j++) {\n      if (d[j] < p) {\n        k = j;\n        p = d[j];\n      }\n    }\n\n    if (k !== i) {\n      d[k] = d[i];\n      d[i] = p;\n      for (j = 0; j < n; j++) {\n        p = V.get(j, i);\n        V.set(j, i, V.get(j, k));\n        V.set(j, k, p);\n      }\n    }\n  }\n}\n\nfunction orthes(n, H, ort, V) {\n  let low = 0;\n  let high = n - 1;\n  let f, g, h, i, j, m;\n  let scale;\n\n  for (m = low + 1; m <= high - 1; m++) {\n    scale = 0;\n    for (i = m; i <= high; i++) {\n      scale = scale + Math.abs(H.get(i, m - 1));\n    }\n\n    if (scale !== 0) {\n      h = 0;\n      for (i = high; i >= m; i--) {\n        ort[i] = H.get(i, m - 1) / scale;\n        h += ort[i] * ort[i];\n      }\n\n      g = Math.sqrt(h);\n      if (ort[m] > 0) {\n        g = -g;\n      }\n\n      h = h - ort[m] * g;\n      ort[m] = ort[m] - g;\n\n      for (j = m; j < n; j++) {\n        f = 0;\n        for (i = high; i >= m; i--) {\n          f += ort[i] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (i = m; i <= high; i++) {\n          H.set(i, j, H.get(i, j) - f * ort[i]);\n        }\n      }\n\n      for (i = 0; i <= high; i++) {\n        f = 0;\n        for (j = high; j >= m; j--) {\n          f += ort[j] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (j = m; j <= high; j++) {\n          H.set(i, j, H.get(i, j) - f * ort[j]);\n        }\n      }\n\n      ort[m] = scale * ort[m];\n      H.set(m, m - 1, scale * g);\n    }\n  }\n\n  for (i = 0; i < n; i++) {\n    for (j = 0; j < n; j++) {\n      V.set(i, j, i === j ? 1 : 0);\n    }\n  }\n\n  for (m = high - 1; m >= low + 1; m--) {\n    if (H.get(m, m - 1) !== 0) {\n      for (i = m + 1; i <= high; i++) {\n        ort[i] = H.get(i, m - 1);\n      }\n\n      for (j = m; j <= high; j++) {\n        g = 0;\n        for (i = m; i <= high; i++) {\n          g += ort[i] * V.get(i, j);\n        }\n\n        g = g / ort[m] / H.get(m, m - 1);\n        for (i = m; i <= high; i++) {\n          V.set(i, j, V.get(i, j) + g * ort[i]);\n        }\n      }\n    }\n  }\n}\n\nfunction hqr2(nn, e, d, V, H) {\n  let n = nn - 1;\n  let low = 0;\n  let high = nn - 1;\n  let eps = Number.EPSILON;\n  let exshift = 0;\n  let norm = 0;\n  let p = 0;\n  let q = 0;\n  let r = 0;\n  let s = 0;\n  let z = 0;\n  let iter = 0;\n  let i, j, k, l, m, t, w, x, y;\n  let ra, sa, vr, vi;\n  let notlast, cdivres;\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      d[i] = H.get(i, i);\n      e[i] = 0;\n    }\n\n    for (j = Math.max(i - 1, 0); j < nn; j++) {\n      norm = norm + Math.abs(H.get(i, j));\n    }\n  }\n\n  while (n >= low) {\n    l = n;\n    while (l > low) {\n      s = Math.abs(H.get(l - 1, l - 1)) + Math.abs(H.get(l, l));\n      if (s === 0) {\n        s = norm;\n      }\n      if (Math.abs(H.get(l, l - 1)) < eps * s) {\n        break;\n      }\n      l--;\n    }\n\n    if (l === n) {\n      H.set(n, n, H.get(n, n) + exshift);\n      d[n] = H.get(n, n);\n      e[n] = 0;\n      n--;\n      iter = 0;\n    } else if (l === n - 1) {\n      w = H.get(n, n - 1) * H.get(n - 1, n);\n      p = (H.get(n - 1, n - 1) - H.get(n, n)) / 2;\n      q = p * p + w;\n      z = Math.sqrt(Math.abs(q));\n      H.set(n, n, H.get(n, n) + exshift);\n      H.set(n - 1, n - 1, H.get(n - 1, n - 1) + exshift);\n      x = H.get(n, n);\n\n      if (q >= 0) {\n        z = p >= 0 ? p + z : p - z;\n        d[n - 1] = x + z;\n        d[n] = d[n - 1];\n        if (z !== 0) {\n          d[n] = x - w / z;\n        }\n        e[n - 1] = 0;\n        e[n] = 0;\n        x = H.get(n, n - 1);\n        s = Math.abs(x) + Math.abs(z);\n        p = x / s;\n        q = z / s;\n        r = Math.sqrt(p * p + q * q);\n        p = p / r;\n        q = q / r;\n\n        for (j = n - 1; j < nn; j++) {\n          z = H.get(n - 1, j);\n          H.set(n - 1, j, q * z + p * H.get(n, j));\n          H.set(n, j, q * H.get(n, j) - p * z);\n        }\n\n        for (i = 0; i <= n; i++) {\n          z = H.get(i, n - 1);\n          H.set(i, n - 1, q * z + p * H.get(i, n));\n          H.set(i, n, q * H.get(i, n) - p * z);\n        }\n\n        for (i = low; i <= high; i++) {\n          z = V.get(i, n - 1);\n          V.set(i, n - 1, q * z + p * V.get(i, n));\n          V.set(i, n, q * V.get(i, n) - p * z);\n        }\n      } else {\n        d[n - 1] = x + p;\n        d[n] = x + p;\n        e[n - 1] = z;\n        e[n] = -z;\n      }\n\n      n = n - 2;\n      iter = 0;\n    } else {\n      x = H.get(n, n);\n      y = 0;\n      w = 0;\n      if (l < n) {\n        y = H.get(n - 1, n - 1);\n        w = H.get(n, n - 1) * H.get(n - 1, n);\n      }\n\n      if (iter === 10) {\n        exshift += x;\n        for (i = low; i <= n; i++) {\n          H.set(i, i, H.get(i, i) - x);\n        }\n        s = Math.abs(H.get(n, n - 1)) + Math.abs(H.get(n - 1, n - 2));\n        // eslint-disable-next-line no-multi-assign\n        x = y = 0.75 * s;\n        w = -0.4375 * s * s;\n      }\n\n      if (iter === 30) {\n        s = (y - x) / 2;\n        s = s * s + w;\n        if (s > 0) {\n          s = Math.sqrt(s);\n          if (y < x) {\n            s = -s;\n          }\n          s = x - w / ((y - x) / 2 + s);\n          for (i = low; i <= n; i++) {\n            H.set(i, i, H.get(i, i) - s);\n          }\n          exshift += s;\n          // eslint-disable-next-line no-multi-assign\n          x = y = w = 0.964;\n        }\n      }\n\n      iter = iter + 1;\n\n      m = n - 2;\n      while (m >= l) {\n        z = H.get(m, m);\n        r = x - z;\n        s = y - z;\n        p = (r * s - w) / H.get(m + 1, m) + H.get(m, m + 1);\n        q = H.get(m + 1, m + 1) - z - r - s;\n        r = H.get(m + 2, m + 1);\n        s = Math.abs(p) + Math.abs(q) + Math.abs(r);\n        p = p / s;\n        q = q / s;\n        r = r / s;\n        if (m === l) {\n          break;\n        }\n        if (\n          Math.abs(H.get(m, m - 1)) * (Math.abs(q) + Math.abs(r)) <\n          eps *\n            (Math.abs(p) *\n              (Math.abs(H.get(m - 1, m - 1)) +\n                Math.abs(z) +\n                Math.abs(H.get(m + 1, m + 1))))\n        ) {\n          break;\n        }\n        m--;\n      }\n\n      for (i = m + 2; i <= n; i++) {\n        H.set(i, i - 2, 0);\n        if (i > m + 2) {\n          H.set(i, i - 3, 0);\n        }\n      }\n\n      for (k = m; k <= n - 1; k++) {\n        notlast = k !== n - 1;\n        if (k !== m) {\n          p = H.get(k, k - 1);\n          q = H.get(k + 1, k - 1);\n          r = notlast ? H.get(k + 2, k - 1) : 0;\n          x = Math.abs(p) + Math.abs(q) + Math.abs(r);\n          if (x !== 0) {\n            p = p / x;\n            q = q / x;\n            r = r / x;\n          }\n        }\n\n        if (x === 0) {\n          break;\n        }\n\n        s = Math.sqrt(p * p + q * q + r * r);\n        if (p < 0) {\n          s = -s;\n        }\n\n        if (s !== 0) {\n          if (k !== m) {\n            H.set(k, k - 1, -s * x);\n          } else if (l !== m) {\n            H.set(k, k - 1, -H.get(k, k - 1));\n          }\n\n          p = p + s;\n          x = p / s;\n          y = q / s;\n          z = r / s;\n          q = q / p;\n          r = r / p;\n\n          for (j = k; j < nn; j++) {\n            p = H.get(k, j) + q * H.get(k + 1, j);\n            if (notlast) {\n              p = p + r * H.get(k + 2, j);\n              H.set(k + 2, j, H.get(k + 2, j) - p * z);\n            }\n\n            H.set(k, j, H.get(k, j) - p * x);\n            H.set(k + 1, j, H.get(k + 1, j) - p * y);\n          }\n\n          for (i = 0; i <= Math.min(n, k + 3); i++) {\n            p = x * H.get(i, k) + y * H.get(i, k + 1);\n            if (notlast) {\n              p = p + z * H.get(i, k + 2);\n              H.set(i, k + 2, H.get(i, k + 2) - p * r);\n            }\n\n            H.set(i, k, H.get(i, k) - p);\n            H.set(i, k + 1, H.get(i, k + 1) - p * q);\n          }\n\n          for (i = low; i <= high; i++) {\n            p = x * V.get(i, k) + y * V.get(i, k + 1);\n            if (notlast) {\n              p = p + z * V.get(i, k + 2);\n              V.set(i, k + 2, V.get(i, k + 2) - p * r);\n            }\n\n            V.set(i, k, V.get(i, k) - p);\n            V.set(i, k + 1, V.get(i, k + 1) - p * q);\n          }\n        }\n      }\n    }\n  }\n\n  if (norm === 0) {\n    return;\n  }\n\n  for (n = nn - 1; n >= 0; n--) {\n    p = d[n];\n    q = e[n];\n\n    if (q === 0) {\n      l = n;\n      H.set(n, n, 1);\n      for (i = n - 1; i >= 0; i--) {\n        w = H.get(i, i) - p;\n        r = 0;\n        for (j = l; j <= n; j++) {\n          r = r + H.get(i, j) * H.get(j, n);\n        }\n\n        if (e[i] < 0) {\n          z = w;\n          s = r;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            H.set(i, n, w !== 0 ? -r / w : -r / (eps * norm));\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            q = (d[i] - p) * (d[i] - p) + e[i] * e[i];\n            t = (x * s - z * r) / q;\n            H.set(i, n, t);\n            H.set(\n              i + 1,\n              n,\n              Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,\n            );\n          }\n\n          t = Math.abs(H.get(i, n));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    } else if (q < 0) {\n      l = n - 1;\n\n      if (Math.abs(H.get(n, n - 1)) > Math.abs(H.get(n - 1, n))) {\n        H.set(n - 1, n - 1, q / H.get(n, n - 1));\n        H.set(n - 1, n, -(H.get(n, n) - p) / H.get(n, n - 1));\n      } else {\n        cdivres = cdiv(0, -H.get(n - 1, n), H.get(n - 1, n - 1) - p, q);\n        H.set(n - 1, n - 1, cdivres[0]);\n        H.set(n - 1, n, cdivres[1]);\n      }\n\n      H.set(n, n - 1, 0);\n      H.set(n, n, 1);\n      for (i = n - 2; i >= 0; i--) {\n        ra = 0;\n        sa = 0;\n        for (j = l; j <= n; j++) {\n          ra = ra + H.get(i, j) * H.get(j, n - 1);\n          sa = sa + H.get(i, j) * H.get(j, n);\n        }\n\n        w = H.get(i, i) - p;\n\n        if (e[i] < 0) {\n          z = w;\n          r = ra;\n          s = sa;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            cdivres = cdiv(-ra, -sa, w, q);\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;\n            vi = (d[i] - p) * 2 * q;\n            if (vr === 0 && vi === 0) {\n              vr =\n                eps *\n                norm *\n                (Math.abs(w) +\n                  Math.abs(q) +\n                  Math.abs(x) +\n                  Math.abs(y) +\n                  Math.abs(z));\n            }\n            cdivres = cdiv(\n              x * r - z * ra + q * sa,\n              x * s - z * sa - q * ra,\n              vr,\n              vi,\n            );\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n            if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {\n              H.set(\n                i + 1,\n                n - 1,\n                (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,\n              );\n              H.set(\n                i + 1,\n                n,\n                (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,\n              );\n            } else {\n              cdivres = cdiv(\n                -r - y * H.get(i, n - 1),\n                -s - y * H.get(i, n),\n                z,\n                q,\n              );\n              H.set(i + 1, n - 1, cdivres[0]);\n              H.set(i + 1, n, cdivres[1]);\n            }\n          }\n\n          t = Math.max(Math.abs(H.get(i, n - 1)), Math.abs(H.get(i, n)));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n - 1, H.get(j, n - 1) / t);\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      for (j = i; j < nn; j++) {\n        V.set(i, j, H.get(i, j));\n      }\n    }\n  }\n\n  for (j = nn - 1; j >= low; j--) {\n    for (i = low; i <= high; i++) {\n      z = 0;\n      for (k = low; k <= Math.min(j, high); k++) {\n        z = z + V.get(i, k) * H.get(k, j);\n      }\n      V.set(i, j, z);\n    }\n  }\n}\n\nfunction cdiv(xr, xi, yr, yi) {\n  let r, d;\n  if (Math.abs(yr) > Math.abs(yi)) {\n    r = yi / yr;\n    d = yr + r * yi;\n    return [(xr + r * xi) / d, (xi - r * xr) / d];\n  } else {\n    r = yr / yi;\n    d = yi + r * yr;\n    return [(r * xr + xi) / d, (r * xi - xr) / d];\n  }\n}\n\nclass CholeskyDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n    if (!value.isSymmetric()) {\n      throw new Error('Matrix is not symmetric');\n    }\n\n    let a = value;\n    let dimension = a.rows;\n    let l = new Matrix(dimension, dimension);\n    let positiveDefinite = true;\n    let i, j, k;\n\n    for (j = 0; j < dimension; j++) {\n      let d = 0;\n      for (k = 0; k < j; k++) {\n        let s = 0;\n        for (i = 0; i < k; i++) {\n          s += l.get(k, i) * l.get(j, i);\n        }\n        s = (a.get(j, k) - s) / l.get(k, k);\n        l.set(j, k, s);\n        d = d + s * s;\n      }\n\n      d = a.get(j, j) - d;\n\n      positiveDefinite &&= d > 0;\n      l.set(j, j, Math.sqrt(Math.max(d, 0)));\n      for (k = j + 1; k < dimension; k++) {\n        l.set(j, k, 0);\n      }\n    }\n\n    this.L = l;\n    this.positiveDefinite = positiveDefinite;\n  }\n\n  isPositiveDefinite() {\n    return this.positiveDefinite;\n  }\n\n  solve(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let l = this.L;\n    let dimension = l.rows;\n\n    if (value.rows !== dimension) {\n      throw new Error('Matrix dimensions do not match');\n    }\n    if (this.isPositiveDefinite() === false) {\n      throw new Error('Matrix is not positive definite');\n    }\n\n    let count = value.columns;\n    let B = value.clone();\n    let i, j, k;\n\n    for (k = 0; k < dimension; k++) {\n      for (j = 0; j < count; j++) {\n        for (i = 0; i < k; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(k, i));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    for (k = dimension - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        for (i = k + 1; i < dimension; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(i, k));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    return B;\n  }\n\n  get lowerTriangularMatrix() {\n    return this.L;\n  }\n}\n\nclass nipals {\n  constructor(X, options = {}) {\n    X = WrapperMatrix2D.checkMatrix(X);\n    let { Y } = options;\n    const {\n      scaleScores = false,\n      maxIterations = 1000,\n      terminationCriteria = 1e-10,\n    } = options;\n\n    let u;\n    if (Y) {\n      if (isAnyArray.isAnyArray(Y) && typeof Y[0] === 'number') {\n        Y = Matrix.columnVector(Y);\n      } else {\n        Y = WrapperMatrix2D.checkMatrix(Y);\n      }\n      if (Y.rows !== X.rows) {\n        throw new Error('Y should have the same number of rows as X');\n      }\n      u = Y.getColumnVector(0);\n    } else {\n      u = X.getColumnVector(0);\n    }\n\n    let diff = 1;\n    let t, q, w, tOld;\n\n    for (\n      let counter = 0;\n      counter < maxIterations && diff > terminationCriteria;\n      counter++\n    ) {\n      w = X.transpose().mmul(u).div(u.transpose().mmul(u).get(0, 0));\n      w = w.div(w.norm());\n\n      t = X.mmul(w).div(w.transpose().mmul(w).get(0, 0));\n\n      if (counter > 0) {\n        diff = t.clone().sub(tOld).pow(2).sum();\n      }\n      tOld = t.clone();\n\n      if (Y) {\n        q = Y.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n        q = q.div(q.norm());\n\n        u = Y.mmul(q).div(q.transpose().mmul(q).get(0, 0));\n      } else {\n        u = t;\n      }\n    }\n\n    if (Y) {\n      let p = X.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      p = p.div(p.norm());\n      let xResidual = X.clone().sub(t.clone().mmul(p.transpose()));\n      let residual = u.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      let yResidual = Y.clone().sub(\n        t.clone().mulS(residual.get(0, 0)).mmul(q.transpose()),\n      );\n\n      this.t = t;\n      this.p = p.transpose();\n      this.w = w.transpose();\n      this.q = q;\n      this.u = u;\n      this.s = t.transpose().mmul(t);\n      this.xResidual = xResidual;\n      this.yResidual = yResidual;\n      this.betas = residual;\n    } else {\n      this.w = w.transpose();\n      this.s = t.transpose().mmul(t).sqrt();\n      if (scaleScores) {\n        this.t = t.clone().div(this.s.get(0, 0));\n      } else {\n        this.t = t;\n      }\n      this.xResidual = X.sub(t.mmul(w.transpose()));\n    }\n  }\n}\n\nexports.AbstractMatrix = AbstractMatrix;\nexports.CHO = CholeskyDecomposition;\nexports.CholeskyDecomposition = CholeskyDecomposition;\nexports.DistanceMatrix = DistanceMatrix;\nexports.EVD = EigenvalueDecomposition;\nexports.EigenvalueDecomposition = EigenvalueDecomposition;\nexports.LU = LuDecomposition;\nexports.LuDecomposition = LuDecomposition;\nexports.Matrix = Matrix;\nexports.MatrixColumnSelectionView = MatrixColumnSelectionView;\nexports.MatrixColumnView = MatrixColumnView;\nexports.MatrixFlipColumnView = MatrixFlipColumnView;\nexports.MatrixFlipRowView = MatrixFlipRowView;\nexports.MatrixRowSelectionView = MatrixRowSelectionView;\nexports.MatrixRowView = MatrixRowView;\nexports.MatrixSelectionView = MatrixSelectionView;\nexports.MatrixSubView = MatrixSubView;\nexports.MatrixTransposeView = MatrixTransposeView;\nexports.NIPALS = nipals;\nexports.Nipals = nipals;\nexports.QR = QrDecomposition;\nexports.QrDecomposition = QrDecomposition;\nexports.SVD = SingularValueDecomposition;\nexports.SingularValueDecomposition = SingularValueDecomposition;\nexports.SymmetricMatrix = SymmetricMatrix;\nexports.WrapperMatrix1D = WrapperMatrix1D;\nexports.WrapperMatrix2D = WrapperMatrix2D;\nexports.correlation = correlation;\nexports.covariance = covariance;\nexports.default = Matrix;\nexports.determinant = determinant;\nexports.inverse = inverse;\nexports.linearDependencies = linearDependencies;\nexports.pseudoInverse = pseudoInverse;\nexports.solve = solve;\nexports.wrap = wrap;\n","import * as matrix from './matrix.js';\n\nexport const AbstractMatrix = matrix.AbstractMatrix;\nexport const CHO = matrix.CHO;\nexport const CholeskyDecomposition = matrix.CholeskyDecomposition;\nexport const DistanceMatrix = matrix.DistanceMatrix;\nexport const EVD = matrix.EVD;\nexport const EigenvalueDecomposition = matrix.EigenvalueDecomposition;\nexport const LU = matrix.LU;\nexport const LuDecomposition = matrix.LuDecomposition;\nexport const Matrix = matrix.Matrix;\nexport const MatrixColumnSelectionView = matrix.MatrixColumnSelectionView;\nexport const MatrixColumnView = matrix.MatrixColumnView;\nexport const MatrixFlipColumnView = matrix.MatrixFlipColumnView;\nexport const MatrixFlipRowView = matrix.MatrixFlipRowView;\nexport const MatrixRowSelectionView = matrix.MatrixRowSelectionView;\nexport const MatrixRowView = matrix.MatrixRowView;\nexport const MatrixSelectionView = matrix.MatrixSelectionView;\nexport const MatrixSubView = matrix.MatrixSubView;\nexport const MatrixTransposeView = matrix.MatrixTransposeView;\nexport const NIPALS = matrix.NIPALS;\nexport const Nipals = matrix.Nipals;\nexport const QR = matrix.QR;\nexport const QrDecomposition = matrix.QrDecomposition;\nexport const SVD = matrix.SVD;\nexport const SingularValueDecomposition = matrix.SingularValueDecomposition;\nexport const SymmetricMatrix = matrix.SymmetricMatrix;\nexport const WrapperMatrix1D = matrix.WrapperMatrix1D;\nexport const WrapperMatrix2D = matrix.WrapperMatrix2D;\nexport const correlation = matrix.correlation;\nexport const covariance = matrix.covariance;\nexport default matrix.default.Matrix ? matrix.default.Matrix : matrix.Matrix;\nexport const determinant = matrix.determinant;\nexport const inverse = matrix.inverse;\nexport const linearDependencies = matrix.linearDependencies;\nexport const pseudoInverse = matrix.pseudoInverse;\nexport const solve = matrix.solve;\nexport const wrap = matrix.wrap;\n","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the maximal value of an array of values\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.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the minimal value of an array of values.\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","import { xCheck } from \"./xCheck.js\";\n/**\n * Return min and max values of an array.\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 (const 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 \"./xMedianAbsoluteDeviation.js\";\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.js\";\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","/**\n * This function calculate the norm of a vector.\n * @example xNorm([3, 4]) -> 5\n * @param array - array\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    for (const element of array) {\n        result += element ** 2;\n    }\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","export function getMinMaxIntervalsDy(y, x, dY, dX) {\n    let lastMax = null;\n    let lastMin = null;\n    const intervalL = [];\n    const intervalR = [];\n    for (let i = 1; i < y.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    }\n    return { intervalL, intervalR };\n}\n//# sourceMappingURL=getMinMaxIntervals.js.map","export function tryMatchOneIntervalWithMinData(options) {\n    const { x, lastK, minData, yThreshold, intervalWidth, intervalCenter, yData, } = options;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let possible = -1;\n    let newLastIndex = lastK;\n    for (let k = newLastIndex + 1; k < minData.length; k++) {\n        const centerIndex = minData[k];\n        if (yData[centerIndex] <= yThreshold) {\n            continue;\n        }\n        const deltaX = x[centerIndex];\n        const currentDistance = Math.abs(deltaX - intervalCenter);\n        if (currentDistance < intervalWidth) {\n            if (currentDistance < minDistance) {\n                possible = k;\n            }\n            newLastIndex = k;\n        }\n        if (currentDistance >= minDistance)\n            break;\n        minDistance = currentDistance;\n    }\n    return { lastIndex: newLastIndex, possible };\n}\n//# sourceMappingURL=tryMatchOneIntervalWithMinData.js.map","import { tryMatchOneIntervalWithMinData } from \"./tryMatchOneIntervalWithMinData.js\";\nexport function getPeakFromIntervals(options) {\n    let lastK = -1;\n    const peaks = [];\n    const { x, ddY, yData, yThreshold, intervalR, intervalL, minData } = options;\n    for (let i = 0; i < intervalL.length; i++) {\n        const intervalWidth = (intervalR[i].x - intervalL[i].x) / 2;\n        const intervalCenter = (intervalR[i].x + intervalL[i].x) / 2;\n        const { possible = -1, lastIndex } = tryMatchOneIntervalWithMinData({\n            x,\n            lastK,\n            minData,\n            yThreshold,\n            intervalWidth,\n            intervalCenter,\n            yData,\n        });\n        if (possible !== -1) {\n            const centerIndex = minData[possible];\n            const width = Math.abs(intervalR[i].x - intervalL[i].x);\n            peaks.push({\n                id: crypto.randomUUID(),\n                x: x[centerIndex],\n                y: yData[centerIndex],\n                width,\n                index: centerIndex,\n                ddY: ddY[centerIndex],\n                inflectionPoints: {\n                    from: intervalL[i],\n                    to: intervalR[i],\n                },\n            });\n        }\n        lastK = lastIndex;\n    }\n    return peaks;\n}\n//# sourceMappingURL=getPeaksFromIntervals.js.map","/**\n * Finds the indices where the first derivative crosses zero (sign change),\n * which are potential peak positions. This function does not detect zero-crossings\n * in regions with consecutive zero values in the derivative (flat regions).\n *\n * @param input - Object containing the y values and their first derivative (dY).\n * @returns Array of indices where the first derivative crosses zero (excluding consecutive zeros).\n */\nexport function xGetCrossZeroPoints(input) {\n    const { y, dY } = input;\n    const crossDy = [];\n    for (let i = 1; i < y.length - 1; ++i) {\n        if (isLessAndGreaterThanZero(dY[i], dY[i + 1])) {\n            // push the index of the element closer to zero\n            crossDy.push(Math.abs(dY[i]) < Math.abs(dY[i + 1]) ? i : i + 1);\n        }\n        else if (\n        // Handle exact zero\n        dY[i] === 0 &&\n            isLessAndGreaterThanZero(dY[i - 1], dY[i + 1])) {\n            crossDy.push(i);\n        }\n    }\n    return crossDy;\n}\nfunction isLessAndGreaterThanZero(back, next) {\n    return (back < 0 && next > 0) || (back > 0 && next < 0);\n}\n//# sourceMappingURL=xGetCrossZeroPoints.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { getPeakFromIntervals } from \"./getPeaksFromIntervals.js\";\nimport { xGetCrossZeroPoints } from \"./xGetCrossZeroPoints.js\";\nexport function firstDerivative(input) {\n    const { y, x, dY, dX, yData, yThreshold, ddY } = input;\n    const crossDy = xGetCrossZeroPoints(input);\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    return getPeakFromIntervals({\n        minData: crossDy,\n        intervalL,\n        intervalR,\n        x,\n        yData,\n        yThreshold,\n        ddY,\n    });\n}\n//# sourceMappingURL=firstDerivative.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\nimport { xIsEquallySpaced, xIsMonotonic, xMinMaxValues, xNoiseStandardDeviation, } from 'ml-spectra-processing';\nimport { autoAlgorithm } from \"./algorithms/autoAlgorithm.js\";\nimport { firstDerivative } from \"./algorithms/firstDerivative.js\";\nimport { secondDerivative } from \"./algorithms/secondDerivative.js\";\nimport { optimizeTop } from \"./utils/optimizeTop.js\";\n/**\n * Global spectra deconvolution\n * @param  data - Object data with x and y arrays. Values in x has to be growing\n * @param options\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 */\nexport function gsd(data, options = {}) {\n    let { noiseLevel } = options;\n    const { sgOptions = {\n        windowSize: 9,\n        polynomial: 3,\n    }, smoothY = false, maxCriteria = true, minMaxRatio = 0.00025, realTopDetection = false, peakDetectionAlgorithm = 'second', } = options;\n    const { x } = data;\n    let { y } = data;\n    if (xIsMonotonic(x) !== 1) {\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    const isEquallySpaced = xIsEquallySpaced(x);\n    if (noiseLevel === undefined) {\n        if (isEquallySpaced) {\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 if (!maxCriteria) {\n        noiseLevel *= -1;\n    }\n    if (!maxCriteria) {\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    const xValue = isEquallySpaced ? x[1] - x[0] : x;\n    const yData = smoothY\n        ? sgg(y, xValue, {\n            ...sgOptions,\n            derivative: 0,\n        })\n        : y;\n    const { min: minY, max: maxY } = xMinMaxValues(yData);\n    if (minY > maxY || minY === maxY)\n        return [];\n    const dY = sgg(y, xValue, {\n        ...sgOptions,\n        derivative: 1,\n    });\n    const ddY = sgg(y, xValue, {\n        ...sgOptions,\n        derivative: 2,\n    });\n    const yThreshold = Math.max(noiseLevel, minY + (maxY - minY) * minMaxRatio);\n    const dX = x[1] - x[0];\n    const peakData = { x, y, yData, dY, ddY, dX, yThreshold };\n    let peaks = [];\n    if (peakDetectionAlgorithm === 'first') {\n        peaks = firstDerivative(peakData);\n    }\n    else if (peakDetectionAlgorithm === 'second') {\n        peaks = secondDerivative(peakData);\n    }\n    else {\n        peaks = autoAlgorithm(peakData);\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","/**\n * Returns true if x is monotonic.\n * @param array - array of numbers.\n * @returns 1 if monotonic increasing, -1 if monotonic decreasing, 0 if not monotonic.\n */\nexport function xIsMonotonic(array) {\n    if (array.length <= 2) {\n        return 1;\n    }\n    if (array[0] === array[1]) {\n        // maybe a constant series\n        for (let i = 1; i < array.length - 1; i++) {\n            if (array[i] !== array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    if (array[0] < array.at(-1)) {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] >= array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return 0;\n        }\n        return -1;\n    }\n}\n//# sourceMappingURL=xIsMonotonic.js.map","/**\n * Check if the values are separated always by the same difference\n * @param array - Monotone growing array of number\n * @param options\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        const absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { getPeakFromIntervals } from \"./getPeaksFromIntervals.js\";\nexport function secondDerivative(input) {\n    const { x, y, yData, dY, ddY, dX, yThreshold } = input;\n    const minddY = [];\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n    for (let i = 1; i < y.length - 1; ++i) {\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    return getPeakFromIntervals({\n        minData: minddY,\n        intervalL,\n        intervalR,\n        x,\n        yData,\n        yThreshold,\n        ddY,\n    });\n}\n//# sourceMappingURL=secondDerivative.js.map","import { getMinMaxIntervalsDy } from \"./getMinMaxIntervals.js\";\nimport { tryMatchOneIntervalWithMinData } from \"./tryMatchOneIntervalWithMinData.js\";\nexport function autoAlgorithm(input) {\n    const { x, y, yData, dY, ddY, dX, yThreshold } = input;\n    const minddY = [];\n    const crossDy = [];\n    const { intervalL, intervalR } = getMinMaxIntervalsDy(y, x, dY, dX);\n    for (let i = 1; i < y.length - 1; ++i) {\n        if ((dY[i] < 0 && dY[i + 1] > 0) || (dY[i] > 0 && dY[i + 1] < 0)) {\n            // push the index of the element closer to zero\n            crossDy.push(Math.abs(dY[i]) < Math.abs(dY[i + 1]) ? i : i + 1);\n        }\n        // Handle exact zero\n        if (dY[i] === 0 &&\n            dY[i] < Math.abs(dY[i + 1]) &&\n            dY[i] < Math.abs(dY[i - 1])) {\n            crossDy.push(i);\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    const peaks = [];\n    let [lastK, lastJ] = [-1, -1];\n    for (let i = 0; i < intervalL.length; i++) {\n        const intervalWidth = (intervalR[i].x - intervalL[i].x) / 2;\n        const intervalCenter = (intervalR[i].x + intervalL[i].x) / 2;\n        let yIndex = -1;\n        let match = tryMatchOneIntervalWithMinData({\n            x,\n            yData,\n            lastK,\n            yThreshold,\n            intervalWidth,\n            intervalCenter,\n            minData: crossDy,\n        });\n        lastK = match.lastIndex;\n        if (match.possible !== -1) {\n            yIndex = crossDy[match.possible];\n        }\n        else {\n            match = tryMatchOneIntervalWithMinData({\n                x,\n                yData,\n                yThreshold,\n                lastK: lastJ,\n                intervalWidth,\n                intervalCenter,\n                minData: minddY,\n            });\n            if (match.possible !== -1) {\n                yIndex = minddY[match.possible];\n            }\n            lastJ = match.lastIndex;\n        }\n        if (yIndex !== -1) {\n            const width = Math.abs(intervalR[i].x - intervalL[i].x);\n            peaks.push({\n                id: crypto.randomUUID(),\n                x: x[yIndex],\n                y: y[yIndex],\n                width,\n                index: yIndex,\n                ddY: ddY[yIndex],\n                inflectionPoints: {\n                    from: intervalL[i],\n                    to: intervalR[i],\n                },\n            });\n        }\n    }\n    return peaks;\n}\n//# sourceMappingURL=autoAlgorithm.js.map","/**\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 if (y[currentIndex + 1] >= y[currentIndex] &&\n            y[currentIndex + 1] >= y[currentIndex + 2]) {\n            currentIndex++;\n        }\n        else if (y[currentIndex - 2] >= y[currentIndex - 3] &&\n            y[currentIndex - 2] >= y[currentIndex - 1]) {\n            currentIndex -= 2;\n        }\n        else if (y[currentIndex + 2] >= y[currentIndex + 1] &&\n            y[currentIndex + 2] >= y[currentIndex + 3]) {\n            currentIndex += 2;\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            const alpha = 20 * Math.log10(y[currentIndex - 1]);\n            const beta = 20 * Math.log10(y[currentIndex]);\n            const gamma = 20 * Math.log10(y[currentIndex + 1]);\n            const p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n            const xCurrent = x[currentIndex];\n            const xPrevious = x[currentIndex - 1];\n            peak.x = xCurrent + (xCurrent - xPrevious) * 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","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","// 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_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 { calculateLorentzianHeight, getLorentzianFactor, lorentzianFwhmToWidth, lorentzianWidthToFWHM, } from '../lorentzian/Lorentzian';\nexport class LorentzianDispersive {\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 lorentzianDispersiveFct(x, this.fwhm);\n    }\n    //eslint-disable-next-line\n    getArea(_height) {\n        return 0;\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianDispersiveData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport const lorentzianDispersiveFct = (x, fwhm) => {\n    return (2 * fwhm * x) / (4 * x ** 2 + fwhm ** 2);\n};\nexport const getLorentzianDispersiveData = (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] = lorentzianDispersiveFct(i - center, fwhm) * height;\n        data[length - 1 - i] = -data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=LorentzianDispersive.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 { ROOT_THREE } from '../../../util/constants';\n/**\n * This shape is a linear combination of rational function (n|n+2), for n = 0 (lorentzian function) and n = 2\n * the parameter that combines those two functions is `gamma` and it is called the kurtosis parameter, it is an\n * implementation of generalized lorentzian shape published by Stanislav Sykora in the SMASH 2010. DOI:10.3247/SL3nmr10.006\n * @link http://www.ebyte.it/stan/Talk_ML_UserMeeting_SMASH_2010_GeneralizedLorentzian.html\n */\nexport class GeneralizedLorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500, gamma = 0.5 } = options;\n        this.fwhm = fwhm;\n        this.gamma = gamma;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return generalizedLorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return generalizedLorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return generalizedLorentzianFct(x, this.fwhm, this.gamma);\n    }\n    getArea(height = 1) {\n        return getGeneralizedLorentzianArea({\n            fwhm: this.fwhm,\n            height,\n            gamma: this.gamma,\n        });\n    }\n    getFactor(area) {\n        return getGeneralizedLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getGeneralizedLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        const { gamma, fwhm } = this;\n        return calculateGeneralizedLorentzianHeight({ fwhm, area, gamma });\n    }\n    getParameters() {\n        return ['fwhm', 'gamma'];\n    }\n}\nexport const calculateGeneralizedLorentzianHeight = ({ fwhm = 1, gamma = 1, area = 1, }) => {\n    return (area / fwhm / (3.14159 - 0.420894 * gamma)) * 2;\n};\n/**\n * expression of integral generated by Mathematica of the function\n */\nexport const getGeneralizedLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1, gamma = 1 } = options;\n    return (height * fwhm * (3.14159 - 0.420894 * gamma)) / 2;\n};\nexport const generalizedLorentzianFct = (x, fwhm, gamma) => {\n    const u = ((2 * x) / fwhm) ** 2;\n    return (1 - gamma) / (1 + u) + (gamma * (1 + u / 2)) / (1 + u + u ** 2);\n};\nexport const generalizedLorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const generalizedLorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getGeneralizedLorentzianFactor = (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 getGeneralizedLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500, gamma = 1 } = shape;\n    let { length, factor = getGeneralizedLorentzianFactor(), height = calculateGeneralizedLorentzianHeight({ fwhm, area: 1, gamma }), } = 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] = generalizedLorentzianFct(i - center, fwhm, gamma) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=GeneralizedLorentzian.js.map","import { Gaussian } from './gaussian/Gaussian';\nimport { GeneralizedLorentzian } from './generalizedLorentzian/GeneralizedLorentzian';\nimport { Lorentzian } from './lorentzian/Lorentzian';\nimport { LorentzianDispersive } from './lorentzianDispersive/LorentzianDispersive';\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        case 'lorentzianDispersive':\n            return new LorentzianDispersive(shape);\n        case 'generalizedLorentzian':\n            return new GeneralizedLorentzian(shape);\n        default: {\n            throw Error(`Unknown distribution ${kind}`);\n        }\n    }\n}\n//# sourceMappingURL=getShape1D.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    gamma: {\n        init: (peak, peakShape) => peakShape.gamma || 0.5,\n        min: () => -1,\n        max: () => 2,\n        gradientDifference: () => 0.01,\n    },\n};\n//# sourceMappingURL=DefaultParameters.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { assert } from \"../assert.js\";\nimport { DefaultParameters } from \"./DefaultParameters.js\";\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 minMaxY\n * @param options\n * @returns\n */\nexport function getInternalPeaks(peaks, minMaxY, options = {}) {\n    let index = 0;\n    const 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 (const parameter of parameters) {\n            for (const 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, options) {\n    const { timeout, 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    let { minValues, maxValues } = 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    if (!(initialValues && initialValues.length > 0)) {\n        throw new Error('The initialValues option is mandatory and must be an array');\n    }\n    const parameters = Array.from(initialValues);\n    const 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    const gradientDifferenceArray = getGradientDifferenceArray(gradientDifference, parameters);\n    const filler = getFiller(weights, data.x.length);\n    const checkTimeout = getCheckTimeout(timeout);\n    const weightSquare = Array.from({ length: data.x.length }, (_, i) => filler(i));\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: gradientDifferenceArray,\n        improvementThreshold,\n    };\n}\nfunction getGradientDifferenceArray(gradientDifference, parameters) {\n    if (typeof gradientDifference === 'number') {\n        return new Array(parameters.length).fill(gradientDifference);\n    }\n    else if (isAnyArray(gradientDifference)) {\n        const parLen = parameters.length;\n        if (gradientDifference.length !== parLen) {\n            return new Array(parLen).fill(gradientDifference[0]);\n        }\n        return Array.from(gradientDifference);\n    }\n    throw new Error('gradientDifference should be a number or array with length equal to the number of parameters');\n}\nfunction getFiller(weights, dataLength) {\n    if (typeof weights === 'number') {\n        const value = 1 / weights ** 2;\n        return () => value;\n    }\n    else if (isAnyArray(weights)) {\n        if (weights.length < dataLength) {\n            const value = 1 / weights[0] ** 2;\n            return () => value;\n        }\n        return (i) => 1 / weights[i] ** 2;\n    }\n    throw new Error('weights should be a number or array with length equal to the number of data points');\n}\nfunction getCheckTimeout(timeout) {\n    if (timeout !== undefined) {\n        if (typeof timeout !== 'number') {\n            throw new Error('timeout should be a number');\n        }\n        const endTime = Date.now() + timeout * 1000;\n        return () => Date.now() > endTime;\n    }\n    else {\n        return () => false;\n    }\n}\n//# sourceMappingURL=check_options.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 *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param parameters - Array of current parameter values\n * @param parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param weightSquare - Square of weights (must be same length as data.x)\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 += (data.y[i] - func(data.x[i])) ** 2 / weightSquare[i];\n    }\n    return error;\n}\n//# sourceMappingURL=error_calculation.js.map","import { inverse, Matrix } from 'ml-matrix';\nimport gradientFunction from \"./gradient_function.js\";\n/**\n * Matrix function over the samples\n *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param evaluatedData - Array of previous evaluated function values\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    const 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 *\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param params - Array of previous parameter values\n * @param damping - Levenberg-Marquardt parameter\n * @param gradientDifference - The step size to approximate the jacobian matrix\n * @param centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param weights - scale the gradient and residual error by weights\n */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights) {\n    const identity = Matrix.eye(params.length, params.length, damping);\n    const func = parameterizedFunction(params);\n    const 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    const gradientFunc = gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    const residualError = matrixFunction(data, evaluatedData);\n    const inverseMatrix = inverse(identity.add(gradientFunc.mmul(gradientFunc.transpose().scale('row', { scale: weights }))));\n    const jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    const 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 * @param data Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param evaluatedData - Array of previous evaluated function values\n * @param params - Array of previous parameter values\n * @param gradientDifference - The step size to approximate the jacobian matrix\n * @param centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param paramFunction - The parameters and returns a function with the independent variable as a parameter\n */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    const 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        const 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            const 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=gradient_function.js.map","import checkOptions from \"./check_options.js\";\nimport errorCalculation from \"./error_calculation.js\";\nimport step from \"./step.js\";\n/**\n * Curve fitting algorithm\n * @param data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param parameterizedFunction - Takes an array of parameters and returns a function with the independent variable as its sole argument\n * @param options - Options object\n */\nexport function levenbergMarquardt(data, parameterizedFunction, options) {\n    const checkedOptions = checkOptions(data, options);\n    const { checkTimeout, minValues, maxValues, parameters, weightSquare, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkedOptions;\n    let damping = checkedOptions.damping;\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        const previousError = error;\n        const { 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        const 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=levenberg_marquardt.js.map","/**\n * Preparata, F. P., & Shamos, M. I. (2012). Computational geometry: an introduction. Springer Science & Business Media.\n * @param {Array} x - The array with x coordinates of the points.\n * @param {Array} y - The array with y coordinates of the points.\n * @return {Array} The indices of the points of anticlockwise lower convex hull\n * @private\n */\nexport default function antiLowerConvexHull(x, y) {\n  if (x.length !== y.length) {\n    throw new RangeError('X and Y vectors has different dimensions');\n  }\n\n  const nbPoints = x.length - 1;\n  if (nbPoints === 0) return [0];\n  if (nbPoints === 1) return [0, 1];\n\n  let currentPoint = 0;\n  let result = new Array(x.length).fill(true);\n  while (true) {\n    const a = currentPoint;\n    const b = moveOn(currentPoint, nbPoints, result);\n    const c = moveOn(moveOn(currentPoint, nbPoints, result), nbPoints, result);\n\n    const det =\n      x[c] * (y[a] - y[b]) + x[a] * (y[b] - y[c]) + x[b] * (y[c] - y[a]);\n\n    const leftTurn = det >= 0;\n\n    if (leftTurn) {\n      currentPoint = b;\n    } else {\n      result[b] = false;\n      currentPoint = moveBack(currentPoint, nbPoints, result);\n    }\n    if (c === nbPoints) break;\n  }\n\n  return result\n    .map((item, index) => (item === false ? false : index))\n    .filter((item) => item !== false);\n}\n\n/**\n * @param {number} currentPoint - The index of the current point to make the move\n * @param {number} nbPoints - The total number of points in the array\n * @param {Array} vector - The array with the points\n * @return {number} the index of the point after the move\n * @private\n */\n\nfunction moveBack(currentPoint, nbPoints, vector) {\n  let counter = currentPoint - 1;\n  while (vector[counter] === false) counter--;\n  return currentPoint === 0 ? nbPoints : counter;\n}\n\nfunction moveOn(currentPoint, nbPoints, vector) {\n  let counter = currentPoint + 1;\n  while (vector[counter] === false) counter++;\n  return currentPoint === nbPoints ? 0 : counter;\n}\n","import { xNorm, xMaxValue, xMinValue } from 'ml-spectra-processing';\n\nimport antiLowerConvexHull from './util/antiLowerConvexHull';\n\n/**\n * Performs a global optimization of required parameters\n * It will return an object containing:\n * - `minFunctionValue`: The minimum value found for the objetive function\n * - `optima`: Array of Array of values for all the variables where the function reach its minimum value\n * - `iterations`: Number of iterations performed in the process\n * - `finalState`: Internal state allowing to continue optimization (initialState)\n * @param {function} objectiveFunction Function to evaluate. It should accept an array of variables\n * @param {Array} lowerBoundaries Array containing for each variable the lower boundary\n * @param {Array} upperBoundaries Array containing for each variable the higher boundary\n * @param {Object} [options={}]\n * @param {number} [options.iterations] - Number of iterations.\n * @param {number} [options.epsilon] - Tolerance to choose best current value.\n * @param {number} [options.tolerance] - Minimum tollerance of the function.\n * @param {number} [options.tolerance2] - Minimum tollerance of the function.\n * @param {Object} [options.initialState={}}] - finalState of previous optimization.\n * @return {Object} {finalState, iterations, minFunctionValue}\n * */\n\nexport default function direct(\n  objectiveFunction,\n  lowerBoundaries,\n  upperBoundaries,\n  options = {},\n) {\n  const {\n    iterations = 50,\n    epsilon = 1e-4,\n    tolerance = 1e-16,\n    tolerance2 = 1e-12,\n    initialState = {},\n  } = options;\n\n  if (\n    objectiveFunction === undefined ||\n    lowerBoundaries === undefined ||\n    upperBoundaries === undefined\n  ) {\n    throw new RangeError('There is something undefined');\n  }\n\n  lowerBoundaries = new Float64Array(lowerBoundaries);\n  upperBoundaries = new Float64Array(upperBoundaries);\n\n  if (lowerBoundaries.length !== upperBoundaries.length) {\n    throw new Error(\n      'Lower bounds and Upper bounds for x are not of the same length',\n    );\n  }\n\n  //-------------------------------------------------------------------------\n  //                        STEP 1. Initialization\n  //-------------------------------------------------------------------------\n  let n = lowerBoundaries.length;\n  let diffBorders = upperBoundaries.map((x, i) => x - lowerBoundaries[i]);\n\n  let {\n    numberOfRectangles = 0,\n    totalIterations = 0,\n    unitaryCoordinates = [new Float64Array(n).fill(0.5)],\n    middlePoint = new Float64Array(n).map((value, index) => {\n      return (\n        lowerBoundaries[index] +\n        unitaryCoordinates[0][index] * diffBorders[index]\n      );\n    }),\n    bestCurrentValue = objectiveFunction(middlePoint),\n    fCalls = 1,\n    smallerDistance = 0,\n    edgeSizes = [new Float64Array(n).fill(0.5)],\n    diagonalDistances = [Math.sqrt(n * 0.5 ** 2)],\n    functionValues = [bestCurrentValue],\n    differentDistances = diagonalDistances,\n    smallerValuesByDistance = [bestCurrentValue],\n    choiceLimit = undefined,\n  } = initialState;\n  if (\n    initialState.originalCoordinates &&\n    initialState.originalCoordinates.length > 0\n  ) {\n    bestCurrentValue = xMinValue(functionValues);\n    choiceLimit =\n      epsilon * Math.abs(bestCurrentValue) > 1e-8\n        ? epsilon * Math.abs(bestCurrentValue)\n        : 1e-8;\n\n    smallerDistance = getMinIndex(\n      functionValues,\n      diagonalDistances,\n      choiceLimit,\n      bestCurrentValue,\n    );\n\n    unitaryCoordinates = initialState.originalCoordinates.slice();\n    for (let j = 0; j < unitaryCoordinates.length; j++) {\n      for (let i = 0; i < lowerBoundaries.length; i++) {\n        unitaryCoordinates[j][i] =\n          (unitaryCoordinates[j][i] - lowerBoundaries[i]) / diffBorders[i];\n      }\n    }\n  }\n\n  let iteration = 0;\n  //-------------------------------------------------------------------------\n  //                          Iteration loop\n  //-------------------------------------------------------------------------\n\n  while (iteration < iterations) {\n    //----------------------------------------------------------------------\n    //  STEP 2. Identify the set S of all potentially optimal rectangles\n    //----------------------------------------------------------------------\n\n    let S1 = [];\n    let idx = differentDistances.findIndex(\n      // eslint-disable-next-line no-loop-func\n      (e) => e === diagonalDistances[smallerDistance],\n    );\n    let counter = 0;\n    for (let i = idx; i < differentDistances.length; i++) {\n      for (let f = 0; f < functionValues.length; f++) {\n        if (\n          (functionValues[f] === smallerValuesByDistance[i]) &\n          (diagonalDistances[f] === differentDistances[i])\n        ) {\n          S1[counter++] = f;\n        }\n      }\n    }\n\n    let optimumValuesIndex, S3;\n    if (differentDistances.length - idx > 1) {\n      let a1 = diagonalDistances[smallerDistance];\n      let b1 = functionValues[smallerDistance];\n      let a2 = differentDistances[differentDistances.length - 1];\n      let b2 = smallerValuesByDistance[differentDistances.length - 1];\n      let slope = (b2 - b1) / (a2 - a1);\n      let constant = b1 - slope * a1;\n      let S2 = new Uint32Array(counter);\n      counter = 0;\n      for (let i = 0; i < S2.length; i++) {\n        let j = S1[i];\n        if (\n          functionValues[j] <=\n          slope * diagonalDistances[j] + constant + tolerance2\n        ) {\n          S2[counter++] = j;\n        }\n      }\n\n      let xHull = [];\n      let yHull = [];\n      for (let i = 0; i < counter; i++) {\n        xHull.push(diagonalDistances[S2[i]]);\n        yHull.push(functionValues[S2[i]]);\n      }\n\n      let lowerIndexHull = antiLowerConvexHull(xHull, yHull);\n\n      S3 = [];\n      for (let i = 0; i < lowerIndexHull.length; i++) {\n        S3.push(S2[lowerIndexHull[i]]);\n      }\n    } else {\n      S3 = S1.slice(0, counter);\n    }\n    optimumValuesIndex = S3;\n    //--------------------------------------------------------------\n    // STEPS 3,5: Select any rectangle j in S\n    //--------------------------------------------------------------\n    for (let k = 0; k < optimumValuesIndex.length; k++) {\n      let j = optimumValuesIndex[k];\n      let largerSide = xMaxValue(edgeSizes[j]);\n      let largeSidesIndex = new Uint32Array(edgeSizes[j].length);\n      counter = 0;\n      for (let i = 0; i < edgeSizes[j].length; i++) {\n        if (Math.abs(edgeSizes[j][i] - largerSide) < tolerance) {\n          largeSidesIndex[counter++] = i;\n        }\n      }\n      let delta = (2 * largerSide) / 3;\n      let bestFunctionValues = [];\n      for (let r = 0; r < counter; r++) {\n        let i = largeSidesIndex[r];\n        let firstMiddleCenter = unitaryCoordinates[j].slice();\n        let secondMiddleCenter = unitaryCoordinates[j].slice();\n        firstMiddleCenter[i] += delta;\n        secondMiddleCenter[i] -= delta;\n        let firstMiddleValue = new Float64Array(firstMiddleCenter.length);\n        let secondMiddleValue = new Float64Array(secondMiddleCenter.length);\n        for (let i = 0; i < firstMiddleCenter.length; i++) {\n          firstMiddleValue[i] =\n            lowerBoundaries[i] + firstMiddleCenter[i] * diffBorders[i];\n          secondMiddleValue[i] =\n            lowerBoundaries[i] + secondMiddleCenter[i] * diffBorders[i];\n        }\n        let firstMinValue = objectiveFunction(firstMiddleValue);\n        let secondMinValue = objectiveFunction(secondMiddleValue);\n        fCalls += 2;\n        bestFunctionValues.push({\n          minValue: Math.min(firstMinValue, secondMinValue),\n          index: r,\n        });\n        // [Math.min(firstMinValue, secondMinValue), r];\n        unitaryCoordinates.push(firstMiddleCenter, secondMiddleCenter);\n        functionValues.push(firstMinValue, secondMinValue);\n      }\n\n      let b = bestFunctionValues.sort((a, b) => a.minValue - b.minValue);\n      for (let r = 0; r < counter; r++) {\n        let u = largeSidesIndex[b[r].index];\n        let ix1 = numberOfRectangles + 2 * (b[r].index + 1) - 1;\n        let ix2 = numberOfRectangles + 2 * (b[r].index + 1);\n        edgeSizes[j][u] = delta / 2;\n        edgeSizes[ix1] = edgeSizes[j].slice();\n        edgeSizes[ix2] = edgeSizes[j].slice();\n        diagonalDistances[j] = xNorm(edgeSizes[j]);\n        diagonalDistances[ix1] = diagonalDistances[j];\n        diagonalDistances[ix2] = diagonalDistances[j];\n      }\n      numberOfRectangles += 2 * counter;\n    }\n\n    //--------------------------------------------------------------\n    //                  Update\n    //--------------------------------------------------------------\n\n    bestCurrentValue = xMinValue(functionValues);\n\n    choiceLimit =\n      epsilon * Math.abs(bestCurrentValue) > 1e-8\n        ? epsilon * Math.abs(bestCurrentValue)\n        : 1e-8;\n\n    smallerDistance = getMinIndex(\n      functionValues,\n      diagonalDistances,\n      choiceLimit,\n      bestCurrentValue,\n      iteration,\n    );\n\n    differentDistances = Array.from(new Set(diagonalDistances));\n    differentDistances = differentDistances.sort((a, b) => a - b);\n\n    smallerValuesByDistance = [];\n    for (let i = 0; i < differentDistances.length; i++) {\n      let minIndex;\n      let minValue = Number.POSITIVE_INFINITY;\n      for (let k = 0; k < diagonalDistances.length; k++) {\n        if (diagonalDistances[k] === differentDistances[i]) {\n          if (functionValues[k] < minValue) {\n            minValue = functionValues[k];\n            minIndex = k;\n          }\n        }\n      }\n      smallerValuesByDistance.push(functionValues[minIndex]);\n    }\n\n    let currentMin = [];\n    for (let j = 0; j < functionValues.length; j++) {\n      if (functionValues[j] === bestCurrentValue) {\n        let temp = [];\n        for (let i = 0; i < lowerBoundaries.length; i++) {\n          temp.push(\n            lowerBoundaries[i] + unitaryCoordinates[j][i] * diffBorders[i],\n          );\n        }\n        currentMin.push(temp);\n      }\n    }\n    iteration += 1;\n  }\n  //--------------------------------------------------------------\n  //                  Saving results\n  //--------------------------------------------------------------\n\n  let result = {};\n  result.minFunctionValue = bestCurrentValue;\n  result.iterations = iteration;\n  let originalCoordinates = [];\n  for (let j = 0; j < numberOfRectangles + 1; j++) {\n    let pair = [];\n    for (let i = 0; i < lowerBoundaries.length; i++) {\n      pair.push(lowerBoundaries[i] + unitaryCoordinates[j][i] * diffBorders[i]);\n    }\n    originalCoordinates.push(pair);\n  }\n\n  result.finalState = {\n    numberOfRectangles,\n    totalIterations: (totalIterations += iterations),\n    originalCoordinates,\n    middlePoint,\n    fCalls,\n    smallerDistance,\n    edgeSizes,\n    diagonalDistances,\n    functionValues,\n    differentDistances,\n    smallerValuesByDistance,\n    choiceLimit,\n  };\n\n  let minimizer = [];\n  for (let i = 0; i < functionValues.length; i++) {\n    if (functionValues[i] === bestCurrentValue) {\n      minimizer.push(originalCoordinates[i]);\n    }\n  }\n\n  result.optima = minimizer;\n  return result;\n}\n\nfunction getMinIndex(\n  functionValues,\n  diagonalDistances,\n  choiceLimit,\n  bestCurrentValue,\n) {\n  let item = [];\n  for (let i = 0; i < functionValues.length; i++) {\n    item[i] =\n      Math.abs(functionValues[i] - (bestCurrentValue + choiceLimit)) /\n      diagonalDistances[i];\n  }\n  const min = xMinValue(item);\n  let result = item.findIndex((x) => x === min);\n  return result;\n}\n","import direct from 'ml-direct';\nexport function directOptimization(data, sumOfShapes, options) {\n    const { minValues, maxValues, maxIterations, epsilon, tolerance, tolerance2, initialState, } = options;\n    const objectiveFunction = getObjectiveFunction(data, sumOfShapes);\n    const result = direct(objectiveFunction, \n    // direct internally converts ArrayLike to Float64Array,\n    // so we can safely cast minValues and maxValues to number[]\n    minValues, maxValues, {\n        iterations: maxIterations,\n        epsilon,\n        tolerance,\n        tolerance2,\n        initialState,\n    });\n    const { optima } = result;\n    return {\n        parameterError: result.minFunctionValue,\n        iterations: result.iterations,\n        parameterValues: optima[0],\n    };\n}\nfunction getObjectiveFunction(data, sumOfShapes) {\n    const { x, y } = data;\n    const nbPoints = x.length;\n    return (parameters) => {\n        const fct = sumOfShapes(parameters);\n        let error = 0;\n        for (let i = 0; i < nbPoints; i++) {\n            error += (y[i] - fct(x[i])) ** 2;\n        }\n        return error;\n    };\n}\n//# sourceMappingURL=directOptimization.js.map","import { xMinMaxValues } from 'ml-spectra-processing';\nimport { getSumOfShapes } from \"./shapes/getSumOfShapes.js\";\nimport { getInternalPeaks } from \"./util/internalPeaks/getInternalPeaks.js\";\nimport { selectMethod } from \"./util/selectMethod.js\";\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    const 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    const 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    const { algorithm, optimizationOptions } = selectMethod(options.optimization);\n    const sumOfShapes = getSumOfShapes(internalPeaks);\n    const 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    const newPeaks = [];\n    for (const 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 { levenbergMarquardt } from 'ml-levenberg-marquardt';\nimport { directOptimization } from \"./wrappers/directOptimization.js\";\n/** Algorithm to select the method.\n * @param optimizationOptions - Optimization options\n * @returns - The algorithm and optimization options\n */\nexport function selectMethod(optimizationOptions = {}) {\n    const { 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        case 'direct': {\n            return {\n                algorithm: directOptimization,\n                optimizationOptions: {\n                    iterations: 20,\n                    epsilon: 1e-4,\n                    tolerance: 1e-16,\n                    tolerance2: 1e-12,\n                    initialState: {},\n                    ...options,\n                },\n            };\n        }\n        default:\n            throw new Error(`Unknown fitting algorithm`);\n    }\n}\n//# sourceMappingURL=selectMethod.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 internalPeaks\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 < parameters.length; i++) {\n                    const shapeFctKey = peak.parameters[i];\n                    peak.shapeFct[shapeFctKey] = 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","import { getShape1D } from 'ml-peak-shape-generator';\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 = structuredClone(peaks) } = options;\n    const 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","import { getShape1D } from 'ml-peak-shape-generator';\nimport { optimize } from 'ml-spectra-fitting';\nimport { xGetFromToIndex } from 'ml-spectra-processing';\nimport { addMissingShape } from \"../utils/addMissingShape.js\";\nimport { groupPeaks } from \"../utils/groupPeaks.js\";\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    const groups = groupPeaks(peakList, { factor: groupingFactor });\n    const logs = [];\n    const 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","/**\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?.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    const 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 { optimizePeaksWithLogs } from \"./optimizePeaksWithLogs.js\";\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","export function addMissingIDs(peaks, options = {}) {\n    const { output = structuredClone(peaks) } = options;\n    for (const peak of output) {\n        if (!('id' in peak)) {\n            peak.id = crypto.randomUUID();\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=addMissingIDs.js.map","import { addMissingIDs } from \"../utils/addMissingIDs.js\";\nimport { addMissingShape } from \"../utils/addMissingShape.js\";\nimport { optimizePeaksWithLogs } from \"./optimizePeaksWithLogs.js\";\nexport function joinBroadPeaks(peakList, options = {}) {\n    const { 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                const initialWidth = Math.abs(candidates.x[candidates.x.length - 1] - candidates.x[0]);\n                const { logs, optimizedPeaks } = optimizePeaksWithLogs(candidates, [\n                    {\n                        id: crypto.randomUUID(),\n                        x: broadLines[maxI].x,\n                        y: max,\n                        width: initialWidth,\n                        parameters: {\n                            width: { max: initialWidth * 4, min: initialWidth * 0.8 },\n                        },\n                    },\n                ], { shape: { kind: 'pseudoVoigt' }, optimization });\n                [max, maxI] = [0, 0];\n                const log = logs.find((l) => l.message === 'optimization successful');\n                if (log) {\n                    const { error } = log;\n                    if (error < 0.2) {\n                        newPeaks.push(optimizedPeaks[0]);\n                    }\n                    else {\n                        pushBackPeaks(broadLines, indexes, newPeaks);\n                    }\n                }\n                else {\n                    pushBackPeaks(broadLines, indexes, newPeaks);\n                }\n            }\n            else {\n                pushBackPeaks(broadLines, indexes, newPeaks);\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 pushBackPeaks(broadLines, indexes, peaks) {\n    for (const index of indexes) {\n        peaks.push(getGSDPeakOptimizedStructure(broadLines[index]));\n    }\n}\nfunction getGSDPeakOptimizedStructure(peak) {\n    const { id, shape, x, y, width } = peak;\n    const 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            const peak = peaks[i];\n            const 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 =\n                    (peak.width / (nextPeak.width + peak.width)) * (nextPeak.x - peak.x) +\n                        peak.x;\n                nextPeak.from.x = peak.to.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    const { shape = { kind: 'gaussian' }, output = parse(stringify(peaks)), } = options;\n    const 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"],"names":["toString","Object","prototype","isAnyArray","value","tag","call","endsWith","includes","sgg","ys","xs","options","windowSize","derivative","polynomial","Number","isInteger","RangeError","TypeError","length","console","warn","half","Math","floor","np","ans","Float64Array","weights","m","n","s","Array","t","j","weight","fullWeights","hs","constantH","i","wg1","wg2","d1","d2","l","getHs","wg","d","h","center","count","gramPoly","k","Grampoly","genFact","a","b","gf","sum","xMedian","input","exact","array","slice","middleIndex","calcMiddle","median","quickSelect","low","high","middle","currentLow","currentHigh","swap","temp","xCheck","minLength","Error","xFindClosestIndex","target","sorted","abs","index","diff","POSITIVE_INFINITY","currentDiff","xGetFromToIndex","x","fromIndex","toIndex","from","to","undefined","output","arguments","currentMin","_options$fromIndex","_options$toIndex","minValue","min","currentMax","maxValue","max","_options$min","autoMinMax","_options$max","factor","defineProperty","matrix","require$$0","rescale","require$$1","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","constructor","name","rows","columns","maxI","maxJ","result","loop","get","line","push","formatNumber","join","inspectData","num","formatNumber2","padEnd","len","str","fix","toFixed","startsWith","exp","toExponential","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","from1DArray","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","rowVector","columnVector","zeros","ones","fill","rand","random","randInt","interval","round","eye","this","diag","data","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isDistance","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","setRow","row1","row2","getColumn","getColumnVector","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","norm","type","sqrt","dot","cumulativeSum","vector2","vector1","mmul","other","Bcolj","mpow","scalar","bb","e","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","c","resultat","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndex","columnIndex","trace","entries","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","iterator","col","values","isArrayOfNumbers","every","element","for","randomInt","diagonal","identity","negate","tensorProduct","initData","nRows","nColumns","super","arrayData","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","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","pow","arg0","powS","powM","installMathOperations","SymmetricMatrix","diagonalSize","isSymmetricMatrix","klassType","upperRightEntries","toMatrix","removeCross","addCross","applyMask","mask","sidesToRemove","passthroughs","reverse","sideIndex","toCompact","compact","fromCompact","compactSize","JSON","stringify","upperRightValues","DistanceMatrix","isDistanceMatrix","klassSubType","sideSize","toSymmetricMatrix","BaseView","MatrixSelectionView","WrapperMatrix1D","_calculateIndex","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","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","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","leftHandSide","rightHandSide","useSVD","xrange","exception","range","dependenciesOneRow","error","thresholdValue","thresholdError","returnArray","EigenvalueDecomposition","assumeSymmetric","hh","tred2","dl1","c3","el1","s2","tst1","tql2","H","ort","orthes","nn","w","ra","sa","vr","vi","notlast","cdivres","exshift","z","iter","cdiv","hqr2","realEigenvalues","imaginaryEigenvalues","eigenvectorMatrix","xr","xi","yr","yi","CholeskyDecomposition","dimension","positiveDefinite","L","isPositiveDefinite","B","nipals","scaleScores","maxIterations","terminationCriteria","u","tOld","counter","xResidual","residual","yResidual","betas","CHO","EVD","Matrix_1","MatrixColumnSelectionView","MatrixColumnView","MatrixFlipColumnView","MatrixFlipRowView","MatrixRowSelectionView","MatrixRowView","MatrixSubView","MatrixTransposeView","NIPALS","Nipals","SVD","correlation","xMatrix","yMatrix","yIsSame","sdx","sdy","corr","covariance","cov","_default","default","subMatrix0","subMatrix1","subMatrix2","inverse_1","linearDependencies","results","Abis","pseudoInverse","svdSolution","wrap","xMaxValue","xMinValue","xMinMaxValues","xNoiseStandardDeviation","mad","averageDeviations","xMedianAbsoluteDeviation","sd","xNorm","getMinMaxIntervalsDy","dY","dX","lastMax","lastMin","intervalL","intervalR","tryMatchOneIntervalWithMinData","lastK","minData","yThreshold","intervalWidth","intervalCenter","yData","minDistance","possible","newLastIndex","centerIndex","deltaX","currentDistance","lastIndex","getPeakFromIntervals","peaks","ddY","width","id","crypto","randomUUID","inflectionPoints","isLessAndGreaterThanZero","back","next","firstDerivative","crossDy","xGetCrossZeroPoints","gsd","noiseLevel","sgOptions","smoothY","maxCriteria","minMaxRatio","realTopDetection","peakDetectionAlgorithm","at","xIsMonotonic","isEquallySpaced","tolerance","maxDx","minDx","MAX_SAFE_INTEGER","absoluteDifference","xIsEquallySpaced","noiseInfo","xValue","minY","maxY","peakData","minddY","secondDerivative","lastJ","yIndex","match","autoAlgorithm","peak","currentIndex","beta","gamma","xCurrent","xPrevious","optimizeTop","forEach","GAUSSIAN_EXP_FACTOR","LN2","ROOT_PI_OVER_LN2","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","Gaussian","fwhm","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","widthToFWHM","fct","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","shape","getGaussianData","calculateHeight","getParameters","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","erfinv","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","halfResidual","quantileFunction","LorentzianDispersive","lorentzianDispersiveFct","_height","getLorentzianDispersiveData","PseudoVoigt","mu","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","GeneralizedLorentzian","generalizedLorentzianFwhmToWidth","generalizedLorentzianWidthToFWHM","generalizedLorentzianFct","getGeneralizedLorentzianArea","getGeneralizedLorentzianFactor","getGeneralizedLorentzianData","calculateGeneralizedLorentzianHeight","getShape1D","kind","assert","message","DefaultParameters","init","peakShape","gradientDifference","properties","getNormalizedValue","parameter","property","minMaxY","baseline","checkOptions","timeout","initialValues","damping","dampingStepUp","dampingStepDown","errorTolerance","centralDifference","improvementThreshold","minValues","maxValues","parameters","parLen","MIN_SAFE_INTEGER","gradientDifferenceArray","getGradientDifferenceArray","filler","dataLength","getFiller","checkTimeout","endTime","Date","now","getCheckTimeout","weightSquare","_","errorCalculation","parameterizedFunction","func","step","params","evaluatedData","gradientFunc","paramFunction","nbParams","nbPoints","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeightResidualError","perturbations","levenbergMarquardt","checkedOptions","optimalError","optimalParameters","converged","iteration","previousError","parameterValues","parameterError","iterations","antiLowerConvexHull","currentPoint","moveOn","moveBack","map","item","filter","getMinIndex","functionValues","diagonalDistances","choiceLimit","bestCurrentValue","findIndex","directOptimization","sumOfShapes","epsilon","tolerance2","initialState","objectiveFunction","getObjectiveFunction","lowerBoundaries","upperBoundaries","diffBorders","numberOfRectangles","totalIterations","unitaryCoordinates","middlePoint","fCalls","smallerDistance","edgeSizes","differentDistances","smallerValuesByDistance","originalCoordinates","optimumValuesIndex","S3","S1","a1","b1","a2","slope","constant","S2","Uint32Array","xHull","yHull","lowerIndexHull","largerSide","largeSidesIndex","bestFunctionValues","firstMiddleCenter","secondMiddleCenter","firstMiddleValue","secondMiddleValue","firstMinValue","secondMinValue","ix1","ix2","Set","minFunctionValue","pair","finalState","minimizer","optima","direct","optimize","internalPeaks","shiftValue","normalizedPeaks","shapeFct","propertiesValues","propertyValue","generalParameterValue","defaultParameterValues","getInternalPeaks","normalizedY","gradientDifferences","algorithm","optimizationOptions","selectMethod","optimization","totalY","peakX","shapeFctKey","getSumOfShapes","fitted","fittedValues","newPeaks","newPeak","addMissingShape","structuredClone","shapeInstance","hasShape","optimizePeaksWithLogs","peakList","fromTo","groupingFactor","factorLimits","groups","parse","previousPeak","currentGroup","groupPeaks","logs","peakGroup","start","firstPeak","lastPeak","subarray","groupSize","time","optimizedPeaks","optimizePeaks","addMissingIDs","joinBroadPeaks","broadWidth","broadRatio","broadLines","getGSDPeakOptimizedStructure","maxDdy","MAX_VALUE","candidates","indexes","initialWidth","find","pushBackPeaks","broadenPeaks","overlap","xFrom","xTo","mapPeaks","nextPeak","setShape"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,24,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49]}