{"version":3,"file":"ml-pls.umd.js","sources":["../node_modules/ml-matrix/matrix.js","../node_modules/ml-matrix/matrix.mjs","../lib/util/utils.js","../lib/PLS.js","../lib/KOPLS.js","../node_modules/is-any-array/lib/index.js","../node_modules/ml-confusion-matrix/lib-esm/index.js","../node_modules/ml-combinations/lib/index.js","../node_modules/ml-cross-validation/src/getFolds.js","../node_modules/ml-array-sum/node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-roc-multiclass/lib-esm/getAuc.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getThresholds.js","../node_modules/ml-roc-multiclass/lib-esm/getBinaryClassifiers.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getClasses.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getClassesPairs.js","../node_modules/ml-roc-multiclass/lib-esm/utilities/getSelectedResults.js","../node_modules/ml-roc-multiclass/lib-esm/getRocCurve.js","../lib/oplsNipals.js","../lib/util/getSafeStandardDeviations.js","../lib/util/tss.js","../lib/OPLS.js"],"sourcesContent":["'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nfunction isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n\n/**\n * Computes the maximum of the given values.\n *\n * @param input\n * @param options\n */\nfunction max(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const { fromIndex = 0, toIndex = input.length } = options;\n    if (fromIndex < 0 ||\n        fromIndex >= input.length ||\n        !Number.isInteger(fromIndex)) {\n        throw new Error('fromIndex must be a positive integer smaller than length');\n    }\n    if (toIndex <= fromIndex ||\n        toIndex > input.length ||\n        !Number.isInteger(toIndex)) {\n        throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n    }\n    let maxValue = input[fromIndex];\n    for (let i = fromIndex + 1; i < toIndex; i++) {\n        if (input[i] > maxValue)\n            maxValue = input[i];\n    }\n    return maxValue;\n}\n\n/**\n * Computes the minimum of the given values.\n */\nfunction min(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const { fromIndex = 0, toIndex = input.length } = options;\n    if (fromIndex < 0 ||\n        fromIndex >= input.length ||\n        !Number.isInteger(fromIndex)) {\n        throw new Error('fromIndex must be a positive integer smaller than length');\n    }\n    if (toIndex <= fromIndex ||\n        toIndex > input.length ||\n        !Number.isInteger(toIndex)) {\n        throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n    }\n    let minValue = input[fromIndex];\n    for (let i = fromIndex + 1; i < toIndex; i++) {\n        if (input[i] < minValue)\n            minValue = input[i];\n    }\n    return minValue;\n}\n\n/**\n * Rescale an array into a range.\n */\nfunction rescale(input, options = {}) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    else if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    let output;\n    if (options.output !== undefined) {\n        if (!isAnyArray(options.output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        output = options.output;\n    }\n    else {\n        output = new Array(input.length);\n    }\n    const currentMin = min(input);\n    const currentMax = max(input);\n    if (currentMin === currentMax) {\n        throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n    }\n    const { min: minValue = options.autoMinMax ? currentMin : 0, max: maxValue = options.autoMinMax ? currentMax : 1, } = options;\n    if (minValue >= maxValue) {\n        throw new RangeError('min option must be smaller than max option');\n    }\n    const factor = (maxValue - minValue) / (currentMax - currentMin);\n    for (let i = 0; i < input.length; i++) {\n        output[i] = (input[i] - currentMin) * factor + minValue;\n    }\n    return output;\n}\n\nconst indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\n/**\n * @this {Matrix}\n * @returns {string}\n */\nfunction inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nfunction inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n\nfunction 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, 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, this.get(i, j) ** matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n}\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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nfunction 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\nclass 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  isDistance() {\n    if (!this.isSymmetric()) return false;\n\n    for (let i = 0; i < this.rows; i++) {\n      if (this.get(i, i) !== 0) return false;\n    }\n\n    return true;\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    switch (type) {\n      case 'max':\n        return this.max();\n      case 'frobenius':\n        return Math.sqrt(this.dot(this));\n      default:\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  mpow(scalar) {\n    if (!this.isSquare()) {\n      throw new RangeError('Matrix must be square');\n    }\n    if (!Number.isInteger(scalar) || scalar < 0) {\n      throw new RangeError('Exponent must be a non-negative integer');\n    }\n    // Russian Peasant exponentiation, i.e. exponentiation by squaring\n    let result = Matrix.eye(this.rows);\n    let bb = this;\n    // Note: Don't bit shift. In JS, that would truncate at 32 bits\n    for (let e = scalar; e >= 1; e /= 2) {\n      if ((e & 1) !== 0) {\n        result = result.mmul(bb);\n      }\n      bb = bb.mmul(bb);\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 result = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      result = result.setSubMatrix(c11, 0, 0);\n      result = result.setSubMatrix(c12, c11.rows, 0);\n      result = result.setSubMatrix(c21, 0, c11.columns);\n      result = result.setSubMatrix(c22, c11.rows, c11.columns);\n      return result.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,\n          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    return this.constructor.copy(this, new Matrix(this.rows, this.columns));\n  }\n\n  /**\n   * @template {AbstractMatrix} M\n   * @param {AbstractMatrix} from\n   * @param {M} to\n   * @return {M}\n   */\n  static copy(from, to) {\n    for (const [row, column, value] of from.entries()) {\n      to.set(row, column, value);\n    }\n\n    return to;\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  [Symbol.iterator]() {\n    return this.entries();\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield [row, column, value]\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *entries() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield [row, col, this.get(row, col)];\n      }\n    }\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield value\n   * @returns {Generator<number, void, void>}\n   */\n  *values() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield this.get(row, col);\n      }\n    }\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\nclass Matrix extends AbstractMatrix {\n  /**\n   * @type {Float64Array[]}\n   */\n  data;\n\n  /**\n   * Init an empty matrix\n   * @param {number} nRows\n   * @param {number} nColumns\n   */\n  #initData(nRows, nColumns) {\n    this.data = [];\n\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\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      this.#initData(nRows.rows, nRows.columns);\n      Matrix.copy(nRows, this);\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      this.#initData(nRows, nColumns);\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\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\n      this.rows = nRows;\n      this.columns = nColumns;\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\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\n/**\n * @typedef {0 | 1 | number | boolean} Mask\n */\n\nclass SymmetricMatrix extends AbstractMatrix {\n  /** @type {Matrix} */\n  #matrix;\n\n  get size() {\n    return this.#matrix.size;\n  }\n\n  get rows() {\n    return this.#matrix.rows;\n  }\n\n  get columns() {\n    return this.#matrix.columns;\n  }\n\n  get diagonalSize() {\n    return this.rows;\n  }\n\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isSymmetricMatrix(value) {\n    return Matrix.isMatrix(value) && value.klassType === 'SymmetricMatrix';\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static zeros(diagonalSize) {\n    return new this(diagonalSize);\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static ones(diagonalSize) {\n    return new this(diagonalSize).fill(1);\n  }\n\n  /**\n   * @param {number | AbstractMatrix | ArrayLike<ArrayLike<number>>} diagonalSize\n   * @return {this}\n   */\n  constructor(diagonalSize) {\n    super();\n\n    if (Matrix.isMatrix(diagonalSize)) {\n      if (!diagonalSize.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n\n      this.#matrix = Matrix.copy(\n        diagonalSize,\n        new Matrix(diagonalSize.rows, diagonalSize.rows),\n      );\n    } else if (Number.isInteger(diagonalSize) && diagonalSize >= 0) {\n      this.#matrix = new Matrix(diagonalSize, diagonalSize);\n    } else {\n      this.#matrix = new Matrix(diagonalSize);\n\n      if (!this.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n    }\n  }\n\n  clone() {\n    const matrix = new SymmetricMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  toMatrix() {\n    return new Matrix(this);\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.#matrix.get(rowIndex, columnIndex);\n  }\n  set(rowIndex, columnIndex, value) {\n    // symmetric set\n    this.#matrix.set(rowIndex, columnIndex, value);\n    this.#matrix.set(columnIndex, rowIndex, value);\n\n    return this;\n  }\n\n  removeCross(index) {\n    // symmetric remove side\n    this.#matrix.removeRow(index);\n    this.#matrix.removeColumn(index);\n\n    return this;\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    const row = array.slice();\n    row.splice(index, 1);\n\n    this.#matrix.addRow(index, row);\n    this.#matrix.addColumn(index, array);\n\n    return this;\n  }\n\n  /**\n   * @param {Mask[]} mask\n   */\n  applyMask(mask) {\n    if (mask.length !== this.diagonalSize) {\n      throw new RangeError('Mask size do not match with matrix size');\n    }\n\n    // prepare sides to remove from matrix from mask\n    /** @type {number[]} */\n    const sidesToRemove = [];\n    for (const [index, passthroughs] of mask.entries()) {\n      if (passthroughs) continue;\n      sidesToRemove.push(index);\n    }\n    // to remove from highest to lowest for no mutation shifting\n    sidesToRemove.reverse();\n\n    // remove sides\n    for (const sideIndex of sidesToRemove) {\n      this.removeCross(sideIndex);\n    }\n\n    return this;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * iterate from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 1 2 3 4\n   * B 2 5 6 7\n   * C 3 6 8 9\n   * D 4 7 9 10\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`\n   *\n   * length is S(i=0, n=sideSize) => 10 for a 4 sideSized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n\n    /** @type {number[]} */\n    const compact = new Array((diagonalSize * (diagonalSize + 1)) / 2);\n    for (let col = 0, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   * @return {SymmetricMatrix}\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n    // compactSize = (sideSize * (sideSize + 1)) / 2\n    // https://mathsolver.microsoft.com/fr/solve-problem/y%20%3D%20%20x%20%60cdot%20%20%20%60frac%7B%20%20%60left(%20x%2B1%20%20%60right)%20%20%20%20%7D%7B%202%20%20%7D\n    // sideSize = (Sqrt(8 × compactSize + 1) - 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) - 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a Symmetric Matrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new SymmetricMatrix(diagonalSize);\n    for (let col = 0, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return matrix;\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield [row, column, value]\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightEntries() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield [row, col, value];\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield value\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightValues() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield value;\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n}\nSymmetricMatrix.prototype.klassType = 'SymmetricMatrix';\n\nclass DistanceMatrix extends SymmetricMatrix {\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isDistanceMatrix(value) {\n    return (\n      SymmetricMatrix.isSymmetricMatrix(value) &&\n      value.klassSubType === 'DistanceMatrix'\n    );\n  }\n\n  constructor(sideSize) {\n    super(sideSize);\n\n    if (!this.isDistance()) {\n      throw new TypeError('Provided arguments do no produce a distance matrix');\n    }\n  }\n\n  set(rowIndex, columnIndex, value) {\n    // distance matrix diagonal is 0\n    if (rowIndex === columnIndex) value = 0;\n\n    return super.set(rowIndex, columnIndex, value);\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    // ensure distance\n    array = array.slice();\n    array[index] = 0;\n\n    return super.addCross(index, array);\n  }\n\n  toSymmetricMatrix() {\n    return new SymmetricMatrix(this);\n  }\n\n  clone() {\n    const matrix = new DistanceMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      if (row === col) continue;\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * no diagonal (only zeros)\n   * iterable from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 0 1 2 3\n   * B 1 0 4 5\n   * C 2 4 0 6\n   * D 3 5 6 0\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6]`\n   *\n   * length is S(i=0, n=sideSize-1) => 6 for a 4 side sized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n    const compactLength = ((diagonalSize - 1) * diagonalSize) / 2;\n\n    /** @type {number[]} */\n    const compact = new Array(compactLength);\n    for (let col = 1, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n\n    if (compactSize === 0) {\n      return new this(0);\n    }\n\n    // compactSize in Natural integer range ]0;∞]\n    // compactSize = (sideSize * (sideSize - 1)) / 2\n    // sideSize = (Sqrt(8 × compactSize + 1) + 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) + 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a DistanceMatrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new this(diagonalSize);\n    for (let col = 1, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return matrix;\n  }\n}\nDistanceMatrix.prototype.klassSubType = 'DistanceMatrix';\n\nclass 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\nclass MatrixColumnView extends BaseView {\n  constructor(matrix, column) {\n    checkColumnIndex(matrix, column);\n    super(matrix, matrix.rows, 1);\n    this.column = column;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.column, value);\n    return this;\n  }\n\n  get(rowIndex) {\n    return this.matrix.get(rowIndex, this.column);\n  }\n}\n\nclass MatrixColumnSelectionView extends BaseView {\n  constructor(matrix, columnIndices) {\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, matrix.rows, columnIndices.length);\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columnIndices[columnIndex], value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columnIndices[columnIndex]);\n  }\n}\n\nclass MatrixFlipColumnView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columns - columnIndex - 1, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columns - columnIndex - 1);\n  }\n}\n\nclass MatrixFlipRowView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rows - rowIndex - 1, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rows - rowIndex - 1, columnIndex);\n  }\n}\n\nclass MatrixRowView extends BaseView {\n  constructor(matrix, row) {\n    checkRowIndex(matrix, row);\n    super(matrix, 1, matrix.columns);\n    this.row = row;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.row, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.row, columnIndex);\n  }\n}\n\nclass MatrixRowSelectionView extends BaseView {\n  constructor(matrix, rowIndices) {\n    checkRowIndices(matrix, rowIndices);\n    super(matrix, rowIndices.length, matrix.columns);\n    this.rowIndices = rowIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rowIndices[rowIndex], columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rowIndices[rowIndex], columnIndex);\n  }\n}\n\nclass MatrixSelectionView extends BaseView {\n  constructor(matrix, rowIndices, columnIndices) {\n    checkRowIndices(matrix, rowIndices);\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, rowIndices.length, columnIndices.length);\n    this.rowIndices = rowIndices;\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n    );\n  }\n}\n\nclass MatrixSubView extends BaseView {\n  constructor(matrix, startRow, endRow, startColumn, endColumn) {\n    checkRange(matrix, startRow, endRow, startColumn, endColumn);\n    super(matrix, endRow - startRow + 1, endColumn - startColumn + 1);\n    this.startRow = startRow;\n    this.startColumn = startColumn;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n    );\n  }\n}\n\nclass 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\nclass WrapperMatrix1D extends AbstractMatrix {\n  constructor(data, options = {}) {\n    const { rows = 1 } = options;\n\n    if (data.length % rows !== 0) {\n      throw new Error('the data length is not divisible by the number of rows');\n    }\n    super();\n    this.rows = rows;\n    this.columns = data.length / rows;\n    this.data = data;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    this.data[index] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    return this.data[index];\n  }\n\n  _calculateIndex(row, column) {\n    return row * this.columns + column;\n  }\n}\n\nclass 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\nfunction wrap(array, options) {\n  if (isAnyArray(array)) {\n    if (array[0] && isAnyArray(array[0])) {\n      return new WrapperMatrix2D(array);\n    } else {\n      return new WrapperMatrix1D(array, options);\n    }\n  } else {\n    throw new Error('the argument is not an array');\n  }\n}\n\nclass LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n\nfunction 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\nclass QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n\nclass 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 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          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          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\nfunction inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nfunction solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n\nfunction determinant(matrix) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isSquare()) {\n    if (matrix.columns === 0) {\n      return 1;\n    }\n\n    let a, b, c, d;\n    if (matrix.columns === 2) {\n      // 2 x 2 matrix\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(1, 0);\n      d = matrix.get(1, 1);\n\n      return a * d - b * c;\n    } else if (matrix.columns === 3) {\n      // 3 x 3 matrix\n      let subMatrix0, subMatrix1, subMatrix2;\n      subMatrix0 = new MatrixSelectionView(matrix, [1, 2], [1, 2]);\n      subMatrix1 = new MatrixSelectionView(matrix, [1, 2], [0, 2]);\n      subMatrix2 = new MatrixSelectionView(matrix, [1, 2], [0, 1]);\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(0, 2);\n\n      return (\n        a * determinant(subMatrix0) -\n        b * determinant(subMatrix1) +\n        c * determinant(subMatrix2)\n      );\n    } else {\n      // general purpose determinant using the LU decomposition\n      return new LuDecomposition(matrix).determinant;\n    }\n  } else {\n    throw Error('determinant can only be calculated for a square matrix');\n  }\n}\n\nfunction xrange(n, exception) {\n  let range = [];\n  for (let i = 0; i < n; i++) {\n    if (i !== exception) {\n      range.push(i);\n    }\n  }\n  return range;\n}\n\nfunction dependenciesOneRow(\n  error,\n  matrix,\n  index,\n  thresholdValue = 10e-10,\n  thresholdError = 10e-10,\n) {\n  if (error > thresholdError) {\n    return new Array(matrix.rows + 1).fill(0);\n  } else {\n    let returnArray = matrix.addRow(index, [0]);\n    for (let i = 0; i < returnArray.rows; i++) {\n      if (Math.abs(returnArray.get(i, 0)) < thresholdValue) {\n        returnArray.set(i, 0, 0);\n      }\n    }\n    return returnArray.to1DArray();\n  }\n}\n\nfunction linearDependencies(matrix, options = {}) {\n  const { thresholdValue = 10e-10, thresholdError = 10e-10 } = options;\n  matrix = Matrix.checkMatrix(matrix);\n\n  let n = matrix.rows;\n  let results = new Matrix(n, n);\n\n  for (let i = 0; i < n; i++) {\n    let b = Matrix.columnVector(matrix.getRow(i));\n    let Abis = matrix.subMatrixRow(xrange(n, i)).transpose();\n    let svd = new SingularValueDecomposition(Abis);\n    let x = svd.solve(b);\n    let error = Matrix.sub(b, Abis.mmul(x)).abs().max();\n    results.setRow(\n      i,\n      dependenciesOneRow(error, x, i, thresholdValue, thresholdError),\n    );\n  }\n  return results;\n}\n\nfunction 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 SingularValueDecomposition(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\nfunction covariance(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n  const { center = true } = options;\n  if (center) {\n    xMatrix = xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix = yMatrix.center('column');\n    }\n  }\n  const cov = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < cov.rows; i++) {\n    for (let j = 0; j < cov.columns; j++) {\n      cov.set(i, j, cov.get(i, j) * (1 / (xMatrix.rows - 1)));\n    }\n  }\n  return cov;\n}\n\nfunction correlation(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n\n  const { center = true, scale = true } = options;\n  if (center) {\n    xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix.center('column');\n    }\n  }\n  if (scale) {\n    xMatrix.scale('column');\n    if (!yIsSame) {\n      yMatrix.scale('column');\n    }\n  }\n\n  const sdx = xMatrix.standardDeviation('column', { unbiased: true });\n  const sdy = yIsSame\n    ? sdx\n    : yMatrix.standardDeviation('column', { unbiased: true });\n\n  const corr = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < corr.rows; i++) {\n    for (let j = 0; j < corr.columns; j++) {\n      corr.set(\n        i,\n        j,\n        corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)),\n      );\n    }\n  }\n  return corr;\n}\n\nclass 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;\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      do {\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        // eslint-disable-next-line no-multi-assign\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          // eslint-disable-next-line no-multi-assign\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\nclass CholeskyDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n    if (!value.isSymmetric()) {\n      throw new Error('Matrix is not symmetric');\n    }\n\n    let a = value;\n    let dimension = a.rows;\n    let l = new Matrix(dimension, dimension);\n    let positiveDefinite = true;\n    let i, j, k;\n\n    for (j = 0; j < dimension; j++) {\n      let d = 0;\n      for (k = 0; k < j; k++) {\n        let s = 0;\n        for (i = 0; i < k; i++) {\n          s += l.get(k, i) * l.get(j, i);\n        }\n        s = (a.get(j, k) - s) / l.get(k, k);\n        l.set(j, k, s);\n        d = d + s * s;\n      }\n\n      d = a.get(j, j) - d;\n\n      positiveDefinite &&= d > 0;\n      l.set(j, j, Math.sqrt(Math.max(d, 0)));\n      for (k = j + 1; k < dimension; k++) {\n        l.set(j, k, 0);\n      }\n    }\n\n    this.L = l;\n    this.positiveDefinite = positiveDefinite;\n  }\n\n  isPositiveDefinite() {\n    return this.positiveDefinite;\n  }\n\n  solve(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let l = this.L;\n    let dimension = l.rows;\n\n    if (value.rows !== dimension) {\n      throw new Error('Matrix dimensions do not match');\n    }\n    if (this.isPositiveDefinite() === false) {\n      throw new Error('Matrix is not positive definite');\n    }\n\n    let count = value.columns;\n    let B = value.clone();\n    let i, j, k;\n\n    for (k = 0; k < dimension; k++) {\n      for (j = 0; j < count; j++) {\n        for (i = 0; i < k; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(k, i));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    for (k = dimension - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        for (i = k + 1; i < dimension; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(i, k));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    return B;\n  }\n\n  get lowerTriangularMatrix() {\n    return this.L;\n  }\n}\n\nclass 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\nexports.AbstractMatrix = AbstractMatrix;\nexports.CHO = CholeskyDecomposition;\nexports.CholeskyDecomposition = CholeskyDecomposition;\nexports.DistanceMatrix = DistanceMatrix;\nexports.EVD = EigenvalueDecomposition;\nexports.EigenvalueDecomposition = EigenvalueDecomposition;\nexports.LU = LuDecomposition;\nexports.LuDecomposition = LuDecomposition;\nexports.Matrix = Matrix;\nexports.MatrixColumnSelectionView = MatrixColumnSelectionView;\nexports.MatrixColumnView = MatrixColumnView;\nexports.MatrixFlipColumnView = MatrixFlipColumnView;\nexports.MatrixFlipRowView = MatrixFlipRowView;\nexports.MatrixRowSelectionView = MatrixRowSelectionView;\nexports.MatrixRowView = MatrixRowView;\nexports.MatrixSelectionView = MatrixSelectionView;\nexports.MatrixSubView = MatrixSubView;\nexports.MatrixTransposeView = MatrixTransposeView;\nexports.NIPALS = nipals;\nexports.Nipals = nipals;\nexports.QR = QrDecomposition;\nexports.QrDecomposition = QrDecomposition;\nexports.SVD = SingularValueDecomposition;\nexports.SingularValueDecomposition = SingularValueDecomposition;\nexports.SymmetricMatrix = SymmetricMatrix;\nexports.WrapperMatrix1D = WrapperMatrix1D;\nexports.WrapperMatrix2D = WrapperMatrix2D;\nexports.correlation = correlation;\nexports.covariance = covariance;\nexports.default = Matrix;\nexports.determinant = determinant;\nexports.inverse = inverse;\nexports.linearDependencies = linearDependencies;\nexports.pseudoInverse = pseudoInverse;\nexports.solve = solve;\nexports.wrap = wrap;\n//# sourceMappingURL=matrix.js.map\n","import * as matrix from './matrix.js';\n\nexport const AbstractMatrix = matrix.AbstractMatrix;\nexport const CHO = matrix.CHO;\nexport const CholeskyDecomposition = matrix.CholeskyDecomposition;\nexport const DistanceMatrix = matrix.DistanceMatrix;\nexport const EVD = matrix.EVD;\nexport const EigenvalueDecomposition = matrix.EigenvalueDecomposition;\nexport const LU = matrix.LU;\nexport const LuDecomposition = matrix.LuDecomposition;\nexport const Matrix = matrix.Matrix;\nexport const MatrixColumnSelectionView = matrix.MatrixColumnSelectionView;\nexport const MatrixColumnView = matrix.MatrixColumnView;\nexport const MatrixFlipColumnView = matrix.MatrixFlipColumnView;\nexport const MatrixFlipRowView = matrix.MatrixFlipRowView;\nexport const MatrixRowSelectionView = matrix.MatrixRowSelectionView;\nexport const MatrixRowView = matrix.MatrixRowView;\nexport const MatrixSelectionView = matrix.MatrixSelectionView;\nexport const MatrixSubView = matrix.MatrixSubView;\nexport const MatrixTransposeView = matrix.MatrixTransposeView;\nexport const NIPALS = matrix.NIPALS;\nexport const Nipals = matrix.Nipals;\nexport const QR = matrix.QR;\nexport const QrDecomposition = matrix.QrDecomposition;\nexport const SVD = matrix.SVD;\nexport const SingularValueDecomposition = matrix.SingularValueDecomposition;\nexport const SymmetricMatrix = matrix.SymmetricMatrix;\nexport const WrapperMatrix1D = matrix.WrapperMatrix1D;\nexport const WrapperMatrix2D = matrix.WrapperMatrix2D;\nexport const correlation = matrix.correlation;\nexport const covariance = matrix.covariance;\nexport default matrix.default.Matrix ? matrix.default.Matrix : matrix.Matrix;\nexport const determinant = matrix.determinant;\nexport const inverse = matrix.inverse;\nexport const linearDependencies = matrix.linearDependencies;\nexport const pseudoInverse = matrix.pseudoInverse;\nexport const solve = matrix.solve;\nexport const wrap = matrix.wrap;\n","import { Matrix } from 'ml-matrix';\n/**\n * Given a vector, returns its norm.\n * @private\n * @param {Matrix} X - the vector.\n * @returns {number} norm of the vector.\n */\nexport function norm(X) {\n    return Math.sqrt(X.clone().apply(pow2array).sum());\n}\n/**\n * Powers by 2 each element of a Matrix or a Vector, used in the apply method of\n * the Matrix object.\n * @private\n * @param {number} i - index i.\n * @param {number} j - index j.\n */\nexport function pow2array(i, j) {\n    // eslint-disable-next-line no-invalid-this -- `this` is the Matrix bound by apply()\n    this.set(i, j, this.get(i, j) ** 2);\n}\n/**\n * Normalizes the dataset and returns the means and standard deviation of each\n * feature.\n * @private\n * @param {Matrix} dataset - the dataset to normalize.\n * @returns {object} dataset normalized, means and standard deviations.\n */\nexport function featureNormalize(dataset) {\n    let means = dataset.mean('column');\n    let std = dataset.standardDeviation('column', {\n        mean: means,\n        unbiased: true,\n    });\n    let result = Matrix.checkMatrix(dataset).subRowVector(means);\n    return { result: result.divRowVector(std), means, std };\n}\n/**\n * Initializes an array of matrices.\n * @private\n * @param {Array} array - the array to initialize.\n * @param {boolean} isMatrix - whether the array holds 2D matrices.\n * @returns {Array} array with the matrices initialized.\n */\nexport function initializeMatrices(array, isMatrix) {\n    if (isMatrix) {\n        for (let i = 0; i < array.length; ++i) {\n            for (let j = 0; j < array[i].length; ++j) {\n                let elem = array[i][j];\n                array[i][j] = elem !== null ? new Matrix(array[i][j]) : undefined;\n            }\n        }\n    }\n    else {\n        for (let i = 0; i < array.length; ++i) {\n            array[i] = new Matrix(array[i]);\n        }\n    }\n    return array;\n}\n//# sourceMappingURL=utils.js.map","import { Matrix } from 'ml-matrix';\nimport * as Utils from './util/utils.js';\n/**\n * @class PLS\n */\nexport class PLS {\n    /**\n     * Constructor for Partial Least Squares (PLS)\n     * @param {object} options - constructor options.\n     * @param {number} [options.latentVectors] - Number of latent vector to get (if the algorithm doesn't find a good model below the tolerance)\n     * @param {number} [options.tolerance=1e-5] - tolerance used to stop the algorithm.\n     * @param {boolean} [options.scale=true] - rescale dataset using mean.\n     * @param {object} model - for load purposes.\n     */\n    constructor(options, model) {\n        if (options === true) {\n            this.meanX = model.meanX;\n            this.stdDevX = model.stdDevX;\n            this.meanY = model.meanY;\n            this.stdDevY = model.stdDevY;\n            this.PBQ = Matrix.checkMatrix(model.PBQ);\n            this.R2X = model.R2X;\n            this.scale = model.scale;\n            this.scaleMethod = model.scaleMethod;\n            this.tolerance = model.tolerance;\n        }\n        else {\n            let { tolerance = 1e-5, scale = true, latentVectors } = options;\n            this.tolerance = tolerance;\n            this.scale = scale;\n            this.latentVectors = latentVectors;\n        }\n    }\n    /**\n     * Fits the model with the given data and predictions, in this function is calculated the\n     * following outputs:\n     *\n     * T - Score matrix of X\n     * P - Loading matrix of X\n     * U - Score matrix of Y\n     * Q - Loading matrix of Y\n     * B - Matrix of regression coefficient\n     * W - Weight matrix of X\n     * @param {Matrix|Array} trainingSet - matrix of features.\n     * @param {Matrix|Array} trainingValues - matrix of predictions.\n     */\n    train(trainingSet, trainingValues) {\n        trainingSet = Matrix.checkMatrix(trainingSet);\n        trainingValues = Matrix.checkMatrix(trainingValues);\n        if (trainingSet.length !== trainingValues.length) {\n            throw new RangeError('The number of X rows must be equal to the number of Y rows');\n        }\n        this.meanX = trainingSet.mean('column');\n        this.stdDevX = trainingSet.standardDeviation('column', {\n            mean: this.meanX,\n            unbiased: true,\n        });\n        this.meanY = trainingValues.mean('column');\n        this.stdDevY = trainingValues.standardDeviation('column', {\n            mean: this.meanY,\n            unbiased: true,\n        });\n        if (this.scale) {\n            trainingSet = trainingSet\n                .clone()\n                .subRowVector(this.meanX)\n                .divRowVector(this.stdDevX);\n            trainingValues = trainingValues\n                .clone()\n                .subRowVector(this.meanY)\n                .divRowVector(this.stdDevY);\n        }\n        if (this.latentVectors === undefined) {\n            this.latentVectors = Math.min(trainingSet.rows - 1, trainingSet.columns);\n        }\n        let rx = trainingSet.rows;\n        let cx = trainingSet.columns;\n        let ry = trainingValues.rows;\n        let cy = trainingValues.columns;\n        let ssqXcal = trainingSet.clone().mul(trainingSet).sum(); // for the r²\n        let sumOfSquaresY = trainingValues.clone().mul(trainingValues).sum();\n        let tolerance = this.tolerance;\n        let n = this.latentVectors;\n        let T = Matrix.zeros(rx, n);\n        let P = Matrix.zeros(cx, n);\n        let U = Matrix.zeros(ry, n);\n        let Q = Matrix.zeros(cy, n);\n        let B = Matrix.zeros(n, n);\n        let W = P.clone();\n        let k = 0;\n        let t;\n        let w;\n        let q;\n        let p;\n        while (Utils.norm(trainingValues) > tolerance && k < n) {\n            let transposeX = trainingSet.transpose();\n            let transposeY = trainingValues.transpose();\n            let tIndex = maxSumColIndex(trainingSet.clone().mul(trainingSet));\n            let uIndex = maxSumColIndex(trainingValues.clone().mul(trainingValues));\n            let t1 = trainingSet.getColumnVector(tIndex);\n            let u = trainingValues.getColumnVector(uIndex);\n            t = Matrix.zeros(rx, 1);\n            while (Utils.norm(t1.clone().sub(t)) > tolerance) {\n                w = transposeX.mmul(u);\n                w.div(Utils.norm(w));\n                t = t1;\n                t1 = trainingSet.mmul(w);\n                q = transposeY.mmul(t1);\n                q.div(Utils.norm(q));\n                u = trainingValues.mmul(q);\n            }\n            t = t1;\n            let num = transposeX.mmul(t);\n            let den = t.transpose().mmul(t).get(0, 0);\n            p = num.div(den);\n            let pnorm = Utils.norm(p);\n            p.div(pnorm);\n            t.mul(pnorm);\n            w.mul(pnorm);\n            num = u.transpose().mmul(t);\n            den = t.transpose().mmul(t).get(0, 0);\n            let b = num.div(den).get(0, 0);\n            trainingSet.sub(t.mmul(p.transpose()));\n            trainingValues.sub(t.clone().mul(b).mmul(q.transpose()));\n            T.setColumn(k, t);\n            P.setColumn(k, p);\n            U.setColumn(k, u);\n            Q.setColumn(k, q);\n            W.setColumn(k, w);\n            B.set(k, k, b);\n            k++;\n        }\n        k--;\n        T = T.subMatrix(0, T.rows - 1, 0, k);\n        P = P.subMatrix(0, P.rows - 1, 0, k);\n        U = U.subMatrix(0, U.rows - 1, 0, k);\n        Q = Q.subMatrix(0, Q.rows - 1, 0, k);\n        W = W.subMatrix(0, W.rows - 1, 0, k);\n        B = B.subMatrix(0, k, 0, k);\n        this.ssqYcal = sumOfSquaresY;\n        this.E = trainingSet;\n        this.F = trainingValues;\n        this.T = T;\n        this.P = P;\n        this.U = U;\n        this.Q = Q;\n        this.W = W;\n        this.B = B;\n        this.PBQ = P.mmul(B).mmul(Q.transpose());\n        this.R2X = t\n            .transpose()\n            .mmul(t)\n            .mmul(p.transpose().mmul(p))\n            .div(ssqXcal)\n            .get(0, 0);\n    }\n    /**\n     * Predicts the behavior of the given dataset.\n     * @param {Matrix|Array} dataset - data to be predicted.\n     * @returns {Matrix} - predictions of each element of the dataset.\n     */\n    predict(dataset) {\n        let X = Matrix.checkMatrix(dataset);\n        if (this.scale) {\n            X = X.subRowVector(this.meanX).divRowVector(this.stdDevX);\n        }\n        let Y = X.mmul(this.PBQ);\n        Y = Y.mulRowVector(this.stdDevY).addRowVector(this.meanY);\n        return Y;\n    }\n    /**\n     * Returns the explained variance on training of the PLS model\n     * @returns {number} the explained variance.\n     */\n    getExplainedVariance() {\n        return this.R2X;\n    }\n    /**\n     * Export the current model to JSON.\n     * @returns {object} - Current model.\n     */\n    toJSON() {\n        return {\n            name: 'PLS',\n            R2X: this.R2X,\n            meanX: this.meanX,\n            stdDevX: this.stdDevX,\n            meanY: this.meanY,\n            stdDevY: this.stdDevY,\n            PBQ: this.PBQ,\n            tolerance: this.tolerance,\n            scale: this.scale,\n        };\n    }\n    /**\n     * Load a PLS model from a JSON Object\n     * @param {object} model - the serialized model to load.\n     * @returns {PLS} - PLS object from the given model\n     */\n    static load(model) {\n        if (model.name !== 'PLS') {\n            throw new RangeError(`Invalid model: ${model.name}`);\n        }\n        return new PLS(true, model);\n    }\n}\n/**\n * Returns the index where the sum of each column vector is maximum.\n * @private\n * @param {Matrix} data - the matrix to scan.\n * @returns {number} index of the maximum.\n */\nfunction maxSumColIndex(data) {\n    return Matrix.rowVector(data.sum('column')).maxIndex()[0];\n}\n//# sourceMappingURL=PLS.js.map","import { Matrix, SingularValueDecomposition, inverse } from 'ml-matrix';\nimport { initializeMatrices } from './util/utils.js';\n/**\n * @class KOPLS\n */\nexport class KOPLS {\n    /**\n     * Constructor for Kernel-based Orthogonal Projections to Latent Structures (K-OPLS)\n     * @param {object} options - constructor options.\n     * @param {number} [options.predictiveComponents] - Number of predictive components to use.\n     * @param {number} [options.orthogonalComponents] - Number of Y-Orthogonal components.\n     * @param {object} [options.kernel] - Kernel object to apply, see [ml-kernel](https://github.com/mljs/kernel).\n     * @param {object} model - for load purposes.\n     */\n    constructor(options, model) {\n        if (options === true) {\n            this.trainingSet = new Matrix(model.trainingSet);\n            this.YLoadingMat = new Matrix(model.YLoadingMat);\n            this.SigmaPow = new Matrix(model.SigmaPow);\n            this.YScoreMat = new Matrix(model.YScoreMat);\n            this.predScoreMat = initializeMatrices(model.predScoreMat, false);\n            this.YOrthLoadingVec = initializeMatrices(model.YOrthLoadingVec, false);\n            this.YOrthEigen = model.YOrthEigen;\n            this.YOrthScoreMat = initializeMatrices(model.YOrthScoreMat, false);\n            this.toNorm = initializeMatrices(model.toNorm, false);\n            this.TURegressionCoeff = initializeMatrices(model.TURegressionCoeff, false);\n            this.kernelX = initializeMatrices(model.kernelX, true);\n            this.kernel = model.kernel;\n            this.orthogonalComp = model.orthogonalComp;\n            this.predictiveComp = model.predictiveComp;\n        }\n        else {\n            if (options.predictiveComponents === undefined) {\n                throw new RangeError('no predictive components found!');\n            }\n            if (options.orthogonalComponents === undefined) {\n                throw new RangeError('no orthogonal components found!');\n            }\n            if (options.kernel === undefined) {\n                throw new RangeError('no kernel found!');\n            }\n            this.orthogonalComp = options.orthogonalComponents;\n            this.predictiveComp = options.predictiveComponents;\n            this.kernel = options.kernel;\n        }\n    }\n    /**\n     * Train the K-OPLS model with the given training set and labels.\n     * @param {Matrix|Array} trainingSet - matrix of features.\n     * @param {Matrix|Array} trainingValues - matrix of labels.\n     */\n    train(trainingSet, trainingValues) {\n        trainingSet = Matrix.checkMatrix(trainingSet);\n        trainingValues = Matrix.checkMatrix(trainingValues);\n        // to save and compute kernel with the prediction dataset.\n        this.trainingSet = trainingSet.clone();\n        let kernelX = this.kernel.compute(trainingSet);\n        let Identity = Matrix.eye(kernelX.rows, kernelX.rows, 1);\n        let temp = kernelX;\n        kernelX = new Array(this.orthogonalComp + 1);\n        for (let i = 0; i < this.orthogonalComp + 1; i++) {\n            kernelX[i] = new Array(this.orthogonalComp + 1);\n        }\n        kernelX[0][0] = temp;\n        let result = new SingularValueDecomposition(trainingValues.transpose().mmul(kernelX[0][0]).mmul(trainingValues), {\n            computeLeftSingularVectors: true,\n            computeRightSingularVectors: false,\n        });\n        let YLoadingMat = result.leftSingularVectors;\n        let Sigma = result.diagonalMatrix;\n        YLoadingMat = YLoadingMat.subMatrix(0, YLoadingMat.rows - 1, 0, this.predictiveComp - 1);\n        Sigma = Sigma.subMatrix(0, this.predictiveComp - 1, 0, this.predictiveComp - 1);\n        let YScoreMat = trainingValues.mmul(YLoadingMat);\n        let predScoreMat = new Array(this.orthogonalComp + 1);\n        let TURegressionCoeff = new Array(this.orthogonalComp + 1);\n        let YOrthScoreMat = new Array(this.orthogonalComp);\n        let YOrthLoadingVec = new Array(this.orthogonalComp);\n        let YOrthEigen = new Array(this.orthogonalComp);\n        let YOrthScoreNorm = new Array(this.orthogonalComp);\n        let SigmaPow = Matrix.pow(Sigma, -0.5);\n        // to avoid errors, check infinity\n        SigmaPow.apply(removeInfinity);\n        for (let i = 0; i < this.orthogonalComp; ++i) {\n            predScoreMat[i] = kernelX[0][i]\n                .transpose()\n                .mmul(YScoreMat)\n                .mmul(SigmaPow);\n            let TpiPrime = predScoreMat[i].transpose();\n            TURegressionCoeff[i] = inverse(TpiPrime.mmul(predScoreMat[i]))\n                .mmul(TpiPrime)\n                .mmul(YScoreMat);\n            result = new SingularValueDecomposition(TpiPrime.mmul(Matrix.sub(kernelX[i][i], predScoreMat[i].mmul(TpiPrime))).mmul(predScoreMat[i]), {\n                computeLeftSingularVectors: true,\n                computeRightSingularVectors: false,\n            });\n            let CoTemp = result.leftSingularVectors;\n            let SoTemp = result.diagonalMatrix;\n            YOrthLoadingVec[i] = CoTemp.subMatrix(0, CoTemp.rows - 1, 0, 0);\n            YOrthEigen[i] = SoTemp.get(0, 0);\n            YOrthScoreMat[i] = Matrix.sub(kernelX[i][i], predScoreMat[i].mmul(TpiPrime))\n                .mmul(predScoreMat[i])\n                .mmul(YOrthLoadingVec[i])\n                .mul(YOrthEigen[i] ** -0.5);\n            let toiPrime = YOrthScoreMat[i].transpose();\n            YOrthScoreNorm[i] = Matrix.sqrt(toiPrime.mmul(YOrthScoreMat[i]));\n            YOrthScoreMat[i] = YOrthScoreMat[i].divRowVector(YOrthScoreNorm[i]);\n            let ITo = Matrix.sub(Identity, YOrthScoreMat[i].mmul(YOrthScoreMat[i].transpose()));\n            kernelX[0][i + 1] = kernelX[0][i].mmul(ITo);\n            kernelX[i + 1][i + 1] = ITo.mmul(kernelX[i][i]).mmul(ITo);\n        }\n        let lastScoreMat = kernelX[0][this.orthogonalComp]\n            .transpose()\n            .mmul(YScoreMat)\n            .mmul(SigmaPow);\n        predScoreMat[this.orthogonalComp] = lastScoreMat.clone();\n        let lastTpPrime = lastScoreMat.transpose();\n        TURegressionCoeff[this.orthogonalComp] = inverse(lastTpPrime.mmul(lastScoreMat))\n            .mmul(lastTpPrime)\n            .mmul(YScoreMat);\n        this.YLoadingMat = YLoadingMat;\n        this.SigmaPow = SigmaPow;\n        this.YScoreMat = YScoreMat;\n        this.predScoreMat = predScoreMat;\n        this.YOrthLoadingVec = YOrthLoadingVec;\n        this.YOrthEigen = YOrthEigen;\n        this.YOrthScoreMat = YOrthScoreMat;\n        this.toNorm = YOrthScoreNorm;\n        this.TURegressionCoeff = TURegressionCoeff;\n        this.kernelX = kernelX;\n    }\n    /**\n     * Predicts the output given the matrix to predict.\n     * @param {Matrix|Array} toPredict - matrix of features to predict.\n     * @returns {{y: Matrix, predScoreMat: Array<Matrix>, predYOrthVectors: Array<Matrix>}} predictions\n     */\n    predict(toPredict) {\n        let KTestTrain = this.kernel.compute(toPredict, this.trainingSet);\n        let temp = KTestTrain;\n        KTestTrain = new Array(this.orthogonalComp + 1);\n        for (let i = 0; i < this.orthogonalComp + 1; i++) {\n            KTestTrain[i] = new Array(this.orthogonalComp + 1);\n        }\n        KTestTrain[0][0] = temp;\n        let YOrthScoreVector = new Array(this.orthogonalComp);\n        let predScoreMat = new Array(this.orthogonalComp);\n        let i;\n        for (i = 0; i < this.orthogonalComp; ++i) {\n            predScoreMat[i] = KTestTrain[i][0]\n                .mmul(this.YScoreMat)\n                .mmul(this.SigmaPow);\n            YOrthScoreVector[i] = Matrix.sub(KTestTrain[i][i], predScoreMat[i].mmul(this.predScoreMat[i].transpose()))\n                .mmul(this.predScoreMat[i])\n                .mmul(this.YOrthLoadingVec[i])\n                .mul(this.YOrthEigen[i] ** -0.5);\n            YOrthScoreVector[i] = YOrthScoreVector[i].divRowVector(this.toNorm[i]);\n            let scoreMatPrime = this.YOrthScoreMat[i].transpose();\n            KTestTrain[i + 1][0] = Matrix.sub(KTestTrain[i][0], YOrthScoreVector[i]\n                .mmul(scoreMatPrime)\n                .mmul(this.kernelX[0][i].transpose()));\n            let p1 = Matrix.sub(KTestTrain[i][0], KTestTrain[i][i].mmul(this.YOrthScoreMat[i]).mmul(scoreMatPrime));\n            let p2 = YOrthScoreVector[i].mmul(scoreMatPrime).mmul(this.kernelX[i][i]);\n            let p3 = p2.mmul(this.YOrthScoreMat[i]).mmul(scoreMatPrime);\n            KTestTrain[i + 1][i + 1] = p1.sub(p2).add(p3);\n        }\n        predScoreMat[i] = KTestTrain[i][0].mmul(this.YScoreMat).mmul(this.SigmaPow);\n        let prediction = predScoreMat[i]\n            .mmul(this.TURegressionCoeff[i])\n            .mmul(this.YLoadingMat.transpose());\n        return {\n            prediction,\n            predScoreMat,\n            predYOrthVectors: YOrthScoreVector,\n        };\n    }\n    /**\n     * Export the current model to JSON.\n     * @returns {object} - Current model.\n     */\n    toJSON() {\n        return {\n            name: 'K-OPLS',\n            YLoadingMat: this.YLoadingMat,\n            SigmaPow: this.SigmaPow,\n            YScoreMat: this.YScoreMat,\n            predScoreMat: this.predScoreMat,\n            YOrthLoadingVec: this.YOrthLoadingVec,\n            YOrthEigen: this.YOrthEigen,\n            YOrthScoreMat: this.YOrthScoreMat,\n            toNorm: this.toNorm,\n            TURegressionCoeff: this.TURegressionCoeff,\n            kernelX: this.kernelX,\n            trainingSet: this.trainingSet,\n            orthogonalComp: this.orthogonalComp,\n            predictiveComp: this.predictiveComp,\n        };\n    }\n    /**\n     * Load a K-OPLS with the given model.\n     * @param {object} model - the serialized model to load.\n     * @param {object} kernel - kernel used on the model, see [ml-kernel](https://github.com/mljs/kernel).\n     * @returns {KOPLS} the loaded K-OPLS model.\n     */\n    static load(model, kernel) {\n        if (model.name !== 'K-OPLS') {\n            throw new RangeError(`Invalid model: ${model.name}`);\n        }\n        if (!kernel) {\n            throw new RangeError('You must provide a kernel for the model!');\n        }\n        model.kernel = kernel;\n        return new KOPLS(true, model);\n    }\n}\n/**\n * Replaces infinite entries with zero. Used as a Matrix.apply() callback.\n * @param {number} i - row index.\n * @param {number} j - column index.\n */\nfunction removeInfinity(i, j) {\n    // eslint-disable-next-line no-invalid-this -- `this` is the Matrix bound by apply()\n    if (this.get(i, j) === Infinity) {\n        // eslint-disable-next-line no-invalid-this -- `this` is the Matrix bound by apply()\n        this.set(i, j, 0);\n    }\n}\n//# sourceMappingURL=KOPLS.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","/**\n * Constructs a confusion matrix\n * @class ConfusionMatrix\n * @example\n * const CM = new ConfusionMatrix([[13, 2], [10, 5]], ['cat', 'dog'])\n * @param matrix - The confusion matrix, a 2D Array. Rows represent the actual label and columns the predicted label.\n * @param labels - Labels of the confusion matrix, a 1D Array\n */\nexport class ConfusionMatrix {\n    constructor(matrix, labels) {\n        if (matrix.length !== matrix[0].length) {\n            throw new Error('Confusion matrix must be square');\n        }\n        if (labels.length !== matrix.length) {\n            throw new Error('Confusion matrix and labels should have the same length');\n        }\n        this.labels = labels;\n        this.matrix = matrix;\n    }\n    /**\n     * Construct confusion matrix from the predicted and actual labels (classes). Be sure to provide the arguments in\n     * the correct order!\n     * @param actual  - The predicted labels of the classification\n     * @param predicted - The actual labels of the classification. Has to be of same length as predicted.\n     * @param [options] - Additional options\n     * @param [options.labels] - The list of labels that should be used. If not provided the distinct set\n     *     of labels present in predicted and actual is used. Labels are compared using the strict equality operator\n     *     '==='\n     * @param [options.sort]\n     * @return Confusion matrix\n     */\n    static fromLabels(actual, predicted, options = {}) {\n        if (predicted.length !== actual.length) {\n            throw new Error('predicted and actual must have the same length');\n        }\n        let distinctLabels;\n        if (options.labels) {\n            distinctLabels = new Set(options.labels);\n        }\n        else {\n            distinctLabels = new Set([...actual, ...predicted]);\n        }\n        const labels = Array.from(distinctLabels);\n        if (options.sort) {\n            labels.sort(options.sort);\n        }\n        // Create confusion matrix and fill with 0's\n        const matrix = Array.from({ length: labels.length });\n        for (let i = 0; i < matrix.length; i++) {\n            matrix[i] = new Array(matrix.length);\n            matrix[i].fill(0);\n        }\n        for (let i = 0; i < predicted.length; i++) {\n            const actualIdx = labels.indexOf(actual[i]);\n            const predictedIdx = labels.indexOf(predicted[i]);\n            if (actualIdx >= 0 && predictedIdx >= 0) {\n                matrix[actualIdx][predictedIdx]++;\n            }\n        }\n        return new ConfusionMatrix(matrix, labels);\n    }\n    /**\n     * Get the confusion matrix\n     */\n    getMatrix() {\n        return this.matrix;\n    }\n    getLabels() {\n        return this.labels;\n    }\n    /**\n     * Get the total number of samples\n     */\n    getTotalCount() {\n        let predicted = 0;\n        for (const row of this.matrix) {\n            for (const element of row) {\n                predicted += element;\n            }\n        }\n        return predicted;\n    }\n    /**\n     * Get the total number of true predictions\n     */\n    getTrueCount() {\n        let count = 0;\n        for (let i = 0; i < this.matrix.length; i++) {\n            count += this.matrix[i][i];\n        }\n        return count;\n    }\n    /**\n     * Get the total number of false predictions.\n     */\n    getFalseCount() {\n        return this.getTotalCount() - this.getTrueCount();\n    }\n    /**\n     * Get the number of true positive predictions.\n     * @param label - The label that should be considered \"positive\"\n     */\n    getTruePositiveCount(label) {\n        const index = this.getIndex(label);\n        return this.matrix[index][index];\n    }\n    /**\n     * Get the number of true negative predictions.\n     * @param label - The label that should be considered \"positive\"\n     */\n    getTrueNegativeCount(label) {\n        const index = this.getIndex(label);\n        let count = 0;\n        for (let i = 0; i < this.matrix.length; i++) {\n            for (let j = 0; j < this.matrix.length; j++) {\n                if (i !== index && j !== index) {\n                    count += this.matrix[i][j];\n                }\n            }\n        }\n        return count;\n    }\n    /**\n     * Get the number of false positive predictions.\n     * @param label - The label that should be considered \"positive\"\n     */\n    getFalsePositiveCount(label) {\n        const index = this.getIndex(label);\n        let count = 0;\n        for (let i = 0; i < this.matrix.length; i++) {\n            if (i !== index) {\n                count += this.matrix[i][index];\n            }\n        }\n        return count;\n    }\n    /**\n     * Get the number of false negative predictions.\n     * @param label - The label that should be considered \"positive\"\n     */\n    getFalseNegativeCount(label) {\n        const index = this.getIndex(label);\n        let count = 0;\n        for (let i = 0; i < this.matrix.length; i++) {\n            if (i !== index) {\n                count += this.matrix[index][i];\n            }\n        }\n        return count;\n    }\n    /**\n     * Get the number of real positive samples.\n     * @param label - The label that should be considered \"positive\"\n     */\n    getPositiveCount(label) {\n        return this.getTruePositiveCount(label) + this.getFalseNegativeCount(label);\n    }\n    /**\n     * Get the number of real negative samples.\n     * @param  label - The label that should be considered \"positive\"\n     */\n    getNegativeCount(label) {\n        return this.getTrueNegativeCount(label) + this.getFalsePositiveCount(label);\n    }\n    /**\n     * Get the index in the confusion matrix that corresponds to the given label\n     * @param label - The label to search for\n     * @throws if the label is not found\n     */\n    getIndex(label) {\n        const index = this.labels.indexOf(label);\n        if (index === -1)\n            throw new Error('The label does not exist');\n        return index;\n    }\n    /**\n     * Get the true positive rate a.k.a. sensitivity. Computes the ratio between the number of true positive predictions and the total number of positive samples.\n     * {@link https://en.wikipedia.org/wiki/Sensitivity_and_specificity}\n     * @param label - The label that should be considered \"positive\"\n     * @return The true positive rate [0-1]\n     */\n    getTruePositiveRate(label) {\n        return this.getTruePositiveCount(label) / this.getPositiveCount(label);\n    }\n    /**\n     * Get the true negative rate a.k.a. specificity. Computes the ration between the number of true negative predictions and the total number of negative samples.\n     * {@link https://en.wikipedia.org/wiki/Sensitivity_and_specificity}\n     * @param label - The label that should be considered \"positive\"\n     * @return The true negative rate a.k.a. specificity.\n     */\n    getTrueNegativeRate(label) {\n        return this.getTrueNegativeCount(label) / this.getNegativeCount(label);\n    }\n    /**\n     * Get the positive predictive value a.k.a. precision. Computes TP / (TP + FP)\n     * {@link https://en.wikipedia.org/wiki/Positive_and_negative_predictive_values}\n     * @param label - The label that should be considered \"positive\"\n     * @return the positive predictive value a.k.a. precision.\n     */\n    getPositivePredictiveValue(label) {\n        const TP = this.getTruePositiveCount(label);\n        return TP / (TP + this.getFalsePositiveCount(label));\n    }\n    /**\n     * Negative predictive value\n     * {@link https://en.wikipedia.org/wiki/Positive_and_negative_predictive_values}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getNegativePredictiveValue(label) {\n        const TN = this.getTrueNegativeCount(label);\n        return TN / (TN + this.getFalseNegativeCount(label));\n    }\n    /**\n     * False negative rate a.k.a. miss rate.\n     * {@link https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#False_positive_and_false_negative_rates}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getFalseNegativeRate(label) {\n        return 1 - this.getTruePositiveRate(label);\n    }\n    /**\n     * False positive rate a.k.a. fall-out rate.\n     * {@link https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#False_positive_and_false_negative_rates}\n     * @param  label - The label that should be considered \"positive\"\n     */\n    getFalsePositiveRate(label) {\n        return 1 - this.getTrueNegativeRate(label);\n    }\n    /**\n     * False discovery rate (FDR)\n     * {@link https://en.wikipedia.org/wiki/False_discovery_rate}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getFalseDiscoveryRate(label) {\n        const FP = this.getFalsePositiveCount(label);\n        return FP / (FP + this.getTruePositiveCount(label));\n    }\n    /**\n     * False omission rate (FOR)\n     * @param label - The label that should be considered \"positive\"\n     */\n    getFalseOmissionRate(label) {\n        const FN = this.getFalseNegativeCount(label);\n        return FN / (FN + this.getTruePositiveCount(label));\n    }\n    /**\n     * F1 score\n     * {@link https://en.wikipedia.org/wiki/F1_score}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getF1Score(label) {\n        const TP = this.getTruePositiveCount(label);\n        return ((2 * TP) /\n            (2 * TP +\n                this.getFalsePositiveCount(label) +\n                this.getFalseNegativeCount(label)));\n    }\n    /**\n     * Matthews correlation coefficient (MCC)\n     * {@link https://en.wikipedia.org/wiki/Matthews_correlation_coefficient}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getMatthewsCorrelationCoefficient(label) {\n        const TP = this.getTruePositiveCount(label);\n        const TN = this.getTrueNegativeCount(label);\n        const FP = this.getFalsePositiveCount(label);\n        const FN = this.getFalseNegativeCount(label);\n        return ((TP * TN - FP * FN) /\n            Math.sqrt((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN)));\n    }\n    /**\n     * Informedness\n     * {@link https://en.wikipedia.org/wiki/Youden%27s_J_statistic}\n     * @param label - The label that should be considered \"positive\"\n     */\n    getInformedness(label) {\n        return (this.getTruePositiveRate(label) + this.getTrueNegativeRate(label) - 1);\n    }\n    /**\n     * Markedness\n     * @param label - The label that should be considered \"positive\"\n     */\n    getMarkedness(label) {\n        return (this.getPositivePredictiveValue(label) +\n            this.getNegativePredictiveValue(label) -\n            1);\n    }\n    /**\n     * Get the confusion table.\n     * @param label - The label that should be considered \"positive\"\n     * @return The 2x2 confusion table. [[TP, FN], [FP, TN]]\n     */\n    getConfusionTable(label) {\n        return [\n            [this.getTruePositiveCount(label), this.getFalseNegativeCount(label)],\n            [this.getFalsePositiveCount(label), this.getTrueNegativeCount(label)],\n        ];\n    }\n    /**\n     * Get total accuracy.\n     * The ratio between the number of true predictions and total number of classifications ([0-1])\n     */\n    getAccuracy() {\n        let correct = 0;\n        let incorrect = 0;\n        for (let i = 0; i < this.matrix.length; i++) {\n            for (let j = 0; j < this.matrix.length; j++) {\n                if (i === j)\n                    correct += this.matrix[i][j];\n                else\n                    incorrect += this.matrix[i][j];\n            }\n        }\n        return correct / (correct + incorrect);\n    }\n    /**\n     * Returns the element in the confusion matrix that corresponds to the given actual and predicted labels.\n     * @param actual - The true label\n     * @param predicted - The predicted label\n     * @return The element in the confusion matrix\n     */\n    getCount(actual, predicted) {\n        const actualIndex = this.getIndex(actual);\n        const predictedIndex = this.getIndex(predicted);\n        return this.matrix[actualIndex][predictedIndex];\n    }\n    /**\n     * Compute the general prediction accuracy\n     * @deprecated Use getAccuracy\n     * @return The prediction accuracy ([0-1]\n     */\n    get accuracy() {\n        return this.getAccuracy();\n    }\n    /**\n     * Compute the number of predicted observations\n     * @deprecated Use getTotalCount\n     */\n    get total() {\n        return this.getTotalCount();\n    }\n}\n//# sourceMappingURL=index.js.map","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(factory());\n}(this, (function () { 'use strict';\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar runtime = createCommonjsModule(function (module) {\n\t/**\n\t * Copyright (c) 2014-present, Facebook, Inc.\n\t *\n\t * This source code is licensed under the MIT license found in the\n\t * LICENSE file in the root directory of this source tree.\n\t */\n\n\t!(function(global) {\n\n\t  var Op = Object.prototype;\n\t  var hasOwn = Op.hasOwnProperty;\n\t  var undefined; // More compressible than void 0.\n\t  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n\t  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n\t  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n\t  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\t  var runtime = global.regeneratorRuntime;\n\t  if (runtime) {\n\t    {\n\t      // If regeneratorRuntime is defined globally and we're in a module,\n\t      // make the exports object identical to regeneratorRuntime.\n\t      module.exports = runtime;\n\t    }\n\t    // Don't bother evaluating the rest of this file if the runtime was\n\t    // already defined globally.\n\t    return;\n\t  }\n\n\t  // Define the runtime globally (as expected by generated code) as either\n\t  // module.exports (if we're in a module) or a new, empty object.\n\t  runtime = global.regeneratorRuntime = module.exports;\n\n\t  function wrap(innerFn, outerFn, self, tryLocsList) {\n\t    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n\t    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n\t    var generator = Object.create(protoGenerator.prototype);\n\t    var context = new Context(tryLocsList || []);\n\n\t    // The ._invoke method unifies the implementations of the .next,\n\t    // .throw, and .return methods.\n\t    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n\t    return generator;\n\t  }\n\t  runtime.wrap = wrap;\n\n\t  // Try/catch helper to minimize deoptimizations. Returns a completion\n\t  // record like context.tryEntries[i].completion. This interface could\n\t  // have been (and was previously) designed to take a closure to be\n\t  // invoked without arguments, but in all the cases we care about we\n\t  // already have an existing method we want to call, so there's no need\n\t  // to create a new function object. We can even get away with assuming\n\t  // the method takes exactly one argument, since that happens to be true\n\t  // in every case, so we don't have to touch the arguments object. The\n\t  // only additional allocation required is the completion record, which\n\t  // has a stable shape and so hopefully should be cheap to allocate.\n\t  function tryCatch(fn, obj, arg) {\n\t    try {\n\t      return { type: \"normal\", arg: fn.call(obj, arg) };\n\t    } catch (err) {\n\t      return { type: \"throw\", arg: err };\n\t    }\n\t  }\n\n\t  var GenStateSuspendedStart = \"suspendedStart\";\n\t  var GenStateSuspendedYield = \"suspendedYield\";\n\t  var GenStateExecuting = \"executing\";\n\t  var GenStateCompleted = \"completed\";\n\n\t  // Returning this object from the innerFn has the same effect as\n\t  // breaking out of the dispatch switch statement.\n\t  var ContinueSentinel = {};\n\n\t  // Dummy constructor functions that we use as the .constructor and\n\t  // .constructor.prototype properties for functions that return Generator\n\t  // objects. For full spec compliance, you may wish to configure your\n\t  // minifier not to mangle the names of these two functions.\n\t  function Generator() {}\n\t  function GeneratorFunction() {}\n\t  function GeneratorFunctionPrototype() {}\n\n\t  // This is a polyfill for %IteratorPrototype% for environments that\n\t  // don't natively support it.\n\t  var IteratorPrototype = {};\n\t  IteratorPrototype[iteratorSymbol] = function () {\n\t    return this;\n\t  };\n\n\t  var getProto = Object.getPrototypeOf;\n\t  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\t  if (NativeIteratorPrototype &&\n\t      NativeIteratorPrototype !== Op &&\n\t      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n\t    // This environment has a native %IteratorPrototype%; use it instead\n\t    // of the polyfill.\n\t    IteratorPrototype = NativeIteratorPrototype;\n\t  }\n\n\t  var Gp = GeneratorFunctionPrototype.prototype =\n\t    Generator.prototype = Object.create(IteratorPrototype);\n\t  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n\t  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n\t  GeneratorFunctionPrototype[toStringTagSymbol] =\n\t    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n\t  // Helper for defining the .next, .throw, and .return methods of the\n\t  // Iterator interface in terms of a single ._invoke method.\n\t  function defineIteratorMethods(prototype) {\n\t    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n\t      prototype[method] = function(arg) {\n\t        return this._invoke(method, arg);\n\t      };\n\t    });\n\t  }\n\n\t  runtime.isGeneratorFunction = function(genFun) {\n\t    var ctor = typeof genFun === \"function\" && genFun.constructor;\n\t    return ctor\n\t      ? ctor === GeneratorFunction ||\n\t        // For the native GeneratorFunction constructor, the best we can\n\t        // do is to check its .name property.\n\t        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n\t      : false;\n\t  };\n\n\t  runtime.mark = function(genFun) {\n\t    if (Object.setPrototypeOf) {\n\t      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n\t    } else {\n\t      genFun.__proto__ = GeneratorFunctionPrototype;\n\t      if (!(toStringTagSymbol in genFun)) {\n\t        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n\t      }\n\t    }\n\t    genFun.prototype = Object.create(Gp);\n\t    return genFun;\n\t  };\n\n\t  // Within the body of any async function, `await x` is transformed to\n\t  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n\t  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n\t  // meant to be awaited.\n\t  runtime.awrap = function(arg) {\n\t    return { __await: arg };\n\t  };\n\n\t  function AsyncIterator(generator) {\n\t    function invoke(method, arg, resolve, reject) {\n\t      var record = tryCatch(generator[method], generator, arg);\n\t      if (record.type === \"throw\") {\n\t        reject(record.arg);\n\t      } else {\n\t        var result = record.arg;\n\t        var value = result.value;\n\t        if (value &&\n\t            typeof value === \"object\" &&\n\t            hasOwn.call(value, \"__await\")) {\n\t          return Promise.resolve(value.__await).then(function(value) {\n\t            invoke(\"next\", value, resolve, reject);\n\t          }, function(err) {\n\t            invoke(\"throw\", err, resolve, reject);\n\t          });\n\t        }\n\n\t        return Promise.resolve(value).then(function(unwrapped) {\n\t          // When a yielded Promise is resolved, its final value becomes\n\t          // the .value of the Promise<{value,done}> result for the\n\t          // current iteration. If the Promise is rejected, however, the\n\t          // result for this iteration will be rejected with the same\n\t          // reason. Note that rejections of yielded Promises are not\n\t          // thrown back into the generator function, as is the case\n\t          // when an awaited Promise is rejected. This difference in\n\t          // behavior between yield and await is important, because it\n\t          // allows the consumer to decide what to do with the yielded\n\t          // rejection (swallow it and continue, manually .throw it back\n\t          // into the generator, abandon iteration, whatever). With\n\t          // await, by contrast, there is no opportunity to examine the\n\t          // rejection reason outside the generator function, so the\n\t          // only option is to throw it from the await expression, and\n\t          // let the generator function handle the exception.\n\t          result.value = unwrapped;\n\t          resolve(result);\n\t        }, reject);\n\t      }\n\t    }\n\n\t    var previousPromise;\n\n\t    function enqueue(method, arg) {\n\t      function callInvokeWithMethodAndArg() {\n\t        return new Promise(function(resolve, reject) {\n\t          invoke(method, arg, resolve, reject);\n\t        });\n\t      }\n\n\t      return previousPromise =\n\t        // If enqueue has been called before, then we want to wait until\n\t        // all previous Promises have been resolved before calling invoke,\n\t        // so that results are always delivered in the correct order. If\n\t        // enqueue has not been called before, then it is important to\n\t        // call invoke immediately, without waiting on a callback to fire,\n\t        // so that the async generator function has the opportunity to do\n\t        // any necessary setup in a predictable way. This predictability\n\t        // is why the Promise constructor synchronously invokes its\n\t        // executor callback, and why async functions synchronously\n\t        // execute code before the first await. Since we implement simple\n\t        // async functions in terms of async generators, it is especially\n\t        // important to get this right, even though it requires care.\n\t        previousPromise ? previousPromise.then(\n\t          callInvokeWithMethodAndArg,\n\t          // Avoid propagating failures to Promises returned by later\n\t          // invocations of the iterator.\n\t          callInvokeWithMethodAndArg\n\t        ) : callInvokeWithMethodAndArg();\n\t    }\n\n\t    // Define the unified helper method that is used to implement .next,\n\t    // .throw, and .return (see defineIteratorMethods).\n\t    this._invoke = enqueue;\n\t  }\n\n\t  defineIteratorMethods(AsyncIterator.prototype);\n\t  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n\t    return this;\n\t  };\n\t  runtime.AsyncIterator = AsyncIterator;\n\n\t  // Note that simple async functions are implemented on top of\n\t  // AsyncIterator objects; they just return a Promise for the value of\n\t  // the final result produced by the iterator.\n\t  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n\t    var iter = new AsyncIterator(\n\t      wrap(innerFn, outerFn, self, tryLocsList)\n\t    );\n\n\t    return runtime.isGeneratorFunction(outerFn)\n\t      ? iter // If outerFn is a generator, return the full iterator.\n\t      : iter.next().then(function(result) {\n\t          return result.done ? result.value : iter.next();\n\t        });\n\t  };\n\n\t  function makeInvokeMethod(innerFn, self, context) {\n\t    var state = GenStateSuspendedStart;\n\n\t    return function invoke(method, arg) {\n\t      if (state === GenStateExecuting) {\n\t        throw new Error(\"Generator is already running\");\n\t      }\n\n\t      if (state === GenStateCompleted) {\n\t        if (method === \"throw\") {\n\t          throw arg;\n\t        }\n\n\t        // Be forgiving, per 25.3.3.3.3 of the spec:\n\t        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\t        return doneResult();\n\t      }\n\n\t      context.method = method;\n\t      context.arg = arg;\n\n\t      while (true) {\n\t        var delegate = context.delegate;\n\t        if (delegate) {\n\t          var delegateResult = maybeInvokeDelegate(delegate, context);\n\t          if (delegateResult) {\n\t            if (delegateResult === ContinueSentinel) continue;\n\t            return delegateResult;\n\t          }\n\t        }\n\n\t        if (context.method === \"next\") {\n\t          // Setting context._sent for legacy support of Babel's\n\t          // function.sent implementation.\n\t          context.sent = context._sent = context.arg;\n\n\t        } else if (context.method === \"throw\") {\n\t          if (state === GenStateSuspendedStart) {\n\t            state = GenStateCompleted;\n\t            throw context.arg;\n\t          }\n\n\t          context.dispatchException(context.arg);\n\n\t        } else if (context.method === \"return\") {\n\t          context.abrupt(\"return\", context.arg);\n\t        }\n\n\t        state = GenStateExecuting;\n\n\t        var record = tryCatch(innerFn, self, context);\n\t        if (record.type === \"normal\") {\n\t          // If an exception is thrown from innerFn, we leave state ===\n\t          // GenStateExecuting and loop back for another invocation.\n\t          state = context.done\n\t            ? GenStateCompleted\n\t            : GenStateSuspendedYield;\n\n\t          if (record.arg === ContinueSentinel) {\n\t            continue;\n\t          }\n\n\t          return {\n\t            value: record.arg,\n\t            done: context.done\n\t          };\n\n\t        } else if (record.type === \"throw\") {\n\t          state = GenStateCompleted;\n\t          // Dispatch the exception by looping back around to the\n\t          // context.dispatchException(context.arg) call above.\n\t          context.method = \"throw\";\n\t          context.arg = record.arg;\n\t        }\n\t      }\n\t    };\n\t  }\n\n\t  // Call delegate.iterator[context.method](context.arg) and handle the\n\t  // result, either by returning a { value, done } result from the\n\t  // delegate iterator, or by modifying context.method and context.arg,\n\t  // setting context.delegate to null, and returning the ContinueSentinel.\n\t  function maybeInvokeDelegate(delegate, context) {\n\t    var method = delegate.iterator[context.method];\n\t    if (method === undefined) {\n\t      // A .throw or .return when the delegate iterator has no .throw\n\t      // method always terminates the yield* loop.\n\t      context.delegate = null;\n\n\t      if (context.method === \"throw\") {\n\t        if (delegate.iterator.return) {\n\t          // If the delegate iterator has a return method, give it a\n\t          // chance to clean up.\n\t          context.method = \"return\";\n\t          context.arg = undefined;\n\t          maybeInvokeDelegate(delegate, context);\n\n\t          if (context.method === \"throw\") {\n\t            // If maybeInvokeDelegate(context) changed context.method from\n\t            // \"return\" to \"throw\", let that override the TypeError below.\n\t            return ContinueSentinel;\n\t          }\n\t        }\n\n\t        context.method = \"throw\";\n\t        context.arg = new TypeError(\n\t          \"The iterator does not provide a 'throw' method\");\n\t      }\n\n\t      return ContinueSentinel;\n\t    }\n\n\t    var record = tryCatch(method, delegate.iterator, context.arg);\n\n\t    if (record.type === \"throw\") {\n\t      context.method = \"throw\";\n\t      context.arg = record.arg;\n\t      context.delegate = null;\n\t      return ContinueSentinel;\n\t    }\n\n\t    var info = record.arg;\n\n\t    if (! info) {\n\t      context.method = \"throw\";\n\t      context.arg = new TypeError(\"iterator result is not an object\");\n\t      context.delegate = null;\n\t      return ContinueSentinel;\n\t    }\n\n\t    if (info.done) {\n\t      // Assign the result of the finished delegate to the temporary\n\t      // variable specified by delegate.resultName (see delegateYield).\n\t      context[delegate.resultName] = info.value;\n\n\t      // Resume execution at the desired location (see delegateYield).\n\t      context.next = delegate.nextLoc;\n\n\t      // If context.method was \"throw\" but the delegate handled the\n\t      // exception, let the outer generator proceed normally. If\n\t      // context.method was \"next\", forget context.arg since it has been\n\t      // \"consumed\" by the delegate iterator. If context.method was\n\t      // \"return\", allow the original .return call to continue in the\n\t      // outer generator.\n\t      if (context.method !== \"return\") {\n\t        context.method = \"next\";\n\t        context.arg = undefined;\n\t      }\n\n\t    } else {\n\t      // Re-yield the result returned by the delegate method.\n\t      return info;\n\t    }\n\n\t    // The delegate iterator is finished, so forget it and continue with\n\t    // the outer generator.\n\t    context.delegate = null;\n\t    return ContinueSentinel;\n\t  }\n\n\t  // Define Generator.prototype.{next,throw,return} in terms of the\n\t  // unified ._invoke helper method.\n\t  defineIteratorMethods(Gp);\n\n\t  Gp[toStringTagSymbol] = \"Generator\";\n\n\t  // A Generator should always return itself as the iterator object when the\n\t  // @@iterator function is called on it. Some browsers' implementations of the\n\t  // iterator prototype chain incorrectly implement this, causing the Generator\n\t  // object to not be returned from this call. This ensures that doesn't happen.\n\t  // See https://github.com/facebook/regenerator/issues/274 for more details.\n\t  Gp[iteratorSymbol] = function() {\n\t    return this;\n\t  };\n\n\t  Gp.toString = function() {\n\t    return \"[object Generator]\";\n\t  };\n\n\t  function pushTryEntry(locs) {\n\t    var entry = { tryLoc: locs[0] };\n\n\t    if (1 in locs) {\n\t      entry.catchLoc = locs[1];\n\t    }\n\n\t    if (2 in locs) {\n\t      entry.finallyLoc = locs[2];\n\t      entry.afterLoc = locs[3];\n\t    }\n\n\t    this.tryEntries.push(entry);\n\t  }\n\n\t  function resetTryEntry(entry) {\n\t    var record = entry.completion || {};\n\t    record.type = \"normal\";\n\t    delete record.arg;\n\t    entry.completion = record;\n\t  }\n\n\t  function Context(tryLocsList) {\n\t    // The root entry object (effectively a try statement without a catch\n\t    // or a finally block) gives us a place to store values thrown from\n\t    // locations where there is no enclosing try statement.\n\t    this.tryEntries = [{ tryLoc: \"root\" }];\n\t    tryLocsList.forEach(pushTryEntry, this);\n\t    this.reset(true);\n\t  }\n\n\t  runtime.keys = function(object) {\n\t    var keys = [];\n\t    for (var key in object) {\n\t      keys.push(key);\n\t    }\n\t    keys.reverse();\n\n\t    // Rather than returning an object with a next method, we keep\n\t    // things simple and return the next function itself.\n\t    return function next() {\n\t      while (keys.length) {\n\t        var key = keys.pop();\n\t        if (key in object) {\n\t          next.value = key;\n\t          next.done = false;\n\t          return next;\n\t        }\n\t      }\n\n\t      // To avoid creating an additional object, we just hang the .value\n\t      // and .done properties off the next function object itself. This\n\t      // also ensures that the minifier will not anonymize the function.\n\t      next.done = true;\n\t      return next;\n\t    };\n\t  };\n\n\t  function values(iterable) {\n\t    if (iterable) {\n\t      var iteratorMethod = iterable[iteratorSymbol];\n\t      if (iteratorMethod) {\n\t        return iteratorMethod.call(iterable);\n\t      }\n\n\t      if (typeof iterable.next === \"function\") {\n\t        return iterable;\n\t      }\n\n\t      if (!isNaN(iterable.length)) {\n\t        var i = -1, next = function next() {\n\t          while (++i < iterable.length) {\n\t            if (hasOwn.call(iterable, i)) {\n\t              next.value = iterable[i];\n\t              next.done = false;\n\t              return next;\n\t            }\n\t          }\n\n\t          next.value = undefined;\n\t          next.done = true;\n\n\t          return next;\n\t        };\n\n\t        return next.next = next;\n\t      }\n\t    }\n\n\t    // Return an iterator with no values.\n\t    return { next: doneResult };\n\t  }\n\t  runtime.values = values;\n\n\t  function doneResult() {\n\t    return { value: undefined, done: true };\n\t  }\n\n\t  Context.prototype = {\n\t    constructor: Context,\n\n\t    reset: function(skipTempReset) {\n\t      this.prev = 0;\n\t      this.next = 0;\n\t      // Resetting context._sent for legacy support of Babel's\n\t      // function.sent implementation.\n\t      this.sent = this._sent = undefined;\n\t      this.done = false;\n\t      this.delegate = null;\n\n\t      this.method = \"next\";\n\t      this.arg = undefined;\n\n\t      this.tryEntries.forEach(resetTryEntry);\n\n\t      if (!skipTempReset) {\n\t        for (var name in this) {\n\t          // Not sure about the optimal order of these conditions:\n\t          if (name.charAt(0) === \"t\" &&\n\t              hasOwn.call(this, name) &&\n\t              !isNaN(+name.slice(1))) {\n\t            this[name] = undefined;\n\t          }\n\t        }\n\t      }\n\t    },\n\n\t    stop: function() {\n\t      this.done = true;\n\n\t      var rootEntry = this.tryEntries[0];\n\t      var rootRecord = rootEntry.completion;\n\t      if (rootRecord.type === \"throw\") {\n\t        throw rootRecord.arg;\n\t      }\n\n\t      return this.rval;\n\t    },\n\n\t    dispatchException: function(exception) {\n\t      if (this.done) {\n\t        throw exception;\n\t      }\n\n\t      var context = this;\n\t      function handle(loc, caught) {\n\t        record.type = \"throw\";\n\t        record.arg = exception;\n\t        context.next = loc;\n\n\t        if (caught) {\n\t          // If the dispatched exception was caught by a catch block,\n\t          // then let that catch block handle the exception normally.\n\t          context.method = \"next\";\n\t          context.arg = undefined;\n\t        }\n\n\t        return !! caught;\n\t      }\n\n\t      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t        var entry = this.tryEntries[i];\n\t        var record = entry.completion;\n\n\t        if (entry.tryLoc === \"root\") {\n\t          // Exception thrown outside of any try block that could handle\n\t          // it, so set the completion value of the entire function to\n\t          // throw the exception.\n\t          return handle(\"end\");\n\t        }\n\n\t        if (entry.tryLoc <= this.prev) {\n\t          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n\t          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n\t          if (hasCatch && hasFinally) {\n\t            if (this.prev < entry.catchLoc) {\n\t              return handle(entry.catchLoc, true);\n\t            } else if (this.prev < entry.finallyLoc) {\n\t              return handle(entry.finallyLoc);\n\t            }\n\n\t          } else if (hasCatch) {\n\t            if (this.prev < entry.catchLoc) {\n\t              return handle(entry.catchLoc, true);\n\t            }\n\n\t          } else if (hasFinally) {\n\t            if (this.prev < entry.finallyLoc) {\n\t              return handle(entry.finallyLoc);\n\t            }\n\n\t          } else {\n\t            throw new Error(\"try statement without catch or finally\");\n\t          }\n\t        }\n\t      }\n\t    },\n\n\t    abrupt: function(type, arg) {\n\t      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t        var entry = this.tryEntries[i];\n\t        if (entry.tryLoc <= this.prev &&\n\t            hasOwn.call(entry, \"finallyLoc\") &&\n\t            this.prev < entry.finallyLoc) {\n\t          var finallyEntry = entry;\n\t          break;\n\t        }\n\t      }\n\n\t      if (finallyEntry &&\n\t          (type === \"break\" ||\n\t           type === \"continue\") &&\n\t          finallyEntry.tryLoc <= arg &&\n\t          arg <= finallyEntry.finallyLoc) {\n\t        // Ignore the finally entry if control is not jumping to a\n\t        // location outside the try/catch block.\n\t        finallyEntry = null;\n\t      }\n\n\t      var record = finallyEntry ? finallyEntry.completion : {};\n\t      record.type = type;\n\t      record.arg = arg;\n\n\t      if (finallyEntry) {\n\t        this.method = \"next\";\n\t        this.next = finallyEntry.finallyLoc;\n\t        return ContinueSentinel;\n\t      }\n\n\t      return this.complete(record);\n\t    },\n\n\t    complete: function(record, afterLoc) {\n\t      if (record.type === \"throw\") {\n\t        throw record.arg;\n\t      }\n\n\t      if (record.type === \"break\" ||\n\t          record.type === \"continue\") {\n\t        this.next = record.arg;\n\t      } else if (record.type === \"return\") {\n\t        this.rval = this.arg = record.arg;\n\t        this.method = \"return\";\n\t        this.next = \"end\";\n\t      } else if (record.type === \"normal\" && afterLoc) {\n\t        this.next = afterLoc;\n\t      }\n\n\t      return ContinueSentinel;\n\t    },\n\n\t    finish: function(finallyLoc) {\n\t      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t        var entry = this.tryEntries[i];\n\t        if (entry.finallyLoc === finallyLoc) {\n\t          this.complete(entry.completion, entry.afterLoc);\n\t          resetTryEntry(entry);\n\t          return ContinueSentinel;\n\t        }\n\t      }\n\t    },\n\n\t    \"catch\": function(tryLoc) {\n\t      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t        var entry = this.tryEntries[i];\n\t        if (entry.tryLoc === tryLoc) {\n\t          var record = entry.completion;\n\t          if (record.type === \"throw\") {\n\t            var thrown = record.arg;\n\t            resetTryEntry(entry);\n\t          }\n\t          return thrown;\n\t        }\n\t      }\n\n\t      // The context.catch method must only be called with a location\n\t      // argument that corresponds to a known catch block.\n\t      throw new Error(\"illegal catch attempt\");\n\t    },\n\n\t    delegateYield: function(iterable, resultName, nextLoc) {\n\t      this.delegate = {\n\t        iterator: values(iterable),\n\t        resultName: resultName,\n\t        nextLoc: nextLoc\n\t      };\n\n\t      if (this.method === \"next\") {\n\t        // Deliberately forget the last sent value so that we don't\n\t        // accidentally pass it on to the delegate.\n\t        this.arg = undefined;\n\t      }\n\n\t      return ContinueSentinel;\n\t    }\n\t  };\n\t})(\n\t  // In sloppy mode, unbound `this` refers to the global object, fallback to\n\t  // Function constructor if we're in global strict mode. That is sadly a form\n\t  // of indirect eval which violates Content Security Policy.\n\t  (function() { return this })() || Function(\"return this\")()\n\t);\n\t});\n\n\t/**\n\t * Copyright (c) 2014-present, Facebook, Inc.\n\t *\n\t * This source code is licensed under the MIT license found in the\n\t * LICENSE file in the root directory of this source tree.\n\t */\n\n\t// This method of obtaining a reference to the global object needs to be\n\t// kept identical to the way it is obtained in runtime.js\n\tvar g = (function() { return this })() || Function(\"return this\")();\n\n\t// Use `getOwnPropertyNames` because not all browsers support calling\n\t// `hasOwnProperty` on the global `self` object in a worker. See #183.\n\tvar hadRuntime = g.regeneratorRuntime &&\n\t  Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n\t// Save the old regeneratorRuntime in case it needs to be restored later.\n\tvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n\t// Force reevalutation of runtime.js.\n\tg.regeneratorRuntime = undefined;\n\n\tvar runtimeModule = runtime;\n\n\tif (hadRuntime) {\n\t  // Restore the original runtime.\n\t  g.regeneratorRuntime = oldRuntime;\n\t} else {\n\t  // Remove the global property added by runtime.js.\n\t  try {\n\t    delete g.regeneratorRuntime;\n\t  } catch(e) {\n\t    g.regeneratorRuntime = undefined;\n\t  }\n\t}\n\n\tvar regenerator = runtimeModule;\n\n\tvar defaultOptions = {\n\t  mode: 'index'\n\t};\n\n\tmodule.exports = /*#__PURE__*/regenerator.mark(function _callee(M, N, options) {\n\t  var a, c, b, p, x, y, z, i, twiddle;\n\t  return regenerator.wrap(function _callee$(_context) {\n\t    while (1) {\n\t      switch (_context.prev = _context.next) {\n\t        case 0:\n\t          twiddle = function twiddle() {\n\t            var i, j, k;\n\t            j = 1;\n\t            while (p[j] <= 0) {\n\t              j++;\n\t            }\n\t            if (p[j - 1] === 0) {\n\t              for (i = j - 1; i !== 1; i--) {\n\t                p[i] = -1;\n\t              }\n\t              p[j] = 0;\n\t              x = z = 0;\n\t              p[1] = 1;\n\t              y = j - 1;\n\t            } else {\n\t              if (j > 1) {\n\t                p[j - 1] = 0;\n\t              }\n\t              do {\n\t                j++;\n\t              } while (p[j] > 0);\n\t              k = j - 1;\n\t              i = j;\n\t              while (p[i] === 0) {\n\t                p[i++] = -1;\n\t              }\n\t              if (p[i] === -1) {\n\t                p[i] = p[k];\n\t                z = p[k] - 1;\n\t                x = i - 1;\n\t                y = k - 1;\n\t                p[k] = -1;\n\t              } else {\n\t                if (i === p[0]) {\n\t                  return 0;\n\t                } else {\n\t                  p[j] = p[i];\n\t                  z = p[i] - 1;\n\t                  p[i] = 0;\n\t                  x = j - 1;\n\t                  y = i - 1;\n\t                }\n\t              }\n\t            }\n\t            return 1;\n\t          };\n\n\t          options = Object.assign({}, defaultOptions, options);\n\t          a = new Array(N);\n\t          c = new Array(M);\n\t          b = new Array(N);\n\t          p = new Array(N + 2);\n\n\n\t          // init a and b\n\t          for (i = 0; i < N; i++) {\n\t            a[i] = i;\n\t            if (i < N - M) b[i] = 0;else b[i] = 1;\n\t          }\n\n\t          // init c\n\t          for (i = 0; i < M; i++) {\n\t            c[i] = N - M + i;\n\t          }\n\n\t          // init p\n\t          for (i = 0; i < p.length; i++) {\n\t            if (i === 0) p[i] = N + 1;else if (i <= N - M) p[i] = 0;else if (i <= N) p[i] = i - N + M;else p[i] = -2;\n\t          }\n\n\t          if (!(options.mode === 'index')) {\n\t            _context.next = 20;\n\t            break;\n\t          }\n\n\t          _context.next = 12;\n\t          return c.slice();\n\n\t        case 12:\n\t          if (!twiddle()) {\n\t            _context.next = 18;\n\t            break;\n\t          }\n\n\t          c[z] = a[x];\n\t          _context.next = 16;\n\t          return c.slice();\n\n\t        case 16:\n\t          _context.next = 12;\n\t          break;\n\n\t        case 18:\n\t          _context.next = 33;\n\t          break;\n\n\t        case 20:\n\t          if (!(options.mode === 'mask')) {\n\t            _context.next = 32;\n\t            break;\n\t          }\n\n\t          _context.next = 23;\n\t          return b.slice();\n\n\t        case 23:\n\t          if (!twiddle()) {\n\t            _context.next = 30;\n\t            break;\n\t          }\n\n\t          b[x] = 1;\n\t          b[y] = 0;\n\t          _context.next = 28;\n\t          return b.slice();\n\n\t        case 28:\n\t          _context.next = 23;\n\t          break;\n\n\t        case 30:\n\t          _context.next = 33;\n\t          break;\n\n\t        case 32:\n\t          throw new Error('Invalid mode');\n\n\t        case 33:\n\t        case 'end':\n\t          return _context.stop();\n\t      }\n\t    }\n\t  }, _callee, this);\n\t});\n\n})));\n","/**\n * get folds indexes\n * @param {Array} features\n * @param {Number} k - number of folds, a\n */\nexport function getFolds(features, k = 5) {\n  let N = features.length;\n  let allIdx = new Array(N);\n  for (let i = 0; i < N; i++) {\n    allIdx[i] = i;\n  }\n\n  let l = Math.floor(N / k);\n  // create random k-folds\n  let current = [];\n  let folds = [];\n  while (allIdx.length) {\n    let randi = Math.floor(Math.random() * allIdx.length);\n    current.push(allIdx[randi]);\n    allIdx.splice(randi, 1);\n    if (current.length === l) {\n      folds.push(current);\n      current = [];\n    }\n  }\n  // we push the remaining to the last fold so that the total length is\n  // preserved. Otherwise the Q2 will fail.\n  if (current.length) current.forEach((e) => folds[k - 1].push(e));\n  folds = folds.slice(0, k);\n\n  let foldsIndex = folds.map((x, idx) => ({\n    testIndex: x,\n    trainIndex: [].concat(...folds.filter((el, idx2) => idx2 !== idx)),\n  }));\n  return foldsIndex;\n}\n","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction sum(input) {\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 sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport { sum as default };\n","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport { mean as default };\n","import mean from 'ml-array-mean';\n/**\n * Returns the Area under the curve.\n * @param curves Object containing the true positivie and false positive rate vectors.\n * @return Area under the curve.\n */\nexport function getAuc(curves) {\n    const auc = [];\n    for (const curve of curves) {\n        let area = 0;\n        const x = curve.specificities;\n        const y = curve.sensitivities;\n        for (let i = 1; i < x.length; i++) {\n            area += 0.5 * (x[i] - x[i - 1]) * (y[i] + y[i - 1]);\n        }\n        area = area > 0.5 ? area : 1 - area;\n        auc.push(area);\n    }\n    return mean(auc);\n}\n//# sourceMappingURL=getAuc.js.map","/**\n * Returns an array of thresholds to build the curve.\n * @param predictions Array of predictions.\n * @return An array of thresholds.\n */\nexport function getThresholds(predictions) {\n    const uniques = [...new Set(predictions)].sort((a, b) => a - b);\n    const thresholds = [Number.NEGATIVE_INFINITY];\n    for (let i = 0; i < uniques.length - 1; i++) {\n        const half = (uniques[i + 1] - uniques[i]) / 2;\n        thresholds.push(uniques[i] + half);\n    }\n    thresholds.push(Number.POSITIVE_INFINITY);\n    return thresholds;\n}\n//# sourceMappingURL=getThresholds.js.map","import { getThresholds } from './utilities/getThresholds';\n/**\n * Returns a ROC (Receiver Operating Characteristic) curve for a given response and prediction vectors.\n * @param responses Array containing category metadata.\n * @param predictions Array containing the results of regression.\n * @return sensitivities and specificities as a object.\n */\nexport function getBinaryClassifiers(responses, predictions) {\n    const limits = getThresholds(predictions);\n    const truePositives = [];\n    const falsePositives = [];\n    const trueNegatives = [];\n    const falseNegatives = [];\n    for (const limit of limits) {\n        let truePositive = 0;\n        let falsePositive = 0;\n        let trueNegative = 0;\n        let falseNegative = 0;\n        const category = responses[0];\n        for (let j = 0; j < responses.length; j++) {\n            if (responses[j] !== category && predictions[j] > limit)\n                truePositive++;\n            if (responses[j] === category && predictions[j] > limit)\n                falsePositive++;\n            if (responses[j] === category && predictions[j] < limit)\n                trueNegative++;\n            if (responses[j] !== category && predictions[j] < limit)\n                falseNegative++;\n        }\n        truePositives.push(truePositive);\n        falsePositives.push(falsePositive);\n        trueNegatives.push(trueNegative);\n        falseNegatives.push(falseNegative);\n    }\n    return {\n        truePositives,\n        falsePositives,\n        trueNegatives,\n        falseNegatives,\n    };\n}\n//# sourceMappingURL=getBinaryClassifiers.js.map","/**\n * @param array Array containing category metadata\n * @return Class object.\n */\nexport function getClasses(array) {\n    let nbClasses = 0;\n    const classes = [{ name: array[0], value: 0, ids: [] }];\n    for (const element of array) {\n        const currentClass = classes.some((item) => item.name === element);\n        if (!currentClass) {\n            nbClasses++;\n            classes.push({ name: element, value: nbClasses, ids: [] });\n        }\n    }\n    for (const category of classes) {\n        const label = category.name;\n        const indexes = [];\n        for (let j = 0; j < array.length; j++) {\n            if (array[j] === label)\n                indexes.push(j);\n        }\n        category.ids = indexes;\n    }\n    return classes;\n}\n//# sourceMappingURL=getClasses.js.map","/**\n * Returns an array of pairs of classes.\n * @param list Array containing a list of classes.\n * @return Array with pairs of classes.\n */\nexport function getClassesPairs(list) {\n    const pairs = [];\n    for (let i = 0; i < list.length - 1; i++) {\n        for (let j = i + 1; j < list.length; j++) {\n            pairs.push([list[i], list[j]]);\n        }\n    }\n    return pairs;\n}\n//# sourceMappingURL=getClassesPairs.js.map","/**\n * Returns the array of metadata numerically categorized.\n * @param array Array containing the categories.\n * @param pair Object containing information about the two classes to deal with.\n * @return Array containing the prediction values arranged for the corresponding classes.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getSelectedResults(array, pair) {\n    const results = [];\n    for (const item of pair) {\n        for (const id of item.ids) {\n            const result = array[id];\n            results.push(result);\n        }\n    }\n    return results;\n}\n//# sourceMappingURL=getSelectedResults.js.map","import { getBinaryClassifiers } from './getBinaryClassifiers';\nimport { getClasses } from './utilities/getClasses';\nimport { getClassesPairs } from './utilities/getClassesPairs';\nimport { getSelectedResults } from './utilities/getSelectedResults';\n/**\n * Returns a ROC (Receiver Operating Characteristic) curve for a given response and prediction vectors.\n * @param responses Array containing category metadata.\n * @param predictions Array containing the results of regression.\n * @return sensitivities and specificities as a object.\n */\nexport function getRocCurve(responses, predictions) {\n    const classes = getClasses(responses);\n    const pairsOfClasses = getClassesPairs(classes);\n    const curves = [];\n    for (const pairs of pairsOfClasses) {\n        const tests = getSelectedResults(predictions, pairs);\n        const targets = getSelectedResults(responses, pairs);\n        const { truePositives, falsePositives, trueNegatives, falseNegatives } = getBinaryClassifiers(targets, tests);\n        const curve = { sensitivities: [], specificities: [] };\n        for (let i = 0; i < truePositives.length; i++) {\n            curve.sensitivities.push(truePositives[i] / (truePositives[i] + falseNegatives[i]));\n            curve.specificities.push(trueNegatives[i] / (falsePositives[i] + trueNegatives[i]));\n        }\n        curves.push(curve);\n    }\n    return curves;\n}\n//# sourceMappingURL=getRocCurve.js.map","import { Matrix, NIPALS } from 'ml-matrix';\n/**\n * Single OPLS (orthogonal projections to latent structures) NIPALS iteration.\n * Computes the predictive and Y-orthogonal components and returns the data with\n * the orthogonal variation filtered out.\n * @param {Array|Matrix} data - matrix with features (X).\n * @param {Array|Matrix} labels - an array of labels (dependent variable Y).\n * @param {object} [options={}] - an object with options.\n * @param {number} [options.numberOSC=1000] - maximum number of NIPALS iterations.\n * @param {number} [options.limit=1e-10] - convergence threshold used to stop the iteration.\n * @returns {object} the computed model with the following properties:\n * - `filteredX`: X with the orthogonal component removed.\n * - `weightsXOrtho`: Y-orthogonal weights of X.\n * - `loadingsXOrtho`: Y-orthogonal loadings of X.\n * - `scoresXOrtho`: Y-orthogonal scores of X.\n * - `weightsXPred`: predictive weights of X.\n * - `loadingsXpred`: predictive loadings of X.\n * - `scoresXpred`: predictive scores of X.\n * - `loadingsY`: loadings of Y.\n */\nexport function oplsNipals(data, labels, options = {}) {\n    const { numberOSC = 1000, limit = 1e-10 } = options;\n    data = Matrix.checkMatrix(data);\n    labels = Matrix.checkMatrix(labels);\n    let tW = [];\n    if (labels.columns > 1) {\n        const wh = getWh(data, labels);\n        const ssWh = wh.norm() ** 2;\n        let ssT = ssWh;\n        let pcaW;\n        let count = 0;\n        do {\n            if (count === 0) {\n                pcaW = new NIPALS(wh.clone());\n                tW.push(pcaW.t);\n            }\n            else {\n                const data = pcaW.xResidual;\n                pcaW = new NIPALS(data);\n                tW.push(pcaW.t);\n            }\n            ssT = pcaW.t.norm() ** 2;\n            count++;\n        } while (ssT / ssWh > limit);\n    }\n    let u = labels.getColumnVector(0);\n    let diff = 1;\n    let t, c, w, uNew;\n    for (let i = 0; i < numberOSC && diff > limit; i++) {\n        w = u\n            .transpose()\n            .mmul(data)\n            .div(u.norm() ** 2);\n        w = w.transpose().div(w.norm());\n        t = data.mmul(w).div(w.norm() ** 2); // t_h paso 3\n        // calc loading\n        c = t\n            .transpose()\n            .mmul(labels)\n            .div(t.norm() ** 2);\n        // calc new u and compare with one in previus iteration (stop criterion)\n        uNew = labels.mmul(c.transpose()).div(c.norm() ** 2);\n        if (i > 0) {\n            // same value as uNew.clone().sub(u).pow(2).sum() / uNew.clone().pow(2).sum()\n            // but without allocating three full-vector clones per iteration.\n            let numerator = 0;\n            let denominator = 0;\n            for (let row = 0; row < uNew.rows; row++) {\n                const newValue = uNew.get(row, 0);\n                const delta = newValue - u.get(row, 0);\n                numerator += delta * delta;\n                denominator += newValue * newValue;\n            }\n            diff = numerator / denominator;\n        }\n        // uNew is reassigned to a fresh matrix next iteration, so a reference is safe.\n        u = uNew;\n    }\n    // calc loadings\n    let wOrtho;\n    let p = t\n        .transpose()\n        .mmul(data)\n        .div(t.norm() ** 2);\n    if (labels.columns > 1) {\n        for (let i = 0; i < tW.length - 1; i++) {\n            let tw = tW[i].transpose();\n            p = p.sub(tw\n                .mmul(p.transpose())\n                .div(tw.norm() ** 2)\n                .mmul(tw));\n        }\n        wOrtho = p.clone();\n    }\n    else {\n        wOrtho = p.clone().sub(w\n            .transpose()\n            .mmul(p.transpose())\n            .div(w.norm() ** 2)\n            .mmul(w.transpose()));\n    }\n    wOrtho.div(wOrtho.norm());\n    let tOrtho = data.mmul(wOrtho.transpose()).div(wOrtho.norm() ** 2);\n    // orthogonal loadings\n    let pOrtho = tOrtho\n        .transpose()\n        .mmul(data)\n        .div(tOrtho.norm() ** 2);\n    // filtered data\n    let err = data.clone().sub(tOrtho.mmul(pOrtho));\n    return {\n        filteredX: err,\n        weightsXOrtho: wOrtho,\n        loadingsXOrtho: pOrtho,\n        scoresXOrtho: tOrtho,\n        weightsXPred: w,\n        loadingsXpred: p,\n        scoresXpred: t,\n        loadingsY: c,\n    };\n}\n/**\n * Computes the W matrix used to initialize the orthogonal loop for multi-column Y.\n * @private\n * @param {Matrix} xValue - the feature matrix (X).\n * @param {Matrix} yValue - the label matrix (Y).\n * @returns {Matrix} the W matrix (one column per Y variable).\n */\nfunction getWh(xValue, yValue) {\n    let result = new Matrix(xValue.columns, yValue.columns);\n    for (let i = 0; i < yValue.columns; i++) {\n        let yN = yValue.getColumnVector(i).transpose();\n        let component = yN.mmul(xValue).div(yN.norm() ** 2);\n        result.setColumn(i, component.getRow(0));\n    }\n    return result;\n}\n//# sourceMappingURL=oplsNipals.js.map","/**\n * Computes the per-column standard deviations of a matrix, replacing any zero\n * (a constant column) by `1`.\n *\n * Scaling a column by its standard deviation is a division; for a constant\n * column the standard deviation is `0`, so the division yields `Infinity`/`NaN`\n * which then poisons every downstream computation. Replacing the zero by `1`\n * leaves the already-centered constant column at all-zeros, which is the\n * neutral, information-free contribution expected from such a column.\n * @private\n * @param {import('ml-matrix').Matrix} matrix - the matrix whose columns are scaled.\n * @returns {number[]} the per-column standard deviations, with every zero replaced by `1`.\n */\nexport function getSafeStandardDeviations(matrix) {\n    const standardDeviations = matrix.standardDeviation('column');\n    for (let i = 0; i < standardDeviations.length; i++) {\n        if (standardDeviations[i] === 0)\n            standardDeviations[i] = 1;\n    }\n    return standardDeviations;\n}\n//# sourceMappingURL=getSafeStandardDeviations.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Get total sum of square\n * @param {Array} x - an array\n * @returns {number} - the sum of the squares\n */\nexport function tss(x) {\n    return Matrix.mul(x, x).sum();\n}\n//# sourceMappingURL=tss.js.map","import { isAnyArray } from 'is-any-array';\nimport { ConfusionMatrix } from 'ml-confusion-matrix';\nimport { getFolds } from 'ml-cross-validation';\nimport { Matrix, NIPALS } from 'ml-matrix';\nimport { getAuc, getClasses, getRocCurve } from 'ml-roc-multiclass';\nimport { oplsNipals } from './oplsNipals.js';\nimport { getSafeStandardDeviations } from './util/getSafeStandardDeviations.js';\nimport { tss } from './util/tss.js';\n/**\n * OPLS (orthogonal projections to latent structures).\n */\nexport class OPLS {\n    /**\n     * Creates a new OPLS model from features and labels.\n     * @param {Array} data - matrix containing data (X).\n     * @param {Array} labels - 1D Array containing metadata (Y). Numeric labels trigger regression, string labels trigger discriminant analysis.\n     * @param {object} [options={}] - constructor options.\n     * @param {boolean} [options.center=true] - should the data be centered (subtract the mean).\n     * @param {boolean} [options.scale=true] - should the data be scaled (divide by the standard deviation).\n     * @param {Array} [options.cvFolds=[]] - Allows to provide folds as array of objects with the arrays trainIndex and testIndex as properties.\n     * @param {number} [options.nbFolds=7] - Allows to generate the defined number of folds with the training and test set chosen randomly from the data set.\n     * @param {number} [options.maxComponents=min(rows - 1, columns)] - upper bound on the number of orthogonal components. The fit normally stops earlier (when adding a component no longer improves the cross-validated metric by at least 0.05); this is a hard cap that guarantees termination even when the metric never plateaus.\n     */\n    constructor(data, labels, options = {}) {\n        if (data === true) {\n            const opls = options;\n            this.labels = opls.labels;\n            this.center = opls.center;\n            this.scale = opls.scale;\n            this.means = opls.means;\n            this.meansY = opls.meansY;\n            this.stdevs = opls.stdevs;\n            this.stdevsY = opls.stdevsY;\n            this.model = opls.model;\n            this.predictiveScoresCV = opls.predictiveScoresCV;\n            this.orthogonalScoresCV = opls.orthogonalScoresCV;\n            this.yHatScoresCV = opls.yHatScoresCV;\n            this.mode = opls.mode;\n            this.output = opls.output;\n            return;\n        }\n        const features = new Matrix(data);\n        // set default values\n        // cvFolds allows to define folds for testing purpose\n        const { center = true, scale = true, cvFolds = [], nbFolds = 7, maxComponents = Math.min(features.rows - 1, features.columns), } = options;\n        this.labels = labels;\n        // a constant Y has zero variance: it cannot define a direction to model and\n        // would silently produce NaN once scaled. Fail loudly instead of hiding it.\n        if (new Set(labels).size < 2) {\n            throw new RangeError('labels must contain at least two distinct values; a constant Y has zero variance and cannot fit an OPLS model');\n        }\n        let group;\n        if (typeof labels[0] === 'number') {\n            // numeric labels: OPLS regression is used\n            this.mode = 'regression';\n            group = Matrix.from1DArray(labels.length, 1, labels);\n        }\n        else if (typeof labels[0] === 'string') {\n            // non-numeric labels: OPLS-DA is used\n            this.mode = 'discriminantAnalysis';\n            group = Matrix.checkMatrix(createDummyY(labels)).transpose();\n        }\n        // getting center and scale the features (all)\n        this.center = center;\n        if (this.center) {\n            this.means = features.mean('column');\n            this.meansY = group.mean('column');\n        }\n        else {\n            this.stdevs = null;\n        }\n        this.scale = scale;\n        if (this.scale) {\n            // constant columns (sd = 0) would divide by zero when scaling and produce\n            // NaN; getSafeStandardDeviations replaces those zeros by 1 (check opls.R line 70).\n            this.stdevs = getSafeStandardDeviations(features);\n            this.stdevsY = getSafeStandardDeviations(group);\n        }\n        else {\n            this.means = null;\n        }\n        const folds = cvFolds.length > 0 ? cvFolds : getFolds(labels, nbFolds);\n        const Q2 = [];\n        const aucResult = [];\n        this.model = [];\n        this.predictiveScoresCV = [];\n        this.orthogonalScoresCV = [];\n        this.yHatScoresCV = [];\n        const oplsCV = [];\n        let modelNC = [];\n        // this code could be made more efficient by reverting the order of the loops\n        // this is a legacy loop to be consistent with R code from MetaboMate package\n        // this allows for having statistic (R2) from CV to decide wether to continue\n        // with more latent structures\n        let overfitted = false;\n        let nc = 0;\n        let value;\n        do {\n            const yHatk = new Matrix(group.rows, 1);\n            const predictiveScoresK = new Matrix(group.rows, 1);\n            const orthogonalScoresK = new Matrix(group.rows, 1);\n            oplsCV[nc] = [];\n            for (let f = 0; f < folds.length; f++) {\n                const trainTest = this._getTrainTest(features, group, folds[f]);\n                const testFeatures = trainTest.testFeatures;\n                const trainFeatures = trainTest.trainFeatures;\n                const trainLabels = trainTest.trainLabels;\n                // determine center and scale of training set\n                const dataCenter = trainFeatures.mean('column');\n                const dataSD = getSafeStandardDeviations(trainFeatures);\n                // center and scale training set. trainFeatures is only consumed for the\n                // first component; later components run oplsNipals on the stored\n                // filteredX, so centering/scaling trainFeatures again would be dead work.\n                if (center) {\n                    if (nc === 0)\n                        trainFeatures.center('column');\n                    trainLabels.center('column');\n                }\n                if (scale) {\n                    if (nc === 0) {\n                        // std computed after centering to stay bit-identical to the previous\n                        // internal scale('column'); sanitized to avoid dividing by a zero sd.\n                        trainFeatures.scale('column', {\n                            scale: getSafeStandardDeviations(trainFeatures),\n                        });\n                    }\n                    trainLabels.scale('column');\n                }\n                // perform opls\n                let oplsk;\n                if (nc === 0) {\n                    oplsk = oplsNipals(trainFeatures, trainLabels);\n                }\n                else {\n                    oplsk = oplsNipals(oplsCV[nc - 1][f].filteredX, trainLabels);\n                }\n                // store model for next component\n                oplsCV[nc][f] = oplsk;\n                const plsCV = new NIPALS(oplsk.filteredX, { Y: trainLabels });\n                // scaling the test dataset with respect to the train\n                testFeatures.center('column', { center: dataCenter });\n                testFeatures.scale('column', { scale: dataSD });\n                const Eh = testFeatures;\n                // removing the orthogonal components from PLS\n                let scores;\n                for (let idx = 0; idx < nc + 1; idx++) {\n                    scores = Eh.mmul(oplsCV[idx][f].weightsXOrtho.transpose()); // ok\n                    Eh.sub(scores.mmul(oplsCV[idx][f].loadingsXOrtho));\n                }\n                // prediction\n                const predictiveComponents = Eh.mmul(plsCV.w.transpose());\n                const yHatComponents = predictiveComponents\n                    .mmul(plsCV.betas)\n                    .mmul(plsCV.q.transpose()); // ok\n                const yHat = new Matrix(yHatComponents.rows, 1);\n                for (let i = 0; i < yHatComponents.rows; i++) {\n                    yHat.setRow(i, [yHatComponents.getRowVector(i).sum()]);\n                }\n                // adding all prediction from all folds\n                for (let i = 0; i < folds[f].testIndex.length; i++) {\n                    yHatk.setRow(folds[f].testIndex[i], [yHat.get(i, 0)]);\n                    predictiveScoresK.setRow(folds[f].testIndex[i], [\n                        predictiveComponents.get(i, 0),\n                    ]);\n                    orthogonalScoresK.setRow(folds[f].testIndex[i], [scores.get(i, 0)]);\n                }\n            } // end of loop over folds\n            this.predictiveScoresCV.push(predictiveScoresK);\n            this.orthogonalScoresCV.push(orthogonalScoresK);\n            this.yHatScoresCV.push(yHatk);\n            // calculate Q2y for all the prediction (all folds)\n            // ROC for DA is not implemented (check opls.R line 183) TODO\n            const tssy = tss(group.center('column').scale('column'));\n            let press = 0;\n            for (let i = 0; i < group.columns; i++) {\n                press += tss(group.getColumnVector(i).sub(yHatk));\n            }\n            const Q2y = 1 - press / group.columns / tssy;\n            Q2.push(Q2y);\n            if (this.mode === 'regression') {\n                value = Q2y;\n            }\n            else if (this.mode === 'discriminantAnalysis') {\n                const rocCurve = getRocCurve(labels, yHatk.to1DArray());\n                const areaUnderCurve = getAuc(rocCurve);\n                aucResult.push(areaUnderCurve);\n                value = areaUnderCurve;\n            }\n            // calculate the R2y for the complete data\n            if (nc === 0) {\n                modelNC = this._predictAll(features, group);\n            }\n            else {\n                modelNC = this._predictAll(modelNC.xRes, group, {\n                    scale: false,\n                    center: false,\n                });\n            }\n            // adding the predictive statistics from CV\n            let listOfValues;\n            modelNC.Q2y = Q2;\n            if (this.mode === 'regression') {\n                listOfValues = Q2;\n            }\n            else {\n                listOfValues = aucResult;\n                modelNC.auc = aucResult;\n            }\n            modelNC.value = value;\n            if (nc > 0) {\n                // a non-finite metric means the fit degenerated; stop rather than keep\n                // adding components until the maxComponents cap.\n                overfitted =\n                    !Number.isFinite(value) || value - listOfValues[nc - 1] < 0.05;\n            }\n            this.model.push(modelNC);\n            // store the model for each component\n            nc++;\n            // console.warn(`OPLS iteration over # of Components: ${nc + 1}`);\n        } while (!overfitted && nc < maxComponents); // end of loop over nc\n        // store scores from CV\n        const predictiveScoresCV = this.predictiveScoresCV;\n        const orthogonalScoresCV = this.orthogonalScoresCV;\n        const yHatScoresCV = this.yHatScoresCV;\n        const m = this.model[nc - 1];\n        const orthogonalData = new Matrix(features.rows, features.columns);\n        const orthogonalScores = new Matrix(features.rows, nc - 1);\n        const orthogonalLoadings = new Matrix(nc - 1, features.columns);\n        const orthogonalWeights = new Matrix(nc - 1, features.columns);\n        for (let i = 0; i < this.model.length - 1; i++) {\n            orthogonalData.add(this.model[i].XOrth);\n            orthogonalScores.setSubMatrix(this.model[i].orthogonalScores, 0, i);\n            orthogonalLoadings.setSubMatrix(this.model[i].orthogonalLoadings, i, 0);\n            orthogonalWeights.setSubMatrix(this.model[i].orthogonalWeights, i, 0);\n        }\n        const FeaturesCS = features.center('column');\n        FeaturesCS.scale('column', {\n            scale: getSafeStandardDeviations(FeaturesCS),\n        });\n        let labelsCS;\n        if (this.mode === 'regression') {\n            labelsCS = group.clone().center('column').scale('column');\n        }\n        else {\n            labelsCS = group;\n        }\n        const orthogonalizedData = FeaturesCS.clone().sub(orthogonalData);\n        const plsCall = new NIPALS(orthogonalizedData, { Y: labelsCS });\n        const residualData = orthogonalizedData\n            .clone()\n            .sub(plsCall.t.mmul(plsCall.p));\n        const R2x = this.model.map((x) => x.R2x);\n        const R2y = this.model.map((x) => x.R2y);\n        this.output = {\n            Q2y: Q2,\n            auc: aucResult,\n            R2x,\n            R2y,\n            predictiveComponents: plsCall.t,\n            predictiveLoadings: plsCall.p,\n            predictiveWeights: plsCall.w,\n            betas: plsCall.betas,\n            Qpc: plsCall.q,\n            predictiveScoresCV,\n            orthogonalScoresCV,\n            yHatScoresCV,\n            oplsCV,\n            orthogonalScores,\n            orthogonalLoadings,\n            orthogonalWeights,\n            Xorth: orthogonalData,\n            yHat: m.totalPred,\n            Yres: m.plsC.yResidual,\n            residualData,\n            folds,\n        };\n    }\n    /**\n     * get access to all the computed elements\n     * Mainly for debug and testing\n     * @returns {object} output object\n     */\n    getLogs() {\n        return this.output;\n    }\n    /**\n     * Returns the cross-validated predictive and orthogonal scores.\n     * @returns {{scoresX: Array<Array<number>>, scoresY: Array<Array<number>>}} the predictive (`scoresX`) and orthogonal (`scoresY`) cross-validated scores.\n     */\n    getScores() {\n        const scoresX = this.predictiveScoresCV.map((x) => x.to1DArray());\n        const scoresY = this.orthogonalScoresCV.map((x) => x.to1DArray());\n        return { scoresX, scoresY };\n    }\n    /**\n     * Load an OPLS model from JSON\n     * @param {object} model - the serialized model to load.\n     * @returns {OPLS} the loaded OPLS model.\n     */\n    static load(model) {\n        if (typeof model.name !== 'string') {\n            throw new TypeError('model must have a name property');\n        }\n        if (model.name !== 'OPLS') {\n            throw new RangeError(`invalid model: ${model.name}`);\n        }\n        return new OPLS(true, [], model);\n    }\n    /**\n     * Export the current model to a JSON object\n     * @returns {object} model\n     */\n    toJSON() {\n        return {\n            name: 'OPLS',\n            labels: this.labels,\n            center: this.center,\n            scale: this.scale,\n            means: this.means,\n            stdevs: this.stdevs,\n            model: this.model,\n            mode: this.mode,\n            output: this.output,\n            predictiveScoresCV: this.predictiveScoresCV,\n            orthogonalScoresCV: this.orthogonalScoresCV,\n            yHatScoresCV: this.yHatScoresCV,\n        };\n    }\n    /**\n     * Predicts the class of each row of new data (discriminant analysis mode).\n     * @param {Matrix} features - a matrix containing new data.\n     * @param {object} [options={}] - prediction options.\n     * @param {Array} [options.trueLabels] - an array with true values to compute confusion matrix.\n     * @param {boolean} [options.center=this.center] - should the data be centered before prediction.\n     * @param {boolean} [options.scale=this.scale] - should the data be scaled before prediction.\n     * @returns {Array} the predicted class name for each row of `features`.\n     */\n    predictCategory(features, options = {}) {\n        const { trueLabels = [], center = this.center, scale = this.scale, } = options;\n        if (isAnyArray(features)) {\n            if (features[0].length === undefined) {\n                features = Matrix.from1DArray(1, features.length, features);\n            }\n            else {\n                features = Matrix.checkMatrix(features);\n            }\n        }\n        const prediction = this.predict(features, { trueLabels, center, scale });\n        const predictiveComponents = Matrix.checkMatrix(this.output.predictiveComponents).to1DArray();\n        const newTPred = Matrix.checkMatrix(prediction.predictiveComponents).to1DArray();\n        const categories = getClasses(this.labels);\n        const classes = this.labels.slice();\n        const result = [];\n        for (const pred of newTPred) {\n            let item;\n            let auc = 0;\n            for (const category of categories) {\n                const testTPred = predictiveComponents.slice();\n                testTPred.push(pred);\n                const testClasses = classes.slice();\n                testClasses.push(category.name);\n                const rocCurve = getRocCurve(testClasses, testTPred);\n                const areaUnderCurve = getAuc(rocCurve);\n                if (auc < areaUnderCurve) {\n                    item = category.name;\n                    auc = areaUnderCurve;\n                }\n            }\n            result.push(item);\n        }\n        return result;\n    }\n    /* eslint-disable-next-line jsdoc/require-returns-check -- always returns for the supported modes (regression / discriminantAnalysis) */\n    /**\n     * Predict scores for new data\n     * @param {Matrix} features - a matrix containing new data\n     * @param {object} [options={}] - prediction options.\n     * @param {Array} [options.trueLabels] - an array with true values to compute confusion matrix.\n     * @param {boolean} [options.center=this.center] - should the data be centered before prediction.\n     * @param {boolean} [options.scale=this.scale] - should the data be scaled before prediction.\n     * @returns {object} - predictions\n     */\n    predict(features, options = {}) {\n        const { trueLabels = [], center = this.center, scale = this.scale, } = options;\n        let labels;\n        if (typeof trueLabels[0] === 'number') {\n            labels = Matrix.from1DArray(trueLabels.length, 1, trueLabels);\n        }\n        else if (typeof trueLabels[0] === 'string') {\n            labels = Matrix.checkMatrix(createDummyY(trueLabels)).transpose();\n        }\n        features = new Matrix(features);\n        // scaling the test dataset with respect to the train\n        if (center) {\n            features.center('column', { center: this.means });\n            if (labels?.rows > 0) {\n                labels.center('column', { center: this.meansY });\n            }\n        }\n        if (scale) {\n            features.scale('column', { scale: this.stdevs });\n            if (labels?.rows > 0) {\n                labels.scale('column', { scale: this.stdevsY });\n            }\n        }\n        const nc = this.mode === 'regression'\n            ? this.model[0].Q2y.length\n            : this.model[0].auc.length - 1;\n        const Eh = features.clone();\n        // removing the orthogonal components from PLS\n        let orthogonalScores;\n        let orthogonalWeights;\n        let orthogonalLoadings;\n        let totalPred;\n        let predictiveComponents;\n        for (let idx = 0; idx < nc; idx++) {\n            const model = this.model[idx];\n            orthogonalWeights = Matrix.checkMatrix(model.orthogonalWeights).transpose();\n            orthogonalLoadings = Matrix.checkMatrix(model.orthogonalLoadings);\n            orthogonalScores = Eh.mmul(orthogonalWeights);\n            Eh.sub(orthogonalScores.mmul(orthogonalLoadings));\n            // prediction\n            predictiveComponents = Eh.mmul(Matrix.checkMatrix(model.plsC.w).transpose());\n            const components = predictiveComponents\n                .mmul(model.plsC.betas)\n                .mmul(Matrix.checkMatrix(model.plsC.q).transpose());\n            totalPred = new Matrix(components.rows, 1);\n            for (let i = 0; i < components.rows; i++) {\n                totalPred.setRow(i, [components.getRowVector(i).sum()]);\n            }\n        }\n        if (labels?.rows > 0) {\n            if (this.mode === 'regression') {\n                const tssy = tss(labels);\n                const press = tss(labels.clone().sub(totalPred));\n                const Q2y = 1 - press / tssy;\n                return { predictiveComponents, orthogonalScores, yHat: totalPred, Q2y };\n            }\n            else if (this.mode === 'discriminantAnalysis') {\n                const confusionMatrix = ConfusionMatrix.fromLabels(trueLabels, totalPred.to1DArray());\n                const rocCurve = getRocCurve(trueLabels, totalPred.to1DArray());\n                const auc = getAuc(rocCurve);\n                return {\n                    predictiveComponents,\n                    orthogonalScores,\n                    yHat: totalPred,\n                    confusionMatrix,\n                    auc,\n                };\n            }\n        }\n        else {\n            return { predictiveComponents, orthogonalScores, yHat: totalPred };\n        }\n    }\n    /**\n     * Fits a one-component OPLS model on the full data set and computes its R2 statistics.\n     * @private\n     * @param {Matrix} data - the feature matrix (X).\n     * @param {Matrix} categories - the label matrix (Y).\n     * @param {object} [options={}] - prediction options.\n     * @param {boolean} [options.center=true] - should the data be centered.\n     * @param {boolean} [options.scale=true] - should the data be scaled.\n     * @returns {object} the fitted component with its scores, loadings, weights and R2x/R2y statistics.\n     */\n    _predictAll(data, categories, options = {}) {\n        // cannot use the global this.center here\n        // since it is used in the NC loop and\n        // centering and scaling should only be\n        // performed once\n        const { center = true, scale = true } = options;\n        // clone only when we mutate the inputs (center/scale below); oplsNipals and\n        // NIPALS do not mutate the X/Y passed here, so when called with\n        // center/scale = false (every component after the first) the clones are pure\n        // waste of a full-matrix copy per iteration.\n        const features = center || scale ? data.clone() : data;\n        const labels = center || scale ? categories.clone() : categories;\n        if (center) {\n            const means = features.mean('column');\n            features.center('column', { center: means });\n            labels.center('column');\n        }\n        if (scale) {\n            const stdevs = getSafeStandardDeviations(features);\n            features.scale('column', { scale: stdevs });\n            labels.scale('column');\n            // reevaluate tssy and tssx after scaling\n            // must be global because re-used for next nc iteration\n            // tssx is only evaluate the first time\n            this.tssy = tss(labels);\n            this.tssx = tss(features);\n        }\n        const oplsC = oplsNipals(features, labels);\n        const plsC = new NIPALS(oplsC.filteredX, { Y: labels });\n        const predictiveComponents = plsC.t.clone();\n        // const yHat = tPred.mmul(plsC.betas).mmul(plsC.q.transpose()); // ok\n        const yHatComponents = predictiveComponents\n            .mmul(plsC.betas)\n            .mmul(plsC.q.transpose()); // ok\n        const yHat = new Matrix(yHatComponents.rows, 1);\n        for (let i = 0; i < yHatComponents.rows; i++) {\n            yHat.setRow(i, [yHatComponents.getRowVector(i).sum()]);\n        }\n        let rss = 0;\n        for (let i = 0; i < labels.columns; i++) {\n            rss += tss(labels.getColumnVector(i).sub(yHat));\n        }\n        const R2y = 1 - rss / labels.columns / this.tssy;\n        const xEx = plsC.t.mmul(plsC.p);\n        const rssx = tss(xEx);\n        const R2x = rssx / this.tssx;\n        return {\n            R2y,\n            R2x,\n            xRes: oplsC.filteredX,\n            orthogonalScores: oplsC.scoresXOrtho,\n            orthogonalLoadings: oplsC.loadingsXOrtho,\n            orthogonalWeights: oplsC.weightsXOrtho,\n            predictiveComponents,\n            totalPred: yHat,\n            XOrth: oplsC.scoresXOrtho.mmul(oplsC.loadingsXOrtho),\n            oplsC,\n            plsC,\n        };\n    }\n    /**\n     * Splits the data into train and test sets for the given fold.\n     * @private\n     * @param {Matrix} X - dataset matrix object.\n     * @param {Matrix} group - labels matrix object.\n     * @param {object} index - train and test index (output from getFold()).\n     * @returns {object} train and test features and labels.\n     */\n    _getTrainTest(X, group, index) {\n        const testFeatures = new Matrix(index.testIndex.length, X.columns);\n        const testLabels = new Matrix(index.testIndex.length, group.columns);\n        for (const [idx, el] of index.testIndex.entries()) {\n            testFeatures.setRow(idx, X.getRow(el));\n            testLabels.setRow(idx, group.getRow(el));\n        }\n        const trainFeatures = new Matrix(index.trainIndex.length, X.columns);\n        const trainLabels = new Matrix(index.trainIndex.length, group.columns);\n        for (const [idx, el] of index.trainIndex.entries()) {\n            trainFeatures.setRow(idx, X.getRow(el));\n            trainLabels.setRow(idx, group.getRow(el));\n        }\n        return {\n            trainFeatures,\n            testFeatures,\n            trainLabels,\n            testLabels,\n        };\n    }\n}\n/**\n * Builds a dummy (indicator) Y matrix from an array of class labels.\n * For more than two classes each row encodes one class as `1` and the others as `-1`;\n * for two classes a single row of `2`/`1` values is returned.\n * @private\n * @param {Array} array - the array of class labels.\n * @returns {Array<Array<number>>} the dummy Y matrix.\n */\nfunction createDummyY(array) {\n    const features = [...new Set(array)];\n    const result = [];\n    if (features.length > 2) {\n        for (let i = 0; i < features.length; i++) {\n            const feature = [];\n            for (let j = 0; j < array.length; j++) {\n                const point = features[i] === array[j] ? 1 : -1;\n                feature.push(point);\n            }\n            result.push(feature);\n        }\n        return result;\n    }\n    else {\n        const result = [];\n        for (let j = 0; j < array.length; j++) {\n            const point = features[0] === array[j] ? 2 : 1;\n            result.push(point);\n        }\n        return [result];\n    }\n}\n//# sourceMappingURL=OPLS.js.map"],"names":["isAnyArray","value","Matrix","matrix","NIPALS","SingularValueDecomposition","inverse","norm","X","Math","sqrt","clone","apply","pow2array","sum","i","j","set","get","initializeMatrices","array","isMatrix","length","elem","undefined","PLS","constructor","options","model","meanX","stdDevX","meanY","stdDevY","PBQ","checkMatrix","R2X","scale","scaleMethod","tolerance","latentVectors","train","trainingSet","trainingValues","RangeError","mean","standardDeviation","unbiased","subRowVector","divRowVector","min","rows","columns","rx","cx","ry","cy","ssqXcal","mul","sumOfSquaresY","n","T","zeros","P","U","Q","B","W","k","t","w","q","p","Utils","transposeX","transpose","transposeY","tIndex","maxSumColIndex","uIndex","t1","getColumnVector","u","sub","mmul","div","num","den","pnorm","b","setColumn","subMatrix","ssqYcal","E","F","predict","dataset","Y","mulRowVector","addRowVector","getExplainedVariance","toJSON","name","load","data","rowVector","maxIndex","KOPLS","YLoadingMat","SigmaPow","YScoreMat","predScoreMat","YOrthLoadingVec","YOrthEigen","YOrthScoreMat","toNorm","TURegressionCoeff","kernelX","kernel","orthogonalComp","predictiveComp","predictiveComponents","orthogonalComponents","compute","Identity","eye","temp","Array","result","computeLeftSingularVectors","computeRightSingularVectors","leftSingularVectors","Sigma","diagonalMatrix","YOrthScoreNorm","pow","removeInfinity","TpiPrime","CoTemp","SoTemp","toiPrime","ITo","lastScoreMat","lastTpPrime","toPredict","KTestTrain","YOrthScoreVector","scoreMatPrime","p1","p2","p3","add","prediction","predYOrthVectors","Infinity","toString","Object","prototype","tag","call","endsWith","includes","ConfusionMatrix","labels","Error","fromLabels","actual","predicted","distinctLabels","Set","from","sort","fill","actualIdx","indexOf","predictedIdx","getMatrix","getLabels","getTotalCount","row","element","getTrueCount","count","getFalseCount","getTruePositiveCount","label","index","getIndex","getTrueNegativeCount","getFalsePositiveCount","getFalseNegativeCount","getPositiveCount","getNegativeCount","getTruePositiveRate","getTrueNegativeRate","getPositivePredictiveValue","TP","getNegativePredictiveValue","TN","getFalseNegativeRate","getFalsePositiveRate","getFalseDiscoveryRate","FP","getFalseOmissionRate","FN","getF1Score","getMatthewsCorrelationCoefficient","getInformedness","getMarkedness","getConfusionTable","getAccuracy","correct","incorrect","getCount","actualIndex","predictedIndex","accuracy","total","global","factory","this","createCommonjsModule","fn","module","exports","runtime","Op","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","regeneratorRuntime","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","makeInvokeMethod","tryCatch","obj","arg","type","err","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","displayName","defineIteratorMethods","forEach","method","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","__await","AsyncIterator","invoke","resolve","reject","record","Promise","then","unwrapped","previousPromise","enqueue","callInvokeWithMethodAndArg","async","iter","next","done","state","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","info","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","keys","object","key","reverse","pop","iterable","iteratorMethod","isNaN","skipTempReset","prev","charAt","slice","stop","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","Function","g","hadRuntime","getOwnPropertyNames","oldRuntime","runtimeModule","e","regenerator","defaultOptions","mode","_callee","M","N","a","c","x","y","z","twiddle","_callee$","_context","assign","getFolds","features","allIdx","l","floor","current","folds","randi","random","splice","foldsIndex","map","idx","testIndex","trainIndex","concat","filter","el","idx2","input","sumValue","getAuc","curves","auc","curve","area","specificities","sensitivities","getThresholds","predictions","uniques","thresholds","Number","NEGATIVE_INFINITY","half","POSITIVE_INFINITY","getBinaryClassifiers","responses","limits","truePositives","falsePositives","trueNegatives","falseNegatives","limit","truePositive","falsePositive","trueNegative","falseNegative","category","getClasses","nbClasses","classes","ids","currentClass","some","item","indexes","getClassesPairs","list","pairs","getSelectedResults","pair","results","id","getRocCurve","pairsOfClasses","tests","targets","oplsNipals","numberOSC","tW","wh","getWh","ssWh","ssT","pcaW","xResidual","diff","uNew","numerator","denominator","newValue","delta","wOrtho","tw","tOrtho","pOrtho","filteredX","weightsXOrtho","loadingsXOrtho","scoresXOrtho","weightsXPred","loadingsXpred","scoresXpred","loadingsY","xValue","yValue","yN","component","getRow","getSafeStandardDeviations","standardDeviations","tss","OPLS","opls","center","means","meansY","stdevs","stdevsY","predictiveScoresCV","orthogonalScoresCV","yHatScoresCV","output","cvFolds","nbFolds","maxComponents","size","group","from1DArray","createDummyY","Q2","aucResult","oplsCV","modelNC","overfitted","nc","yHatk","predictiveScoresK","orthogonalScoresK","f","trainTest","_getTrainTest","testFeatures","trainFeatures","trainLabels","dataCenter","dataSD","oplsk","plsCV","Eh","scores","yHatComponents","betas","yHat","setRow","getRowVector","tssy","press","Q2y","rocCurve","to1DArray","areaUnderCurve","_predictAll","xRes","listOfValues","isFinite","m","orthogonalData","orthogonalScores","orthogonalLoadings","orthogonalWeights","XOrth","setSubMatrix","FeaturesCS","labelsCS","orthogonalizedData","plsCall","residualData","R2x","R2y","predictiveLoadings","predictiveWeights","Qpc","Xorth","totalPred","Yres","plsC","yResidual","getLogs","getScores","scoresX","scoresY","predictCategory","trueLabels","newTPred","categories","pred","testTPred","testClasses","components","confusionMatrix","tssx","oplsC","rss","xEx","rssx","testLabels","entries","feature","point"],"mappings":";;;;;;;;;;;;;;;;;;;EAAA;;EAEA;;EAEA;EACA;EACA;EACA,SAAAA,aAAAC,KAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,5,6,7,8,9,10,11,12,13,14,15,16,17,18]}