{"version":3,"file":"ml-spectra-fitting.min.js","sources":["../node_modules/assign-symbols/index.js","../node_modules/assign-deep/index.js","../node_modules/is-any-array/src/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../src/shapes/sumOfGaussianLorentzians.js","../src/shapes/sumOfGaussians.js","../src/shapes/sumOfLorentzians.js","../node_modules/ml-levenberg-marquardt/src/errorCalculation.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/decompositions.js","../node_modules/ml-levenberg-marquardt/src/step.js","../node_modules/ml-levenberg-marquardt/src/gradientFunction.js","../node_modules/ml-levenberg-marquardt/src/index.js","../node_modules/ml-levenberg-marquardt/src/checkOptions.js","../src/selectMethod.js","../src/index.js","../src/checkInput.js"],"sourcesContent":["/*!\n * assign-symbols <https://github.com/jonschlinkert/assign-symbols>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst isEnumerable = Object.prototype.propertyIsEnumerable;\nconst getSymbols = Object.getOwnPropertySymbols;\n\nmodule.exports = (target, ...args) => {\n  if (!isObject(target)) {\n    throw new TypeError('expected the first argument to be an object');\n  }\n\n  if (args.length === 0 || typeof Symbol !== 'function' || typeof getSymbols !== 'function') {\n    return target;\n  }\n\n  for (let arg of args) {\n    let names = getSymbols(arg);\n\n    for (let key of names) {\n      if (isEnumerable.call(arg, key)) {\n        target[key] = arg[key];\n      }\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]' || Array.isArray(val);\n}\n","/*!\n * assign-deep <https://github.com/jonschlinkert/assign-deep>\n *\n * Copyright (c) 2017-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst assignSymbols = require('assign-symbols');\n\nconst isValidKey = key => {\n  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\nconst assign = module.exports = (target, ...args) => {\n  let i = 0;\n  if (isPrimitive(target)) target = args[i++];\n  if (!target) target = {};\n  for (; i < args.length; i++) {\n    if (isObject(args[i])) {\n      for (const key of Object.keys(args[i])) {\n        if (isValidKey(key)) {\n          if (isObject(target[key]) && isObject(args[i][key])) {\n            assign(target[key], args[i][key]);\n          } else {\n            target[key] = args[i][key];\n          }\n        }\n      }\n      assignSymbols(target, args[i]);\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]';\n}\n\nfunction isPrimitive(val) {\n  return typeof val === 'object' ? val === null : typeof val !== 'function';\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n","import {\n  ROOT_2LN2,\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\nimport erfinv from '../util/erfinv';\n\nexport class Gaussian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.sd\n      ? Gaussian.widthToFWHM(2 * options.sd)\n      : options.fwhm\n      ? options.fwhm\n      : 500;\n    this.height =\n      options.height === undefined\n        ? Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / this.fwhm\n        : options.height;\n  }\n  /**\n   * Calculate a gaussian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = 6] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a gaussian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of gaussian with the current parameters.\n   */\n  fct(x) {\n    return Gaussian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Gaussian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Gaussian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} width - Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    //https://mathworld.wolfram.com/GaussianFunction.html\n    return Gaussian.widthToFWHM(width);\n  }\n\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @returns {number} width\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Gaussian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nGaussian.fct = function fct(x, fwhm = 500) {\n  return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} width - Width between the inflection points\n * @returns {number} fwhm\n */\nGaussian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_2LN2;\n};\n\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} fwhm - Full Width at Half Maximum.\n * @returns {number} width\n */\nGaussian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_2LN2;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {object} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\n\nGaussian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n  return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nGaussian.getFactor = function getFactor(area = 0.9999) {\n  return Math.sqrt(2) * erfinv(area);\n};\n","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n\nexport default function erfinv(x) {\n  let a = 0.147;\n  if (x === 0) return 0;\n  let ln1MinusXSqrd = Math.log(1 - x * x);\n  let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n  let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n  let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n  return secondSqrt * (x > 0 ? 1 : -1);\n}\n","import { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined ? 2 / Math.PI / this.fwhm : options.height;\n  }\n  /**\n   * Calculate a lorentzian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a lorentzian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of lorentzian with the current parameters.\n   */\n  fct(x) {\n    return Lorentzian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Lorentzian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Lorentzian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [fwhm] - Full Width at Half Maximum.\n   * @returns {number} width between the inflection points\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Lorentzian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [width] Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    return Lorentzian.widthToFWHM(width);\n  }\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nLorentzian.fct = function fct(x, fwhm) {\n  const squareFWHM = fwhm * fwhm;\n  return squareFWHM / (4 * Math.pow(x, 2) + squareFWHM);\n};\n\n/**\n * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [fwhm] - Full Width at Half Maximum.\n * @returns {number} width between the inflection points\n */\nLorentzian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_THREE;\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [width] Width between the inflection points\n * @returns {number} fwhm\n */\nLorentzian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_THREE;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nLorentzian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n\n  return (height * Math.PI * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nLorentzian.getFactor = function getFactor(area = 0.9999) {\n  return 2 * Math.tan(Math.PI * (area - 0.5));\n};\n","import {\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_2LN2_MINUS_ONE,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\n\nimport { Gaussian } from './Gaussian';\nimport { Lorentzian } from './Lorentzian';\n\nexport class PseudoVoigt {\n  /**\n   * @param {object} [options={}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm=500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.mu=0.5] - ratio of gaussian contribution.\n   */\n\n  constructor(options = {}) {\n    this.mu = options.mu === undefined ? 0.5 : options.mu;\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined\n        ? 1 /\n          ((this.mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * this.fwhm +\n            ((1 - this.mu) * this.fwhm * Math.PI) / 2)\n        : options.height;\n  }\n\n  /**\n   * Calculate a linear combination of gaussian and lorentzian function width an same full width at half maximum\n   * @param { object } [options = {}]\n   * @param { number } [options.factor = 2 * Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm in the calculation of the length.Default covers 99.99 % of area.\n   * @param { number } [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return { object } - { fwhm, data<Float64Array>} - An with the number of points at half maximum and the array of y values covering the 99.99 % of the area.\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n    if (!length) {\n      length = Math.ceil(this.fwhm * factor);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n\n    let data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a linear combination of Gaussian and Lorentzian shapes where the full width at half maximum are the same for both kind of shapes (see README for equation).\n   * @param {number} [x] x value to calculate.\n   * @returns {number} - the y value of a pseudo voigt with the current parameters.\n   */\n\n  fct(x) {\n    return PseudoVoigt.fct(x, this.fwhm, this.mu);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999] - required area to be coverage\n   * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n   * @returns {number}\n   */\n  getFactor(area = 0.9999, mu = this.mu) {\n    return PseudoVoigt.getFactor(area, mu);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n  getArea() {\n    return PseudoVoigt.getArea(this.fwhm, { height: this.height, mu: this.mu });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n   * @param {number} width - width between the inflection points\n   * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n   * @returns {number} Full Width at Half Maximum (FMHM).\n   */\n  widthToFWHM(width, mu) {\n    return PseudoVoigt.widthToFWHM(width, mu);\n  }\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @param {number} [mu] - ratio of gaussian contribution.\n   * @returns {number} width between the inflection points.\n   */\n  fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n    return PseudoVoigt.fwhmToWidth(fwhm, mu);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n\n  /**\n   * set a new mu\n   * @param {number} mu - ratio of gaussian contribution.\n   */\n  setMu(mu) {\n    this.mu = mu;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @param {number} [mu=0.5] - ratio of gaussian contribution.\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nPseudoVoigt.fct = function fct(x, fwhm, mu = 0.5) {\n  return (1 - mu) * Lorentzian.fct(x, fwhm) + mu * Gaussian.fct(x, fwhm);\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n * @param {number} width - width between the inflection points\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} Full Width at Half Maximum (FMHM).\n */\nPseudoVoigt.widthToFWHM = function widthToFWHM(width, mu = 0.5) {\n  return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * @param {number} fwhm - Full Width at Half Maximum.\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} width between the inflection points.\n */\nPseudoVoigt.fwhmToWidth = function fwhmToWidth(fwhm, mu = 0.5) {\n  return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @param {number} [options.mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nPseudoVoigt.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1, mu = 0.5 } = options;\n  return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999] - required area to be coverage\n * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n * @returns {number}\n */\nPseudoVoigt.getFactor = function getFactor(area = 0.9999, mu = 0.5) {\n  return mu < 1 ? Lorentzian.getFactor(area) : Gaussian.getFactor(area);\n};\n","import { PseudoVoigt } from 'ml-peak-shape-generator';\n\n/**\n * This function calculates the spectrum as a sum of linear combination of gaussian and lorentzian functions. The pseudo voigt\n * parameters are divided in 4 batches. 1st: centers; 2nd: heights; 3th: widths; 4th: mu's ;\n * @param t Ordinate value\n * @param p Lorentzian parameters\n * @returns {*}\n */\n\nexport function sumOfGaussianLorentzians(p) {\n  return function (t) {\n    let nL = p.length / 4;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result +=\n        p[i + nL] * PseudoVoigt.fct(t - p[i], p[i + nL * 2], p[i + nL * 3]);\n    }\n    return result;\n  };\n}\n","import { Gaussian } from 'ml-peak-shape-generator';\n/**\n * This function calculates the spectrum as a sum of gaussian functions. The Gaussian\n * parameters are divided in 3 batches. 1st: centers; 2nd: height; 3th: widths;\n * @param t Ordinate values\n * @param p Gaussian parameters\n * @returns {*}\n */\n\nexport function sumOfGaussians(p) {\n  return function (t) {\n    let nL = p.length / 3;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result += p[i + nL] * Gaussian.fct(t - p[i], p[i + nL * 2]);\n    }\n    return result;\n  };\n}\n","import { Lorentzian } from 'ml-peak-shape-generator';\n\n/**\n * This function calculates the spectrum as a sum of lorentzian functions. The Lorentzian\n * parameters are divided in 3 batches. 1st: centers; 2nd: heights; 3th: widths;\n * @param t Ordinate values\n * @param p Lorentzian parameters\n * @returns {*}\n */\n\nexport function sumOfLorentzians(p) {\n  return function (t) {\n    let nL = p.length / 3;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result += p[i + nL] * Lorentzian.fct(t - p[i], p[i + nL * 2]);\n    }\n    return result;\n  };\n}\n","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {Array} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(\n  data,\n  parameters,\n  parameterizedFunction,\n  weightSquare,\n) {\n  let error = 0;\n  const func = parameterizedFunction(parameters);\n  for (let i = 0; i < data.x.length; i++) {\n    error += Math.pow(data.y[i] - func(data.x[i]), 2) / weightSquare[i];\n  }\n\n  return error;\n}\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport default min;\n","import isArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport default rescale;\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkIndices,\n  checkNonEmpty,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\nimport gradientFunction from './gradientFunction';\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n  const m = data.x.length;\n\n  let ans = new Matrix(m, 1);\n\n  for (let point = 0; point < m; point++) {\n    ans.set(point, 0, data.y[point] - evaluatedData[point]);\n  }\n  return ans;\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n  data,\n  params,\n  damping,\n  gradientDifference,\n  parameterizedFunction,\n  centralDifference,\n  weights,\n) {\n  let value = damping;\n  let identity = Matrix.eye(params.length, params.length, value);\n\n  const func = parameterizedFunction(params);\n\n  let evaluatedData = new Float64Array(data.x.length);\n  for (let i = 0; i < data.x.length; i++) {\n    evaluatedData[i] = func(data.x[i]);\n  }\n\n  let gradientFunc = gradientFunction(\n    data,\n    evaluatedData,\n    params,\n    gradientDifference,\n    parameterizedFunction,\n    centralDifference,\n  );\n  let residualError = matrixFunction(data, evaluatedData);\n\n  let inverseMatrix = inverse(\n    identity.add(\n      gradientFunc.mmul(\n        gradientFunc.transpose().scale('row', { scale: weights }),\n      ),\n    ),\n  );\n\n  let jacobianWeigthResidualError = gradientFunc.mmul(\n    residualError.scale('row', { scale: weights }),\n  );\n\n  let perturbations = inverseMatrix.mmul(jacobianWeigthResidualError);\n\n  return {\n    perturbations,\n    jacobianWeigthResidualError,\n  };\n}\n","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\n\nexport default function gradientFunction(\n  data,\n  evaluatedData,\n  params,\n  gradientDifference,\n  paramFunction,\n  centralDifference,\n) {\n  const nbParams = params.length;\n  const nbPoints = data.x.length;\n  let ans = Matrix.zeros(nbParams, nbPoints);\n\n  let rowIndex = 0;\n  for (let param = 0; param < nbParams; param++) {\n    if (gradientDifference[param] === 0) continue;\n    let delta = gradientDifference[param];\n    let auxParams = params.slice();\n    auxParams[param] += delta;\n    let funcParam = paramFunction(auxParams);\n    if (!centralDifference) {\n      for (let point = 0; point < nbPoints; point++) {\n        ans.set(\n          rowIndex,\n          point,\n          (evaluatedData[point] - funcParam(data.x[point])) / delta,\n        );\n      }\n    } else {\n      auxParams = params.slice();\n      auxParams[param] -= delta;\n      delta *= 2;\n      let funcParam2 = paramFunction(auxParams);\n      for (let point = 0; point < nbPoints; point++) {\n        ans.set(\n          rowIndex,\n          point,\n          (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta,\n        );\n      }\n    }\n    rowIndex++;\n  }\n\n  return ans;\n}\n","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number|array} [options.weights = 1] - weighting vector, if the length does not match with the number of data points, the vector is reconstructed with first value.\n * @param {number} [options.damping = 1e-2] - Levenberg-Marquardt parameter, small values of the damping parameter λ result in a Gauss-Newton update and large\nvalues of λ result in a gradient descent update\n * @param {number} [options.dampingStepDown = 9] - factor to reduce the damping (Levenberg-Marquardt parameter) when there is not an improvement when updating parameters.\n * @param {number} [options.dampingStepUp = 11] - factor to increase the damping (Levenberg-Marquardt parameter) when there is an improvement when updating parameters.\n * @param {number} [options.improvementThreshold = 1e-3] - the threshold to define an improvement through an update of parameters\n * @param {number|array} [options.gradientDifference = 10e-2] - The step size to approximate the jacobian matrix\n * @param {boolean} [options.centralDifference = false] - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point.\n * @param {number} [options.timeout] - maximum time running before throw in seconds.\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n  data,\n  parameterizedFunction,\n  options = {},\n) {\n  let {\n    checkTimeout,\n    minValues,\n    maxValues,\n    parameters,\n    weightSquare,\n    damping,\n    dampingStepUp,\n    dampingStepDown,\n    maxIterations,\n    errorTolerance,\n    centralDifference,\n    gradientDifference,\n    improvementThreshold,\n  } = checkOptions(data, parameterizedFunction, options);\n\n  let error = errorCalculation(\n    data,\n    parameters,\n    parameterizedFunction,\n    weightSquare,\n  );\n\n  let converged = error <= errorTolerance;\n\n  let iteration = 0;\n  for (; iteration < maxIterations && !converged; iteration++) {\n    let previousError = error;\n\n    let { perturbations, jacobianWeigthResidualError } = step(\n      data,\n      parameters,\n      damping,\n      gradientDifference,\n      parameterizedFunction,\n      centralDifference,\n      weightSquare,\n    );\n\n    for (let k = 0; k < parameters.length; k++) {\n      parameters[k] = Math.min(\n        Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)),\n        maxValues[k],\n      );\n    }\n\n    error = errorCalculation(\n      data,\n      parameters,\n      parameterizedFunction,\n      weightSquare,\n    );\n\n    if (isNaN(error)) break;\n\n    let improvementMetric =\n      (previousError - error) /\n      perturbations\n        .transpose()\n        .mmul(perturbations.mulS(damping).add(jacobianWeigthResidualError))\n        .get(0, 0);\n\n    if (improvementMetric > improvementThreshold) {\n      damping = Math.max(damping / dampingStepDown, 1e-7);\n    } else {\n      error = previousError;\n      damping = Math.min(damping * dampingStepUp, 1e7);\n    }\n\n    if (checkTimeout()) {\n      throw new Error(\n        `The execution time is over to ${options.timeout} seconds`,\n      );\n    }\n\n    converged = error <= errorTolerance;\n  }\n\n  return {\n    parameterValues: parameters,\n    parameterError: error,\n    iterations: iteration,\n  };\n}\n","import isArray from 'is-any-array';\n\nexport default function checkOptions(data, parameterizedFunction, options) {\n  let {\n    timeout,\n    minValues,\n    maxValues,\n    initialValues,\n    weights = 1,\n    damping = 1e-2,\n    dampingStepUp = 11,\n    dampingStepDown = 9,\n    maxIterations = 100,\n    errorTolerance = 1e-7,\n    centralDifference = false,\n    gradientDifference = 10e-2,\n    improvementThreshold = 1e-3,\n  } = options;\n\n  if (damping <= 0) {\n    throw new Error('The damping option must be a positive number');\n  } else if (!data.x || !data.y) {\n    throw new Error('The data parameter must have x and y elements');\n  } else if (\n    !isArray(data.x) ||\n    data.x.length < 2 ||\n    !isArray(data.y) ||\n    data.y.length < 2\n  ) {\n    throw new Error(\n      'The data parameter elements must be an array with more than 2 points',\n    );\n  } else if (data.x.length !== data.y.length) {\n    throw new Error('The data parameter elements must have the same size');\n  }\n\n  let parameters =\n    initialValues || new Array(parameterizedFunction.length).fill(1);\n\n  let nbPoints = data.y.length;\n  let parLen = parameters.length;\n  maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n  minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n  if (maxValues.length !== minValues.length) {\n    throw new Error('minValues and maxValues must be the same size');\n  }\n\n  if (!isArray(parameters)) {\n    throw new Error('initialValues must be an array');\n  }\n\n  if (typeof gradientDifference === 'number') {\n    gradientDifference = new Array(parameters.length).fill(gradientDifference);\n  } else if (isArray(gradientDifference)) {\n    if (gradientDifference.length !== parLen) {\n      gradientDifference = new Array(parLen).fill(gradientDifference[0]);\n    }\n  } else {\n    throw new Error(\n      'gradientDifference should be a number or array with length equal to the number of parameters',\n    );\n  }\n\n  let filler;\n  if (typeof weights === 'number') {\n    let value = 1 / weights ** 2;\n    filler = () => value;\n  } else if (isArray(weights)) {\n    if (weights.length < data.x.length) {\n      let value = 1 / weights[0] ** 2;\n      filler = () => value;\n    } else {\n      filler = (i) => 1 / weights[i] ** 2;\n    }\n  } else {\n    throw new Error(\n      'weights should be a number or array with length equal to the number of data points',\n    );\n  }\n\n  let checkTimeout;\n  if (timeout !== undefined) {\n    if (typeof timeout !== 'number') {\n      throw new Error('timeout should be a number');\n    }\n    let endTime = Date.now() + timeout * 1000;\n    checkTimeout = () => Date.now() > endTime;\n  } else {\n    checkTimeout = () => false;\n  }\n\n  let weightSquare = new Array(data.x.length);\n  for (let i = 0; i < nbPoints; i++) {\n    weightSquare[i] = filler(i);\n  }\n\n  return {\n    checkTimeout,\n    minValues,\n    maxValues,\n    parameters,\n    weightSquare,\n    damping,\n    dampingStepUp,\n    dampingStepDown,\n    maxIterations,\n    errorTolerance,\n    centralDifference,\n    gradientDifference,\n    improvementThreshold,\n  };\n}\n","import LM from 'ml-levenberg-marquardt';\n\nconst LEVENBERG_MARQUARDT = 1;\n\nexport function selectMethod(optimizationOptions = {}) {\n  let { kind, options } = optimizationOptions;\n  kind = getKind(kind);\n  switch (kind) {\n    case LEVENBERG_MARQUARDT:\n      return {\n        algorithm: LM,\n        optimizationOptions: checkOptions(kind, options),\n      };\n    default:\n      throw new Error(`Unknown kind algorithm`);\n  }\n}\n\nfunction checkOptions(kind, options = {}) {\n  // eslint-disable-next-line default-case\n  switch (kind) {\n    case LEVENBERG_MARQUARDT:\n      return Object.assign({}, lmOptions, options);\n  }\n}\n\nfunction getKind(kind) {\n  if (typeof kind !== 'string') return kind;\n  switch (kind.toLowerCase().replace(/[^a-z]/g, '')) {\n    case 'lm':\n    case 'levenbergmarquardt':\n      return LEVENBERG_MARQUARDT;\n    default:\n      throw new Error(`Unknown kind algorithm`);\n  }\n}\n\nconst lmOptions = {\n  damping: 1.5,\n  maxIterations: 100,\n  errorTolerance: 1e-8,\n};\n","import { checkInput } from './checkInput';\nimport { selectMethod } from './selectMethod';\n\n// const STATE_INIT = 0;\n// const STATE_MIN = 1;\n// const STATE_MAX = 2;\n// const STATE_GRADIENT_DIFFERENCE = 3;\n\n// const X = 0;\n// const Y = 1;\n// const WIDTH = 2;\n// const MU = 3;\n\n// const keys = ['x', 'y', 'width', 'mu'];\n/**\n * Fits a set of points to the sum of a set of bell functions.\n * @param {object} data - An object containing the x and y data to be fitted.\n * @param {array} peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}]\n * @param {object} [options.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string} [options.shape.kind = 'gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {object} [options.optimization = {}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {object} [options.optimization.kind = 'lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object} [options.optimization.parameters] - options of each parameter to be optimized e.g. For a gaussian shape\n *  it could have x, y and with properties, each of which could contain init, min, max and gradientDifference, those options will define the guess,\n *  the min and max value of the parameter (search space) and the step size to approximate the jacobian matrix respectively. Those options could be a number,\n *  array of numbers, callback, or array of callbacks. Each kind of shape has default parameters so it could be undefined.\n * @param {object} [options.optimization.parameters.x] - options for x parameter.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.init] - definition of the starting point of the parameter (the guess),\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the guess of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.min] - definition of the lower limit of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the min of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.max] - definition of the upper limit of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the max of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.gradientDifference] - definition of  the step size to approximate the jacobian matrix of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the gradientDifference of the first peak and so on.\n * @param {object} [options.optimization.options = {}] - options for the specific kind of algorithm.\n * @param {number} [options.optimization.options.timeout] - maximum time running before break in seconds.\n * @param {number} [options.optimization.options.damping=1.5]\n * @param {number} [options.optimization.options.maxIterations=100]\n * @param {number} [options.optimization.options.errorTolerance=1e-8]\n * @returns {object} - A object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peakList, options = {}) {\n  const { y, x, maxY, peaks, paramsFunc, optimization } = checkInput(\n    data,\n    peakList,\n    options,\n  );\n\n  let parameters = optimization.parameters;\n\n  let nbShapes = peaks.length;\n  let parameterKey = Object.keys(parameters);\n  let nbParams = nbShapes * parameterKey.length;\n  let pMin = new Float64Array(nbParams);\n  let pMax = new Float64Array(nbParams);\n  let pInit = new Float64Array(nbParams);\n  let gradientDifference = new Float64Array(nbParams);\n\n  for (let i = 0; i < nbShapes; i++) {\n    let peak = peaks[i];\n    for (let k = 0; k < parameterKey.length; k++) {\n      let key = parameterKey[k];\n      let init = parameters[key].init;\n      let min = parameters[key].min;\n      let max = parameters[key].max;\n      let gradientDifferenceValue = parameters[key].gradientDifference;\n      pInit[i + k * nbShapes] = init[i % init.length](peak);\n      pMin[i + k * nbShapes] = min[i % min.length](peak);\n      pMax[i + k * nbShapes] = max[i % max.length](peak);\n      gradientDifference[i + k * nbShapes] = gradientDifferenceValue[\n        i % gradientDifferenceValue.length\n      ](peak);\n    }\n  }\n\n  let { algorithm, optimizationOptions } = selectMethod(optimization);\n\n  optimizationOptions.minValues = pMin;\n  optimizationOptions.maxValues = pMax;\n  optimizationOptions.initialValues = pInit;\n  optimizationOptions.gradientDifference = gradientDifference;\n\n  let pFit = algorithm({ x, y }, paramsFunc, optimizationOptions);\n\n  let { parameterError: error, iterations } = pFit;\n  let result = { error, iterations, peaks };\n  for (let i = 0; i < nbShapes; i++) {\n    pFit.parameterValues[i + nbShapes] *= maxY;\n    for (let k = 0; k < parameterKey.length; k++) {\n      // we modify the optimized parameters\n      peaks[i][parameterKey[k]] = pFit.parameterValues[i + k * nbShapes];\n    }\n  }\n\n  return result;\n}\n","import assignDeep from 'assign-deep';\nimport getMaxValue from 'ml-array-max';\n\nimport { sumOfGaussianLorentzians } from './shapes/sumOfGaussianLorentzians';\nimport { sumOfGaussians } from './shapes/sumOfGaussians';\nimport { sumOfLorentzians } from './shapes/sumOfLorentzians';\n\nexport function checkInput(data, peaks, options) {\n  let {\n    shape = { kind: 'gaussian' },\n    optimization = {\n      kind: 'lm',\n    },\n  } = options;\n\n  if (typeof shape.kind !== 'string') {\n    throw new Error('kind should be a string');\n  }\n\n  let kind = shape.kind.toLowerCase().replace(/[^a-z]/g, '');\n\n  let paramsFunc;\n  let defaultParameters;\n  switch (kind) {\n    case 'gaussian':\n      paramsFunc = sumOfGaussians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n      };\n      break;\n    case 'lorentzian':\n      paramsFunc = sumOfLorentzians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n      };\n      break;\n    case 'pseudovoigt':\n      paramsFunc = sumOfGaussianLorentzians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        mu: {\n          init: (peak) => (peak.mu !== undefined ? peak.mu : 0.5),\n          min: () => 0,\n          max: () => 1,\n          gradientDifference: () => 0.01,\n        },\n      };\n      break;\n    default:\n      throw new Error('kind of shape is not supported');\n  }\n\n  let x = data.x;\n  let maxY = getMaxValue(data.y);\n  let y = new Array(x.length);\n  for (let i = 0; i < x.length; i++) {\n    y[i] = data.y[i] / maxY;\n  }\n\n  for (let i = 0; i < peaks.length; i++) {\n    peaks[i].y /= maxY;\n  }\n\n  let parameters = assignDeep({}, optimization.parameters, defaultParameters);\n\n  for (let key in parameters) {\n    for (let par in parameters[key]) {\n      if (!Array.isArray(parameters[key][par])) {\n        parameters[key][par] = [parameters[key][par]];\n      }\n      if (\n        parameters[key][par].length !== 1 &&\n        parameters[key][par].length !== peaks.length\n      ) {\n        throw new Error(`The length of ${key}-${par} is not correct`);\n      }\n      for (let index = 0; index < parameters[key][par].length; index++) {\n        if (typeof parameters[key][par][index] === 'number') {\n          let value = parameters[key][par][index];\n          parameters[key][par][index] = () => value;\n        }\n      }\n    }\n  }\n\n  optimization.parameters = parameters;\n\n  return {\n    y,\n    x,\n    maxY,\n    peaks,\n    paramsFunc,\n    optimization,\n  };\n}\n"],"names":["toString","Object","prototype","isEnumerable","propertyIsEnumerable","getSymbols","getOwnPropertySymbols","target","args","val","call","Array","isArray","TypeError","length","Symbol","arg","names","key","isValidKey","assign","module","i","isObject","keys","assignSymbols","isAnyArray","object","endsWith","max","input","options","arguments","undefined","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","Error","maxValue","GAUSSIAN_EXP_FACTOR","Math","LN2","ROOT_PI_OVER_LN2","sqrt","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","Gaussian","constructor","fwhm","sd","widthToFWHM","height","this","getData","factor","getFactor","min","ceil","pow","center","data","Float64Array","fct","x","area","getArea","width","fwhmToWidth","setFWHM","setHeight","exp","ln1MinusXSqrd","log","lnEtcBy2Plus2","firstSqrt","erfinv","Lorentzian","squareFWHM","tan","PseudoVoigt","mu","setMu","sumOfGaussianLorentzians","p","t","nL","result","sumOfGaussians","sumOfLorentzians","errorCalculation","parameters","parameterizedFunction","weightSquare","error","func","y","minValue","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","name","rows","columns","maxI","maxJ","line","j","push","formatNumber","get","join","inspectData","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","e","slice","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","r","from","checkColumnIndices","columnIndices","c","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","value","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","fill","random","interval","round","zeros","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","NaN","v","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","first","last","flipColumns","kroneckerProduct","q","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","size","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","identity","eye","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","floor","fround","log1p","log10","log2","sign","sin","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","X","determinant","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","tol","ii","useSVD","leftHandSide","rightHandSide","step","params","damping","gradientDifference","centralDifference","weights","evaluatedData","gradientFunc","paramFunction","nbParams","nbPoints","ans","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeigthResidualError","perturbations","levenbergMarquardt","checkTimeout","minValues","maxValues","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","improvementThreshold","timeout","initialValues","filler","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","endTime","Date","now","checkOptions","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","kind","toLowerCase","replace","getKind","algorithm","LM","lmOptions","peakList","maxY","peaks","paramsFunc","optimization","defaultParameters","shape","init","peak","getMaxValue","assignDeep","par","checkInput","nbShapes","parameterKey","pMin","pMax","pInit","gradientDifferenceValue","pFit"],"mappings":"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"}