{"version":3,"file":"ml-pcr.min.js","sources":["../node_modules/is-any-array/lib-esm/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/views/base.js","../node_modules/ml-matrix/src/views/transpose.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/dc/evd.js","../node_modules/ml-matrix/src/dc/nipals.js","../node_modules/ml-pca/src/pca.js","../node_modules/ml-regression-multivariate-linear/src/index.js","../node_modules/ml-matrix/src/pseudoInverse.js","../lib-esm/pcr.js"],"sourcesContent":["const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n","import BaseView from './base';\n\nexport default class MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n","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","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 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 Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class EigenvalueDecomposition {\n  constructor(matrix, options = {}) {\n    const { assumeSymmetric = false } = options;\n\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n    if (!matrix.isSquare()) {\n      throw new Error('Matrix is not a square matrix');\n    }\n\n    if (matrix.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let n = matrix.columns;\n    let V = new Matrix(n, n);\n    let d = new Float64Array(n);\n    let e = new Float64Array(n);\n    let value = matrix;\n    let i, j;\n\n    let isSymmetric = false;\n    if (assumeSymmetric) {\n      isSymmetric = true;\n    } else {\n      isSymmetric = matrix.isSymmetric();\n    }\n\n    if (isSymmetric) {\n      for (i = 0; i < n; i++) {\n        for (j = 0; j < n; j++) {\n          V.set(i, j, value.get(i, j));\n        }\n      }\n      tred2(n, e, d, V);\n      tql2(n, e, d, V);\n    } else {\n      let H = new Matrix(n, n);\n      let ort = new Float64Array(n);\n      for (j = 0; j < n; j++) {\n        for (i = 0; i < n; i++) {\n          H.set(i, j, value.get(i, j));\n        }\n      }\n      orthes(n, H, ort, V);\n      hqr2(n, e, d, V, H);\n    }\n\n    this.n = n;\n    this.e = e;\n    this.d = d;\n    this.V = V;\n  }\n\n  get realEigenvalues() {\n    return Array.from(this.d);\n  }\n\n  get imaginaryEigenvalues() {\n    return Array.from(this.e);\n  }\n\n  get eigenvectorMatrix() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    let n = this.n;\n    let e = this.e;\n    let d = this.d;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        X.set(i, j, 0);\n      }\n      X.set(i, i, d[i]);\n      if (e[i] > 0) {\n        X.set(i, i + 1, e[i]);\n      } else if (e[i] < 0) {\n        X.set(i, i - 1, e[i]);\n      }\n    }\n    return X;\n  }\n}\n\nfunction tred2(n, e, d, V) {\n  let f, g, h, i, j, k, hh, scale;\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n  }\n\n  for (i = n - 1; i > 0; i--) {\n    scale = 0;\n    h = 0;\n    for (k = 0; k < i; k++) {\n      scale = scale + Math.abs(d[k]);\n    }\n\n    if (scale === 0) {\n      e[i] = d[i - 1];\n      for (j = 0; j < i; j++) {\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n        V.set(j, i, 0);\n      }\n    } else {\n      for (k = 0; k < i; k++) {\n        d[k] /= scale;\n        h += d[k] * d[k];\n      }\n\n      f = d[i - 1];\n      g = Math.sqrt(h);\n      if (f > 0) {\n        g = -g;\n      }\n\n      e[i] = scale * g;\n      h = h - f * g;\n      d[i - 1] = f - g;\n      for (j = 0; j < i; j++) {\n        e[j] = 0;\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        V.set(j, i, f);\n        g = e[j] + V.get(j, j) * f;\n        for (k = j + 1; k <= i - 1; k++) {\n          g += V.get(k, j) * d[k];\n          e[k] += V.get(k, j) * f;\n        }\n        e[j] = g;\n      }\n\n      f = 0;\n      for (j = 0; j < i; j++) {\n        e[j] /= h;\n        f += e[j] * d[j];\n      }\n\n      hh = f / (h + h);\n      for (j = 0; j < i; j++) {\n        e[j] -= hh * d[j];\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        g = e[j];\n        for (k = j; k <= i - 1; k++) {\n          V.set(k, j, V.get(k, j) - (f * e[k] + g * d[k]));\n        }\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n      }\n    }\n    d[i] = h;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    V.set(n - 1, i, V.get(i, i));\n    V.set(i, i, 1);\n    h = d[i + 1];\n    if (h !== 0) {\n      for (k = 0; k <= i; k++) {\n        d[k] = V.get(k, i + 1) / h;\n      }\n\n      for (j = 0; j <= i; j++) {\n        g = 0;\n        for (k = 0; k <= i; k++) {\n          g += V.get(k, i + 1) * V.get(k, j);\n        }\n        for (k = 0; k <= i; k++) {\n          V.set(k, j, V.get(k, j) - g * d[k]);\n        }\n      }\n    }\n\n    for (k = 0; k <= i; k++) {\n      V.set(k, i + 1, 0);\n    }\n  }\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n    V.set(n - 1, j, 0);\n  }\n\n  V.set(n - 1, n - 1, 1);\n  e[0] = 0;\n}\n\nfunction tql2(n, e, d, V) {\n  let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2, iter;\n\n  for (i = 1; i < n; i++) {\n    e[i - 1] = e[i];\n  }\n\n  e[n - 1] = 0;\n\n  let f = 0;\n  let tst1 = 0;\n  let eps = Number.EPSILON;\n\n  for (l = 0; l < n; l++) {\n    tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));\n    m = l;\n    while (m < n) {\n      if (Math.abs(e[m]) <= eps * tst1) {\n        break;\n      }\n      m++;\n    }\n\n    if (m > l) {\n      iter = 0;\n      do {\n        iter = iter + 1;\n\n        g = d[l];\n        p = (d[l + 1] - g) / (2 * e[l]);\n        r = hypotenuse(p, 1);\n        if (p < 0) {\n          r = -r;\n        }\n\n        d[l] = e[l] / (p + r);\n        d[l + 1] = e[l] * (p + r);\n        dl1 = d[l + 1];\n        h = g - d[l];\n        for (i = l + 2; i < n; i++) {\n          d[i] -= h;\n        }\n\n        f = f + h;\n\n        p = d[m];\n        c = 1;\n        c2 = c;\n        c3 = c;\n        el1 = e[l + 1];\n        s = 0;\n        s2 = 0;\n        for (i = m - 1; i >= l; i--) {\n          c3 = c2;\n          c2 = c;\n          s2 = s;\n          g = c * e[i];\n          h = c * p;\n          r = hypotenuse(p, e[i]);\n          e[i + 1] = s * r;\n          s = e[i] / r;\n          c = p / r;\n          p = c * d[i] - s * g;\n          d[i + 1] = h + s * (c * g + s * d[i]);\n\n          for (k = 0; k < n; k++) {\n            h = V.get(k, i + 1);\n            V.set(k, i + 1, s * V.get(k, i) + c * h);\n            V.set(k, i, c * V.get(k, i) - s * h);\n          }\n        }\n\n        p = (-s * s2 * c3 * el1 * e[l]) / dl1;\n        e[l] = s * p;\n        d[l] = c * p;\n      } while (Math.abs(e[l]) > eps * tst1);\n    }\n    d[l] = d[l] + f;\n    e[l] = 0;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    k = i;\n    p = d[i];\n    for (j = i + 1; j < n; j++) {\n      if (d[j] < p) {\n        k = j;\n        p = d[j];\n      }\n    }\n\n    if (k !== i) {\n      d[k] = d[i];\n      d[i] = p;\n      for (j = 0; j < n; j++) {\n        p = V.get(j, i);\n        V.set(j, i, V.get(j, k));\n        V.set(j, k, p);\n      }\n    }\n  }\n}\n\nfunction orthes(n, H, ort, V) {\n  let low = 0;\n  let high = n - 1;\n  let f, g, h, i, j, m;\n  let scale;\n\n  for (m = low + 1; m <= high - 1; m++) {\n    scale = 0;\n    for (i = m; i <= high; i++) {\n      scale = scale + Math.abs(H.get(i, m - 1));\n    }\n\n    if (scale !== 0) {\n      h = 0;\n      for (i = high; i >= m; i--) {\n        ort[i] = H.get(i, m - 1) / scale;\n        h += ort[i] * ort[i];\n      }\n\n      g = Math.sqrt(h);\n      if (ort[m] > 0) {\n        g = -g;\n      }\n\n      h = h - ort[m] * g;\n      ort[m] = ort[m] - g;\n\n      for (j = m; j < n; j++) {\n        f = 0;\n        for (i = high; i >= m; i--) {\n          f += ort[i] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (i = m; i <= high; i++) {\n          H.set(i, j, H.get(i, j) - f * ort[i]);\n        }\n      }\n\n      for (i = 0; i <= high; i++) {\n        f = 0;\n        for (j = high; j >= m; j--) {\n          f += ort[j] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (j = m; j <= high; j++) {\n          H.set(i, j, H.get(i, j) - f * ort[j]);\n        }\n      }\n\n      ort[m] = scale * ort[m];\n      H.set(m, m - 1, scale * g);\n    }\n  }\n\n  for (i = 0; i < n; i++) {\n    for (j = 0; j < n; j++) {\n      V.set(i, j, i === j ? 1 : 0);\n    }\n  }\n\n  for (m = high - 1; m >= low + 1; m--) {\n    if (H.get(m, m - 1) !== 0) {\n      for (i = m + 1; i <= high; i++) {\n        ort[i] = H.get(i, m - 1);\n      }\n\n      for (j = m; j <= high; j++) {\n        g = 0;\n        for (i = m; i <= high; i++) {\n          g += ort[i] * V.get(i, j);\n        }\n\n        g = g / ort[m] / H.get(m, m - 1);\n        for (i = m; i <= high; i++) {\n          V.set(i, j, V.get(i, j) + g * ort[i]);\n        }\n      }\n    }\n  }\n}\n\nfunction hqr2(nn, e, d, V, H) {\n  let n = nn - 1;\n  let low = 0;\n  let high = nn - 1;\n  let eps = Number.EPSILON;\n  let exshift = 0;\n  let norm = 0;\n  let p = 0;\n  let q = 0;\n  let r = 0;\n  let s = 0;\n  let z = 0;\n  let iter = 0;\n  let i, j, k, l, m, t, w, x, y;\n  let ra, sa, vr, vi;\n  let notlast, cdivres;\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      d[i] = H.get(i, i);\n      e[i] = 0;\n    }\n\n    for (j = Math.max(i - 1, 0); j < nn; j++) {\n      norm = norm + Math.abs(H.get(i, j));\n    }\n  }\n\n  while (n >= low) {\n    l = n;\n    while (l > low) {\n      s = Math.abs(H.get(l - 1, l - 1)) + Math.abs(H.get(l, l));\n      if (s === 0) {\n        s = norm;\n      }\n      if (Math.abs(H.get(l, l - 1)) < eps * s) {\n        break;\n      }\n      l--;\n    }\n\n    if (l === n) {\n      H.set(n, n, H.get(n, n) + exshift);\n      d[n] = H.get(n, n);\n      e[n] = 0;\n      n--;\n      iter = 0;\n    } else if (l === n - 1) {\n      w = H.get(n, n - 1) * H.get(n - 1, n);\n      p = (H.get(n - 1, n - 1) - H.get(n, n)) / 2;\n      q = p * p + w;\n      z = Math.sqrt(Math.abs(q));\n      H.set(n, n, H.get(n, n) + exshift);\n      H.set(n - 1, n - 1, H.get(n - 1, n - 1) + exshift);\n      x = H.get(n, n);\n\n      if (q >= 0) {\n        z = p >= 0 ? p + z : p - z;\n        d[n - 1] = x + z;\n        d[n] = d[n - 1];\n        if (z !== 0) {\n          d[n] = x - w / z;\n        }\n        e[n - 1] = 0;\n        e[n] = 0;\n        x = H.get(n, n - 1);\n        s = Math.abs(x) + Math.abs(z);\n        p = x / s;\n        q = z / s;\n        r = Math.sqrt(p * p + q * q);\n        p = p / r;\n        q = q / r;\n\n        for (j = n - 1; j < nn; j++) {\n          z = H.get(n - 1, j);\n          H.set(n - 1, j, q * z + p * H.get(n, j));\n          H.set(n, j, q * H.get(n, j) - p * z);\n        }\n\n        for (i = 0; i <= n; i++) {\n          z = H.get(i, n - 1);\n          H.set(i, n - 1, q * z + p * H.get(i, n));\n          H.set(i, n, q * H.get(i, n) - p * z);\n        }\n\n        for (i = low; i <= high; i++) {\n          z = V.get(i, n - 1);\n          V.set(i, n - 1, q * z + p * V.get(i, n));\n          V.set(i, n, q * V.get(i, n) - p * z);\n        }\n      } else {\n        d[n - 1] = x + p;\n        d[n] = x + p;\n        e[n - 1] = z;\n        e[n] = -z;\n      }\n\n      n = n - 2;\n      iter = 0;\n    } else {\n      x = H.get(n, n);\n      y = 0;\n      w = 0;\n      if (l < n) {\n        y = H.get(n - 1, n - 1);\n        w = H.get(n, n - 1) * H.get(n - 1, n);\n      }\n\n      if (iter === 10) {\n        exshift += x;\n        for (i = low; i <= n; i++) {\n          H.set(i, i, H.get(i, i) - x);\n        }\n        s = Math.abs(H.get(n, n - 1)) + Math.abs(H.get(n - 1, n - 2));\n        x = y = 0.75 * s;\n        w = -0.4375 * s * s;\n      }\n\n      if (iter === 30) {\n        s = (y - x) / 2;\n        s = s * s + w;\n        if (s > 0) {\n          s = Math.sqrt(s);\n          if (y < x) {\n            s = -s;\n          }\n          s = x - w / ((y - x) / 2 + s);\n          for (i = low; i <= n; i++) {\n            H.set(i, i, H.get(i, i) - s);\n          }\n          exshift += s;\n          x = y = w = 0.964;\n        }\n      }\n\n      iter = iter + 1;\n\n      m = n - 2;\n      while (m >= l) {\n        z = H.get(m, m);\n        r = x - z;\n        s = y - z;\n        p = (r * s - w) / H.get(m + 1, m) + H.get(m, m + 1);\n        q = H.get(m + 1, m + 1) - z - r - s;\n        r = H.get(m + 2, m + 1);\n        s = Math.abs(p) + Math.abs(q) + Math.abs(r);\n        p = p / s;\n        q = q / s;\n        r = r / s;\n        if (m === l) {\n          break;\n        }\n        if (\n          Math.abs(H.get(m, m - 1)) * (Math.abs(q) + Math.abs(r)) <\n          eps *\n            (Math.abs(p) *\n              (Math.abs(H.get(m - 1, m - 1)) +\n                Math.abs(z) +\n                Math.abs(H.get(m + 1, m + 1))))\n        ) {\n          break;\n        }\n        m--;\n      }\n\n      for (i = m + 2; i <= n; i++) {\n        H.set(i, i - 2, 0);\n        if (i > m + 2) {\n          H.set(i, i - 3, 0);\n        }\n      }\n\n      for (k = m; k <= n - 1; k++) {\n        notlast = k !== n - 1;\n        if (k !== m) {\n          p = H.get(k, k - 1);\n          q = H.get(k + 1, k - 1);\n          r = notlast ? H.get(k + 2, k - 1) : 0;\n          x = Math.abs(p) + Math.abs(q) + Math.abs(r);\n          if (x !== 0) {\n            p = p / x;\n            q = q / x;\n            r = r / x;\n          }\n        }\n\n        if (x === 0) {\n          break;\n        }\n\n        s = Math.sqrt(p * p + q * q + r * r);\n        if (p < 0) {\n          s = -s;\n        }\n\n        if (s !== 0) {\n          if (k !== m) {\n            H.set(k, k - 1, -s * x);\n          } else if (l !== m) {\n            H.set(k, k - 1, -H.get(k, k - 1));\n          }\n\n          p = p + s;\n          x = p / s;\n          y = q / s;\n          z = r / s;\n          q = q / p;\n          r = r / p;\n\n          for (j = k; j < nn; j++) {\n            p = H.get(k, j) + q * H.get(k + 1, j);\n            if (notlast) {\n              p = p + r * H.get(k + 2, j);\n              H.set(k + 2, j, H.get(k + 2, j) - p * z);\n            }\n\n            H.set(k, j, H.get(k, j) - p * x);\n            H.set(k + 1, j, H.get(k + 1, j) - p * y);\n          }\n\n          for (i = 0; i <= Math.min(n, k + 3); i++) {\n            p = x * H.get(i, k) + y * H.get(i, k + 1);\n            if (notlast) {\n              p = p + z * H.get(i, k + 2);\n              H.set(i, k + 2, H.get(i, k + 2) - p * r);\n            }\n\n            H.set(i, k, H.get(i, k) - p);\n            H.set(i, k + 1, H.get(i, k + 1) - p * q);\n          }\n\n          for (i = low; i <= high; i++) {\n            p = x * V.get(i, k) + y * V.get(i, k + 1);\n            if (notlast) {\n              p = p + z * V.get(i, k + 2);\n              V.set(i, k + 2, V.get(i, k + 2) - p * r);\n            }\n\n            V.set(i, k, V.get(i, k) - p);\n            V.set(i, k + 1, V.get(i, k + 1) - p * q);\n          }\n        }\n      }\n    }\n  }\n\n  if (norm === 0) {\n    return;\n  }\n\n  for (n = nn - 1; n >= 0; n--) {\n    p = d[n];\n    q = e[n];\n\n    if (q === 0) {\n      l = n;\n      H.set(n, n, 1);\n      for (i = n - 1; i >= 0; i--) {\n        w = H.get(i, i) - p;\n        r = 0;\n        for (j = l; j <= n; j++) {\n          r = r + H.get(i, j) * H.get(j, n);\n        }\n\n        if (e[i] < 0) {\n          z = w;\n          s = r;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            H.set(i, n, w !== 0 ? -r / w : -r / (eps * norm));\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            q = (d[i] - p) * (d[i] - p) + e[i] * e[i];\n            t = (x * s - z * r) / q;\n            H.set(i, n, t);\n            H.set(\n              i + 1,\n              n,\n              Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,\n            );\n          }\n\n          t = Math.abs(H.get(i, n));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    } else if (q < 0) {\n      l = n - 1;\n\n      if (Math.abs(H.get(n, n - 1)) > Math.abs(H.get(n - 1, n))) {\n        H.set(n - 1, n - 1, q / H.get(n, n - 1));\n        H.set(n - 1, n, -(H.get(n, n) - p) / H.get(n, n - 1));\n      } else {\n        cdivres = cdiv(0, -H.get(n - 1, n), H.get(n - 1, n - 1) - p, q);\n        H.set(n - 1, n - 1, cdivres[0]);\n        H.set(n - 1, n, cdivres[1]);\n      }\n\n      H.set(n, n - 1, 0);\n      H.set(n, n, 1);\n      for (i = n - 2; i >= 0; i--) {\n        ra = 0;\n        sa = 0;\n        for (j = l; j <= n; j++) {\n          ra = ra + H.get(i, j) * H.get(j, n - 1);\n          sa = sa + H.get(i, j) * H.get(j, n);\n        }\n\n        w = H.get(i, i) - p;\n\n        if (e[i] < 0) {\n          z = w;\n          r = ra;\n          s = sa;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            cdivres = cdiv(-ra, -sa, w, q);\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;\n            vi = (d[i] - p) * 2 * q;\n            if (vr === 0 && vi === 0) {\n              vr =\n                eps *\n                norm *\n                (Math.abs(w) +\n                  Math.abs(q) +\n                  Math.abs(x) +\n                  Math.abs(y) +\n                  Math.abs(z));\n            }\n            cdivres = cdiv(\n              x * r - z * ra + q * sa,\n              x * s - z * sa - q * ra,\n              vr,\n              vi,\n            );\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n            if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {\n              H.set(\n                i + 1,\n                n - 1,\n                (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,\n              );\n              H.set(\n                i + 1,\n                n,\n                (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,\n              );\n            } else {\n              cdivres = cdiv(\n                -r - y * H.get(i, n - 1),\n                -s - y * H.get(i, n),\n                z,\n                q,\n              );\n              H.set(i + 1, n - 1, cdivres[0]);\n              H.set(i + 1, n, cdivres[1]);\n            }\n          }\n\n          t = Math.max(Math.abs(H.get(i, n - 1)), Math.abs(H.get(i, n)));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n - 1, H.get(j, n - 1) / t);\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      for (j = i; j < nn; j++) {\n        V.set(i, j, H.get(i, j));\n      }\n    }\n  }\n\n  for (j = nn - 1; j >= low; j--) {\n    for (i = low; i <= high; i++) {\n      z = 0;\n      for (k = low; k <= Math.min(j, high); k++) {\n        z = z + V.get(i, k) * H.get(k, j);\n      }\n      V.set(i, j, z);\n    }\n  }\n}\n\nfunction cdiv(xr, xi, yr, yi) {\n  let r, d;\n  if (Math.abs(yr) > Math.abs(yi)) {\n    r = yi / yr;\n    d = yr + r * yi;\n    return [(xr + r * xi) / d, (xi - r * xr) / d];\n  } else {\n    r = yr / yi;\n    d = yi + r * yr;\n    return [(r * xr + xi) / d, (r * xi - xr) / d];\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nimport 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 (isAnyArray(Y) && typeof Y[0] === 'number') {\n        Y = Matrix.columnVector(Y);\n      } else {\n        Y = WrapperMatrix2D.checkMatrix(Y);\n      }\n      if (Y.rows !== X.rows) {\n        throw new Error('Y should have the same number of rows as X');\n      }\n      u = Y.getColumnVector(0);\n    } else {\n      u = X.getColumnVector(0);\n    }\n\n    let diff = 1;\n    let t, q, w, tOld;\n\n    for (\n      let counter = 0;\n      counter < maxIterations && diff > terminationCriteria;\n      counter++\n    ) {\n      w = X.transpose().mmul(u).div(u.transpose().mmul(u).get(0, 0));\n      w = w.div(w.norm());\n\n      t = X.mmul(w).div(w.transpose().mmul(w).get(0, 0));\n\n      if (counter > 0) {\n        diff = t.clone().sub(tOld).pow(2).sum();\n      }\n      tOld = t.clone();\n\n      if (Y) {\n        q = Y.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n        q = q.div(q.norm());\n\n        u = Y.mmul(q).div(q.transpose().mmul(q).get(0, 0));\n      } else {\n        u = t;\n      }\n    }\n\n    if (Y) {\n      let p = X.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      p = p.div(p.norm());\n      let xResidual = X.clone().sub(t.clone().mmul(p.transpose()));\n      let residual = u.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      let yResidual = Y.clone().sub(\n        t.clone().mulS(residual.get(0, 0)).mmul(q.transpose()),\n      );\n\n      this.t = t;\n      this.p = p.transpose();\n      this.w = w.transpose();\n      this.q = q;\n      this.u = u;\n      this.s = t.transpose().mmul(t);\n      this.xResidual = xResidual;\n      this.yResidual = yResidual;\n      this.betas = residual;\n    } else {\n      this.w = w.transpose();\n      this.s = t.transpose().mmul(t).sqrt();\n      if (scaleScores) {\n        this.t = t.clone().div(this.s.get(0, 0));\n      } else {\n        this.t = t;\n      }\n      this.xResidual = X.sub(t.mmul(w.transpose()));\n    }\n  }\n}\n","import { Matrix, MatrixTransposeView, EVD, SVD, NIPALS } from 'ml-matrix';\r\n\r\n/**\r\n * Creates new PCA (Principal Component Analysis) from the dataset\r\n * @param {Matrix} dataset - dataset or covariance matrix.\r\n * @param {Object} [options]\r\n * @param {boolean} [options.isCovarianceMatrix=false] - true if the dataset is a covariance matrix.\r\n * @param {string} [options.method='SVD'] - select which method to use: SVD (default), covarianceMatrirx or NIPALS.\r\n * @param {number} [options.nCompNIPALS=2] - number of components to be computed with NIPALS.\r\n * @param {boolean} [options.center=true] - should the data be centered (subtract the mean).\r\n * @param {boolean} [options.scale=false] - should the data be scaled (divide by the standard deviation).\r\n * @param {boolean} [options.ignoreZeroVariance=false] - ignore columns with zero variance if `scale` is `true`.\r\n * */\r\nexport class PCA {\r\n  constructor(dataset, options = {}) {\r\n    if (dataset === true) {\r\n      const model = options;\r\n      this.center = model.center;\r\n      this.scale = model.scale;\r\n      this.means = model.means;\r\n      this.stdevs = model.stdevs;\r\n      this.U = Matrix.checkMatrix(model.U);\r\n      this.S = model.S;\r\n      this.R = model.R;\r\n      this.excludedFeatures = model.excludedFeatures || [];\r\n      return;\r\n    }\r\n\r\n    dataset = new Matrix(dataset);\r\n\r\n    const {\r\n      isCovarianceMatrix = false,\r\n      method = 'SVD',\r\n      nCompNIPALS = 2,\r\n      center = true,\r\n      scale = false,\r\n      ignoreZeroVariance = false,\r\n    } = options;\r\n\r\n    this.center = center;\r\n    this.scale = scale;\r\n    this.means = null;\r\n    this.stdevs = null;\r\n    this.excludedFeatures = [];\r\n\r\n    if (isCovarianceMatrix) {\r\n      // User provided a covariance matrix instead of dataset.\r\n      this._computeFromCovarianceMatrix(dataset);\r\n      return;\r\n    }\r\n\r\n    this._adjust(dataset, ignoreZeroVariance);\r\n    switch (method) {\r\n      case 'covarianceMatrix': {\r\n        // User provided a dataset but wants us to compute and use the covariance matrix.\r\n        const covarianceMatrix = new MatrixTransposeView(dataset)\r\n          .mmul(dataset)\r\n          .div(dataset.rows - 1);\r\n        this._computeFromCovarianceMatrix(covarianceMatrix);\r\n        break;\r\n      }\r\n      case 'NIPALS': {\r\n        this._computeWithNIPALS(dataset, nCompNIPALS);\r\n        break;\r\n      }\r\n      case 'SVD': {\r\n        const svd = new SVD(dataset, {\r\n          computeLeftSingularVectors: false,\r\n          computeRightSingularVectors: true,\r\n          autoTranspose: true,\r\n        });\r\n\r\n        this.U = svd.rightSingularVectors;\r\n\r\n        const singularValues = svd.diagonal;\r\n        const eigenvalues = [];\r\n        for (const singularValue of singularValues) {\r\n          eigenvalues.push(\r\n            (singularValue * singularValue) / (dataset.rows - 1),\r\n          );\r\n        }\r\n        this.S = eigenvalues;\r\n        break;\r\n      }\r\n      default: {\r\n        throw new Error(`unknown method: ${method}`);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Load a PCA model from JSON\r\n   * @param {Object} model\r\n   * @return {PCA}\r\n   */\r\n  static load(model) {\r\n    if (typeof model.name !== 'string') {\r\n      throw new TypeError('model must have a name property');\r\n    }\r\n    if (model.name !== 'PCA') {\r\n      throw new RangeError(`invalid model: ${model.name}`);\r\n    }\r\n    return new PCA(true, model);\r\n  }\r\n\r\n  /**\r\n   * Project the dataset into the PCA space\r\n   * @param {Matrix} dataset\r\n   * @param {Object} options\r\n   * @return {Matrix} dataset projected in the PCA space\r\n   */\r\n  predict(dataset, options = {}) {\r\n    const { nComponents = this.U.columns } = options;\r\n    dataset = new Matrix(dataset);\r\n    if (this.center) {\r\n      dataset.subRowVector(this.means);\r\n      if (this.scale) {\r\n        for (let i of this.excludedFeatures) {\r\n          dataset.removeColumn(i);\r\n        }\r\n        dataset.divRowVector(this.stdevs);\r\n      }\r\n    }\r\n    let predictions = dataset.mmul(this.U);\r\n    return predictions.subMatrix(0, predictions.rows - 1, 0, nComponents - 1);\r\n  }\r\n\r\n  /**\r\n   * Calculates the inverse PCA transform\r\n   * @param {Matrix} dataset\r\n   * @return {Matrix} dataset projected in the PCA space\r\n   */\r\n  invert(dataset) {\r\n    dataset = Matrix.checkMatrix(dataset);\r\n\r\n    let inverse = dataset.mmul(this.U.transpose());\r\n\r\n    if (this.center) {\r\n      if (this.scale) {\r\n        inverse.mulRowVector(this.stdevs);\r\n      }\r\n      inverse.addRowVector(this.means);\r\n    }\r\n\r\n    return inverse;\r\n  }\r\n\r\n  /**\r\n   * Returns the proportion of variance for each component\r\n   * @return {[number]}\r\n   */\r\n  getExplainedVariance() {\r\n    let sum = 0;\r\n    for (const s of this.S) {\r\n      sum += s;\r\n    }\r\n    return this.S.map((value) => value / sum);\r\n  }\r\n\r\n  /**\r\n   * Returns the cumulative proportion of variance\r\n   * @return {[number]}\r\n   */\r\n  getCumulativeVariance() {\r\n    let explained = this.getExplainedVariance();\r\n    for (let i = 1; i < explained.length; i++) {\r\n      explained[i] += explained[i - 1];\r\n    }\r\n    return explained;\r\n  }\r\n\r\n  /**\r\n   * Returns the Eigenvectors of the covariance matrix\r\n   * @returns {Matrix}\r\n   */\r\n  getEigenvectors() {\r\n    return this.U;\r\n  }\r\n\r\n  /**\r\n   * Returns the Eigenvalues (on the diagonal)\r\n   * @returns {[number]}\r\n   */\r\n  getEigenvalues() {\r\n    return this.S;\r\n  }\r\n\r\n  /**\r\n   * Returns the standard deviations of the principal components\r\n   * @returns {[number]}\r\n   */\r\n  getStandardDeviations() {\r\n    return this.S.map((x) => Math.sqrt(x));\r\n  }\r\n\r\n  /**\r\n   * Returns the loadings matrix\r\n   * @return {Matrix}\r\n   */\r\n  getLoadings() {\r\n    return this.U.transpose();\r\n  }\r\n\r\n  /**\r\n   * Export the current model to a JSON object\r\n   * @return {Object} model\r\n   */\r\n  toJSON() {\r\n    return {\r\n      name: 'PCA',\r\n      center: this.center,\r\n      scale: this.scale,\r\n      means: this.means,\r\n      stdevs: this.stdevs,\r\n      U: this.U,\r\n      S: this.S,\r\n      excludedFeatures: this.excludedFeatures,\r\n    };\r\n  }\r\n\r\n  _adjust(dataset, ignoreZeroVariance) {\r\n    if (this.center) {\r\n      const mean = dataset.mean('column');\r\n      const stdevs = this.scale\r\n        ? dataset.standardDeviation('column', { mean })\r\n        : null;\r\n      this.means = mean;\r\n      dataset.subRowVector(mean);\r\n      if (this.scale) {\r\n        for (let i = 0; i < stdevs.length; i++) {\r\n          if (stdevs[i] === 0) {\r\n            if (ignoreZeroVariance) {\r\n              dataset.removeColumn(i);\r\n              stdevs.splice(i, 1);\r\n              this.excludedFeatures.push(i);\r\n              i--;\r\n            } else {\r\n              throw new RangeError(\r\n                `Cannot scale the dataset (standard deviation is zero at index ${i}`,\r\n              );\r\n            }\r\n          }\r\n        }\r\n        this.stdevs = stdevs;\r\n        dataset.divRowVector(stdevs);\r\n      }\r\n    }\r\n  }\r\n\r\n  _computeFromCovarianceMatrix(dataset) {\r\n    const evd = new EVD(dataset, { assumeSymmetric: true });\r\n    this.U = evd.eigenvectorMatrix;\r\n    this.U.flipRows();\r\n    this.S = evd.realEigenvalues;\r\n    this.S.reverse();\r\n  }\r\n\r\n  _computeWithNIPALS(dataset, nCompNIPALS) {\r\n    this.U = new Matrix(nCompNIPALS, dataset.columns);\r\n    this.S = [];\r\n\r\n    let x = dataset;\r\n    for (let i = 0; i < nCompNIPALS; i++) {\r\n      let dc = new NIPALS(x);\r\n\r\n      this.U.setRow(i, dc.w.transpose());\r\n      this.S.push(Math.pow(dc.s.get(0, 0), 2));\r\n\r\n      x = dc.xResidual;\r\n    }\r\n    this.U = this.U.transpose(); // to be compatible with API\r\n  }\r\n}\r\n","import { Matrix, SVD, pseudoInverse } from 'ml-matrix';\n\nexport default class MultivariateLinearRegression {\n  constructor(x, y, options = {}) {\n    const { intercept = true, statistics = true } = options;\n    this.statistics = statistics;\n    if (x === true) {\n      this.weights = y.weights;\n      this.inputs = y.inputs;\n      this.outputs = y.outputs;\n      this.intercept = y.intercept;\n    } else {\n      x = new Matrix(x);\n      y = new Matrix(y);\n      if (intercept) {\n        x.addColumn(new Array(x.rows).fill(1));\n      }\n      let xt = x.transpose();\n      const xx = xt.mmul(x);\n      const xy = xt.mmul(y);\n      const invxx = new SVD(xx).inverse();\n      const beta = xy.transpose().mmul(invxx).transpose();\n      this.weights = beta.to2DArray();\n      this.inputs = x.columns;\n      this.outputs = y.columns;\n      if (intercept) this.inputs--;\n      this.intercept = intercept;\n      if (statistics) {\n        /*\n         * Let's add some basic statistics about the beta's to be able to interpret them.\n         * source: http://dept.stat.lsa.umich.edu/~kshedden/Courses/Stat401/Notes/401-multreg.pdf\n         * validated against Excel Regression AddIn\n         * test: \"datamining statistics test\"\n         */\n        const fittedValues = x.mmul(beta);\n        const residuals = y.clone().addM(fittedValues.neg());\n        const variance =\n          residuals\n            .to2DArray()\n            .map((ri) => Math.pow(ri[0], 2))\n            .reduce((a, b) => a + b) /\n          (y.rows - x.columns);\n        this.stdError = Math.sqrt(variance);\n        this.stdErrorMatrix = pseudoInverse(xx).mul(variance);\n        this.stdErrors = this.stdErrorMatrix\n          .diagonal()\n          .map((d) => Math.sqrt(d));\n        this.tStats = this.weights.map((d, i) =>\n          this.stdErrors[i] === 0 ? 0 : d[0] / this.stdErrors[i],\n        );\n      }\n    }\n  }\n\n  predict(x) {\n    if (Array.isArray(x)) {\n      if (typeof x[0] === 'number') {\n        return this._predict(x);\n      } else if (Array.isArray(x[0])) {\n        const y = new Array(x.length);\n        for (let i = 0; i < x.length; i++) {\n          y[i] = this._predict(x[i]);\n        }\n        return y;\n      }\n    } else if (Matrix.isMatrix(x)) {\n      const y = new Matrix(x.rows, this.outputs);\n      for (let i = 0; i < x.rows; i++) {\n        y.setRow(i, this._predict(x.getRow(i)));\n      }\n      return y;\n    }\n    throw new TypeError('x must be a matrix or array of numbers');\n  }\n\n  _predict(x) {\n    const result = new Array(this.outputs);\n    if (this.intercept) {\n      for (let i = 0; i < this.outputs; i++) {\n        result[i] = this.weights[this.inputs][i];\n      }\n    } else {\n      result.fill(0);\n    }\n    for (let i = 0; i < this.inputs; i++) {\n      for (let j = 0; j < this.outputs; j++) {\n        result[j] += this.weights[i][j] * x[i];\n      }\n    }\n    return result;\n  }\n\n  score() {\n    throw new Error('score method is not implemented yet');\n  }\n\n  toJSON() {\n    return {\n      name: 'multivariateLinearRegression',\n      weights: this.weights,\n      inputs: this.inputs,\n      outputs: this.outputs,\n      intercept: this.intercept,\n      summary: this.statistics\n        ? {\n            regressionStatistics: {\n              standardError: this.stdError,\n              observations: this.outputs,\n            },\n            variables: this.weights.map((d, i) => {\n              return {\n                label:\n                  i === this.weights.length - 1\n                    ? 'Intercept'\n                    : `X Variable ${i + 1}`,\n                coefficients: d,\n                standardError: this.stdErrors[i],\n                tStat: this.tStats[i],\n              };\n            }),\n          }\n        : undefined,\n    };\n  }\n\n  static load(model) {\n    if (model.name !== 'multivariateLinearRegression') {\n      throw new Error('not a MLR model');\n    }\n    return new MultivariateLinearRegression(true, model);\n  }\n}\n","import SVD from './dc/svd';\nimport Matrix from './matrix';\n\nexport function pseudoInverse(matrix, threshold = Number.EPSILON) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isEmpty()) {\n    // with a zero dimension, the pseudo-inverse is the transpose, since all 0xn and nx0 matrices are singular\n    // (0xn)*(nx0)*(0xn) = 0xn\n    // (nx0)*(0xn)*(nx0) = nx0\n    return matrix.transpose();\n  }\n  let svdSolution = new SVD(matrix, { autoTranspose: true });\n\n  let U = svdSolution.leftSingularVectors;\n  let V = svdSolution.rightSingularVectors;\n  let s = svdSolution.diagonal;\n\n  for (let i = 0; i < s.length; i++) {\n    if (Math.abs(s[i]) > threshold) {\n      s[i] = 1.0 / s[i];\n    } else {\n      s[i] = 0.0;\n    }\n  }\n\n  return V.mmul(Matrix.diag(s).mmul(U.transpose()));\n}\n","import { Matrix } from 'ml-matrix';\nimport { PCA } from 'ml-pca';\nimport MLR from 'ml-regression-multivariate-linear';\n/**\n * Creates new PCR (Principal component regression)\n * @param {Array} predictor - matrix with predictor variables. (Each column is an array)\n * @param {Array} response - matrix with response variables. (Each column is an array)\n * @param {number} pcaWeight - Weight to choose the principal components. It refers to the weight that components must sum with each other (in percent) to perform the regression.\n * @param {boolean} intercept - Intercept\n * */\nexport class PCR {\n    constructor(predictor, response, options = {}) {\n        const { intercept = true, pcaWeight = 1, nComp = 0, scale = false, center = true, } = options;\n        this.intercept = intercept;\n        this.pcaWeight = pcaWeight;\n        let pca;\n        if (nComp) {\n            pca = new PCA(predictor, {\n                scale,\n                center,\n                method: 'NIPALS',\n                nCompNIPALS: nComp,\n            });\n        }\n        else {\n            pca = new PCA(predictor, { scale, center });\n        }\n        let evalues = pca.getEigenvalues();\n        const sum = evalues.reduce((accumulator, currentValue) => accumulator + currentValue);\n        const weight = evalues.map((value, index) => ({\n            weight: value / sum,\n            evalues: evalues[index],\n            componentNumber: index + 1,\n        }));\n        weight.sort((first, second) => first.weight + second.weight);\n        let n = 0;\n        let z = 0;\n        let l = 0;\n        while (z < this.pcaWeight) {\n            l = weight[n].weight;\n            z += l;\n            n++;\n        }\n        let predictorsMatrix = Matrix.checkMatrix(predictor);\n        let responseMatrix = Matrix.checkMatrix(response);\n        const loadings = pca.getLoadings();\n        const selectedLoadings = loadings.subMatrixRow(new Array(n).fill(0).map((_, index) => index));\n        this.loadingsData = new Array(selectedLoadings.rows)\n            .fill(0)\n            .map((_, index) => ({\n            weight: (evalues[index] / sum) * 100,\n            evalues: evalues[index],\n            componentNumber: index + 1,\n            component: loadings.getRow(index),\n        }));\n        let scores = predictorsMatrix.mmul(loadings.transpose());\n        this.scores = scores;\n        const regressionScores = new MLR(scores, responseMatrix, {\n            intercept: this.intercept,\n        });\n        const coefficientsMatrix = new Matrix(regressionScores.weights).transpose();\n        const coefficients = coefficientsMatrix\n            .subMatrixColumn(new Array(coefficientsMatrix.columns - 1)\n            .fill(0)\n            .map((_, index) => index))\n            .mmul(loadings.transpose())\n            .transpose();\n        if (this.intercept) {\n            coefficients.addRow(0, coefficientsMatrix.getColumn(coefficientsMatrix.rows - 1));\n            predictorsMatrix.addColumn(0, new Array(predictorsMatrix.rows).fill(1));\n        }\n        this.coefficients = coefficients;\n        let yFittedValues = predictorsMatrix.mmul(coefficients);\n        this.yFittedValues = yFittedValues;\n        let residual = responseMatrix.sub(yFittedValues).to2DArray();\n        let xMedia = predictorsMatrix.mean('row');\n        let yMedia = responseMatrix.mean('row');\n        let sst = [];\n        for (let i = 0; i < responseMatrix.rows; i++) {\n            sst[i] = responseMatrix\n                .getRow(i)\n                .map((x) => Math.pow(x - yMedia[i], 2))\n                .reduce((a, b) => a + b);\n        }\n        let ssr = [];\n        let yVariance = [];\n        let stdDeviationY = [];\n        for (let i = 0; i < responseMatrix.rows; i++) {\n            ssr.push(yFittedValues\n                .getRow(i)\n                .map((x) => Math.pow(x - yMedia[i], 2))\n                .reduce((a, b) => a + b));\n            yVariance.push(ssr[i] / (responseMatrix.columns - 1));\n            stdDeviationY.push(Math.sqrt(yVariance[i]));\n        }\n        let sse = [];\n        sse = residual.map((a) => a.map((x) => Math.pow(x, 2)).reduce((a, b) => a + b));\n        let r2 = [];\n        for (let i = 0; i < ssr.length; i++) {\n            r2.push(ssr[i] / sst[i]);\n        }\n        let xVariance = [];\n        let stdDeviationX = [];\n        for (let i = 0; i < predictorsMatrix.rows; i++) {\n            xVariance.push(predictorsMatrix\n                .getRow(i)\n                .map((x) => Math.pow(x - xMedia[i], 2))\n                .reduce((a, b) => a + b) /\n                (predictorsMatrix.columns - 1));\n            stdDeviationX[i] = Math.sqrt(xVariance[i]);\n        }\n        let Statistic = {\n            residual,\n            yMedia,\n            xMedia,\n            SST: sst,\n            SSR: ssr,\n            SSE: sse,\n            R2: r2,\n            yVariance,\n            xVariance,\n            stdDeviationY,\n            stdDeviationX,\n        };\n        this.statistics = Statistic;\n    }\n    /**\n     * Predict y-values for a given x\n     * @returns {[Array]}\n     */\n    predict(x) {\n        const result = [];\n        let g = [];\n        if (this.intercept) {\n            x.unshift(1);\n        }\n        for (let i = 0; i < this.coefficients.columns; i++) {\n            for (let j = 0; j < this.coefficients.rows; j++) {\n                g.push(this.coefficients.get(j, i) * x[j]);\n            }\n            result[i] = g.reduce((a, b) => a + b);\n            g = [];\n        }\n        return result;\n    }\n    /**\n     * Returns some basic statistics of the regression\n     * @returns {[Array]}\n     */\n    getStatistic() {\n        return this.statistics;\n    }\n    /**\n     * Returns fitted values of Y\n     * @returns {[Array]}\n     */\n    getFittedValuesY() {\n        return this.yFittedValues;\n    }\n    /**\n     * Returns the regression coefficients\n     * @returns {[Array]}\n     */\n    getCoefficients() {\n        return this.coefficients;\n    }\n    /**\n     * Returns the scores for principal components\n     * @returns {[Object]}\n     */\n    getLoadingsdata() {\n        return this.loadingsData;\n    }\n    /**\n     * Returns the number of principal components used\n     * @returns {[Array]}\n     */\n    getScores() {\n        return this.scores;\n    }\n}\n//# sourceMappingURL=pcr.js.map"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","max","input","options","arguments","length","undefined","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","inspectData","rows","columns","maxI","Math","maxJ","result","line","j","push","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","e","slice","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","fill","random","interval","round","this","zeros","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","v","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","sqrt","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","Float64Array","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","y","x","r1","c1","r2","c2","embed","mat","cols","r","c","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","element","from","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","exp","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","BaseView","MatrixTransposeView","WrapperMatrix2D","hypotenuse","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","t","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","solve","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","X","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","EigenvalueDecomposition","assumeSymmetric","d","hh","tred2","dl1","c3","el1","s2","tst1","tql2","H","ort","low","high","orthes","nn","w","ra","sa","vr","vi","notlast","cdivres","exshift","z","iter","cdiv","hqr2","realEigenvalues","imaginaryEigenvalues","eigenvectorMatrix","xr","xi","yr","yi","nipals","scaleScores","maxIterations","terminationCriteria","u","tOld","diff","counter","xResidual","residual","yResidual","betas","PCA","dataset","model","means","stdevs","S","R","excludedFeatures","isCovarianceMatrix","method","nCompNIPALS","ignoreZeroVariance","_computeFromCovarianceMatrix","_adjust","covarianceMatrix","_computeWithNIPALS","svd","SVD","singularValues","eigenvalues","singularValue","predict","nComponents","predictions","invert","getExplainedVariance","map","getCumulativeVariance","explained","getEigenvectors","getEigenvalues","getStandardDeviations","getLoadings","evd","EVD","reverse","dc","NIPALS","MultivariateLinearRegression","intercept","statistics","weights","inputs","outputs","xt","xx","xy","invxx","beta","fittedValues","ri","reduce","stdError","stdErrorMatrix","svdSolution","pseudoInverse","stdErrors","tStats","isArray","_predict","score","summary","regressionStatistics","standardError","observations","variables","label","coefficients","tStat","predictor","response","pcaWeight","nComp","pca","evalues","accumulator","currentValue","weight","componentNumber","second","predictorsMatrix","responseMatrix","loadings","selectedLoadings","_","loadingsData","component","scores","regressionScores","MLR","coefficientsMatrix","yFittedValues","xMedia","yMedia","sst","ssr","yVariance","stdDeviationY","sse","xVariance","stdDeviationX","Statistic","SST","SSR","SSE","R2","unshift","getStatistic","getFittedValuesY","getCoefficients","getLoadingsdata","getScores"],"mappings":"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"}