{"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/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-matrix/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","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/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/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-levenberg-marquardt/lib-esm/checkOptions.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-direct/node_modules/ml-spectra-processing/lib-esm/x/xNorm.js","../node_modules/ml-direct/src/util/antiLowerConvexHull.js","../node_modules/ml-direct/src/index.js","../lib-esm/util/wrappers/directOptimization.js","../lib-esm/index.js","../lib-esm/util/selectMethod.js","../lib-esm/shapes/getSumOfShapes.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 { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input, options = {}) {\n    const { minLength } = options;\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    //@ts-expect-error we already checked that input is an array\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","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","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nexport class Gaussian {\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport function calculateGaussianHeight(options) {\n    let { fwhm = 500, area = 1, sd } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\n/**\n * Calculate the height of the gaussian function of a specific width (fwhm) at a speicifc\n * x position (the gaussian is centered on x=0)\n * @param x\n * @param fwhm\n * @returns y\n */\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\nexport function getGaussianArea(options) {\n    let { fwhm = 500, sd, height = 1 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\nexport function getGaussianFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\nexport function getGaussianData(shape = {}, options = {}) {\n    let { fwhm = 500, sd } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    let { length, factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = gaussianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        return 0;\n    let ln1MinusXSqrd = Math.log(1 - x * x);\n    let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","import { ROOT_THREE } from '../../../util/constants';\nexport class Lorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2);\n};\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    const quantileFunction = (p) => Math.tan(Math.PI * (p - 0.5));\n    return ((quantileFunction(1 - halfResidual) - quantileFunction(halfResidual)) / 2);\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500 } = shape;\n    let { length, factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = lorentzianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { 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","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {ArrayLike<number>} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(data, parameters, parameterizedFunction, weightSquare) {\n    let error = 0;\n    const func = parameterizedFunction(parameters);\n    for (let i = 0; i < data.x.length; i++) {\n        error += Math.pow(data.y[i] - func(data.x[i]), 2) / weightSquare[i];\n    }\n    return error;\n}\n//# sourceMappingURL=errorCalculation.js.map","import { inverse, Matrix } from 'ml-matrix';\nimport gradientFunction from './gradientFunction';\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    let ans = new Matrix(m, 1);\n    for (let point = 0; point < m; point++) {\n        ans.set(point, 0, data.y[point] - evaluatedData[point]);\n    }\n    return ans;\n}\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights) {\n    let value = damping;\n    let identity = Matrix.eye(params.length, params.length, value);\n    const func = parameterizedFunction(params);\n    let evaluatedData = new Float64Array(data.x.length);\n    for (let i = 0; i < data.x.length; i++) {\n        evaluatedData[i] = func(data.x[i]);\n    }\n    let gradientFunc = gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    let residualError = matrixFunction(data, evaluatedData);\n    let inverseMatrix = inverse(identity.add(gradientFunc.mmul(gradientFunc.transpose().scale('row', { scale: weights }))));\n    let jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    let perturbations = inverseMatrix.mmul(jacobianWeightResidualError);\n    return {\n        perturbations,\n        jacobianWeightResidualError,\n    };\n}\n//# sourceMappingURL=step.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    let ans = Matrix.zeros(nbParams, nbPoints);\n    let rowIndex = 0;\n    for (let param = 0; param < nbParams; param++) {\n        if (gradientDifference[param] === 0)\n            continue;\n        let delta = gradientDifference[param];\n        let auxParams = params.slice();\n        auxParams[param] += delta;\n        let funcParam = paramFunction(auxParams);\n        if (!centralDifference) {\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (evaluatedData[point] - funcParam(data.x[point])) / delta);\n            }\n        }\n        else {\n            auxParams = params.slice();\n            auxParams[param] -= delta;\n            delta *= 2;\n            let funcParam2 = paramFunction(auxParams);\n            for (let point = 0; point < nbPoints; point++) {\n                ans.set(rowIndex, point, (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta);\n            }\n        }\n        rowIndex++;\n    }\n    return ans;\n}\n//# sourceMappingURL=gradientFunction.js.map","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n/**\n * Curve fitting algorithm\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number|ArrayLike<number>} [options.weights = 1] - weighting vector, if the length does not match with the number of data points, the vector is reconstructed with first value.\n * @param {number} [options.damping = 1e-2] - Levenberg-Marquardt parameter, small values of the damping parameter λ result in a Gauss-Newton update and large\nvalues of λ result in a gradient descent update\n * @param {number} [options.dampingStepDown = 9] - factor to reduce the damping (Levenberg-Marquardt parameter) when there is not an improvement when updating parameters.\n * @param {number} [options.dampingStepUp = 11] - factor to increase the damping (Levenberg-Marquardt parameter) when there is an improvement when updating parameters.\n * @param {number} [options.improvementThreshold = 1e-3] - the threshold to define an improvement through an update of parameters\n * @param {number|ArrayLike<number>} [options.gradientDifference = 10e-2] - The step size to approximate the jacobian matrix\n * @param {boolean} [options.centralDifference = false] - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {ArrayLike<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {ArrayLike<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {ArrayLike<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point.\n * @param {number} [options.timeout] - maximum time running before throw in seconds.\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport function levenbergMarquardt(data, parameterizedFunction, options = {}) {\n    let { checkTimeout, minValues, maxValues, parameters, weightSquare, damping, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkOptions(data, parameterizedFunction, options);\n    let error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n    let optimalError = error;\n    let optimalParameters = parameters.slice();\n    let converged = error <= errorTolerance;\n    let iteration = 0;\n    for (; iteration < maxIterations && !converged; iteration++) {\n        let previousError = error;\n        let { perturbations, jacobianWeightResidualError } = step(data, parameters, damping, gradientDifference, parameterizedFunction, centralDifference, weightSquare);\n        for (let k = 0; k < parameters.length; k++) {\n            parameters[k] = Math.min(Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)), maxValues[k]);\n        }\n        error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n        if (isNaN(error))\n            break;\n        if (error < optimalError - errorTolerance) {\n            optimalError = error;\n            optimalParameters = parameters.slice();\n        }\n        let improvementMetric = (previousError - error) /\n            perturbations\n                .transpose()\n                .mmul(perturbations.mul(damping).add(jacobianWeightResidualError))\n                .get(0, 0);\n        if (improvementMetric > improvementThreshold) {\n            damping = Math.max(damping / dampingStepDown, 1e-7);\n        }\n        else {\n            damping = Math.min(damping * dampingStepUp, 1e7);\n        }\n        if (checkTimeout()) {\n            throw new Error(`The execution time is over to ${options.timeout} seconds`);\n        }\n        converged = error <= errorTolerance;\n    }\n    return {\n        parameterValues: optimalParameters,\n        parameterError: optimalError,\n        iterations: iteration,\n    };\n}\n//# sourceMappingURL=index.js.map","import { 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","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, options = {}) {\n    const { minLength } = options;\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    //@ts-expect-error we already checked that input is an array\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","/**\n * This function calculate the norm of a vector\n *\n * @example xNorm([3, 4]) -> 5\n * @param array - array\n * @returns - calculated norm\n */\nexport function xNorm(array) {\n    let result = 0;\n    for (const element of array) {\n        result += element ** 2;\n    }\n    return Math.sqrt(result);\n}\n//# sourceMappingURL=xNorm.js.map","/**\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 { xMinMaxValues } from 'ml-spectra-processing';\nimport { getSumOfShapes } from './shapes/getSumOfShapes';\nimport { getInternalPeaks } from './util/internalPeaks/getInternalPeaks';\nimport { selectMethod } from './util/selectMethod';\n/**\n * Fits a set of points to the sum of a set of bell functions.\n *\n * @param data - An object containing the x and y data to be fitted.\n * @param peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param options - Options for optimize\n * @returns - An object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peaks, options = {}) {\n    // rescale data\n    let temp = xMinMaxValues(data.y);\n    const minMaxY = { ...temp, range: temp.max - temp.min };\n    const internalPeaks = getInternalPeaks(peaks, minMaxY, options);\n    // need to rescale what is related to Y\n    const { baseline: shiftValue = minMaxY.min } = options;\n    let normalizedY = new Float64Array(data.y.length);\n    for (let i = 0; i < data.y.length; i++) {\n        normalizedY[i] = (data.y[i] - shiftValue) / minMaxY.range;\n    }\n    const nbParams = internalPeaks[internalPeaks.length - 1].toIndex + 1;\n    const minValues = new Float64Array(nbParams);\n    const maxValues = new Float64Array(nbParams);\n    const initialValues = new Float64Array(nbParams);\n    const gradientDifferences = new Float64Array(nbParams);\n    let index = 0;\n    for (const peak of internalPeaks) {\n        for (let i = 0; i < peak.parameters.length; i++) {\n            minValues[index] = peak.propertiesValues.min[i];\n            maxValues[index] = peak.propertiesValues.max[i];\n            initialValues[index] = peak.propertiesValues.init[i];\n            gradientDifferences[index] = peak.propertiesValues.gradientDifference[i];\n            index++;\n        }\n    }\n    let { algorithm, optimizationOptions } = selectMethod(options.optimization);\n    let sumOfShapes = getSumOfShapes(internalPeaks);\n    let fitted = algorithm({ x: data.x, y: normalizedY }, sumOfShapes, {\n        minValues,\n        maxValues,\n        initialValues,\n        gradientDifference: gradientDifferences,\n        ...optimizationOptions,\n    });\n    const fittedValues = fitted.parameterValues;\n    let newPeaks = [];\n    for (let peak of internalPeaks) {\n        const { id, shape, parameters, fromIndex } = peak;\n        let newPeak = { x: 0, y: 0, shape };\n        if (id) {\n            newPeak = { ...newPeak, id };\n        }\n        newPeak.x = fittedValues[fromIndex];\n        newPeak.y = fittedValues[fromIndex + 1] * minMaxY.range + shiftValue;\n        for (let i = 2; i < parameters.length; i++) {\n            //@ts-expect-error should be fixed once\n            newPeak.shape[parameters[i]] = fittedValues[fromIndex + i];\n        }\n        newPeaks.push(newPeak);\n    }\n    return {\n        error: fitted.parameterError,\n        iterations: fitted.iterations,\n        peaks: newPeaks,\n    };\n}\n//# sourceMappingURL=index.js.map","import { 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","/**\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"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","xMinMaxValues","array","input","options","arguments","length","undefined","minLength","TypeError","Error","xCheck","min","max","rescale","output","Array","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","minValue","i","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","padMinus","constructor","name","rows","columns","maxI","Math","maxJ","result","loop","j","get","line","push","formatNumber","join","inspectData","num","formatNumber2","padEnd","len","str","fix","toFixed","startsWith","exp","toExponential","slice","checkRowIndex","index","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","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","sqrt","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","x","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","middle","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","element","from","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","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","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","e","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","useSVD","leftHandSide","rightHandSide","GAUSSIAN_EXP_FACTOR","LN2","ROOT_PI_OVER_LN2","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","Gaussian","fwhm","sd","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","widthToFWHM","width","fct","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","shape","getGaussianData","calculateHeight","getParameters","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","erfinv","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","_ref","halfResidual","quantileFunction","PseudoVoigt","mu","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","getShape1D","kind","assert","message","DefaultParameters","init","peak","peakShape","gradientDifference","properties","getNormalizedValue","parameter","property","minMaxY","baseline","range","errorCalculation","parameters","parameterizedFunction","weightSquare","error","func","step","params","damping","centralDifference","weights","evaluatedData","gradientFunc","paramFunction","nbParams","nbPoints","ans","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeightResidualError","perturbations","levenbergMarquardt","checkTimeout","minValues","maxValues","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","improvementThreshold","timeout","initialValues","filler","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","endTime","Date","now","checkOptions","optimalError","optimalParameters","converged","iteration","previousError","parameterValues","parameterError","iterations","xFindClosestIndex","target","sorted","low","high","diff","currentDiff","xGetFromToIndex","to","xMaxValue","xMinValue","xNorm","antiLowerConvexHull","currentPoint","moveOn","moveBack","map","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","peaks","internalPeaks","shiftValue","normalizedPeaks","id","shapeFct","propertiesValues","propertyValue","generalParameterValue","defaultParameterValues","getInternalPeaks","normalizedY","gradientDifferences","algorithm","optimizationOptions","selectMethod","optimization","totalY","peakX","getSumOfShapes","fitted","fittedValues","newPeaks","newPeak"],"mappings":"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"}