{"version":3,"file":"ml-spectra-fitting.min.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../src/shapes/sumOfGaussianLorentzians.js","../src/shapes/sumOfGaussians.js","../src/shapes/sumOfLorentzians.js","../src/util/assignDeep.js","../src/util/checkInput.js","../node_modules/ml-levenberg-marquardt/lib-esm/checkOptions.js","../node_modules/ml-levenberg-marquardt/lib-esm/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/lib-esm/step.js","../node_modules/ml-levenberg-marquardt/lib-esm/gradientFunction.js","../node_modules/ml-levenberg-marquardt/lib-esm/index.js","../src/util/selectMethod.js","../src/index.js"],"sourcesContent":["const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","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//# sourceMappingURL=constants.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        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//# sourceMappingURL=erfinv.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nexport class Gaussian {\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n}\nexport function calculateGaussianHeight(options) {\n    let { fwhm = 500, area = 1, sd } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\nexport function getGaussianArea(options) {\n    let { fwhm = 500, sd, height = 1 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\nexport function getGaussianFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\nexport function getGaussianData(shape = {}, options = {}) {\n    let { fwhm = 500, sd } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    let { length, factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = gaussianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","import { ROOT_THREE } from '../../../util/constants';\nexport class Lorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return Math.pow(fwhm, 2) / (4 * Math.pow(x, 2) + Math.pow(fwhm, 2));\n};\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const getLorentzianFactor = (area = 0.9999) => {\n    return 2 * Math.tan(Math.PI * (area - 0.5));\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500 } = shape;\n    let { length, factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = lorentzianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport { gaussianFct, getGaussianFactor } from '../gaussian/Gaussian';\nimport { lorentzianFct, getLorentzianFactor } from '../lorentzian/Lorentzian';\nexport class PseudoVoigt {\n    constructor(options = {}) {\n        const { fwhm = 500, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this.fwhm, this.mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this.fwhm, height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this.fwhm,\n            mu: this.mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({ fwhm: this.fwhm, mu: this.mu, area });\n    }\n}\nexport const calculatePseudoVoigtHeight = (options = {}) => {\n    let { fwhm = 1, mu = 0.5, area = 1 } = options;\n    return (2 * area) / (fwhm * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI));\n};\nexport const pseudoVoigtFct = (x, fwhm, mu) => {\n    return (1 - mu) * lorentzianFct(x, fwhm) + mu * gaussianFct(x, fwhm);\n};\nexport const pseudoVoigtWidthToFWHM = (width, mu = 0.5) => {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const pseudoVoigtFwhmToWidth = (fwhm, mu = 0.5) => {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const getPseudoVoigtArea = (options) => {\n    const { fwhm = 500, height = 1, mu = 0.5 } = options;\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\nexport const getPseudoVoigtFactor = (area = 0.9999, mu = 0.5) => {\n    return mu < 1 ? getLorentzianFactor(area) : getGaussianFactor(area);\n};\nexport const getPseudoVoigtData = (shape = {}, options = {}) => {\n    let { fwhm = 500, mu = 0.5 } = shape;\n    let { length, factor = getPseudoVoigtFactor(0.999, mu), height = calculatePseudoVoigtHeight({ fwhm, mu, area: 1 }), } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = pseudoVoigtFct(i - center, fwhm, mu) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=PseudoVoigt.js.map","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\n// const pseudoVoigtFct = PseudoVoigt.fct;\n\nexport function sumOfGaussianLorentzians(p) {\n  const pseudoVoigt = new PseudoVoigt();\n  return (t) => {\n    let nL = p.length / 4;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      pseudoVoigt.fwhm = p[i + nL * 2];\n      pseudoVoigt.mu = p[i + nL * 3];\n      result += p[i + nL] * pseudoVoigt.fct(t - p[i]);\n    }\n    return result;\n  };\n}\n","import { Gaussian } from 'ml-peak-shape-generator';\n\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  const nL = p.length / 3;\n  const gaussian = new Gaussian();\n  return (t) => {\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      gaussian.fwhm = p[i + nL * 2];\n      result += p[i + nL] * gaussian.fct(t - p[i]);\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\n// const lorentzianFct = Lorentzian.fct;\n\nexport function sumOfLorentzians(p) {\n  const lorentzian = new Lorentzian();\n  return (t) => {\n    let nL = p.length / 3;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      lorentzian.fwhm = p[i + nL * 2];\n      result += p[i + nL] * lorentzian.fct(t - p[i]);\n    }\n    return result;\n  };\n}\n","const isValidKey = (key) => {\n  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\nconst isObject = (val) => {\n  return typeof val === 'object';\n};\nconst isPrimitive = (val) => {\n  return typeof val === 'object' ? val === null : typeof val !== 'function';\n};\n\nexport function assignDeep(target, ...args) {\n  let index = 0;\n  if (isPrimitive(target)) target = args[index++];\n  if (!target) target = {};\n  for (; index < args.length; index++) {\n    if (!isObject(args[index])) continue;\n    for (const key in args[index]) {\n      if (!isValidKey(key)) continue;\n      if (isObject(target[key]) && isObject(args[index][key])) {\n        assignDeep(target[key], args[index][key]);\n      } else {\n        target[key] = args[index][key];\n      }\n    }\n  }\n  return target;\n}\n","import getMaxValue from 'ml-array-max';\n\nimport { sumOfGaussianLorentzians } from '../shapes/sumOfGaussianLorentzians';\nimport { sumOfGaussians } from '../shapes/sumOfGaussians';\nimport { sumOfLorentzians } from '../shapes/sumOfLorentzians';\n\nimport { assignDeep } from './assignDeep';\n\nexport function checkInput(data, peakList, options) {\n  let {\n    shape = { kind: 'gaussian' },\n    optimization = {\n      kind: 'lm',\n    },\n  } = options;\n\n  let peaks = JSON.parse(JSON.stringify(peakList));\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.fwhm * 2,\n          min: (peak) => peak.x - peak.fwhm * 2,\n          gradientDifference: (peak) => peak.fwhm * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        fwhm: {\n          init: (peak) => peak.fwhm,\n          max: (peak) => peak.fwhm * 4,\n          min: (peak) => peak.fwhm * 0.25,\n          gradientDifference: (peak) => peak.fwhm * 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.fwhm * 2,\n          min: (peak) => peak.x - peak.fwhm * 2,\n          gradientDifference: (peak) => peak.fwhm * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        fwhm: {\n          init: (peak) => peak.fwhm,\n          max: (peak) => peak.fwhm * 4,\n          min: (peak) => peak.fwhm * 0.25,\n          gradientDifference: (peak) => peak.fwhm * 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.fwhm * 2,\n          min: (peak) => peak.x - peak.fwhm * 2,\n          gradientDifference: (peak) => peak.fwhm * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        fwhm: {\n          init: (peak) => peak.fwhm,\n          max: (peak) => peak.fwhm * 4,\n          min: (peak) => peak.fwhm * 0.25,\n          gradientDifference: (peak) => peak.fwhm * 2e-3,\n        },\n        mu: {\n          init: (peak) =>\n            peak.shape && peak.shape.mu !== undefined ? peak.shape.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    peaks[i].shape = {\n      kind: shape.kind,\n      ...peaks[i].shape,\n    };\n  }\n\n  let parameters = assignDeep({}, defaultParameters, optimization.parameters);\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","import { isAnyArray } from 'is-any-array';\nexport default function checkOptions(data, parameterizedFunction, options) {\n    let { timeout, minValues, maxValues, initialValues, weights = 1, damping = 1e-2, dampingStepUp = 11, dampingStepDown = 9, maxIterations = 100, errorTolerance = 1e-7, centralDifference = false, gradientDifference = 10e-2, improvementThreshold = 1e-3, } = options;\n    if (damping <= 0) {\n        throw new Error('The damping option must be a positive number');\n    }\n    else if (!data.x || !data.y) {\n        throw new Error('The data parameter must have x and y elements');\n    }\n    else if (!isAnyArray(data.x) ||\n        data.x.length < 2 ||\n        !isAnyArray(data.y) ||\n        data.y.length < 2) {\n        throw new Error('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    let parameters = initialValues || new Array(parameterizedFunction.length).fill(1);\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    if (maxValues.length !== minValues.length) {\n        throw new Error('minValues and maxValues must be the same size');\n    }\n    if (!isAnyArray(parameters)) {\n        throw new Error('initialValues must be an array');\n    }\n    if (typeof gradientDifference === 'number') {\n        gradientDifference = new Array(parameters.length).fill(gradientDifference);\n    }\n    else if (isAnyArray(gradientDifference)) {\n        if (gradientDifference.length !== parLen) {\n            gradientDifference = new Array(parLen).fill(gradientDifference[0]);\n        }\n    }\n    else {\n        throw new Error('gradientDifference should be a number or array with length equal to the number of parameters');\n    }\n    let filler;\n    if (typeof weights === 'number') {\n        let value = 1 / weights ** 2;\n        filler = () => value;\n    }\n    else if (isAnyArray(weights)) {\n        if (weights.length < data.x.length) {\n            let value = 1 / weights[0] ** 2;\n            filler = () => value;\n        }\n        else {\n            filler = (i) => 1 / weights[i] ** 2;\n        }\n    }\n    else {\n        throw new Error('weights should be a number or array with length equal to the number of data points');\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    }\n    else {\n        checkTimeout = () => false;\n    }\n    let weightSquare = new Array(data.x.length);\n    for (let i = 0; i < nbPoints; i++) {\n        weightSquare[i] = filler(i);\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//# sourceMappingURL=checkOptions.js.map","/**\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:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<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 {ArrayLike<number>} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(data, parameters, parameterizedFunction, weightSquare) {\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    return error;\n}\n//# sourceMappingURL=errorCalculation.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","/**\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\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[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';\nimport gradientFunction from './gradientFunction';\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n    const m = data.x.length;\n    let ans = new Matrix(m, 1);\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 * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<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 */\nexport default function step(data, params, damping, gradientDifference, parameterizedFunction, centralDifference, weights) {\n    let value = damping;\n    let identity = Matrix.eye(params.length, params.length, value);\n    const func = parameterizedFunction(params);\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    let gradientFunc = gradientFunction(data, evaluatedData, params, gradientDifference, parameterizedFunction, centralDifference);\n    let residualError = matrixFunction(data, evaluatedData);\n    let inverseMatrix = inverse(identity.add(gradientFunc.mmul(gradientFunc.transpose().scale('row', { scale: weights }))));\n    let jacobianWeightResidualError = gradientFunc.mmul(residualError.scale('row', { scale: weights }));\n    let perturbations = inverseMatrix.mmul(jacobianWeightResidualError);\n    return {\n        perturbations,\n        jacobianWeightResidualError,\n    };\n}\n//# sourceMappingURL=step.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:ArrayLike<number>, y:ArrayLike<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {ArrayLike<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 */\nexport default function gradientFunction(data, evaluatedData, params, gradientDifference, paramFunction, centralDifference) {\n    const nbParams = params.length;\n    const nbPoints = data.x.length;\n    let ans = Matrix.zeros(nbParams, nbPoints);\n    let rowIndex = 0;\n    for (let param = 0; param < nbParams; param++) {\n        if (gradientDifference[param] === 0)\n            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(rowIndex, point, (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(rowIndex, point, (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta);\n            }\n        }\n        rowIndex++;\n    }\n    return ans;\n}\n//# sourceMappingURL=gradientFunction.js.map","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n/**\n * Curve fitting algorithm\n * @param {{x:ArrayLike<number>, y:ArrayLike<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|ArrayLike<number>} [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|ArrayLike<number>} [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 {ArrayLike<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {ArrayLike<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {ArrayLike<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 function levenbergMarquardt(data, parameterizedFunction, options = {}) {\n    let { checkTimeout, minValues, maxValues, parameters, weightSquare, damping, dampingStepUp, dampingStepDown, maxIterations, errorTolerance, centralDifference, gradientDifference, improvementThreshold, } = checkOptions(data, parameterizedFunction, options);\n    let error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n    let converged = error <= errorTolerance;\n    let iteration = 0;\n    for (; iteration < maxIterations && !converged; iteration++) {\n        let previousError = error;\n        let { perturbations, jacobianWeightResidualError } = step(data, parameters, damping, gradientDifference, parameterizedFunction, centralDifference, weightSquare);\n        for (let k = 0; k < parameters.length; k++) {\n            parameters[k] = Math.min(Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)), maxValues[k]);\n        }\n        error = errorCalculation(data, parameters, parameterizedFunction, weightSquare);\n        if (isNaN(error))\n            break;\n        let improvementMetric = (previousError - error) /\n            perturbations\n                .transpose()\n                .mmul(perturbations.mul(damping).add(jacobianWeightResidualError))\n                .get(0, 0);\n        if (improvementMetric > improvementThreshold) {\n            damping = Math.max(damping / dampingStepDown, 1e-7);\n        }\n        else {\n            error = previousError;\n            damping = Math.min(damping * dampingStepUp, 1e7);\n        }\n        if (checkTimeout()) {\n            throw new Error(`The execution time is over to ${options.timeout} seconds`);\n        }\n        converged = error <= errorTolerance;\n    }\n    return {\n        parameterValues: parameters,\n        parameterError: error,\n        iterations: iteration,\n    };\n}\n//# sourceMappingURL=index.js.map","import { levenbergMarquardt } 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: levenbergMarquardt,\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 './util/checkInput';\nimport { selectMethod } from './util/selectMethod';\n\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] =\n        gradientDifferenceValue[i % gradientDifferenceValue.length](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    for (let k = 0; k < parameterKey.length; k++) {\n      const key = parameterKey[k];\n      const value = pFit.parameterValues[i + k * nbShapes];\n      // we modify the optimized parameters\n      if (key === 'x' || key === 'fwhm') {\n        peaks[i][parameterKey[k]] = value;\n      } else if (key === 'y') {\n        peaks[i][parameterKey[k]] = value * maxY;\n      } else {\n        peaks[i].shape[parameterKey[k]] = value;\n      }\n    }\n  }\n\n  return result;\n}\n"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","max","input","options","arguments","length","undefined","TypeError","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","Error","maxValue","i","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","fwhm","sd","gaussianWidthToFWHM","fwhmToWidth","gaussianFwhmToWidth","this","widthToFWHM","width","fct","gaussianFct","getArea","height","calculateGaussianHeight","getGaussianArea","getFactor","area","getGaussianFactor","getData","shape","factor","min","ceil","pow","center","data","Float64Array","getGaussianData","calculateHeight","exp","Lorentzian","lorentzianFwhmToWidth","lorentzianWidthToFWHM","lorentzianFct","getLorentzianArea","getLorentzianFactor","getLorentzianData","calculateLorentzianHeight","_ref","tan","PseudoVoigt","mu","pseudoVoigtFwhmToWidth","pseudoVoigtWidthToFWHM","pseudoVoigtFct","getPseudoVoigtArea","getPseudoVoigtFactor","calculatePseudoVoigtHeight","getPseudoVoigtData","sumOfGaussianLorentzians","p","pseudoVoigt","t","nL","result","sumOfGaussians","gaussian","sumOfLorentzians","lorentzian","isValidKey","key","isObject","val","isPrimitive","assignDeep","target","index","args","checkInput","peakList","paramsFunc","defaultParameters","kind","optimization","peaks","JSON","parse","stringify","toLowerCase","replace","init","peak","gradientDifference","y","maxY","getMaxValue","Array","parameters","par","isArray","checkOptions","parameterizedFunction","timeout","minValues","maxValues","initialValues","weights","damping","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","centralDifference","improvementThreshold","filler","checkTimeout","fill","nbPoints","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","endTime","Date","now","weightSquare","errorCalculation","error","func","minValue","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","name","inspectData","rows","columns","maxI","maxJ","line","j","push","formatNumber","get","join","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","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","random","interval","round","zeros","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","NaN","v","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","floor","fround","log1p","log10","log2","sign","sin","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","leftHandSide","rightHandSide","useSVD","step","params","evaluatedData","gradientFunc","paramFunction","nbParams","ans","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeightResidualError","perturbations","levenbergMarquardt","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","getKind","algorithm","assign","lmOptions","nbShapes","parameterKey","keys","pMin","pMax","pInit","gradientDifferenceValue","pFit"],"mappings":"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"}