{"version":3,"file":"ml-pls.min.js","sources":["../node_modules/is-any-array/src/index.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","../node_modules/ml-matrix/src/dc/nipals.js","../src/util/utils.js","../src/PLS.js","../src/KOPLS.js","../node_modules/ml-confusion-matrix/src/index.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-roc-multiclass/lib-esm/getAuc.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getNumericalTargets.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getSelectedResults.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getThresholds.js","../node_modules/ml-roc-multiclass/lib-esm/getRocCurve.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getClassesPairs.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getClasses.js","../src/oplsNipals.js","../src/util/tss.js","../src/OPLS.js","../node_modules/ml-cross-validation/src/getFolds.js"],"sourcesContent":["const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default max;\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default min;\n","import isArray 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 (!isArray(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 (!isArray(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","/**\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 checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\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 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  checkIndices,\n  checkNonEmpty,\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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    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    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[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 (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(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 (!Array.isArray(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[\n    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 (Array.isArray(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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class nipals {\n  constructor(X, options = {}) {\n    X = WrapperMatrix2D.checkMatrix(X);\n    let { Y } = options;\n    const {\n      scaleScores = false,\n      maxIterations = 1000,\n      terminationCriteria = 1e-10,\n    } = options;\n\n    let u;\n    if (Y) {\n      if (Array.isArray(Y) && typeof Y[0] === 'number') {\n        Y = Matrix.columnVector(Y);\n      } else {\n        Y = WrapperMatrix2D.checkMatrix(Y);\n      }\n      if (Y.rows !== X.rows) {\n        throw new Error('Y should have the same number of rows as X');\n      }\n      u = Y.getColumnVector(0);\n    } else {\n      u = X.getColumnVector(0);\n    }\n\n    let diff = 1;\n    let t, q, w, tOld;\n\n    for (\n      let counter = 0;\n      counter < maxIterations && diff > terminationCriteria;\n      counter++\n    ) {\n      w = X.transpose().mmul(u).div(u.transpose().mmul(u).get(0, 0));\n      w = w.div(w.norm());\n\n      t = X.mmul(w).div(w.transpose().mmul(w).get(0, 0));\n\n      if (counter > 0) {\n        diff = t.clone().sub(tOld).pow(2).sum();\n      }\n      tOld = t.clone();\n\n      if (Y) {\n        q = Y.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n        q = q.div(q.norm());\n\n        u = Y.mmul(q).div(q.transpose().mmul(q).get(0, 0));\n      } else {\n        u = t;\n      }\n    }\n\n    if (Y) {\n      let p = X.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      p = p.div(p.norm());\n      let xResidual = X.clone().sub(t.clone().mmul(p.transpose()));\n      let residual = u.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      let yResidual = Y.clone().sub(\n        t.clone().mulS(residual.get(0, 0)).mmul(q.transpose()),\n      );\n\n      this.t = t;\n      this.p = p.transpose();\n      this.w = w.transpose();\n      this.q = q;\n      this.u = u;\n      this.s = t.transpose().mmul(t);\n      this.xResidual = xResidual;\n      this.yResidual = yResidual;\n      this.betas = residual;\n    } else {\n      this.w = w.transpose();\n      this.s = t.transpose().mmul(t).sqrt();\n      if (scaleScores) {\n        this.t = t.clone().div(this.s.get(0, 0));\n      } else {\n        this.t = t;\n      }\n      this.xResidual = X.sub(t.mmul(w.transpose()));\n    }\n  }\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * @private\n * Function that given vector, returns its norm\n * @param {Vector} X\n * @return {number} Norm of the vector\n */\nexport function norm(X) {\n  return Math.sqrt(X.clone().apply(pow2array).sum());\n}\n\n/**\n * @private\n * Function that pow 2 each element of a Matrix or a Vector,\n * used in the apply method of the Matrix object\n * @param {number} i - index i.\n * @param {number} j - index j.\n * @return {Matrix} The Matrix object modified at the index i, j.\n * */\nexport function pow2array(i, j) {\n  this.set(i, j, this.get(i, j) ** 2);\n}\n\n/**\n * @private\n * Function that normalize the dataset and return the means and\n * standard deviation of each feature.\n * @param {Matrix} dataset\n * @return {object} dataset normalized, means and standard deviations\n */\nexport function featureNormalize(dataset) {\n  let means = dataset.mean('column');\n  let std = dataset.standardDeviation('column', {\n    mean: means,\n    unbiased: true,\n  });\n  let result = Matrix.checkMatrix(dataset).subRowVector(means);\n  return { result: result.divRowVector(std), means: means, std: std };\n}\n\n/**\n * @private\n * Function that initialize an array of matrices.\n * @param {Array} array\n * @param {boolean} isMatrix\n * @return {Array} array with the matrices initialized.\n */\nexport function initializeMatrices(array, isMatrix) {\n  if (isMatrix) {\n    for (let i = 0; i < array.length; ++i) {\n      for (let j = 0; j < array[i].length; ++j) {\n        let elem = array[i][j];\n        array[i][j] = elem !== null ? new Matrix(array[i][j]) : undefined;\n      }\n    }\n  } else {\n    for (let i = 0; i < array.length; ++i) {\n      array[i] = new Matrix(array[i]);\n    }\n  }\n\n  return array;\n}\n","import { Matrix } from 'ml-matrix';\n\nimport * as Utils from './util/utils';\n\n/**\n * @class PLS\n */\nexport class PLS {\n  /**\n   * Constructor for Partial Least Squares (PLS)\n   * @param {object} options\n   * @param {number} [options.latentVectors] - Number of latent vector to get (if the algorithm doesn't find a good model below the tolerance)\n   * @param {number} [options.tolerance=1e-5]\n   * @param {boolean} [options.scale=true] - rescale dataset using mean.\n   * @param {object} model - for load purposes.\n   */\n  constructor(options, model) {\n    if (options === true) {\n      this.meanX = model.meanX;\n      this.stdDevX = model.stdDevX;\n      this.meanY = model.meanY;\n      this.stdDevY = model.stdDevY;\n      this.PBQ = Matrix.checkMatrix(model.PBQ);\n      this.R2X = model.R2X;\n      this.scale = model.scale;\n      this.scaleMethod = model.scaleMethod;\n      this.tolerance = model.tolerance;\n    } else {\n      let { tolerance = 1e-5, scale = true } = options;\n      this.tolerance = tolerance;\n      this.scale = scale;\n      this.latentVectors = options.latentVectors;\n    }\n  }\n\n  /**\n   * Fits the model with the given data and predictions, in this function is calculated the\n   * following outputs:\n   *\n   * T - Score matrix of X\n   * P - Loading matrix of X\n   * U - Score matrix of Y\n   * Q - Loading matrix of Y\n   * B - Matrix of regression coefficient\n   * W - Weight matrix of X\n   *\n   * @param {Matrix|Array} trainingSet\n   * @param {Matrix|Array} trainingValues\n   */\n  train(trainingSet, trainingValues) {\n    trainingSet = Matrix.checkMatrix(trainingSet);\n    trainingValues = Matrix.checkMatrix(trainingValues);\n\n    if (trainingSet.length !== trainingValues.length) {\n      throw new RangeError(\n        'The number of X rows must be equal to the number of Y rows',\n      );\n    }\n\n    this.meanX = trainingSet.mean('column');\n    this.stdDevX = trainingSet.standardDeviation('column', {\n      mean: this.meanX,\n      unbiased: true,\n    });\n    this.meanY = trainingValues.mean('column');\n    this.stdDevY = trainingValues.standardDeviation('column', {\n      mean: this.meanY,\n      unbiased: true,\n    });\n\n    if (this.scale) {\n      trainingSet = trainingSet\n        .clone()\n        .subRowVector(this.meanX)\n        .divRowVector(this.stdDevX);\n      trainingValues = trainingValues\n        .clone()\n        .subRowVector(this.meanY)\n        .divRowVector(this.stdDevY);\n    }\n\n    if (this.latentVectors === undefined) {\n      this.latentVectors = Math.min(trainingSet.rows - 1, trainingSet.columns);\n    }\n\n    let rx = trainingSet.rows;\n    let cx = trainingSet.columns;\n    let ry = trainingValues.rows;\n    let cy = trainingValues.columns;\n\n    let ssqXcal = trainingSet.clone().mul(trainingSet).sum(); // for the r²\n    let sumOfSquaresY = trainingValues.clone().mul(trainingValues).sum();\n\n    let tolerance = this.tolerance;\n    let n = this.latentVectors;\n    let T = Matrix.zeros(rx, n);\n    let P = Matrix.zeros(cx, n);\n    let U = Matrix.zeros(ry, n);\n    let Q = Matrix.zeros(cy, n);\n    let B = Matrix.zeros(n, n);\n    let W = P.clone();\n    let k = 0;\n    let t;\n    let w;\n    let q;\n    let p;\n\n    while (Utils.norm(trainingValues) > tolerance && k < n) {\n      let transposeX = trainingSet.transpose();\n      let transposeY = trainingValues.transpose();\n\n      let tIndex = maxSumColIndex(trainingSet.clone().mul(trainingSet));\n      let uIndex = maxSumColIndex(trainingValues.clone().mul(trainingValues));\n\n      let t1 = trainingSet.getColumnVector(tIndex);\n      let u = trainingValues.getColumnVector(uIndex);\n      t = Matrix.zeros(rx, 1);\n\n      while (Utils.norm(t1.clone().sub(t)) > tolerance) {\n        w = transposeX.mmul(u);\n        w.div(Utils.norm(w));\n        t = t1;\n        t1 = trainingSet.mmul(w);\n        q = transposeY.mmul(t1);\n        q.div(Utils.norm(q));\n        u = trainingValues.mmul(q);\n      }\n\n      t = t1;\n      let num = transposeX.mmul(t);\n      let den = t.transpose().mmul(t).get(0, 0);\n      p = num.div(den);\n      let pnorm = Utils.norm(p);\n      p.div(pnorm);\n      t.mul(pnorm);\n      w.mul(pnorm);\n\n      num = u.transpose().mmul(t);\n      den = t.transpose().mmul(t).get(0, 0);\n      let b = num.div(den).get(0, 0);\n      trainingSet.sub(t.mmul(p.transpose()));\n      trainingValues.sub(t.clone().mul(b).mmul(q.transpose()));\n\n      T.setColumn(k, t);\n      P.setColumn(k, p);\n      U.setColumn(k, u);\n      Q.setColumn(k, q);\n      W.setColumn(k, w);\n\n      B.set(k, k, b);\n      k++;\n    }\n\n    k--;\n    T = T.subMatrix(0, T.rows - 1, 0, k);\n    P = P.subMatrix(0, P.rows - 1, 0, k);\n    U = U.subMatrix(0, U.rows - 1, 0, k);\n    Q = Q.subMatrix(0, Q.rows - 1, 0, k);\n    W = W.subMatrix(0, W.rows - 1, 0, k);\n    B = B.subMatrix(0, k, 0, k);\n\n    this.ssqYcal = sumOfSquaresY;\n    this.E = trainingSet;\n    this.F = trainingValues;\n    this.T = T;\n    this.P = P;\n    this.U = U;\n    this.Q = Q;\n    this.W = W;\n    this.B = B;\n    this.PBQ = P.mmul(B).mmul(Q.transpose());\n    this.R2X = t\n      .transpose()\n      .mmul(t)\n      .mmul(p.transpose().mmul(p))\n      .div(ssqXcal)\n      .get(0, 0);\n  }\n\n  /**\n   * Predicts the behavior of the given dataset.\n   * @param {Matrix|Array} dataset - data to be predicted.\n   * @return {Matrix} - predictions of each element of the dataset.\n   */\n  predict(dataset) {\n    let X = Matrix.checkMatrix(dataset);\n    if (this.scale) {\n      X = X.subRowVector(this.meanX).divRowVector(this.stdDevX);\n    }\n    let Y = X.mmul(this.PBQ);\n    Y = Y.mulRowVector(this.stdDevY).addRowVector(this.meanY);\n    return Y;\n  }\n\n  /**\n   * Returns the explained variance on training of the PLS model\n   * @return {number}\n   */\n  getExplainedVariance() {\n    return this.R2X;\n  }\n\n  /**\n   * Export the current model to JSON.\n   * @return {object} - Current model.\n   */\n  toJSON() {\n    return {\n      name: 'PLS',\n      R2X: this.R2X,\n      meanX: this.meanX,\n      stdDevX: this.stdDevX,\n      meanY: this.meanY,\n      stdDevY: this.stdDevY,\n      PBQ: this.PBQ,\n      tolerance: this.tolerance,\n      scale: this.scale,\n    };\n  }\n\n  /**\n   * Load a PLS model from a JSON Object\n   * @param {object} model\n   * @return {PLS} - PLS object from the given model\n   */\n  static load(model) {\n    if (model.name !== 'PLS') {\n      throw new RangeError(`Invalid model: ${model.name}`);\n    }\n    return new PLS(true, model);\n  }\n}\n\n/**\n * @private\n * Function that returns the index where the sum of each\n * column vector is maximum.\n * @param {Matrix} data\n * @return {number} index of the maximum\n */\nfunction maxSumColIndex(data) {\n  return Matrix.rowVector(data.sum('column')).maxIndex()[0];\n}\n","import { Matrix, SingularValueDecomposition, inverse } from 'ml-matrix';\n\nimport { initializeMatrices } from './util/utils';\n\n/**\n * @class KOPLS\n */\nexport class KOPLS {\n  /**\n   * Constructor for Kernel-based Orthogonal Projections to Latent Structures (K-OPLS)\n   * @param {object} options\n   * @param {number} [options.predictiveComponents] - Number of predictive components to use.\n   * @param {number} [options.orthogonalComponents] - Number of Y-Orthogonal components.\n   * @param {Kernel} [options.kernel] - Kernel object to apply, see [ml-kernel](https://github.com/mljs/kernel).\n   * @param {object} model - for load purposes.\n   */\n  constructor(options, model) {\n    if (options === true) {\n      this.trainingSet = new Matrix(model.trainingSet);\n      this.YLoadingMat = new Matrix(model.YLoadingMat);\n      this.SigmaPow = new Matrix(model.SigmaPow);\n      this.YScoreMat = new Matrix(model.YScoreMat);\n      this.predScoreMat = initializeMatrices(model.predScoreMat, false);\n      this.YOrthLoadingVec = initializeMatrices(model.YOrthLoadingVec, false);\n      this.YOrthEigen = model.YOrthEigen;\n      this.YOrthScoreMat = initializeMatrices(model.YOrthScoreMat, false);\n      this.toNorm = initializeMatrices(model.toNorm, false);\n      this.TURegressionCoeff = initializeMatrices(\n        model.TURegressionCoeff,\n        false,\n      );\n      this.kernelX = initializeMatrices(model.kernelX, true);\n      this.kernel = model.kernel;\n      this.orthogonalComp = model.orthogonalComp;\n      this.predictiveComp = model.predictiveComp;\n    } else {\n      if (options.predictiveComponents === undefined) {\n        throw new RangeError('no predictive components found!');\n      }\n      if (options.orthogonalComponents === undefined) {\n        throw new RangeError('no orthogonal components found!');\n      }\n      if (options.kernel === undefined) {\n        throw new RangeError('no kernel found!');\n      }\n\n      this.orthogonalComp = options.orthogonalComponents;\n      this.predictiveComp = options.predictiveComponents;\n      this.kernel = options.kernel;\n    }\n  }\n\n  /**\n   * Train the K-OPLS model with the given training set and labels.\n   * @param {Matrix|Array} trainingSet\n   * @param {Matrix|Array} trainingValues\n   */\n  train(trainingSet, trainingValues) {\n    trainingSet = Matrix.checkMatrix(trainingSet);\n    trainingValues = Matrix.checkMatrix(trainingValues);\n\n    // to save and compute kernel with the prediction dataset.\n    this.trainingSet = trainingSet.clone();\n\n    let kernelX = this.kernel.compute(trainingSet);\n\n    let Identity = Matrix.eye(kernelX.rows, kernelX.rows, 1);\n    let temp = kernelX;\n    kernelX = new Array(this.orthogonalComp + 1);\n    for (let i = 0; i < this.orthogonalComp + 1; i++) {\n      kernelX[i] = new Array(this.orthogonalComp + 1);\n    }\n    kernelX[0][0] = temp;\n\n    let result = new SingularValueDecomposition(\n      trainingValues.transpose().mmul(kernelX[0][0]).mmul(trainingValues),\n      {\n        computeLeftSingularVectors: true,\n        computeRightSingularVectors: false,\n      },\n    );\n    let YLoadingMat = result.leftSingularVectors;\n    let Sigma = result.diagonalMatrix;\n\n    YLoadingMat = YLoadingMat.subMatrix(\n      0,\n      YLoadingMat.rows - 1,\n      0,\n      this.predictiveComp - 1,\n    );\n    Sigma = Sigma.subMatrix(\n      0,\n      this.predictiveComp - 1,\n      0,\n      this.predictiveComp - 1,\n    );\n\n    let YScoreMat = trainingValues.mmul(YLoadingMat);\n\n    let predScoreMat = new Array(this.orthogonalComp + 1);\n    let TURegressionCoeff = new Array(this.orthogonalComp + 1);\n    let YOrthScoreMat = new Array(this.orthogonalComp);\n    let YOrthLoadingVec = new Array(this.orthogonalComp);\n    let YOrthEigen = new Array(this.orthogonalComp);\n    let YOrthScoreNorm = new Array(this.orthogonalComp);\n\n    let SigmaPow = Matrix.pow(Sigma, -0.5);\n    // to avoid errors, check infinity\n\n    function removeInfinity(i, j) {\n      if (this.get(i, j) === Infinity) {\n        this.set(i, j, 0);\n      }\n    }\n\n    SigmaPow.apply(removeInfinity);\n\n    for (let i = 0; i < this.orthogonalComp; ++i) {\n      predScoreMat[i] = kernelX[0][i]\n        .transpose()\n        .mmul(YScoreMat)\n        .mmul(SigmaPow);\n\n      let TpiPrime = predScoreMat[i].transpose();\n      TURegressionCoeff[i] = inverse(TpiPrime.mmul(predScoreMat[i]))\n        .mmul(TpiPrime)\n        .mmul(YScoreMat);\n\n      result = new SingularValueDecomposition(\n        TpiPrime.mmul(\n          Matrix.sub(kernelX[i][i], predScoreMat[i].mmul(TpiPrime)),\n        ).mmul(predScoreMat[i]),\n        {\n          computeLeftSingularVectors: true,\n          computeRightSingularVectors: false,\n        },\n      );\n      let CoTemp = result.leftSingularVectors;\n      let SoTemp = result.diagonalMatrix;\n\n      YOrthLoadingVec[i] = CoTemp.subMatrix(0, CoTemp.rows - 1, 0, 0);\n      YOrthEigen[i] = SoTemp.get(0, 0);\n\n      YOrthScoreMat[i] = Matrix.sub(\n        kernelX[i][i],\n        predScoreMat[i].mmul(TpiPrime),\n      )\n        .mmul(predScoreMat[i])\n        .mmul(YOrthLoadingVec[i])\n        .mul(Math.pow(YOrthEigen[i], -0.5));\n\n      let toiPrime = YOrthScoreMat[i].transpose();\n      YOrthScoreNorm[i] = Matrix.sqrt(toiPrime.mmul(YOrthScoreMat[i]));\n\n      YOrthScoreMat[i] = YOrthScoreMat[i].divRowVector(YOrthScoreNorm[i]);\n\n      let ITo = Matrix.sub(\n        Identity,\n        YOrthScoreMat[i].mmul(YOrthScoreMat[i].transpose()),\n      );\n\n      kernelX[0][i + 1] = kernelX[0][i].mmul(ITo);\n      kernelX[i + 1][i + 1] = ITo.mmul(kernelX[i][i]).mmul(ITo);\n    }\n\n    let lastScoreMat = (predScoreMat[this.orthogonalComp] = kernelX[0][\n      this.orthogonalComp\n    ]\n      .transpose()\n      .mmul(YScoreMat)\n      .mmul(SigmaPow));\n\n    let lastTpPrime = lastScoreMat.transpose();\n    TURegressionCoeff[this.orthogonalComp] = inverse(\n      lastTpPrime.mmul(lastScoreMat),\n    )\n      .mmul(lastTpPrime)\n      .mmul(YScoreMat);\n\n    this.YLoadingMat = YLoadingMat;\n    this.SigmaPow = SigmaPow;\n    this.YScoreMat = YScoreMat;\n    this.predScoreMat = predScoreMat;\n    this.YOrthLoadingVec = YOrthLoadingVec;\n    this.YOrthEigen = YOrthEigen;\n    this.YOrthScoreMat = YOrthScoreMat;\n    this.toNorm = YOrthScoreNorm;\n    this.TURegressionCoeff = TURegressionCoeff;\n    this.kernelX = kernelX;\n  }\n\n  /**\n   * Predicts the output given the matrix to predict.\n   * @param {Matrix|Array} toPredict\n   * @return {{y: Matrix, predScoreMat: Array<Matrix>, predYOrthVectors: Array<Matrix>}} predictions\n   */\n  predict(toPredict) {\n    let KTestTrain = this.kernel.compute(toPredict, this.trainingSet);\n\n    let temp = KTestTrain;\n    KTestTrain = new Array(this.orthogonalComp + 1);\n    for (let i = 0; i < this.orthogonalComp + 1; i++) {\n      KTestTrain[i] = new Array(this.orthogonalComp + 1);\n    }\n    KTestTrain[0][0] = temp;\n\n    let YOrthScoreVector = new Array(this.orthogonalComp);\n    let predScoreMat = new Array(this.orthogonalComp);\n\n    let i;\n    for (i = 0; i < this.orthogonalComp; ++i) {\n      predScoreMat[i] = KTestTrain[i][0]\n        .mmul(this.YScoreMat)\n        .mmul(this.SigmaPow);\n\n      YOrthScoreVector[i] = Matrix.sub(\n        KTestTrain[i][i],\n        predScoreMat[i].mmul(this.predScoreMat[i].transpose()),\n      )\n        .mmul(this.predScoreMat[i])\n        .mmul(this.YOrthLoadingVec[i])\n        .mul(Math.pow(this.YOrthEigen[i], -0.5));\n\n      YOrthScoreVector[i] = YOrthScoreVector[i].divRowVector(this.toNorm[i]);\n\n      let scoreMatPrime = this.YOrthScoreMat[i].transpose();\n      KTestTrain[i + 1][0] = Matrix.sub(\n        KTestTrain[i][0],\n        YOrthScoreVector[i]\n          .mmul(scoreMatPrime)\n          .mmul(this.kernelX[0][i].transpose()),\n      );\n\n      let p1 = Matrix.sub(\n        KTestTrain[i][0],\n        KTestTrain[i][i].mmul(this.YOrthScoreMat[i]).mmul(scoreMatPrime),\n      );\n      let p2 = YOrthScoreVector[i].mmul(scoreMatPrime).mmul(this.kernelX[i][i]);\n      let p3 = p2.mmul(this.YOrthScoreMat[i]).mmul(scoreMatPrime);\n\n      KTestTrain[i + 1][i + 1] = p1.sub(p2).add(p3);\n    }\n\n    predScoreMat[i] = KTestTrain[i][0].mmul(this.YScoreMat).mmul(this.SigmaPow);\n    let prediction = predScoreMat[i]\n      .mmul(this.TURegressionCoeff[i])\n      .mmul(this.YLoadingMat.transpose());\n\n    return {\n      prediction: prediction,\n      predScoreMat: predScoreMat,\n      predYOrthVectors: YOrthScoreVector,\n    };\n  }\n\n  /**\n   * Export the current model to JSON.\n   * @return {object} - Current model.\n   */\n  toJSON() {\n    return {\n      name: 'K-OPLS',\n      YLoadingMat: this.YLoadingMat,\n      SigmaPow: this.SigmaPow,\n      YScoreMat: this.YScoreMat,\n      predScoreMat: this.predScoreMat,\n      YOrthLoadingVec: this.YOrthLoadingVec,\n      YOrthEigen: this.YOrthEigen,\n      YOrthScoreMat: this.YOrthScoreMat,\n      toNorm: this.toNorm,\n      TURegressionCoeff: this.TURegressionCoeff,\n      kernelX: this.kernelX,\n      trainingSet: this.trainingSet,\n      orthogonalComp: this.orthogonalComp,\n      predictiveComp: this.predictiveComp,\n    };\n  }\n\n  /**\n   * Load a K-OPLS with the given model.\n   * @param {object} model\n   * @param {Kernel} kernel - kernel used on the model, see [ml-kernel](https://github.com/mljs/kernel).\n   * @return {KOPLS}\n   */\n  static load(model, kernel) {\n    if (model.name !== 'K-OPLS') {\n      throw new RangeError(`Invalid model: ${model.name}`);\n    }\n\n    if (!kernel) {\n      throw new RangeError('You must provide a kernel for the model!');\n    }\n\n    model.kernel = kernel;\n    return new KOPLS(true, model);\n  }\n}\n","/**\n *  Constructs a confusion matrix\n * @class ConfusionMatrix\n * @example\n * const CM = new ConfusionMatrix([[13, 2], [10, 5]], ['cat', 'dog'])\n * @param {Array<Array<number>>} matrix - The confusion matrix, a 2D Array. Rows represent the actual label and columns\n *     the predicted label.\n * @param {Array<any>} labels - Labels of the confusion matrix, a 1D Array\n */\nexport default class ConfusionMatrix {\n  constructor(matrix, labels) {\n    if (matrix.length !== matrix[0].length) {\n      throw new Error('Confusion matrix must be square');\n    }\n    if (labels.length !== matrix.length) {\n      throw new Error(\n        'Confusion matrix and labels should have the same length',\n      );\n    }\n    this.labels = labels;\n    this.matrix = matrix;\n  }\n\n  /**\n   * Construct confusion matrix from the predicted and actual labels (classes). Be sure to provide the arguments in\n   * the correct order!\n   * @param {Array<any>} actual  - The predicted labels of the classification\n   * @param {Array<any>} predicted     - The actual labels of the classification. Has to be of same length as\n   *     predicted.\n   * @param {object} [options] - Additional options\n   * @param {Array<any>} [options.labels] - The list of labels that should be used. If not provided the distinct set\n   *     of labels present in predicted and actual is used. Labels are compared using the strict equality operator\n   *     '==='\n   * @return {ConfusionMatrix} - Confusion matrix\n   */\n  static fromLabels(actual, predicted, options = {}) {\n    if (predicted.length !== actual.length) {\n      throw new Error('predicted and actual must have the same length');\n    }\n    let distinctLabels;\n    if (options.labels) {\n      distinctLabels = new Set(options.labels);\n    } else {\n      distinctLabels = new Set([...actual, ...predicted]);\n    }\n    distinctLabels = Array.from(distinctLabels);\n    if (options.sort) {\n      distinctLabels.sort(options.sort);\n    }\n\n    // Create confusion matrix and fill with 0's\n    const matrix = Array.from({ length: distinctLabels.length });\n    for (let i = 0; i < matrix.length; i++) {\n      matrix[i] = new Array(matrix.length);\n      matrix[i].fill(0);\n    }\n\n    for (let i = 0; i < predicted.length; i++) {\n      const actualIdx = distinctLabels.indexOf(actual[i]);\n      const predictedIdx = distinctLabels.indexOf(predicted[i]);\n      if (actualIdx >= 0 && predictedIdx >= 0) {\n        matrix[actualIdx][predictedIdx]++;\n      }\n    }\n\n    return new ConfusionMatrix(matrix, distinctLabels);\n  }\n\n  /**\n   * Get the confusion matrix\n   * @return {Array<Array<number> >}\n   */\n  getMatrix() {\n    return this.matrix;\n  }\n\n  getLabels() {\n    return this.labels;\n  }\n\n  /**\n   * Get the total number of samples\n   * @return {number}\n   */\n  getTotalCount() {\n    let predicted = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      for (let j = 0; j < this.matrix.length; j++) {\n        predicted += this.matrix[i][j];\n      }\n    }\n    return predicted;\n  }\n\n  /**\n   * Get the total number of true predictions\n   * @return {number}\n   */\n  getTrueCount() {\n    let count = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      count += this.matrix[i][i];\n    }\n    return count;\n  }\n\n  /**\n   * Get the total number of false predictions.\n   * @return {number}\n   */\n  getFalseCount() {\n    return this.getTotalCount() - this.getTrueCount();\n  }\n\n  /**\n   * Get the number of true positive predictions.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getTruePositiveCount(label) {\n    const index = this.getIndex(label);\n    return this.matrix[index][index];\n  }\n\n  /**\n   * Get the number of true negative predictions\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getTrueNegativeCount(label) {\n    const index = this.getIndex(label);\n    let count = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      for (let j = 0; j < this.matrix.length; j++) {\n        if (i !== index && j !== index) {\n          count += this.matrix[i][j];\n        }\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Get the number of false positive predictions.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalsePositiveCount(label) {\n    const index = this.getIndex(label);\n    let count = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      if (i !== index) {\n        count += this.matrix[i][index];\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Get the number of false negative predictions.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalseNegativeCount(label) {\n    const index = this.getIndex(label);\n    let count = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      if (i !== index) {\n        count += this.matrix[index][i];\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Get the number of real positive samples.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getPositiveCount(label) {\n    return this.getTruePositiveCount(label) + this.getFalseNegativeCount(label);\n  }\n\n  /**\n   * Get the number of real negative samples.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getNegativeCount(label) {\n    return this.getTrueNegativeCount(label) + this.getFalsePositiveCount(label);\n  }\n\n  /**\n   * Get the index in the confusion matrix that corresponds to the given label\n   * @param {any} label - The label to search for\n   * @throws if the label is not found\n   * @return {number}\n   */\n  getIndex(label) {\n    const index = this.labels.indexOf(label);\n    if (index === -1) throw new Error('The label does not exist');\n    return index;\n  }\n\n  /**\n   * Get the true positive rate a.k.a. sensitivity. Computes the ratio between the number of true positive predictions and the total number of positive samples.\n   * {@link https://en.wikipedia.org/wiki/Sensitivity_and_specificity}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number} - The true positive rate [0-1]\n   */\n  getTruePositiveRate(label) {\n    return this.getTruePositiveCount(label) / this.getPositiveCount(label);\n  }\n\n  /**\n   * Get the true negative rate a.k.a. specificity. Computes the ration between the number of true negative predictions and the total number of negative samples.\n   * {@link https://en.wikipedia.org/wiki/Sensitivity_and_specificity}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getTrueNegativeRate(label) {\n    return this.getTrueNegativeCount(label) / this.getNegativeCount(label);\n  }\n\n  /**\n   * Get the positive predictive value a.k.a. precision. Computes TP / (TP + FP)\n   * {@link https://en.wikipedia.org/wiki/Positive_and_negative_predictive_values}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getPositivePredictiveValue(label) {\n    const TP = this.getTruePositiveCount(label);\n    return TP / (TP + this.getFalsePositiveCount(label));\n  }\n\n  /**\n   * Negative predictive value\n   * {@link https://en.wikipedia.org/wiki/Positive_and_negative_predictive_values}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getNegativePredictiveValue(label) {\n    const TN = this.getTrueNegativeCount(label);\n    return TN / (TN + this.getFalseNegativeCount(label));\n  }\n\n  /**\n   * False negative rate a.k.a. miss rate.\n   * {@link https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#False_positive_and_false_negative_rates}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalseNegativeRate(label) {\n    return 1 - this.getTruePositiveRate(label);\n  }\n\n  /**\n   * False positive rate a.k.a. fall-out rate.\n   * {@link https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#False_positive_and_false_negative_rates}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalsePositiveRate(label) {\n    return 1 - this.getTrueNegativeRate(label);\n  }\n\n  /**\n   * False discovery rate (FDR)\n   * {@link https://en.wikipedia.org/wiki/False_discovery_rate}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalseDiscoveryRate(label) {\n    const FP = this.getFalsePositiveCount(label);\n    return FP / (FP + this.getTruePositiveCount(label));\n  }\n\n  /**\n   * False omission rate (FOR)\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getFalseOmissionRate(label) {\n    const FN = this.getFalseNegativeCount(label);\n    return FN / (FN + this.getTruePositiveCount(label));\n  }\n\n  /**\n   * F1 score\n   * {@link https://en.wikipedia.org/wiki/F1_score}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getF1Score(label) {\n    const TP = this.getTruePositiveCount(label);\n    return (\n      (2 * TP) /\n      (2 * TP +\n        this.getFalsePositiveCount(label) +\n        this.getFalseNegativeCount(label))\n    );\n  }\n\n  /**\n   * Matthews correlation coefficient (MCC)\n   * {@link https://en.wikipedia.org/wiki/Matthews_correlation_coefficient}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getMatthewsCorrelationCoefficient(label) {\n    const TP = this.getTruePositiveCount(label);\n    const TN = this.getTrueNegativeCount(label);\n    const FP = this.getFalsePositiveCount(label);\n    const FN = this.getFalseNegativeCount(label);\n    return (\n      (TP * TN - FP * FN) /\n      Math.sqrt((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN))\n    );\n  }\n\n  /**\n   * Informedness\n   * {@link https://en.wikipedia.org/wiki/Youden%27s_J_statistic}\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getInformedness(label) {\n    return (\n      this.getTruePositiveRate(label) + this.getTrueNegativeRate(label) - 1\n    );\n  }\n\n  /**\n   * Markedness\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {number}\n   */\n  getMarkedness(label) {\n    return (\n      this.getPositivePredictiveValue(label) +\n      this.getNegativePredictiveValue(label) -\n      1\n    );\n  }\n\n  /**\n   * Get the confusion table.\n   * @param {any} label - The label that should be considered \"positive\"\n   * @return {Array<Array<number> >} - The 2x2 confusion table. [[TP, FN], [FP, TN]]\n   */\n  getConfusionTable(label) {\n    return [\n      [this.getTruePositiveCount(label), this.getFalseNegativeCount(label)],\n      [this.getFalsePositiveCount(label), this.getTrueNegativeCount(label)],\n    ];\n  }\n\n  /**\n   * Get total accuracy.\n   * @return {number} - The ratio between the number of true predictions and total number of classifications ([0-1])\n   */\n  getAccuracy() {\n    let correct = 0;\n    let incorrect = 0;\n    for (let i = 0; i < this.matrix.length; i++) {\n      for (let j = 0; j < this.matrix.length; j++) {\n        if (i === j) correct += this.matrix[i][j];\n        else incorrect += this.matrix[i][j];\n      }\n    }\n    return correct / (correct + incorrect);\n  }\n\n  /**\n   * Returns the element in the confusion matrix that corresponds to the given actual and predicted labels.\n   * @param {any} actual - The true label\n   * @param {any} predicted - The predicted label\n   * @return {number} - The element in the confusion matrix\n   */\n  getCount(actual, predicted) {\n    const actualIndex = this.getIndex(actual);\n    const predictedIndex = this.getIndex(predicted);\n    return this.matrix[actualIndex][predictedIndex];\n  }\n\n  /**\n   * Compute the general prediction accuracy\n   * @deprecated Use getAccuracy\n   * @return {number} - The prediction accuracy ([0-1]\n   */\n  get accuracy() {\n    return this.getAccuracy();\n  }\n\n  /**\n   * Compute the number of predicted observations\n   * @deprecated Use getTotalCount\n   * @return {number}\n   */\n  get total() {\n    return this.getTotalCount();\n  }\n}\n","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport default mean;\n","import isArray from 'is-any-array';\n\nfunction sum(input) {\n  if (!isArray(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 sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport default sum;\n","import mean from 'ml-array-mean';\n/**\n * Returns the Area under the curve.\n * @param curves Object containing the true positivie and false positive rate vectors.\n * @return Area under the curve.\n */\nexport function getAuc(curves) {\n    const auc = [];\n    for (const curve of curves) {\n        let area = 0;\n        const x = curve.specificities;\n        const y = curve.sensitivities;\n        for (let i = 1; i < x.length; i++) {\n            area += 0.5 * (x[i] - x[i - 1]) * (y[i] + y[i - 1]);\n        }\n        area = area > 0.5 ? area : 1 - area;\n        auc.push(area);\n    }\n    return mean(auc);\n}\n//# sourceMappingURL=getAuc.js.map","import max from 'ml-array-max';\nimport min from 'ml-array-min';\n/**\n * Returns the array of metadata numerically categorized.\n * @param targets Array containing the categories.\n * @param tests Array containing the result of prediction.\n * @param pair Object with information about two classes.\n * @param [options={}]\n * @return Array containing the categories assinged as numbers.\n */\nexport function getNumericalTargets(targets, tests, pair, options = {}) {\n    const { dx = 0.001 } = options;\n    const boundaries = [min(tests) - dx, max(tests) + dx];\n    const results = [];\n    for (let i = 0; i < targets.length; i++) {\n        for (let j = 0; j < pair.length; j++) {\n            if (targets[i] === pair[j].name) {\n                results[i] = boundaries[j];\n                break;\n            }\n        }\n    }\n    return results;\n}\n//# sourceMappingURL=getNumericalTargets.js.map","/**\n * Returns the array of metadata numerically categorized.\n * @param array Array containing the categories.\n * @param pair Object containing information about the two classes to deal with.\n * @return Array containing the prediction values arranged for the corresponding classes.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getSelectedResults(array, pair) {\n    const results = [];\n    for (const item of pair) {\n        for (const id of item.ids) {\n            const result = array[id];\n            results.push(result);\n        }\n    }\n    return results;\n}\n//# sourceMappingURL=getSelectedResults.js.map","/**\n * Returns an array of thresholds to build the curve.\n * @param predictions Array of predictions.\n * @return An array of thresholds.\n */\nexport function getThresholds(predictions) {\n    const uniques = [...new Set(predictions)].sort((a, b) => a - b);\n    const thresholds = [uniques[0]];\n    for (let i = 0; i < uniques.length - 1; i++) {\n        const half = (uniques[i + 1] - uniques[i]) / 2;\n        thresholds.push(uniques[i] + half);\n    }\n    thresholds.push(uniques[uniques.length - 1] + 0.001);\n    return thresholds;\n}\n//# sourceMappingURL=getThresholds.js.map","import { getClasses } from './utilities/getClasses';\nimport { getClassesPairs } from './utilities/getClassesPairs';\nimport { getNumericalTargets } from './utilities/getNumericalTargets';\nimport { getSelectedResults } from './utilities/getSelectedResults';\nimport { getThresholds } from './utilities/getThresholds';\n/**\n * Returns a ROC (Receiver Operating Characteristic) curve for a given response and prediction vectors.\n * @param responses Array containing category metadata.\n * @param predictions Array containing the results of regression.\n * @return sensitivities and specificities as a object.\n */\nexport function getRocCurve(responses, predictions) {\n    const classes = getClasses(responses);\n    const pairsOfClasses = getClassesPairs(classes);\n    const curves = [];\n    for (const pairs of pairsOfClasses) {\n        const tests = getSelectedResults(predictions, pairs);\n        const targets = getSelectedResults(responses, pairs);\n        const numericalTargets = getNumericalTargets(targets, tests, pairs);\n        const curve = { sensitivities: [], specificities: [] };\n        const limits = getThresholds(tests);\n        for (const limit of limits) {\n            let truePositives = 0;\n            let falsePositives = 0;\n            let trueNegatives = 0;\n            let falseNegatives = 0;\n            for (let j = 0; j < numericalTargets.length; j++) {\n                if (tests[j] > limit && numericalTargets[j] > limit)\n                    truePositives++;\n                if (tests[j] >= limit && numericalTargets[j] <= limit)\n                    falsePositives++;\n                if (tests[j] < limit && numericalTargets[j] < limit)\n                    trueNegatives++;\n                if (tests[j] <= limit && numericalTargets[j] >= limit)\n                    falseNegatives++;\n            }\n            curve.sensitivities.push(truePositives / (truePositives + falseNegatives));\n            curve.specificities.push(trueNegatives / (falsePositives + trueNegatives));\n        }\n        curves.push(curve);\n    }\n    return curves;\n}\n//# sourceMappingURL=getRocCurve.js.map","/**\n * Returns an array of pairs of classes.\n * @param list Array containing a list of classes.\n * @return Array with pairs of classes.\n */\nexport function getClassesPairs(list) {\n    const pairs = [];\n    for (let i = 0; i < list.length - 1; i++) {\n        for (let j = i + 1; j < list.length; j++) {\n            pairs.push([list[i], list[j]]);\n        }\n    }\n    return pairs;\n}\n//# sourceMappingURL=getClassesPairs.js.map","/**\n * @param array Array containing category metadata\n * @return Class object.\n */\nexport function getClasses(array) {\n    let nbClasses = 0;\n    const classes = [{ name: array[0], value: 0, ids: [] }];\n    for (const element of array) {\n        const currentClass = classes.some((item) => item.name === element);\n        if (!currentClass) {\n            nbClasses++;\n            classes.push({ name: element, value: nbClasses, ids: [] });\n        }\n    }\n    for (const category of classes) {\n        const label = category.name;\n        const indexes = [];\n        for (let j = 0; j < array.length; j++) {\n            if (array[j] === label)\n                indexes.push(j);\n        }\n        category.ids = indexes;\n    }\n    return classes;\n}\n//# sourceMappingURL=getClasses.js.map","import { Matrix, NIPALS } from 'ml-matrix';\n\nimport { norm } from './util/utils.js';\n\n/**\n * OPLS loop\n * @param {Array|Matrix} data matrix with features\n * @param {Array|Matrix} labels an array of labels (dependent variable)\n * @param {Object} [options={}] an object with options\n * @return {Object} an object with model (filteredX: err,\n    loadingsXOrtho: pOrtho,\n    scoresXOrtho: tOrtho,\n    weightsXOrtho: wOrtho,\n    weightsPred: w,\n    loadingsXpred: p,\n    scoresXpred: t,\n    loadingsY:)\n */\nexport function oplsNipals(data, labels, options = {}) {\n  const { numberOSC = 100, limit = 10e-10 } = options;\n\n  data = Matrix.checkMatrix(data);\n  labels = Matrix.checkMatrix(labels);\n  let tW = [];\n  if (labels.columns > 1) {\n    const wh = getWh(data, labels);\n    const ssWh = wh.norm() ** 2;\n    let ssT = ssWh;\n    let pcaW;\n    let count = 0;\n    do {\n      if (count === 0) {\n        pcaW = new NIPALS(wh);\n        tW.push(pcaW.t);\n      } else {\n        let data = pcaW.xResidual;\n        pcaW = new NIPALS(data);\n        tW.push(pcaW.t);\n      }\n      ssT = wh.norm() ** 2;\n      count++;\n    } while (ssT / ssWh > limit);\n  }\n\n  let u = labels.getColumnVector(0);\n  let diff = 1;\n  let t, c, w, uNew;\n  for (let i = 0; i < numberOSC && diff > limit; i++) {\n    w = u.transpose().mmul(data).div(u.transpose().mmul(u).get(0, 0));\n    w = w.transpose().div(norm(w));\n\n    t = data.mmul(w).div(w.transpose().mmul(w).get(0, 0)); // t_h paso 3\n\n    // calc loading\n    c = t.transpose().mmul(labels).div(t.transpose().mmul(t).get(0, 0));\n\n    // calc new u and compare with one in previus iteration (stop criterion)\n    uNew = labels.mmul(c.transpose());\n    uNew = uNew.div(c.transpose().mmul(c).get(0, 0));\n\n    if (i > 0) {\n      diff = uNew.clone().sub(u).pow(2).sum() / uNew.clone().pow(2).sum();\n    }\n    u = uNew.clone();\n  }\n\n  // calc loadings\n  let wOrtho;\n  let p = t.transpose().mmul(data).div(t.transpose().mmul(t).get(0, 0));\n  if (labels.columns > 1) {\n    for (let i = 0; i < tW.length; i++) {\n      let tw = tW[i].transpose();\n      p = p.sub(\n        tw.mmul(p.transpose()).mmul(tw), // .div(tw.mmul(tw.transpose()).get(0, 0))\n      );\n    }\n    wOrtho = p.clone();\n  } else {\n    wOrtho = p\n      .clone()\n      .sub(\n        w\n          .transpose()\n          .mmul(p.transpose())\n          .div(w.transpose().mmul(w).get(0, 0))\n          .mmul(w.transpose()),\n      );\n  }\n\n  wOrtho.div(norm(wOrtho));\n\n  let tOrtho = data\n    .mmul(wOrtho.transpose())\n    .div(wOrtho.mmul(wOrtho.transpose()).get(0, 0));\n\n  // orthogonal loadings\n  let pOrtho = tOrtho\n    .transpose()\n    .mmul(data)\n    .div(tOrtho.transpose().mmul(tOrtho).get(0, 0));\n\n  // filtered data\n  let err = data.clone().sub(tOrtho.mmul(pOrtho));\n  return {\n    filteredX: err,\n    weightsXOrtho: wOrtho,\n    loadingsXOrtho: pOrtho,\n    scoresXOrtho: tOrtho,\n    weightsXPred: w,\n    loadingsXpred: p,\n    scoresXpred: t,\n    loadingsY: c,\n  };\n}\n\nfunction getWh(xValue, yValue) {\n  let result = new Matrix(xValue.columns, yValue.columns);\n  for (let i = 0; i < yValue.columns; i++) {\n    let yN = yValue.getColumnVector(i).transpose();\n    let component = yN.mmul(xValue).div(yN.mmul(yN.transpose()).get(0, 0));\n    result.setColumn(i, component.getRow(0));\n  }\n  return result;\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * Get total sum of square\n * @param {Array} x an array\n * @return {Number} - the sum of the squares\n */\nexport function tss(x) {\n  return Matrix.mul(x, x).sum();\n}\n","import ConfusionMatrix from 'ml-confusion-matrix';\nimport { getFolds } from 'ml-cross-validation';\nimport { Matrix, NIPALS } from 'ml-matrix';\nimport { getRocCurve, getAuc } from 'ml-roc-multiclass';\n\nimport { oplsNipals } from './oplsNipals.js';\nimport { tss } from './util/tss.js';\n\n/**\n * Creates new OPLS (orthogonal partial latent structures) from features and labels.\n * @param {Array} data - matrix containing data (X).\n * @param {Array} labels - 1D Array containing metadata (Y).\n * @param {Object} [options={}]\n * @param {boolean} [options.center = true] - should the data be centered (subtract the mean).\n * @param {boolean} [options.scale = true] - should the data be scaled (divide by the standard deviation).\n * @param {Array} [options.cvFolds = []] - Allows to provide folds as array of objects with the arrays trainIndex and testIndex as properties.\n * @param {number} [options.nbFolds = 7] - Allows to generate the defined number of folds with the training and test set choosen randomly from the data set.\n * */\n\nexport class OPLS {\n  constructor(data, labels, options = {}) {\n    if (data === true) {\n      const opls = options;\n      this.center = opls.center;\n      this.scale = opls.scale;\n      this.means = opls.means;\n      this.meansY = opls.meansY;\n      this.stdevs = opls.stdevs;\n      this.stdevs = opls.stdevsY;\n      this.model = opls.model;\n      this.tCV = opls.tCV;\n      this.tOrthCV = opls.tOrthCV;\n      this.yHatCV = opls.yHatCV;\n      this.mode = opls.mode;\n      return;\n    }\n\n    const features = new Matrix(data);\n    // set default values\n    // cvFolds allows to define folds for testing purpose\n    const { center = true, scale = true, cvFolds = [], nbFolds = 7 } = options;\n\n    let group;\n    if (typeof labels[0] === 'number') {\n      // numeric labels: OPLS regression is used\n      this.mode = 'regression';\n      group = Matrix.from1DArray(labels.length, 1, labels);\n    } else if (typeof labels[0] === 'string') {\n      // non-numeric labels: OPLS-DA is used\n      this.mode = 'discriminantAnalysis';\n      group = Matrix.checkMatrix(createDummyY(labels)).transpose();\n    }\n\n    // getting center and scale the features (all)\n    this.center = center;\n    if (this.center) {\n      this.means = features.mean('column');\n      this.meansY = group.mean('column');\n    } else {\n      this.stdevs = null;\n    }\n    this.scale = scale;\n    if (this.scale) {\n      this.stdevs = features.standardDeviation('column');\n      this.stdevsY = group.standardDeviation('column');\n    } else {\n      this.means = null;\n    }\n\n    // check and remove for features with sd = 0 TODO here\n    // check opls.R line 70\n\n    const folds = cvFolds.length > 0 ? cvFolds : getFolds(labels, nbFolds);\n    const Q2 = [];\n    const aucResult = [];\n    this.model = [];\n    this.tCV = [];\n    this.tOrthCV = [];\n    this.yHatCV = [];\n    const oplsCV = [];\n\n    let modelNC = [];\n\n    // this code could be made more efficient by reverting the order of the loops\n    // this is a legacy loop to be consistent with R code from MetaboMate package\n    // this allows for having statistic (R2) from CV to decide wether to continue\n    // with more latent structures\n    let overfitted = false;\n    let nc = 0;\n    let value;\n\n    do {\n      const yHatk = new Matrix(group.rows, 1);\n      const tPredk = new Matrix(group.rows, 1);\n      const tOrthk = new Matrix(group.rows, 1);\n      oplsCV[nc] = [];\n      for (let f = 0; f < folds.length; f++) {\n        const trainTest = this._getTrainTest(features, group, folds[f]);\n        const testXk = trainTest.testFeatures;\n        const Xk = trainTest.trainFeatures;\n        const Yk = trainTest.trainLabels;\n\n        // determine center and scale of training set\n        const dataCenter = Xk.mean('column');\n        const dataSD = Xk.standardDeviation('column');\n\n        // center and scale training set\n        if (center) {\n          Xk.center('column');\n          Yk.center('column');\n        }\n\n        if (scale) {\n          Xk.scale('column');\n          Yk.scale('column');\n        }\n\n        // perform opls\n        let oplsk;\n        if (nc === 0) {\n          oplsk = oplsNipals(Xk, Yk);\n        } else {\n          oplsk = oplsNipals(oplsCV[nc - 1][f].filteredX, Yk);\n        }\n\n        // store model for next component\n        oplsCV[nc][f] = oplsk;\n        const plsCV = new NIPALS(oplsk.filteredX, { Y: Yk });\n\n        // scaling the test dataset with respect to the train\n        testXk.center('column', { center: dataCenter });\n        testXk.scale('column', { scale: dataSD });\n\n        const Eh = testXk;\n        // removing the orthogonal components from PLS\n        let scores;\n        for (let idx = 0; idx < nc + 1; idx++) {\n          scores = Eh.mmul(oplsCV[idx][f].weightsXOrtho.transpose()); // ok\n          Eh.sub(scores.mmul(oplsCV[idx][f].loadingsXOrtho));\n        }\n\n        // prediction\n        const tPred = Eh.mmul(plsCV.w.transpose());\n        const yHatComponents = tPred\n          .mmul(plsCV.betas)\n          .mmul(plsCV.q.transpose()); // ok\n        const yHat = new Matrix(yHatComponents.rows, 1);\n        for (let i = 0; i < yHatComponents.rows; i++) {\n          yHat.setRow(i, [yHatComponents.getRowVector(i).sum()]);\n        }\n        // adding all prediction from all folds\n        for (let i = 0; i < folds[f].testIndex.length; i++) {\n          yHatk.setRow(folds[f].testIndex[i], [yHat.get(i, 0)]);\n          tPredk.setRow(folds[f].testIndex[i], [tPred.get(i, 0)]);\n          tOrthk.setRow(folds[f].testIndex[i], [scores.get(i, 0)]);\n        }\n      } // end of loop over folds\n\n      this.tCV.push(tPredk);\n      this.tOrthCV.push(tOrthk);\n      this.yHatCV.push(yHatk);\n\n      // calculate Q2y for all the prediction (all folds)\n      // ROC for DA is not implemented (check opls.R line 183) TODO\n      const tssy = tss(group.center('column').scale('column'));\n      let press = 0;\n      for (let i = 0; i < group.columns; i++) {\n        press += tss(group.getColumnVector(i).sub(yHatk));\n      }\n      const Q2y = 1 - press / group.columns / tssy;\n      Q2.push(Q2y);\n      if (this.mode === 'regression') {\n        value = Q2y;\n      } else if (this.mode === 'discriminantAnalysis') {\n        const rocCurve = getRocCurve(labels, yHatk.to1DArray());\n        const areaUnderCurve = getAuc(rocCurve);\n        aucResult.push(areaUnderCurve);\n        value = areaUnderCurve;\n      }\n\n      // calculate the R2y for the complete data\n      if (nc === 0) {\n        modelNC = this._predictAll(features, group);\n      } else {\n        modelNC = this._predictAll(modelNC.xRes, group, {\n          scale: false,\n          center: false,\n        });\n      }\n\n      // adding the predictive statistics from CV\n      let listOfValues;\n      modelNC.Q2y = Q2;\n      if (this.mode === 'regression') {\n        listOfValues = Q2;\n      } else {\n        listOfValues = aucResult;\n        modelNC.auc = aucResult;\n      }\n      modelNC.value = value;\n\n      if (nc > 0) {\n        overfitted = listOfValues[nc - 1] >= value ? true : false;\n      }\n      this.model.push(modelNC);\n      // store the model for each component\n      nc++;\n      // console.warn(`OPLS iteration over # of Components: ${nc + 1}`);\n    } while (!overfitted); // end of loop over nc\n    // store scores from CV\n    const tCV = this.tCV;\n    const tOrthCV = this.tOrthCV;\n    const yHatCV = this.yHatCV;\n    const m = this.model[nc - 1];\n    const XOrth = m.XOrth;\n    const FeaturesCS = features.center('column').scale('column');\n    let labelsCS;\n    if (this.mode === 'regression') {\n      labelsCS = group.center('column').scale('column');\n    } else {\n      labelsCS = group;\n    }\n    const Xres = FeaturesCS.clone().sub(XOrth);\n    const plsCall = new NIPALS(Xres, { Y: labelsCS });\n    const E = Xres.clone().sub(plsCall.t.mmul(plsCall.p));\n\n    const R2x = this.model.map((x) => x.R2x);\n    const R2y = this.model.map((x) => x.R2y);\n\n    this.output = {\n      Q2y: Q2,\n      auc: aucResult,\n      R2x,\n      R2y,\n      tPred: m.plsC.t,\n      pPred: m.plsC.p,\n      wPred: m.plsC.w,\n      betasPred: m.plsC.betas,\n      Qpc: m.plsC.q,\n      tCV,\n      tOrthCV,\n      yHatCV,\n      oplsCV,\n      tOrth: m.tOrth,\n      pOrth: m.pOrth,\n      wOrth: m.wOrth,\n      XOrth,\n      yHat: m.totalPred,\n      Yres: m.plsC.yResidual,\n      E,\n      folds,\n    };\n  }\n\n  /**\n   * get access to all the computed elements\n   * Mainly for debug and testing\n   * @return {Object} output object\n   */\n  getLogs() {\n    return this.output;\n  }\n\n  getScores() {\n    const scoresX = this.tCV.map((x) => x.to1DArray());\n    const scoresY = this.tOrthCV.map((x) => x.to1DArray());\n    return { scoresX, scoresY };\n  }\n\n  /**\n   * Load an OPLS model from JSON\n   * @param {Object} model\n   * @return {OPLS}\n   */\n  static load(model) {\n    if (typeof model.name !== 'string') {\n      throw new TypeError('model must have a name property');\n    }\n    if (model.name !== 'OPLS') {\n      throw new RangeError(`invalid model: ${model.name}`);\n    }\n    return new OPLS(true, [], model);\n  }\n\n  /**\n   * Export the current model to a JSON object\n   * @return {Object} model\n   */\n  toJSON() {\n    return {\n      name: 'OPLS',\n      center: this.center,\n      scale: this.scale,\n      means: this.means,\n      stdevs: this.stdevs,\n      model: this.model,\n      tCV: this.tCV,\n      tOrthCV: this.tOrthCV,\n      yHatCV: this.yHatCV,\n    };\n  }\n\n  /**\n   * Predict scores for new data\n   * @param {Matrix} features - a matrix containing new data\n   * @param {Object} [options={}]\n   * @param {Array} [options.trueLabel] - an array with true values to compute confusion matrix\n   * @param {Number} [options.nc] - the number of components to be used\n   * @return {Object} - predictions\n   */\n  predict(features, options = {}) {\n    const {\n      trueLabels = [],\n      center = this.center,\n      scale = this.scale,\n    } = options;\n\n    let labels;\n    if (typeof trueLabels[0] === 'number') {\n      labels = Matrix.from1DArray(trueLabels.length, 1, trueLabels);\n    } else if (typeof trueLabels[0] === 'string') {\n      labels = Matrix.checkMatrix(createDummyY(trueLabels)).transpose();\n    }\n\n    features = new Matrix(features);\n\n    // scaling the test dataset with respect to the train\n    if (center) {\n      features.center('column', { center: this.means });\n      if (labels?.rows > 0) {\n        labels.center('column', { center: this.meansY });\n      }\n    }\n    if (scale) {\n      features.scale('column', { scale: this.stdevs });\n      if (labels?.rows > 0) {\n        labels.scale('column', { scale: this.stdevsY });\n      }\n    }\n\n    const nc =\n      this.mode === 'regression'\n        ? this.model[0].Q2y.length\n        : this.model[0].auc.length;\n\n    const Eh = features.clone();\n    // removing the orthogonal components from PLS\n    let tOrth;\n    let wOrth;\n    let pOrth;\n    let yHat;\n    let tPred;\n    for (let idx = 0; idx < nc; idx++) {\n      const model = this.model[idx];\n      wOrth = model.wOrth.transpose();\n      pOrth = model.pOrth;\n      tOrth = Eh.mmul(wOrth);\n      Eh.sub(tOrth.mmul(pOrth));\n      // prediction\n      tPred = Eh.mmul(model.plsC.w.transpose());\n      yHat = tPred.mmul(model.plsC.betas).mmul(model.plsC.q);\n    }\n\n    if (labels?.rows > 0) {\n      if (this.mode === 'regression') {\n        const tssy = tss(labels);\n        const press = tss(labels.clone().sub(yHat));\n        const Q2y = 1 - press / tssy;\n\n        return { tPred, tOrth, yHat, Q2y };\n      } else if (this.mode === 'discriminantAnalysis') {\n        const confusionMatrix = ConfusionMatrix.fromLabels(\n          trueLabels,\n          yHat.to1DArray(),\n        );\n\n        const rocCurve = getRocCurve(trueLabels, yHat.to1DArray());\n        const auc = getAuc(rocCurve);\n        return { tPred, tOrth, yHat, confusionMatrix, auc };\n      }\n    } else {\n      return { tPred, tOrth, yHat };\n    }\n  }\n\n  _predictAll(features, labels, options = {}) {\n    // cannot use the global this.center here\n    // since it is used in the NC loop and\n    // centering and scaling should only be\n    // performed once\n    const { center = true, scale = true } = options;\n\n    if (center) {\n      features.center('column');\n      labels.center('column');\n    }\n\n    if (scale) {\n      features.scale('column');\n      labels.scale('column');\n      // reevaluate tssy and tssx after scaling\n      // must be global because re-used for next nc iteration\n      // tssx is only evaluate the first time\n      this.tssy = tss(labels);\n      this.tssx = tss(features);\n    }\n\n    const oplsC = oplsNipals(features, labels);\n    const plsC = new NIPALS(oplsC.filteredX, { Y: labels });\n\n    const tPred = oplsC.filteredX.mmul(plsC.w.transpose());\n    const yHatComponents = tPred.mmul(plsC.betas).mmul(plsC.q.transpose()); // ok\n    const yHat = new Matrix(yHatComponents.rows, 1);\n    for (let i = 0; i < yHatComponents.rows; i++) {\n      yHat.setRow(i, [yHatComponents.getRowVector(i).sum()]);\n    }\n    let rss = 0;\n    for (let i = 0; i < labels.columns; i++) {\n      rss += tss(labels.getColumnVector(i).sub(yHat));\n    }\n    const R2y = 1 - rss / labels.columns / this.tssy;\n    const xEx = plsC.t.mmul(plsC.p);\n    const rssx = tss(xEx);\n    const R2x = rssx / this.tssx;\n\n    return {\n      R2y,\n      R2x,\n      xRes: oplsC.filteredX,\n      tOrth: oplsC.scoresXOrtho,\n      pOrth: oplsC.loadingsXOrtho,\n      wOrth: oplsC.weightsXOrtho,\n      tPred: tPred,\n      totalPred: yHat,\n      XOrth: oplsC.scoresXOrtho.mmul(oplsC.loadingsXOrtho),\n      oplsC,\n      plsC,\n    };\n  }\n  /**\n   *\n   * @param {*} X - dataset matrix object\n   * @param {*} group - labels matrix object\n   * @param {*} index - train and test index (output from getFold())\n   */\n  _getTrainTest(X, group, index) {\n    const testFeatures = new Matrix(index.testIndex.length, X.columns);\n    const testLabels = new Matrix(index.testIndex.length, group.columns);\n    index.testIndex.forEach((el, idx) => {\n      testFeatures.setRow(idx, X.getRow(el));\n      testLabels.setRow(idx, group.getRow(el));\n    });\n\n    const trainFeatures = new Matrix(index.trainIndex.length, X.columns);\n    const trainLabels = new Matrix(index.trainIndex.length, group.columns);\n    index.trainIndex.forEach((el, idx) => {\n      trainFeatures.setRow(idx, X.getRow(el));\n      trainLabels.setRow(idx, group.getRow(el));\n    });\n\n    return {\n      trainFeatures,\n      testFeatures,\n      trainLabels,\n      testLabels,\n    };\n  }\n}\n\nfunction createDummyY(array) {\n  const features = [...new Set(array)];\n  const result = [];\n  if (features.length > 2) {\n    for (let i = 0; i < features.length; i++) {\n      const feature = [];\n      for (let j = 0; j < array.length; j++) {\n        const point = features[i] === array[j] ? 1 : -1;\n        feature.push(point);\n      }\n      result.push(feature);\n    }\n    return result;\n  } else {\n    const result = [];\n    for (let j = 0; j < array.length; j++) {\n      const point = features[0] === array[j] ? 2 : 1;\n      result.push(point);\n    }\n    return [result];\n  }\n}\n","/**\n * get folds indexes\n * @param {Array} features\n * @param {Number} k - number of folds, a\n */\nexport function getFolds(features, k = 5) {\n  let N = features.length;\n  let allIdx = new Array(N);\n  for (let i = 0; i < N; i++) {\n    allIdx[i] = i;\n  }\n\n  let l = Math.floor(N / k);\n  // create random k-folds\n  let current = [];\n  let folds = [];\n  while (allIdx.length) {\n    let randi = Math.floor(Math.random() * allIdx.length);\n    current.push(allIdx[randi]);\n    allIdx.splice(randi, 1);\n    if (current.length === l) {\n      folds.push(current);\n      current = [];\n    }\n  }\n  // we push the remaining to the last fold so that the total length is\n  // preserved. Otherwise the Q2 will fail.\n  if (current.length) current.forEach((e) => folds[k - 1].push(e));\n  folds = folds.slice(0, k);\n\n  let foldsIndex = folds.map((x, idx) => ({\n    testIndex: x,\n    trainIndex: [].concat(...folds.filter((el, idx2) => idx2 !== idx)),\n  }));\n  return foldsIndex;\n}\n"],"names":["toString","Object","prototype","isAnyArray","object","call","endsWith","max","input","options","arguments","length","undefined","isArray","TypeError","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","Error","maxValue","i","min","minValue","rescale","output","Array","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","constructor","name","rows","columns","maxI","Math","maxJ","result","line","j","push","formatNumber","get","join","inspectData","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","e","slice","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","r","from","checkColumnIndices","columnIndices","c","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","value","array","checkNonEmpty","isEmpty","AbstractMatrix","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","NaN","v","maxIndex","idx","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","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","checkIndices","rowIndex","columnIndex","trace","by","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","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","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","useSVD","leftHandSide","rightHandSide","nipals","scaleScores","maxIterations","terminationCriteria","u","w","tOld","diff","counter","xResidual","residual","yResidual","betas","pow2array","initializeMatrices","elem","PLS","model","meanX","stdDevX","meanY","stdDevY","PBQ","R2X","scaleMethod","tolerance","latentVectors","train","trainingSet","trainingValues","rx","cx","ry","cy","ssqXcal","sumOfSquaresY","T","P","Q","B","W","Utils","transposeX","transposeY","tIndex","maxSumColIndex","uIndex","t1","den","pnorm","ssqYcal","E","F","predict","dataset","getExplainedVariance","KOPLS","YLoadingMat","SigmaPow","YScoreMat","predScoreMat","YOrthLoadingVec","YOrthEigen","YOrthScoreMat","toNorm","TURegressionCoeff","kernelX","kernel","orthogonalComp","predictiveComp","predictiveComponents","orthogonalComponents","compute","Identity","Sigma","YOrthScoreNorm","Infinity","TpiPrime","CoTemp","SoTemp","toiPrime","ITo","lastScoreMat","lastTpPrime","toPredict","KTestTrain","YOrthScoreVector","scoreMatPrime","p1","p2","p3","prediction","predYOrthVectors","ConfusionMatrix","labels","actual","predicted","distinctLabels","Set","actualIdx","predictedIdx","getMatrix","getLabels","getTotalCount","getTrueCount","getFalseCount","getTruePositiveCount","label","getIndex","getTrueNegativeCount","getFalsePositiveCount","getFalseNegativeCount","getPositiveCount","getNegativeCount","getTruePositiveRate","getTrueNegativeRate","getPositivePredictiveValue","TP","getNegativePredictiveValue","TN","getFalseNegativeRate","getFalsePositiveRate","getFalseDiscoveryRate","FP","getFalseOmissionRate","FN","getF1Score","getMatthewsCorrelationCoefficient","getInformedness","getMarkedness","getConfusionTable","getAccuracy","correct","incorrect","getCount","actualIndex","predictedIndex","accuracy","total","sumValue","getAuc","curves","auc","curve","area","specificities","sensitivities","getNumericalTargets","targets","tests","pair","dx","boundaries","results","getSelectedResults","item","id","ids","getThresholds","predictions","uniques","thresholds","half","getRocCurve","responses","pairsOfClasses","list","pairs","getClassesPairs","nbClasses","classes","element","category","indexes","getClasses","numericalTargets","limits","limit","truePositives","falsePositives","trueNegatives","falseNegatives","oplsNipals","numberOSC","tW","wh","xValue","yValue","yN","component","getWh","ssWh","pcaW","ssT","NIPALS","uNew","wOrtho","tw","tOrtho","pOrtho","filteredX","weightsXOrtho","loadingsXOrtho","scoresXOrtho","weightsXPred","loadingsXpred","scoresXpred","loadingsY","tss","OPLS","opls","means","meansY","stdevs","stdevsY","tCV","tOrthCV","yHatCV","mode","features","cvFolds","nbFolds","group","from1DArray","createDummyY","folds","N","allIdx","current","randi","forEach","map","testIndex","trainIndex","concat","filter","el","idx2","getFolds","Q2","aucResult","oplsCV","modelNC","overfitted","nc","yHatk","tPredk","tOrthk","trainTest","_getTrainTest","testXk","testFeatures","Xk","trainFeatures","Yk","trainLabels","dataCenter","dataSD","oplsk","plsCV","Eh","scores","tPred","yHatComponents","yHat","tssy","press","Q2y","areaUnderCurve","listOfValues","_predictAll","xRes","XOrth","FeaturesCS","labelsCS","Xres","plsCall","R2x","R2y","plsC","pPred","wPred","betasPred","Qpc","tOrth","pOrth","wOrth","totalPred","Yres","getLogs","getScores","scoresX","scoresY","trueLabels","confusionMatrix","fromLabels","rocCurve","tssx","oplsC","rss","testLabels","feature","point"],"mappings":"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"}