{"version":3,"file":"ml-spectra-fitting.min.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xNorm.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/decompositions.js","../lib-esm/shapes/getSumOfShapes.js","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/getShape1D.js","../lib-esm/util/assert.js","../lib-esm/util/internalPeaks/DefaultParameters.js","../lib-esm/util/internalPeaks/getInternalPeaks.js","../node_modules/ml-levenberg-marquardt/lib-esm/checkOptions.js","../node_modules/ml-levenberg-marquardt/lib-esm/errorCalculation.js","../node_modules/ml-levenberg-marquardt/lib-esm/step.js","../node_modules/ml-levenberg-marquardt/lib-esm/gradientFunction.js","../node_modules/ml-levenberg-marquardt/lib-esm/index.js","../node_modules/ml-direct/src/util/antiLowerConvexHull.js","../node_modules/ml-direct/src/index.js","../lib-esm/util/wrappers/directOptimization.js","../lib-esm/util/selectMethod.js","../lib-esm/index.js"],"sourcesContent":["const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","/**\n * This function calculate the norm of a vector\n *\n * @example xNorm([3, 4]) -> 5\n * @param array - array\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    array.forEach((element) => {\n        result += element ** 2;\n    });\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","/**\n * This function returns the sumOfShapes function\n * This function gives sumOfShapes access to the peak list and the associated data\n * @param parameters - parameters\n */\nexport function getSumOfShapes(internalPeaks) {\n    return function sumOfShapes(parameters) {\n        return (x) => {\n            let totalY = 0;\n            for (const peak of internalPeaks) {\n                const peakX = parameters[peak.fromIndex];\n                const y = parameters[peak.fromIndex + 1];\n                for (let i = 2; i < parameters.length; i++) {\n                    //@ts-expect-error Not simply to solve the issue\n                    peak.shapeFct[peak.parameters[i]] = parameters[peak.fromIndex + i];\n                }\n                totalY += y * peak.shapeFct.fct(x - peakX);\n            }\n            return totalY;\n        };\n    };\n}\n//# sourceMappingURL=getSumOfShapes.js.map","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        return 0;\n    let ln1MinusXSqrd = Math.log(1 - x * x);\n    let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nexport class Gaussian {\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport function calculateGaussianHeight(options) {\n    let { fwhm = 500, area = 1, sd } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\n/**\n * Calculate the height of the gaussian function of a specific width (fwhm) at a speicifc\n * x position (the gaussian is centered on x=0)\n * @param x\n * @param fwhm\n * @returns y\n */\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\nexport function getGaussianArea(options) {\n    let { fwhm = 500, sd, height = 1 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\nexport function getGaussianFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\nexport function getGaussianData(shape = {}, options = {}) {\n    let { fwhm = 500, sd } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    let { length, factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = gaussianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","import { ROOT_THREE } from '../../../util/constants';\nexport class Lorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2);\n};\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    const quantileFunction = (p) => Math.tan(Math.PI * (p - 0.5));\n    return ((quantileFunction(1 - halfResidual) - quantileFunction(halfResidual)) / 2);\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500 } = shape;\n    let { length, factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = lorentzianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport { gaussianFct, getGaussianFactor } from '../gaussian/Gaussian';\nimport { lorentzianFct, getLorentzianFactor } from '../lorentzian/Lorentzian';\nexport class PseudoVoigt {\n    constructor(options = {}) {\n        const { fwhm = 500, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this.fwhm, this.mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this.fwhm, height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this.fwhm,\n            mu: this.mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({ fwhm: this.fwhm, mu: this.mu, area });\n    }\n    getParameters() {\n        return ['fwhm', 'mu'];\n    }\n}\nexport const calculatePseudoVoigtHeight = (options = {}) => {\n    let { fwhm = 1, mu = 0.5, area = 1 } = options;\n    return (2 * area) / (fwhm * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI));\n};\nexport const pseudoVoigtFct = (x, fwhm, mu) => {\n    return (1 - mu) * lorentzianFct(x, fwhm) + mu * gaussianFct(x, fwhm);\n};\nexport const pseudoVoigtWidthToFWHM = (width, mu = 0.5) => {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const pseudoVoigtFwhmToWidth = (fwhm, mu = 0.5) => {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const getPseudoVoigtArea = (options) => {\n    const { fwhm = 500, height = 1, mu = 0.5 } = options;\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\nexport const getPseudoVoigtFactor = (area = 0.9999, mu = 0.5) => {\n    return mu < 1 ? getLorentzianFactor(area) : getGaussianFactor(area);\n};\nexport const getPseudoVoigtData = (shape = {}, options = {}) => {\n    let { fwhm = 500, mu = 0.5 } = shape;\n    let { length, factor = getPseudoVoigtFactor(0.999, mu), height = calculatePseudoVoigtHeight({ fwhm, mu, area: 1 }), } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = pseudoVoigtFct(i - center, fwhm, mu) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=PseudoVoigt.js.map","import { Gaussian } from './gaussian/Gaussian';\nimport { Lorentzian } from './lorentzian/Lorentzian';\nimport { PseudoVoigt } from './pseudoVoigt/PseudoVoigt';\n/**\n * Generate a instance of a specific kind of shape.\n */\nexport function getShape1D(shape) {\n    const { kind } = shape;\n    switch (kind) {\n        case 'gaussian':\n            return new Gaussian(shape);\n        case 'lorentzian':\n            return new Lorentzian(shape);\n        case 'pseudoVoigt':\n            return new PseudoVoigt(shape);\n        default: {\n            throw Error(`Unknown distribution ${kind}`);\n        }\n    }\n}\n//# sourceMappingURL=getShape1D.js.map","/**\n * Asserts that value is truthy.\n *\n * @param value - Value to check.\n * @param message - Optional error message to throw.\n */\nexport function assert(value, message) {\n    if (!value) {\n        throw new Error(message ? message : 'unreachable');\n    }\n}\n//# sourceMappingURL=assert.js.map","export const DefaultParameters = {\n    x: {\n        init: (peak) => peak.x,\n        min: (peak, peakShape) => peak.x - peakShape.fwhm * 2,\n        max: (peak, peakShape) => peak.x + peakShape.fwhm * 2,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    y: {\n        init: (peak) => peak.y,\n        min: (peak) => (peak.y < 0 ? -1.1 : 0),\n        max: (peak) => (peak.y < 0 ? 0 : 1.1),\n        gradientDifference: () => 1e-3,\n    },\n    fwhm: {\n        init: (peak, peakShape) => peakShape.fwhm,\n        min: (peak, peakShape) => peakShape.fwhm * 0.25,\n        max: (peak, peakShape) => peakShape.fwhm * 4,\n        gradientDifference: (peak, peakShape) => peakShape.fwhm * 2e-3,\n    },\n    mu: {\n        init: (peak, peakShape) => peakShape.mu,\n        min: () => 0,\n        max: () => 1,\n        gradientDifference: () => 0.01,\n    },\n};\n//# sourceMappingURL=DefaultParameters.js.map","import { getShape1D } from 'ml-peak-shape-generator';\nimport { assert } from '../assert';\nimport { DefaultParameters } from './DefaultParameters';\nconst properties = ['init', 'min', 'max', 'gradientDifference'];\n/**\n * Return an array of internalPeaks that contains the exact init, min, max values based on the options\n * @param peaks\n * @param options\n * @returns\n */\nexport function getInternalPeaks(peaks, minMaxY, options = {}) {\n    let index = 0;\n    let internalPeaks = [];\n    const { baseline: shiftValue = minMaxY.min } = options;\n    const normalizedPeaks = peaks.map((peak) => {\n        return {\n            ...peak,\n            y: (peak.y - shiftValue) / minMaxY.range,\n        };\n    });\n    for (const peak of normalizedPeaks) {\n        const { id, shape = options.shape ? options.shape : { kind: 'gaussian' } } = peak;\n        const shapeFct = getShape1D(shape);\n        const parameters = ['x', 'y', ...shapeFct.getParameters()];\n        const propertiesValues = {\n            min: [],\n            max: [],\n            init: [],\n            gradientDifference: [],\n        };\n        for (let parameter of parameters) {\n            for (let property of properties) {\n                // check if the property is specified in the peak\n                let propertyValue = peak?.parameters?.[parameter]?.[property];\n                if (propertyValue) {\n                    propertyValue = getNormalizedValue(propertyValue, parameter, property, minMaxY, options.baseline);\n                    propertiesValues[property].push(propertyValue);\n                    continue;\n                }\n                // check if there are some global option, it could be a number or a callback\n                let generalParameterValue = options?.parameters?.[parameter]?.[property];\n                if (generalParameterValue) {\n                    if (typeof generalParameterValue === 'number') {\n                        generalParameterValue = getNormalizedValue(generalParameterValue, parameter, property, minMaxY, options.baseline);\n                        propertiesValues[property].push(generalParameterValue);\n                        continue;\n                    }\n                    else {\n                        let value = generalParameterValue(peak);\n                        value = getNormalizedValue(value, parameter, property, minMaxY, options.baseline);\n                        propertiesValues[property].push(value);\n                        continue;\n                    }\n                }\n                // we just need to take the default parameters\n                assert(DefaultParameters[parameter], `No default parameter for ${parameter}`);\n                const defaultParameterValues = DefaultParameters[parameter][property];\n                //@ts-expect-error should never happen\n                propertiesValues[property].push(defaultParameterValues(peak, shapeFct));\n            }\n        }\n        const fromIndex = index;\n        const toIndex = fromIndex + parameters.length - 1;\n        index += toIndex - fromIndex + 1;\n        internalPeaks.push({\n            id,\n            shape,\n            shapeFct,\n            parameters,\n            propertiesValues,\n            fromIndex,\n            toIndex,\n        });\n    }\n    return internalPeaks;\n}\nfunction getNormalizedValue(value, parameter, property, minMaxY, baseline) {\n    if (parameter === 'y') {\n        if (property === 'gradientDifference') {\n            return value;\n        }\n        else {\n            return baseline !== undefined\n                ? (value - baseline) / minMaxY.range\n                : (value - minMaxY.min) / minMaxY.range;\n        }\n    }\n    return value;\n}\n//# sourceMappingURL=getInternalPeaks.js.map","import { isAnyArray } from 'is-any-array';\nexport default function checkOptions(data, parameterizedFunction, options) {\n    let { timeout, minValues, maxValues, initialValues, weights = 1, damping = 1e-2, dampingStepUp = 11, dampingStepDown = 9, maxIterations = 100, errorTolerance = 1e-7, centralDifference = false, gradientDifference = 10e-2, improvementThreshold = 1e-3, } = options;\n    if (damping <= 0) {\n        throw new Error('The damping option must be a positive number');\n    }\n    else if (!data.x || !data.y) {\n        throw new Error('The data parameter must have x and y elements');\n    }\n    else if (!isAnyArray(data.x) ||\n        data.x.length < 2 ||\n        !isAnyArray(data.y) ||\n        data.y.length < 2) {\n        throw new Error('The data parameter elements must be an array with more than 2 points');\n    }\n    else if (data.x.length !== data.y.length) {\n        throw new Error('The data parameter elements must have the same size');\n    }\n    let parameters = initialValues || new Array(parameterizedFunction.length).fill(1);\n    let nbPoints = data.y.length;\n    let parLen = parameters.length;\n    maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n    minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n    if (maxValues.length !== minValues.length) {\n        throw new Error('minValues and maxValues must be the same size');\n    }\n    if (!isAnyArray(parameters)) {\n        throw new Error('initialValues must be an array');\n    }\n    if (typeof gradientDifference === 'number') {\n        gradientDifference = new Array(parameters.length).fill(gradientDifference);\n    }\n    else if (isAnyArray(gradientDifference)) {\n        if (gradientDifference.length !== parLen) {\n            gradientDifference = new Array(parLen).fill(gradientDifference[0]);\n        }\n    }\n    else {\n        throw new Error('gradientDifference should be a number or array with length equal to the number of parameters');\n    }\n    let filler;\n    if (typeof weights === 'number') {\n        let value = 1 / weights ** 2;\n        filler = () => value;\n    }\n    else if (isAnyArray(weights)) {\n        if (weights.length < data.x.length) {\n            let value = 1 / weights[0] ** 2;\n            filler = () => value;\n        }\n        else {\n            filler = (i) => 1 / weights[i] ** 2;\n        }\n    }\n    else {\n        throw new Error('weights should be a number or array with length equal to the number of data points');\n    }\n    let checkTimeout;\n    if (timeout !== undefined) {\n        if (typeof timeout !== 'number') {\n            throw new Error('timeout should be a number');\n        }\n        let endTime = Date.now() + timeout * 1000;\n        checkTimeout = () => Date.now() > endTime;\n    }\n    else {\n        checkTimeout = () => false;\n    }\n    let weightSquare = new Array(data.x.length);\n    for (let i = 0; i < nbPoints; i++) {\n        weightSquare[i] = filler(i);\n    }\n    return {\n        checkTimeout,\n        minValues,\n        maxValues,\n        parameters,\n        weightSquare,\n        damping,\n        dampingStepUp,\n        dampingStepDown,\n        maxIterations,\n        errorTolerance,\n        centralDifference,\n        gradientDifference,\n        improvementThreshold,\n    };\n}\n//# sourceMappingURL=checkOptions.js.map","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {ArrayLike<number>} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(data, parameters, parameterizedFunction, weightSquare) {\n    let error = 0;\n    const func = parameterizedFunction(parameters);\n    for (let i = 0; i < data.x.length; i++) {\n        error += Math.pow(data.y[i] - func(data.x[i]), 2) / weightSquare[i];\n    }\n    return error;\n}\n//# sourceMappingURL=errorCalculation.js.map","import { inverse, Matrix } from 'ml-matrix';\nimport gradientFunction from './gradientFunction';\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    let ans = new Matrix(m, 1);\n    for (let point = 0; point < m; point++) {\n        ans.set(point, 0, data.y[point] - evaluatedData[point]);\n    }\n    return ans;\n}\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights) {\n    let value = damping;\n    let identity = Matrix.eye(params.length, params.length, value);\n    const func = parameterizedFunction(params);\n    let evaluatedData = new Float64Array(data.x.length);\n    for (let i = 0; i < data.x.length; i++) {\n        evaluatedData[i] = func(data.x[i]);\n    }\n    let gradientFunc = gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    let residualError = matrixFunction(data, evaluatedData);\n    let inverseMatrix = inverse(identity.add(gradientFunc.mmul(gradientFunc.transpose().scale('row', { scale: weights }))));\n    let jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    let perturbations = inverseMatrix.mmul(jacobianWeightResidualError);\n    return {\n        perturbations,\n        jacobianWeightResidualError,\n    };\n}\n//# sourceMappingURL=step.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    let ans = Matrix.zeros(nbParams, nbPoints);\n    let rowIndex = 0;\n    for (let param = 0; param < nbParams; param++) {\n        if (gradientDifference[param] === 0)\n            continue;\n        let delta = gradientDifference[param];\n        let auxParams = params.slice();\n        auxParams[param] += delta;\n        let funcParam = paramFunction(auxParams);\n        if (!centralDifference) {\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (evaluatedData[point] - funcParam(data.x[point])) / delta);\n            }\n        }\n        else {\n            auxParams = params.slice();\n            auxParams[param] -= delta;\n            delta *= 2;\n            let funcParam2 = paramFunction(auxParams);\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta);\n            }\n        }\n        rowIndex++;\n    }\n    return ans;\n}\n//# sourceMappingURL=gradientFunction.js.map","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n/**\n * Curve fitting algorithm\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number|ArrayLike<number>} [options.weights = 1] - weighting vector, if the length does not match with the number of data points, the vector is reconstructed with first value.\n * @param {number} [options.damping = 1e-2] - Levenberg-Marquardt parameter, small values of the damping parameter λ result in a Gauss-Newton update and large\nvalues of λ result in a gradient descent update\n * @param {number} [options.dampingStepDown = 9] - factor to reduce the damping (Levenberg-Marquardt parameter) when there is not an improvement when updating parameters.\n * @param {number} [options.dampingStepUp = 11] - factor to increase the damping (Levenberg-Marquardt parameter) when there is an improvement when updating parameters.\n * @param {number} [options.improvementThreshold = 1e-3] - the threshold to define an improvement through an update of parameters\n * @param {number|ArrayLike<number>} [options.gradientDifference = 10e-2] - The step size to approximate the jacobian matrix\n * @param {boolean} [options.centralDifference = false] - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {ArrayLike<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {ArrayLike<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {ArrayLike<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point.\n * @param {number} [options.timeout] - maximum time running before throw in seconds.\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport function levenbergMarquardt(data, parameterizedFunction, options = {}) {\n    let { checkTimeout, minValues, maxValues, parameters, weightSquare, damping, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkOptions(data, parameterizedFunction, options);\n    let error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n    let optimalError = error;\n    let optimalParameters = parameters.slice();\n    let converged = error <= errorTolerance;\n    let iteration = 0;\n    for (; iteration < maxIterations && !converged; iteration++) {\n        let previousError = error;\n        let { perturbations, jacobianWeightResidualError } = step(data, parameters, damping, gradientDifference, parameterizedFunction, centralDifference, weightSquare);\n        for (let k = 0; k < parameters.length; k++) {\n            parameters[k] = Math.min(Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)), maxValues[k]);\n        }\n        error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n        if (isNaN(error))\n            break;\n        if (error < optimalError - errorTolerance) {\n            optimalError = error;\n            optimalParameters = parameters.slice();\n        }\n        let improvementMetric = (previousError - error) /\n            perturbations\n                .transpose()\n                .mmul(perturbations.mul(damping).add(jacobianWeightResidualError))\n                .get(0, 0);\n        if (improvementMetric > improvementThreshold) {\n            damping = Math.max(damping / dampingStepDown, 1e-7);\n        }\n        else {\n            damping = Math.min(damping * dampingStepUp, 1e7);\n        }\n        if (checkTimeout()) {\n            throw new Error(`The execution time is over to ${options.timeout} seconds`);\n        }\n        converged = error <= errorTolerance;\n    }\n    return {\n        parameterValues: optimalParameters,\n        parameterError: optimalError,\n        iterations: iteration,\n    };\n}\n//# sourceMappingURL=index.js.map","/**\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 * Math.pow(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, 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 += Math.pow(y[i] - fct(x[i]), 2);\n        }\n        return error;\n    };\n}\n//# sourceMappingURL=directOptimization.js.map","import { levenbergMarquardt } from 'ml-levenberg-marquardt';\nimport { directOptimization } from './wrappers/directOptimization';\n/** Algorithm to select the method.\n * @param optimizationOptions - Optimization options\n * @returns - The algorithm and optimization options\n */\nexport function selectMethod(optimizationOptions = {}) {\n    let { kind = 'lm', options } = optimizationOptions;\n    switch (kind) {\n        case 'lm':\n        case 'levenbergMarquardt':\n            return {\n                algorithm: levenbergMarquardt,\n                optimizationOptions: {\n                    damping: 1.5,\n                    maxIterations: 100,\n                    errorTolerance: 1e-8,\n                    ...options,\n                },\n            };\n        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","import { xMinMaxValues } from 'ml-spectra-processing';\nimport { getSumOfShapes } from './shapes/getSumOfShapes';\nimport { getInternalPeaks } from './util/internalPeaks/getInternalPeaks';\nimport { selectMethod } from './util/selectMethod';\n/**\n * Fits a set of points to the sum of a set of bell functions.\n *\n * @param data - An object containing the x and y data to be fitted.\n * @param peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Options for optimize\n * @returns - An object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peaks, options = {}) {\n    // rescale data\n    let temp = xMinMaxValues(data.y);\n    const minMaxY = { ...temp, range: temp.max - temp.min };\n    const internalPeaks = getInternalPeaks(peaks, minMaxY, options);\n    // need to rescale what is related to Y\n    const { baseline: shiftValue = minMaxY.min } = options;\n    let normalizedY = new Float64Array(data.y.length);\n    for (let i = 0; i < data.y.length; i++) {\n        normalizedY[i] = (data.y[i] - shiftValue) / minMaxY.range;\n    }\n    const nbParams = internalPeaks[internalPeaks.length - 1].toIndex + 1;\n    const minValues = new Float64Array(nbParams);\n    const maxValues = new Float64Array(nbParams);\n    const initialValues = new Float64Array(nbParams);\n    const gradientDifferences = new Float64Array(nbParams);\n    let index = 0;\n    for (const peak of internalPeaks) {\n        for (let i = 0; i < peak.parameters.length; i++) {\n            minValues[index] = peak.propertiesValues.min[i];\n            maxValues[index] = peak.propertiesValues.max[i];\n            initialValues[index] = peak.propertiesValues.init[i];\n            gradientDifferences[index] = peak.propertiesValues.gradientDifference[i];\n            index++;\n        }\n    }\n    let { algorithm, optimizationOptions } = selectMethod(options.optimization);\n    let sumOfShapes = getSumOfShapes(internalPeaks);\n    let fitted = algorithm({ x: data.x, y: normalizedY }, sumOfShapes, {\n        minValues,\n        maxValues,\n        initialValues,\n        gradientDifference: gradientDifferences,\n        ...optimizationOptions,\n    });\n    const fittedValues = fitted.parameterValues;\n    let newPeaks = [];\n    for (let peak of internalPeaks) {\n        const { id, shape, parameters, fromIndex } = peak;\n        let newPeak = { x: 0, y: 0, shape };\n        if (id) {\n            newPeak = { ...newPeak, id };\n        }\n        newPeak.x = fittedValues[fromIndex];\n        newPeak.y = fittedValues[fromIndex + 1] * minMaxY.range + shiftValue;\n        for (let i = 2; i < parameters.length; i++) {\n            //@ts-expect-error should be fixed once\n            newPeak.shape[parameters[i]] = fittedValues[fromIndex + i];\n        }\n        newPeaks.push(newPeak);\n    }\n    return {\n        error: fitted.parameterError,\n        iterations: fitted.iterations,\n        peaks: newPeaks,\n    };\n}\n//# sourceMappingURL=index.js.map"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","xCheck","input","TypeError","length","xFindClosestIndex","array","target","options","sorted","low","high","middle","Math","abs","index","diff","Number","POSITIVE_INFINITY","i","currentDiff","xGetFromToIndex","x","fromIndex","toIndex","from","to","undefined","xMaxValue","maxValue","xMinValue","minValue","xMinMaxValues","min","max","xNorm","result","forEach","element","sqrt","arguments","_options$fromIndex","_options$toIndex","isInteger","Error","rescale","output","Array","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","constructor","name","inspectData","rows","columns","maxI","maxJ","line","j","push","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","e","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","fill","random","interval","round","this","zeros","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","v","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","Float64Array","s","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","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","exp","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","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","getSumOfShapes","internalPeaks","parameters","totalY","peak","peakX","shapeFct","fct","GAUSSIAN_EXP_FACTOR","LN2","ROOT_PI_OVER_LN2","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","Gaussian","fwhm","sd","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","widthToFWHM","width","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","shape","getGaussianData","calculateHeight","getParameters","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","_ref","halfResidual","quantileFunction","PseudoVoigt","mu","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","getShape1D","kind","assert","message","DefaultParameters","init","peakShape","gradientDifference","properties","getInternalPeaks","peaks","minMaxY","baseline","shiftValue","normalizedPeaks","map","range","id","propertiesValues","parameter","property","propertyValue","getNormalizedValue","generalParameterValue","defaultParameterValues","checkOptions","parameterizedFunction","timeout","minValues","maxValues","initialValues","weights","damping","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","centralDifference","improvementThreshold","filler","checkTimeout","nbPoints","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","endTime","Date","now","weightSquare","errorCalculation","error","func","step","params","evaluatedData","gradientFunc","paramFunction","nbParams","ans","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeightResidualError","perturbations","levenbergMarquardt","optimalError","optimalParameters","converged","iteration","previousError","parameterValues","parameterError","iterations","antiLowerConvexHull","currentPoint","moveOn","moveBack","item","filter","counter","getMinIndex","functionValues","diagonalDistances","choiceLimit","bestCurrentValue","findIndex","directOptimization","sumOfShapes","epsilon","tolerance","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","u","ix1","ix2","Set","minFunctionValue","pair","finalState","minimizer","optima","direct","selectMethod","optimizationOptions","algorithm","normalizedY","gradientDifferences","optimization","fitted","fittedValues","newPeaks","newPeak"],"mappings":"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"}