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