{"version":3,"file":"ml-gsd.min.js","sources":["../node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/src/classes/Gaussian2D.js","../node_modules/ml-savitzky-golay-generalized/src/index.js","../src/gsd.js","../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-spectra-fitting/src/shapes/sumOfGaussianLorentzians.js","../node_modules/ml-spectra-fitting/src/shapes/sumOfGaussians.js","../node_modules/ml-spectra-fitting/src/shapes/sumOfLorentzians.js","../node_modules/ml-levenberg-marquardt/node_modules/is-any-array/src/index.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","../node_modules/ml-spectra-fitting/src/selectMethod.js","../node_modules/ml-spectra-fitting/src/index.js","../node_modules/ml-spectra-fitting/src/checkInput.js","../node_modules/ml-spectra-processing/src/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/src/x/xGetFromToIndex.js","../src/post/broadenPeaks.js","../node_modules/ml-peak-shape-generator/src/util/getShapeGenerator.js","../src/post/joinBroadPeaks.js","../src/post/optimizePeaks.js","../src/post/groupPeaks.js"],"sourcesContent":["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","// 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 {\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=4*LN2/(PI*FWHM)] 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","import { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=2/(PI*FWHM)] 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=1/(mu*FWHM/sqrt(4*LN2/PI)+(1-mu)*fwhm*PI*0.5)] 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 { ROOT_2LN2, GAUSSIAN_EXP_FACTOR } from '../util/constants';\nimport erfinv from '../util/erfinv';\n\nlet axis = ['x', 'y'];\n\nexport class Gaussian2D {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=4*LN2/(PI*xFWHM*yFWHM)] 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 used if x or y has not the fwhm property.\n   * @param {object} [options.x] - Options for x axis.\n   * @param {number} [options.x.fwhm = fwhm] - Full Width at Half Maximum in the number of points in FWHM for x axis.\n   * @param {number} [options.x.sd] - Standard deviation for x axis, if it's defined options.x.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   * @param {object} [options.y] - Options for y axis.\n   * @param {number} [options.y.fwhm = fwhm] - Full Width at Half Maximum in the number of points in FWHM for y axis.\n   * @param {number} [options.y.sd] - Standard deviation for y axis, if it's defined options.y.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    let { fwhm: globalFWHM = 500 } = options;\n\n    for (let i of axis) {\n      let fwhm;\n      if (!options[i]) {\n        fwhm = globalFWHM;\n      } else {\n        fwhm = options[i].sd\n          ? Gaussian2D.widthToFWHM(2 * options[i].sd)\n          : options[i].fwhm || globalFWHM;\n      }\n      this[i] = { fwhm };\n    }\n\n    this.height =\n      options.height === undefined\n        ? -GAUSSIAN_EXP_FACTOR / Math.PI / this.x.fwhm / this.y.fwhm\n        : options.height;\n  }\n  /**\n   * Calculate a Gaussian2D shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {object} [options.x] - parameter for x axis.\n   * @param {number} [options.x.length=fwhm*factor+1] - length on x axis.\n   * @param {number} [options.x.factor=factor] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {object} [options.y] - parameter for y axis.\n   * @param {number} [options.y.length=fwhm*factor+1] - length on y axis.\n   * @param {number} [options.y.factor=factor] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @return {Array<Float64Array>} - z values.\n   */\n\n  getData(options = {}) {\n    let { x = {}, y = {}, factor = this.getFactor(), length } = options;\n\n    let xLength = x.length || length;\n    if (!xLength) {\n      let { factor: xFactor = factor } = x;\n      xLength = Math.min(Math.ceil(this.x.fwhm * xFactor), Math.pow(2, 25) - 1);\n      if (xLength % 2 === 0) xLength++;\n    }\n\n    let yLength = y.length || length;\n    if (!yLength) {\n      let { factor: yFactor = factor } = y;\n      yLength = Math.min(Math.ceil(this.y.fwhm * yFactor), Math.pow(2, 25) - 1);\n      if (yLength % 2 === 0) yLength++;\n    }\n\n    const xCenter = (xLength - 1) / 2;\n    const yCenter = (yLength - 1) / 2;\n    const data = new Array(xLength);\n    for (let i = 0; i < xLength; i++) {\n      data[i] = new Array(yLength);\n    }\n\n    for (let i = 0; i < xLength; i++) {\n      for (let j = 0; j < yLength; j++) {\n        data[i][j] = this.fct(i - xCenter, j - yCenter) * this.height;\n      }\n    }\n\n    return data;\n  }\n\n  /**\n   * Return the intensity value of a 2D gaussian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @param {number} y - y value to calculate.\n   * @returns {number} - the z value of bi-dimensional gaussian with the current parameters.\n   */\n  fct(x, y) {\n    return Gaussian2D.fct(x, y, this.x.fwhm, this.y.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific volume coverage.\n   * @param {number} [volume=0.9999]\n   * @returns {number}\n   */\n  getFactor(volume = 0.9999) {\n    return Gaussian2D.getFactor(volume);\n  }\n\n  /**\n   * Calculate the volume of the shape.\n   * @returns {number} - returns the volume.\n   */\n\n  getVolume() {\n    return Gaussian2D.getVolume(this.x.fwhm, this.y.fwhm, {\n      height: this.height,\n    });\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/Gaussian2DFunction.html\n   * @param {number} width - Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    //https://mathworld.wolfram.com/Gaussian2DFunction.html\n    return Gaussian2D.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/Gaussian2DFunction.html\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @returns {number} width\n   */\n  fwhmToWidth(fwhm = this.x.fwhm) {\n    return Gaussian2D.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   * @param {string|Array<string>} axisLabel - label of axis, if it is undefined fwhm is set to both axis.\n   */\n  setFWHM(fwhm, axisLabel) {\n    if (!axisLabel) axisLabel = axis;\n    if (!Array.isArray(axisLabel)) axisLabel = [axisLabel];\n    for (let i of axisLabel) {\n      let axisName = i.toLowerCase();\n      if (axisName !== 'y' && axisName !== 'x') {\n        throw new Error('axis label should be x or y');\n      }\n      this[axisName].fwhm = fwhm;\n    }\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 Gaussian2D shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} y - y value to calculate.\n * @param {number} fwhmX - full width half maximum in the x axis.\n * @param {number} fwhmY - full width half maximum in the y axis.\n * @returns {number} - the z value of bi-dimensional gaussian with the current parameters.\n */\nGaussian2D.fct = function fct(x, y, xFWHM = 500, yFWHM = 500) {\n  return Math.exp(\n    GAUSSIAN_EXP_FACTOR * (Math.pow(x / xFWHM, 2) + Math.pow(y / yFWHM, 2)),\n  );\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/Gaussian2DFunction.html\n * @param {number} width - Width between the inflection points\n * @returns {number} fwhm\n */\nGaussian2D.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/Gaussian2DFunction.html\n * @param {number} fwhm - Full Width at Half Maximum.\n * @returns {number} width\n */\nGaussian2D.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_2LN2;\n};\n\n/**\n * Calculate the volume of a specific shape.\n * @param {number} xFWHM - Full width at half maximum for x axis.\n * @param {number} yFWHM - Full width at half maximum for y axis.\n * @param {object} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum z value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\n\nGaussian2D.getVolume = function getVolume(xFWHM, yFWHM, options = {}) {\n  let { height = 1 } = options;\n  return (height * Math.PI * xFWHM * yFWHM) / Math.LN2 / 4;\n};\n\n/**@TODO look for a better factor\n * Calculate the number of times FWHM allows to reach a specific volume coverage.\n * @param {number} [volume=0.9999]\n * @returns {number}\n */\nGaussian2D.getFactor = function getFactor(volume = 0.9999) {\n  return Math.sqrt(2) * erfinv(volume);\n};\n","/**\n * Apply Savitzky Golay algorithm\n * @param {array} [ys] Array of y values\n * @param {array|number} [xs] Array of X or deltaX\n * @param {object} [options={}]\n * @param {number} [options.windowSize=9]\n * @param {number} [options.derivative=0]\n * @param {number} [options.polynomial=3]\n * @return {array} Array containing the new ys (same length)\n */\n\nexport default function SavitzkyGolay(ys, xs, options = {}) {\n  let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n\n  if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n    throw new RangeError(\n      'Invalid window size (should be odd and at least 5 integer number)',\n    );\n  }\n  if (windowSize > ys.length) {\n    throw new RangeError(\n      `Window size is higher than the data length ${windowSize}>${ys.length}`,\n    );\n  }\n  if (derivative < 0 || !Number.isInteger(derivative)) {\n    throw new RangeError('Derivative should be a positive integer');\n  }\n  if (polynomial < 1 || !Number.isInteger(polynomial)) {\n    throw new RangeError('Polynomial should be a positive integer');\n  }\n  if (polynomial >= 6) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      'You should not use polynomial grade higher than 5 if you are' +\n        ' not sure that your data arises from such a model. Possible polynomial oscillation problems',\n    );\n  }\n\n  let half = Math.floor(windowSize / 2);\n  let np = ys.length;\n  let ans = new Array(np);\n  let weights = fullWeights(windowSize, polynomial, derivative);\n  let hs = 0;\n  let constantH = true;\n  if (Array.isArray(xs)) {\n    constantH = false;\n  } else {\n    hs = Math.pow(xs, derivative);\n  }\n\n  //For the borders\n  for (let i = 0; i < half; i++) {\n    let wg1 = weights[half - i - 1];\n    let wg2 = weights[half + i + 1];\n    let d1 = 0;\n    let d2 = 0;\n    for (let l = 0; l < windowSize; l++) {\n      d1 += wg1[l] * ys[l];\n      d2 += wg2[l] * ys[np - windowSize + l];\n    }\n    if (constantH) {\n      ans[half - i - 1] = d1 / hs;\n      ans[np - half + i] = d2 / hs;\n    } else {\n      hs = getHs(xs, half - i - 1, half, derivative);\n      ans[half - i - 1] = d1 / hs;\n      hs = getHs(xs, np - half + i, half, derivative);\n      ans[np - half + i] = d2 / hs;\n    }\n  }\n\n  //For the internal points\n  let wg = weights[half];\n  for (let i = windowSize; i <= np; i++) {\n    let d = 0;\n    for (let l = 0; l < windowSize; l++) d += wg[l] * ys[l + i - windowSize];\n    if (!constantH) hs = getHs(xs, i - half - 1, half, derivative);\n    ans[i - half - 1] = d / hs;\n  }\n  return ans;\n}\n\nfunction getHs(h, center, half, derivative) {\n  let hs = 0;\n  let count = 0;\n  for (let i = center - half; i < center + half; i++) {\n    if (i >= 0 && i < h.length - 1) {\n      hs += h[i + 1] - h[i];\n      count++;\n    }\n  }\n  return Math.pow(hs / count, derivative);\n}\n\nfunction GramPoly(i, m, k, s) {\n  let Grampoly = 0;\n  if (k > 0) {\n    Grampoly =\n      ((4 * k - 2) / (k * (2 * m - k + 1))) *\n        (i * GramPoly(i, m, k - 1, s) + s * GramPoly(i, m, k - 1, s - 1)) -\n      (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n        GramPoly(i, m, k - 2, s);\n  } else {\n    if (k === 0 && s === 0) {\n      Grampoly = 1;\n    } else {\n      Grampoly = 0;\n    }\n  }\n  return Grampoly;\n}\n\nfunction GenFact(a, b) {\n  let gf = 1;\n  if (a >= b) {\n    for (let j = a - b + 1; j <= a; j++) {\n      gf *= j;\n    }\n  }\n  return gf;\n}\n\nfunction Weight(i, t, m, n, s) {\n  let sum = 0;\n  for (let k = 0; k <= n; k++) {\n    //console.log(k);\n    sum +=\n      (2 * k + 1) *\n      (GenFact(2 * m, k) / GenFact(2 * m + k + 1, k + 1)) *\n      GramPoly(i, m, k, 0) *\n      GramPoly(t, m, k, s);\n  }\n  return sum;\n}\n\n/**\n *\n * @param m  Number of points\n * @param n  Polynomial grade\n * @param s  Derivative\n */\nfunction fullWeights(m, n, s) {\n  let weights = new Array(m);\n  let np = Math.floor(m / 2);\n  for (let t = -np; t <= np; t++) {\n    weights[t + np] = new Array(m);\n    for (let j = -np; j <= np; j++) {\n      weights[t + np][j + np] = Weight(j, t, np, n, s);\n    }\n  }\n  return weights;\n}\n\n/*function entropy(data,h,options){\n    var trend = SavitzkyGolay(data,h,trendOptions);\n    var copy = new Array(data.length);\n    var sum = 0;\n    var max = 0;\n    for(var i=0;i<data.length;i++){\n        copy[i] = data[i]-trend[i];\n    }\n\n    sum/=data.length;\n    console.log(sum+\" \"+max);\n    console.log(stat.array.standardDeviation(copy));\n    console.log(Math.abs(stat.array.mean(copy))/stat.array.standardDeviation(copy));\n    return sum;\n\n}\n\n\n\nfunction guessWindowSize(data, h){\n    console.log(\"entropy \"+entropy(data,h,trendOptions));\n    return 5;\n}\n*/\n","import { getShapeGenerator } from 'ml-peak-shape-generator';\nimport SG from 'ml-savitzky-golay-generalized';\n\n/**\n * Global spectra deconvolution\n * @param {object} data - Object data with x and y arrays\n * @param {Array<number>} [data.x] - Independent variable\n * @param {Array<number>} [data.y] - Dependent variable\n * @param {object} [options={}] - Options object\n * @param {object} [options.shape={}] - Object that specified the kind of shape to calculate the FWHM instead of width between inflection points. see https://mljs.github.io/peak-shape-generator/#inflectionpointswidthtofwhm\n * @param {object} [options.shape.kind='gaussian']\n * @param {object} [options.shape.options={}]\n * @param {object} [options.sgOptions] - Options object for Savitzky-Golay filter. See https://github.com/mljs/savitzky-golay-generalized#options\n * @param {number} [options.sgOptions.windowSize = 9] - points to use in the approximations\n * @param {number} [options.sgOptions.polynomial = 3] - degree of the polynomial to use in the approximations\n * @param {number} [options.minMaxRatio = 0.00025] - Threshold to determine if a given peak should be considered as a noise\n * @param {number} [options.broadRatio = 0.00] - If `broadRatio` is higher than 0, then all the peaks which second derivative\n * smaller than `broadRatio * maxAbsSecondDerivative` will be marked with the soft mask equal to true.\n * @param {number} [options.noiseLevel = 0] - Noise threshold in spectrum units\n * @param {boolean} [options.maxCriteria = true] - Peaks are local maximum(true) or minimum(false)\n * @param {boolean} [options.smoothY = true] - Select the peak intensities from a smoothed version of the independent variables\n * @param {boolean} [options.realTopDetection = false] - Use a quadratic optimizations with the peak and its 3 closest neighbors\n * to determine the true x,y values of the peak?\n * @param {number} [options.heightFactor = 0] - Factor to multiply the calculated height (usually 2)\n * @param {number} [options.derivativeThreshold = -1] - Filters based on the amplitude of the first derivative\n * @return {Array<object>}\n */\nexport function gsd(data, options = {}) {\n  let {\n    noiseLevel,\n    sgOptions = {\n      windowSize: 9,\n      polynomial: 3,\n    },\n    shape = {},\n    smoothY = true,\n    heightFactor = 0,\n    broadRatio = 0.0,\n    maxCriteria = true,\n    minMaxRatio = 0.00025,\n    derivativeThreshold = -1,\n    realTopDetection = false,\n  } = options;\n\n  let { y: yIn, x } = data;\n\n  const y = yIn.slice();\n  let equalSpaced = isEqualSpaced(x);\n\n  if (noiseLevel === undefined) {\n    noiseLevel = equalSpaced ? getNoiseLevel(y) : 0;\n  }\n\n  const yCorrection = { m: 1, b: noiseLevel };\n\n  if (!maxCriteria) {\n    yCorrection.m = -1;\n    yCorrection.b *= -1;\n  }\n\n  for (let i = 0; i < y.length; i++) {\n    y[i] = yCorrection.m * y[i] - yCorrection.b;\n  }\n\n  for (let i = 0; i < y.length; i++) {\n    if (y[i] < 0) {\n      y[i] = 0;\n    }\n  }\n  // If the max difference between delta x is less than 5%, then,\n  // we can assume it to be equally spaced variable\n  let yData = y;\n  let dY, ddY;\n  const { windowSize, polynomial } = sgOptions;\n\n  if (equalSpaced) {\n    if (smoothY) {\n      yData = SG(y, x[1] - x[0], {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  } else {\n    if (smoothY) {\n      yData = SG(y, x, {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  }\n\n  const xData = x;\n  const dX = x[1] - x[0];\n  let maxDdy = 0;\n  let maxY = 0;\n  for (let i = 0; i < yData.length; i++) {\n    if (Math.abs(ddY[i]) > maxDdy) {\n      maxDdy = Math.abs(ddY[i]);\n    }\n    if (Math.abs(yData[i]) > maxY) {\n      maxY = Math.abs(yData[i]);\n    }\n  }\n\n  let lastMax = null;\n  let lastMin = null;\n  let minddY = [];\n  let intervalL = [];\n  let intervalR = [];\n  let broadMask = [];\n\n  // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n  for (let i = 1; i < yData.length - 1; ++i) {\n    // filter based on derivativeThreshold\n    // console.log('pasa', y[i], dY[i], ddY[i]);\n    if (Math.abs(dY[i]) > derivativeThreshold) {\n      // Minimum in first derivative\n      if (\n        (dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n        (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])\n      ) {\n        lastMin = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX > 0 && lastMax !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n\n      // Maximum in first derivative\n      if (\n        (dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n        (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])\n      ) {\n        lastMax = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX < 0 && lastMin !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n    }\n\n    // Minimum in second derivative\n    if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n      minddY.push(i);\n      broadMask.push(Math.abs(ddY[i]) <= broadRatio * maxDdy);\n    }\n  }\n\n  let widthProcessor = shape.kind\n    ? getShapeGenerator(shape.kind, shape.options).widthToFWHM\n    : (x) => x;\n\n  let signals = [];\n  let lastK = -1;\n  let possible, frequency, distanceJ, minDistance, gettingCloser;\n  for (let j = 0; j < minddY.length; ++j) {\n    frequency = xData[minddY[j]];\n    possible = -1;\n    let k = lastK + 1;\n    minDistance = Number.MAX_VALUE;\n    distanceJ = 0;\n    gettingCloser = true;\n    while (possible === -1 && k < intervalL.length && gettingCloser) {\n      distanceJ = Math.abs(frequency - (intervalL[k].x + intervalR[k].x) / 2);\n\n      // Still getting closer?\n      if (distanceJ < minDistance) {\n        minDistance = distanceJ;\n      } else {\n        gettingCloser = false;\n      }\n      if (distanceJ < Math.abs(intervalL[k].x - intervalR[k].x) / 2) {\n        possible = k;\n        lastK = k;\n      }\n      ++k;\n    }\n\n    if (possible !== -1) {\n      if (Math.abs(yData[minddY[j]]) > minMaxRatio * maxY) {\n        let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n        signals.push({\n          index: minddY[j],\n          x: frequency,\n          y: (yData[minddY[j]] + yCorrection.b) / yCorrection.m,\n          width: widthProcessor(width),\n          soft: broadMask[j],\n        });\n\n        signals[signals.length - 1].left = intervalL[possible];\n        signals[signals.length - 1].right = intervalR[possible];\n\n        if (heightFactor) {\n          let yLeft = yData[intervalL[possible].index];\n          let yRight = yData[intervalR[possible].index];\n          signals[signals.length - 1].height =\n            heightFactor *\n            (signals[signals.length - 1].y - (yLeft + yRight) / 2);\n        }\n      }\n    }\n  }\n\n  if (realTopDetection) {\n    determineRealTop(signals, xData, yData);\n  }\n\n  // Correct the values to fit the original spectra data\n  for (let j = 0; j < signals.length; j++) {\n    signals[j].base = noiseLevel;\n  }\n\n  signals.sort(function (a, b) {\n    return a.x - b.x;\n  });\n\n  return signals;\n}\n\nconst isEqualSpaced = (x) => {\n  let tmp;\n  let maxDx = 0;\n  let minDx = Number.MAX_SAFE_INTEGER;\n  for (let i = 0; i < x.length - 1; ++i) {\n    tmp = Math.abs(x[i + 1] - x[i]);\n    if (tmp < minDx) {\n      minDx = tmp;\n    }\n    if (tmp > maxDx) {\n      maxDx = tmp;\n    }\n  }\n  return (maxDx - minDx) / maxDx < 0.05;\n};\n\nconst getNoiseLevel = (y) => {\n  let mean = 0;\n\n  let stddev = 0;\n  let length = y.length;\n  for (let i = 0; i < length; ++i) {\n    mean += y[i];\n  }\n  mean /= length;\n  let averageDeviations = new Array(length);\n  for (let i = 0; i < length; ++i) {\n    averageDeviations[i] = Math.abs(y[i] - mean);\n  }\n  averageDeviations.sort((a, b) => a - b);\n  if (length % 2 === 1) {\n    stddev = averageDeviations[(length - 1) / 2] / 0.6745;\n  } else {\n    stddev =\n      (0.5 *\n        (averageDeviations[length / 2] + averageDeviations[length / 2 - 1])) /\n      0.6745;\n  }\n\n  return stddev;\n};\n\nconst determineRealTop = (peakList, x, y) => {\n  let alpha, beta, gamma, p, currentPoint;\n  for (let j = 0; j < peakList.length; j++) {\n    currentPoint = peakList[j].index; // peakList[j][2];\n    // The detected peak could be moved 1 or 2 units to left or right.\n    if (\n      y[currentPoint - 1] >= y[currentPoint - 2] &&\n      y[currentPoint - 1] >= y[currentPoint]\n    ) {\n      currentPoint--;\n    } else {\n      if (\n        y[currentPoint + 1] >= y[currentPoint] &&\n        y[currentPoint + 1] >= y[currentPoint + 2]\n      ) {\n        currentPoint++;\n      } else {\n        if (\n          y[currentPoint - 2] >= y[currentPoint - 3] &&\n          y[currentPoint - 2] >= y[currentPoint - 1]\n        ) {\n          currentPoint -= 2;\n        } else {\n          if (\n            y[currentPoint + 2] >= y[currentPoint + 1] &&\n            y[currentPoint + 2] >= y[currentPoint + 3]\n          ) {\n            currentPoint += 2;\n          }\n        }\n      }\n    }\n    // interpolation to a sin() function\n    if (\n      y[currentPoint - 1] > 0 &&\n      y[currentPoint + 1] > 0 &&\n      y[currentPoint] >= y[currentPoint - 1] &&\n      y[currentPoint] >= y[currentPoint + 1] &&\n      (y[currentPoint] !== y[currentPoint - 1] ||\n        y[currentPoint] !== y[currentPoint + 1])\n    ) {\n      alpha = 20 * Math.log10(y[currentPoint - 1]);\n      beta = 20 * Math.log10(y[currentPoint]);\n      gamma = 20 * Math.log10(y[currentPoint + 1]);\n      p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n      // console.log(alpha, beta, gamma, `p: ${p}`);\n      // console.log(x[currentPoint]+\" \"+tmp+\" \"+currentPoint);\n      peakList[j].x =\n        x[currentPoint] + (x[currentPoint] - x[currentPoint - 1]) * p;\n      peakList[j].y =\n        y[currentPoint] -\n        0.25 * (y[currentPoint - 1] - y[currentPoint + 1]) * p;\n    }\n  }\n};\n","/*!\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","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","const toString = Object.prototype.toString;\r\n\r\nexport default function isAnyArray(object) {\r\n  return toString.call(object).endsWith('Array]');\r\n}\r\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  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","import { 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","/**\n * Returns the closest index of a `target` in an ordered array\n * @param {array<Number>} array\n * @param {number} target\n */\n\nexport function xFindClosestIndex(array, target) {\n  let low = 0;\n  let high = array.length - 1;\n  let middle = 0;\n  while (high - low > 1) {\n    middle = low + ((high - low) >> 1);\n    if (array[middle] < target) {\n      low = middle;\n    } else if (array[middle] > target) {\n      high = middle;\n    } else {\n      return middle;\n    }\n  }\n\n  if (low < array.length - 1) {\n    if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n      return low;\n    } else {\n      return low + 1;\n    }\n  } else {\n    return low;\n  }\n}\n","import { xFindClosestIndex } from './xFindClosestIndex';\n\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param {array} x\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n */\n\nexport function xGetFromToIndex(x, options = {}) {\n  let { fromIndex, toIndex, from, to } = options;\n\n  if (fromIndex === undefined) {\n    if (from !== undefined) {\n      fromIndex = xFindClosestIndex(x, from);\n    } else {\n      fromIndex = 0;\n    }\n  }\n  if (toIndex === undefined) {\n    if (to !== undefined) {\n      toIndex = xFindClosestIndex(x, to);\n    } else {\n      toIndex = x.length - 1;\n    }\n  }\n  if (fromIndex > toIndex) [fromIndex, toIndex] = [toIndex, fromIndex];\n  return { fromIndex, toIndex };\n}\n","/**\n * This method will allow to enlarge peaks and prevent overlap between peaks\n * Because peaks may not be symmetric after we add 2 properties, from and to.\n * @param {Array} peakList\n * @param {object} [options={}]\n * @param {number} [options.factor=2]\n * @param {boolean} [options.overlap=false] by default we don't allow overlap\n * @return {Array} peakList\n */\nexport function broadenPeaks(peakList, options = {}) {\n  const { factor = 2, overlap = false } = options;\n\n  for (let peak of peakList) {\n    if (!peak.right || !peak.left) {\n      peak.from = peak.x - (peak.width / 2) * factor;\n      peak.to = peak.x + (peak.width / 2) * factor;\n    } else {\n      peak.from = peak.x - (peak.x - peak.left.x) * factor;\n      peak.to = peak.x + (peak.right.x - peak.x) * factor;\n    }\n  }\n\n  if (!overlap) {\n    for (let i = 0; i < peakList.length - 1; i++) {\n      let peak = peakList[i];\n      let nextPeak = peakList[i + 1];\n      if (peak.to > nextPeak.from) {\n        peak.to = nextPeak.from = (peak.to + nextPeak.from) / 2;\n      }\n    }\n  }\n\n  for (let peak of peakList) {\n    peak.width = peak.to - peak.from;\n  }\n\n  return peakList;\n}\n","import { Gaussian } from '../classes/Gaussian';\nimport { Gaussian2D } from '../classes/Gaussian2D';\nimport { Lorentzian } from '../classes/Lorentzian';\nimport { PseudoVoigt } from '../classes/PseudoVoigt';\n\nexport function getShapeGenerator(options) {\n  let { kind = 'Gaussian', options: shapeOptions } = options;\n  switch (kind.toLowerCase().replace(/[^a-z^0-9]/g, '')) {\n    case 'gaussian':\n      return new Gaussian(shapeOptions);\n    case 'lorentzian':\n      return new Lorentzian(shapeOptions);\n    case 'pseudovoigt':\n      return new PseudoVoigt(shapeOptions);\n    case 'gaussian2d':\n      return new Gaussian2D(shapeOptions);\n    default:\n      throw new Error(`Unknown kind: ${kind}`);\n  }\n}\n","import { optimize } from 'ml-spectra-fitting';\n\n/**\n * This function try to join the peaks that seems to belong to a broad signal in a single broad peak.\n * @param {Array} peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}] - options\n * @param {number} [options.width=0.25] - width limit to join peaks.\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 {string} [options.optimization.kind = 'lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {number} [options.optimization.options.timeout = 10] - maximum time running before break in seconds.\n * @param {object} [options.optimization.options = {}] - options for the specific kind of algorithm.\n */\nexport function joinBroadPeaks(peakList, options = {}) {\n  let {\n    width = 0.25,\n    shape = { kind: 'gaussian' },\n    optimization = { kind: 'lm', timeout: 10 },\n  } = options;\n  let broadLines = [];\n  // Optimize the possible broad lines\n  let max = 0;\n\n  let maxI = 0;\n\n  let count = 1;\n  for (let i = peakList.length - 1; i >= 0; i--) {\n    if (peakList[i].soft) {\n      broadLines.push(peakList.splice(i, 1)[0]);\n    }\n  }\n  // Push a feke peak\n  broadLines.push({ x: Number.MAX_VALUE });\n\n  let candidates = { x: [broadLines[0].x], y: [broadLines[0].y] };\n  let indexes = [0];\n  for (let i = 1; i < broadLines.length; i++) {\n    if (Math.abs(broadLines[i - 1].x - broadLines[i].x) < width) {\n      candidates.x.push(broadLines[i].x);\n      candidates.y.push(broadLines[i].y);\n      if (broadLines[i].y > max) {\n        max = broadLines[i].y;\n        maxI = i;\n      }\n      indexes.push(i);\n      count++;\n    } else {\n      if (count > 2) {\n        let fitted = optimize(\n          candidates,\n          [\n            {\n              x: broadLines[maxI].x,\n              y: max,\n              width: Math.abs(\n                candidates.x[0] - candidates.x[candidates.x.length - 1],\n              ),\n            },\n          ],\n          { shape, optimization },\n        );\n        let { peaks: peak } = fitted;\n        peak[0].index = Math.floor(\n          indexes.reduce((a, b) => a + b, 0) / indexes.length,\n        );\n        peak[0].soft = false;\n        peakList.push(peak[0]);\n      } else {\n        // Put back the candidates to the signals list\n        indexes.forEach((index) => {\n          peakList.push(broadLines[index]);\n        });\n      }\n      candidates = { x: [broadLines[i].x], y: [broadLines[i].y] };\n      indexes = [i];\n      max = broadLines[i].y;\n      maxI = i;\n      count = 1;\n    }\n  }\n  peakList.sort(function (a, b) {\n    return a.x - b.x;\n  });\n\n  return peakList;\n}\n","import { optimize } from 'ml-spectra-fitting';\nimport { xGetFromToIndex } from 'ml-spectra-processing';\n\nimport { groupPeaks } from './groupPeaks';\n\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (width)\n * and the ratio of gaussian contribution (mu) if it's required. It supports three kind of shapes: gaussian, lorentzian and pseudovoigt\n * @param {object} data - An object containing the x and y data to be fitted.\n * @param {Array} peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}] -\n * @param {number} [options.factorWidth = 1] - times of width to group peaks.\n * @param {number} [options.factorLimits = 2] - times of width to use to optimize peaks\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 {string} [options.shape.options={}] - options depending the kind of shape\n * @param {object} [options.optimization={}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {string} [options.optimization.kind='lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object} [options.optimization.options={}] - options for the specific kind of algorithm.\n * @param {number} [options.optimization.options.timeout=10] - maximum time running before break in seconds.\n */\n\nexport function optimizePeaks(data, peakList, options = {}) {\n  const {\n    factorWidth = 1,\n    factorLimits = 2,\n    shape = {\n      kind: 'gaussian',\n    },\n    optimization = {\n      kind: 'lm',\n      options: {\n        timeout: 10,\n      },\n    },\n  } = options;\n\n  if (data.x[0] > data.x[1]) {\n    data.x.reverse();\n    data.y.reverse();\n  }\n\n  let groups = groupPeaks(peakList, factorWidth);\n\n  let results = [];\n  for (const peaks of groups) {\n    const firstPeak = peaks[0];\n    const lastPeak = peaks[peaks.length - 1];\n\n    const from = firstPeak.x - firstPeak.width * factorLimits;\n    const to = lastPeak.x + lastPeak.width * factorLimits;\n    const { fromIndex, toIndex } = xGetFromToIndex(data.x, { from, to });\n    // Multiple peaks\n    const currentRange = {\n      x: data.x.slice(fromIndex, toIndex),\n      y: data.y.slice(fromIndex, toIndex),\n    };\n    if (currentRange.x.length > 5) {\n      let { peaks: optimizedPeaks } = optimize(currentRange, peaks, {\n        shape,\n        optimization,\n      });\n      results = results.concat(optimizedPeaks);\n    } else {\n      results = results.concat(peaks);\n    }\n  }\n  return results;\n}\n","/**\n * Group peaks based on factor and add group property in peaks\n * @param {array} peakList\n * @param {number} factor\n */\n\nexport function groupPeaks(peakList, factor = 1) {\n  if (peakList.length === 0) return [];\n  let peaks = peakList.sort((a, b) => a.x - b.x);\n\n  let previousPeak = { x: Number.NEGATIVE_INFINITY, width: 1 };\n  let currentGroup = [previousPeak];\n  let groups = [];\n\n  for (let peak of peaks) {\n    if (\n      (peak.x - previousPeak.x) / (peak.width + previousPeak.width) <=\n      factor / 2\n    ) {\n      currentGroup.push(peak);\n    } else {\n      currentGroup = [peak];\n      groups.push(currentGroup);\n    }\n    peak.group = groups.length - 1;\n    previousPeak = peak;\n  }\n\n  return groups;\n}\n"],"names":["GAUSSIAN_EXP_FACTOR","Math","LN2","ROOT_PI_OVER_LN2","sqrt","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","x","ln1MinusXSqrd","log","lnEtcBy2Plus2","firstSqrt","Gaussian","constructor","options","fwhm","sd","widthToFWHM","height","undefined","this","getData","length","factor","getFactor","min","ceil","pow","center","data","Float64Array","i","fct","area","getArea","width","fwhmToWidth","setFWHM","setHeight","exp","Lorentzian","squareFWHM","tan","PseudoVoigt","mu","setMu","axis","Gaussian2D","globalFWHM","y","xLength","xFactor","yLength","yFactor","xCenter","yCenter","Array","j","volume","getVolume","axisLabel","isArray","axisName","toLowerCase","Error","SavitzkyGolay","ys","xs","windowSize","derivative","polynomial","Number","isInteger","RangeError","console","warn","half","floor","np","ans","weights","m","n","s","t","Weight","fullWeights","hs","constantH","wg1","wg2","d1","d2","l","getHs","wg","d","h","count","GramPoly","k","Grampoly","GenFact","a","b","gf","sum","xFWHM","yFWHM","isEqualSpaced","tmp","maxDx","minDx","MAX_SAFE_INTEGER","abs","getNoiseLevel","mean","stddev","averageDeviations","sort","determineRealTop","peakList","alpha","beta","gamma","p","currentPoint","index","log10","toString","Object","prototype","isEnumerable","propertyIsEnumerable","getSymbols","getOwnPropertySymbols","target","args","val","call","TypeError","Symbol","arg","names","key","isValidKey","assign","module","isObject","keys","assignSymbols","isAnyArray","object","endsWith","max","input","arguments","_options$fromIndex","fromIndex","_options$toIndex","toIndex","maxValue","sumOfGaussianLorentzians","nL","result","sumOfGaussians","sumOfLorentzians","errorCalculation","parameters","parameterizedFunction","weightSquare","error","func","minValue","rescale","output","currentMin","currentMax","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","name","rows","columns","maxI","maxJ","line","push","formatNumber","get","join","inspectData","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","e","slice","checkRowIndex","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","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","reducedEchelonForm","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","dot","vector2","vector1","mmul","other","Bcolj","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","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","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","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","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log2","sign","sin","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","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","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","evaluatedData","gradientFunc","paramFunction","nbParams","nbPoints","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","MIN_SAFE_INTEGER","endTime","Date","now","checkOptions","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","kind","replace","getKind","algorithm","LM","lmOptions","optimize","maxY","peaks","paramsFunc","optimization","defaultParameters","shape","init","peak","getMaxValue","assignDeep","par","checkInput","nbShapes","parameterKey","pMin","pMax","pInit","gradientDifferenceValue","pFit","xFindClosestIndex","low","high","xGetFromToIndex","to","overlap","right","left","nextPeak","noiseLevel","sgOptions","smoothY","heightFactor","broadRatio","maxCriteria","minMaxRatio","derivativeThreshold","realTopDetection","yIn","equalSpaced","yCorrection","dY","ddY","yData","SG","xData","dX","maxDdy","lastMax","lastMin","minddY","intervalL","intervalR","broadMask","possible","frequency","distanceJ","minDistance","gettingCloser","widthProcessor","shapeOptions","getShapeGenerator","signals","lastK","MAX_VALUE","soft","yLeft","yRight","base","broadLines","candidates","indexes","fitted","reduce","forEach","factorWidth","factorLimits","reverse","groups","previousPeak","NEGATIVE_INFINITY","currentGroup","group","groupPeaks","results","firstPeak","lastPeak","currentRange","optimizedPeaks","concat"],"mappings":"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"}