{"version":3,"file":"baselines.min.js","sources":["../node_modules/ml-airpls/src/choleskySolver.js","../node_modules/cuthill-mckee/cuthill-mckee.js","../node_modules/ml-airpls/src/utils.js","../node_modules/ml-airpls/src/index.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/views/base.js","../node_modules/ml-matrix/src/views/transpose.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/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-regression-base/src/maybeToPrecision.js","../node_modules/ml-regression-base/src/index.js","../node_modules/ml-regression-polynomial/src/index.js","../node_modules/ml-regression-base/src/checkArrayLength.js","../node_modules/ml-matrix/src/decompositions.js","../node_modules/ml-baseline-correction-regression/src/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedian.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMean.js","../node_modules/ml-spectra-processing/lib-esm/x/xPadding.js","../node_modules/ml-spectra-processing/lib-esm/x/xRolling.js","../node_modules/ml-spectra-processing/lib-esm/x/xRollingAverage.js","../node_modules/ml-spectra-processing/lib-esm/x/xRollingMedian.js","../node_modules/ml-rolling-ball-baseline/src/rollingBall.js","../src/airPLS.js","../src/iterativePolynomial.js","../src/rollingAverage.js","../src/rollingBall.js","../src/rollingMedian.js"],"sourcesContent":["// Based on https://github.com/scijs/cholesky-solve\r\n\r\n/*\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2013 Eric Arnebäck\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nfunction ldlSymbolic(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n + 1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Lp /* output of size n + 1, not defined on input */,\r\n  Parent /* output of size n, not defined on input */,\r\n  Lnz /* output of size n, not defined on input */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let i, k, p, kk, p2;\r\n\r\n  for (k = 0; k < n; k++) {\r\n    /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */\r\n    Parent[k] = -1; /* parent of k is not yet known */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      /* A (i,k) is nonzero (original or permuted A) */\r\n      i = Ai[p];\r\n\r\n      if (i < k) {\r\n        /* follow path from i to root of etree, stop at flagged node */\r\n        for (; Flag[i] !== k; i = Parent[i]) {\r\n          /* find parent of i if not yet determined */\r\n          if (Parent[i] === -1) Parent[i] = k;\r\n          Lnz[i]++; /* L (k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n      }\r\n    }\r\n  }\r\n  /* construct Lp index array from Lnz column counts */\r\n  Lp[0] = 0;\r\n  for (k = 0; k < n; k++) {\r\n    Lp[k + 1] = Lp[k] + Lnz[k];\r\n  }\r\n}\r\n\r\nfunction ldlNumeric(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n+1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Ax /* input of size nz=Ap[n], not modified */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Parent /* input of size n, not modified */,\r\n  Lnz /* output of size n, not defn. on input */,\r\n  Li /* output of size lnz=Lp[n], not defined on input */,\r\n  Lx /* output of size lnz=Lp[n], not defined on input */,\r\n  D /* output of size n, not defined on input */,\r\n  Y /* workspace of size n, not defn. on input or output */,\r\n  Pattern /* workspace of size n, not defn. on input or output */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let yi, lKi;\r\n  let i, k, p, kk, p2, len, top;\r\n  for (k = 0; k < n; k++) {\r\n    /* compute nonzero Pattern of kth row of L, in topological order */\r\n    Y[k] = 0.0; /* Y(0:k) is now all zero */\r\n    top = n; /* stack for pattern is empty */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      i = Ai[p]; /* get A(i,k) */\r\n      if (i <= k) {\r\n        Y[i] += Ax[p]; /* scatter A(i,k) into Y (sum duplicates) */\r\n        for (len = 0; Flag[i] !== k; i = Parent[i]) {\r\n          Pattern[len++] = i; /* L(k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n        while (len > 0) Pattern[--top] = Pattern[--len];\r\n      }\r\n    }\r\n    /* compute numerical values kth row of L (a sparse triangular solve) */\r\n    D[k] = Y[k]; /* get D(k,k) and clear Y(k) */\r\n    Y[k] = 0.0;\r\n    for (; top < n; top++) {\r\n      i = Pattern[top]; /* Pattern[top:n-1] is pattern of L(:,k) */\r\n      yi = Y[i]; /* get and clear Y(i) */\r\n      Y[i] = 0.0;\r\n      p2 = Lp[i] + Lnz[i];\r\n      for (p = Lp[i]; p < p2; p++) {\r\n        Y[Li[p]] -= Lx[p] * yi;\r\n      }\r\n      lKi = yi / D[i]; /* the nonzero entry L(k,i) */\r\n      D[k] -= lKi * yi;\r\n      Li[p] = k; /* store L(k,i) in column form of L */\r\n      Lx[p] = lKi;\r\n      Lnz[i]++; /* increment count of nonzeros in col i */\r\n    }\r\n\r\n    if (D[k] === 0.0) return k; /* failure, D(k,k) is zero */\r\n  }\r\n\r\n  return n; /* success, diagonal of D is all nonzero */\r\n}\r\n\r\nfunction ldlLsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = 0; j < n; j++) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[Li[p]] -= Lx[p] * X[j];\r\n    }\r\n  }\r\n}\r\nfunction ldlDsolve(\r\n  n /* D is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  D /* input of size n, not modified */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] /= D[j];\r\n  }\r\n}\r\nfunction ldlLTsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = n - 1; j >= 0; j--) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[j] -= Lx[p] * X[Li[p]];\r\n    }\r\n  }\r\n}\r\n\r\nfunction ldlPerm(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] = B[P[j]];\r\n  }\r\n}\r\n\r\nfunction ldlPermt(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[P[j]] = B[j];\r\n  }\r\n}\r\n\r\nfunction prepare(M, n, P) {\r\n  // if a permutation was specified, apply it.\r\n  if (P) {\r\n    let Pinv = new Array(n);\r\n\r\n    for (let k = 0; k < n; k++) {\r\n      Pinv[P[k]] = k;\r\n    }\r\n\r\n    let Mt = []; // scratch memory\r\n    // Apply permutation. We make M into P*M*P^T\r\n    for (let a = 0; a < M.length; ++a) {\r\n      let ar = Pinv[M[a][0]];\r\n      let ac = Pinv[M[a][1]];\r\n\r\n      // we only store the upper-diagonal elements(since we assume matrix is symmetric, we only need to store these)\r\n      // if permuted element is below diagonal, we simply transpose it.\r\n      if (ac < ar) {\r\n        let t = ac;\r\n        ac = ar;\r\n        ar = t;\r\n      }\r\n\r\n      Mt[a] = [];\r\n      Mt[a][0] = ar;\r\n      Mt[a][1] = ac;\r\n      Mt[a][2] = M[a][2];\r\n    }\r\n\r\n    M = Mt; // copy scratch memory.\r\n  } else {\r\n    // if P argument is null, we just use an identity permutation.\r\n    P = [];\r\n    for (let i = 0; i < n; ++i) {\r\n      P[i] = i;\r\n    }\r\n  }\r\n\r\n  // The sparse matrix we are decomposing is A.\r\n  // Now we shall create A from M.\r\n  let Ap = new Array(n + 1);\r\n  let Ai = new Array(M.length);\r\n  let Ax = new Array(M.length);\r\n\r\n  // count number of non-zero elements in columns.\r\n  let LNZ = [];\r\n  for (let i = 0; i < n; ++i) {\r\n    LNZ[i] = 0;\r\n  }\r\n  for (let a = 0; a < M.length; ++a) {\r\n    LNZ[M[a][1]]++;\r\n  }\r\n\r\n  Ap[0] = 0;\r\n  for (let i = 0; i < n; ++i) {\r\n    Ap[i + 1] = Ap[i] + LNZ[i];\r\n  }\r\n\r\n  let coloffset = [];\r\n  for (let a = 0; a < n; ++a) {\r\n    coloffset[a] = 0;\r\n  }\r\n\r\n  // go through all elements in M, and add them to sparse matrix A.\r\n  for (let i = 0; i < M.length; ++i) {\r\n    let e = M[i];\r\n    let col = e[1];\r\n\r\n    let adr = Ap[col] + coloffset[col];\r\n    Ai[adr] = e[0];\r\n    Ax[adr] = e[2];\r\n\r\n    coloffset[col]++;\r\n  }\r\n\r\n  let D = new Array(n);\r\n  let Y = new Array(n);\r\n  let Lp = new Array(n + 1);\r\n  let Parent = new Array(n);\r\n  let Lnz = new Array(n);\r\n  let Flag = new Array(n);\r\n  let Pattern = new Array(n);\r\n  let bp1 = new Array(n);\r\n  let x = new Array(n);\r\n  let d;\r\n\r\n  ldlSymbolic(n, Ap, Ai, Lp, Parent, Lnz, Flag);\r\n\r\n  let Lx = new Array(Lp[n]);\r\n  let Li = new Array(Lp[n]);\r\n\r\n  d = ldlNumeric(n, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, Flag);\r\n\r\n  if (d === n) {\r\n    return function (b) {\r\n      ldlPerm(n, bp1, b, P);\r\n      ldlLsolve(n, bp1, Lp, Li, Lx);\r\n      ldlDsolve(n, bp1, D);\r\n      ldlLTsolve(n, bp1, Lp, Li, Lx);\r\n      ldlPermt(n, x, bp1, P);\r\n\r\n      return x;\r\n    };\r\n  } else {\r\n    return null;\r\n  }\r\n}\r\n\r\nexport { prepare as default };\r\n","'use strict'\n\nmodule.exports = cuthillMckee\n\nfunction compareNum(a, b) { return a - b }\n\nfunction cuthillMckee(list, n) {\n  var adj = new Array(n)\n  var visited = new Array(n)\n  for(var i=0; i<n; ++i) {\n    adj[i]     = []\n    visited[i] = false\n  }\n\n  for(var i=0; i<list.length; ++i) {\n    var l = list[i]\n    adj[l[0]].push(l[1])\n  }\n\n  var toVisit = new Array(n)\n  var eol = 0\n  var ptr = 0\n  for(var i=0; i<n; ++i) {\n    if(visited[i]) {\n      continue\n    }\n    toVisit[eol++] = i\n    visited[i] = true\n    while(ptr < eol) {\n      var v = toVisit[ptr++]\n      var nbhd = adj[v]\n      nbhd.sort(compareNum)\n      for(var j=0; j<nbhd.length; ++j) {\n        var u = nbhd[j]\n        if(visited[u]) {\n          continue\n        }\n        visited[u] = true\n        toVisit[eol++] = u\n      }\n    }\n  }\n\n  var result = new Array(n)\n  for(var i=0; i<n; ++i) {\n    result[toVisit[i]] = i\n  }\n\n  return result\n}\n","import cuthillMckee from 'cuthill-mckee';\r\n\r\nconst getClosestNumber = (array = [], goal = 0) => {\r\n  const closest = array.reduce((prev, curr) => {\r\n    return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev;\r\n  });\r\n  return closest;\r\n};\r\n\r\nconst getCloseIndex = (array = [], goal = 0) => {\r\n  const closest = getClosestNumber(array, goal);\r\n  return array.indexOf(closest);\r\n};\r\n\r\nconst updateSystem = (matrix, y, weights) => {\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let newMatrix = new Array(matrix.length);\r\n  let newVector = new Float64Array(nbPoints);\r\n  for (let i = 0; i < l; i++) {\r\n    let w = weights[i];\r\n    let diag = i * 2;\r\n    let next = diag + 1;\r\n    newMatrix[diag] = matrix[diag].slice();\r\n    newMatrix[next] = matrix[next].slice();\r\n    if (w === 0) {\r\n      newVector[i] = 0;\r\n    } else {\r\n      newVector[i] = y[i] * w;\r\n      newMatrix[diag][2] += w;\r\n    }\r\n  }\r\n  newVector[l] = y[l] * weights[l];\r\n  newMatrix[l * 2] = matrix[l * 2].slice();\r\n  newMatrix[l * 2][2] += weights[l];\r\n\r\n  return [newMatrix, newVector];\r\n};\r\n\r\nconst getDeltaMatrix = (nbPoints, lambda) => {\r\n  let matrix = [];\r\n  let last = nbPoints - 1;\r\n  for (let i = 0; i < last; i++) {\r\n    matrix.push([i, i, lambda * 2]);\r\n    matrix.push([i + 1, i, -1 * lambda]);\r\n  }\r\n  matrix[0][2] = lambda;\r\n  matrix.push([last, last, lambda]);\r\n  return {\r\n    lowerTriangularNonZeros: matrix,\r\n    permutationEncodedArray: cuthillMckee(matrix, nbPoints),\r\n  };\r\n};\r\n\r\nexport { updateSystem, getDeltaMatrix, getCloseIndex, getClosestNumber };\r\n","import Cholesky from './choleskySolver';\r\nimport { updateSystem, getDeltaMatrix, getCloseIndex } from './utils';\r\n\r\n/**\r\n * Fit the baseline drift by iteratively changing weights of sum square error between the fitted baseline and original signals,\r\n * for further information about the parameters you can get the [paper of airPLS](https://github.com/zmzhang/airPLS/blob/master/airPLS_manuscript.pdf)\r\n * @param {Array<number>} x - x axis data useful when control points or zones are submitted\r\n * @param {Array<number>} y - Original data\r\n * @param {object} [options={}] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximal number of iterations if the method does not reach the stop criterion\r\n * @param {number} [options.factorCriterion = 0.001] - Factor of the sum of absolute value of original data, to compute stop criterion\r\n * @param {Array<number>} [options.weights = [1,1,...]] - Initial weights vector, default each point has the same weight\r\n * @param {number} [options.lambda = 100] - Factor of weights matrix in -> [I + lambda D'D]z = x\r\n * @param {Array<number>} [options.controlPoints = []] - Array of x axis values to force that baseline cross those points.\r\n * @param {Array<number>} [options.baseLineZones = []] - Array of x axis values (as from - to), to force that baseline cross those zones.\r\n * @returns {{corrected: Array<number>, error: number, iteration: number, baseline: Array<number>}}\r\n */\r\nfunction airPLS(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    lambda = 100,\r\n    factorCriterion = 0.001,\r\n    weights = new Array(y.length).fill(1),\r\n    controlPoints = [],\r\n    baseLineZones = [],\r\n  } = options;\r\n\r\n  if (controlPoints.length > 0) {\r\n    controlPoints.forEach((e, i, arr) => (arr[i] = getCloseIndex(x, e)));\r\n  }\r\n  if (baseLineZones.length > 0) {\r\n    baseLineZones.forEach((range) => {\r\n      let indexFrom = getCloseIndex(x, range.from);\r\n      let indexTo = getCloseIndex(x, range.to);\r\n      if (indexFrom > indexTo) [indexFrom, indexTo] = [indexTo, indexFrom];\r\n      for (let i = indexFrom; i < indexTo; i++) {\r\n        controlPoints.push(i);\r\n      }\r\n    });\r\n  }\r\n\r\n  let baseline, iteration;\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let sumNegDifferences = Number.MAX_SAFE_INTEGER;\r\n  let stopCriterion =\r\n    factorCriterion * y.reduce((sum, e) => Math.abs(e) + sum, 0);\r\n\r\n  let { lowerTriangularNonZeros, permutationEncodedArray } = getDeltaMatrix(\r\n    nbPoints,\r\n    lambda,\r\n  );\r\n\r\n  for (\r\n    iteration = 0;\r\n    iteration < maxIterations && Math.abs(sumNegDifferences) > stopCriterion;\r\n    iteration++\r\n  ) {\r\n    let [leftHandSide, rightHandSide] = updateSystem(\r\n      lowerTriangularNonZeros,\r\n      y,\r\n      weights,\r\n    );\r\n\r\n    let cho = Cholesky(leftHandSide, nbPoints, permutationEncodedArray);\r\n\r\n    baseline = cho(rightHandSide);\r\n\r\n    sumNegDifferences = 0;\r\n\r\n    let difference = y.map(calculateError);\r\n\r\n    let maxNegativeDiff = -1 * Number.MAX_SAFE_INTEGER;\r\n    for (let i = 1; i < l; i++) {\r\n      let diff = difference[i];\r\n      if (diff >= 0) {\r\n        weights[i] = 0;\r\n      } else {\r\n        weights[i] = Math.exp((iteration * diff) / sumNegDifferences);\r\n        if (maxNegativeDiff < diff) maxNegativeDiff = diff;\r\n      }\r\n    }\r\n\r\n    let value = Math.exp((iteration * maxNegativeDiff) / sumNegDifferences);\r\n    weights[0] = value;\r\n    weights[l] = value;\r\n    controlPoints.forEach((i) => (weights[i] = value));\r\n  }\r\n\r\n  return {\r\n    corrected: y.map((e, i) => e - baseline[i]),\r\n    baseline,\r\n    iteration,\r\n    error: sumNegDifferences,\r\n  };\r\n\r\n  function calculateError(e, i) {\r\n    let diff = e - baseline[i];\r\n    if (diff < 0) sumNegDifferences += diff;\r\n    return diff;\r\n  }\r\n}\r\n\r\nexport { airPLS as default };\r\n","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 _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n/**\n * Fill an array with sequential numbers\n * @param {Array<number>} [input] - optional destination array (if not provided a new array will be created)\n * @param {object} [options={}]\n * @param {number} [options.from=0] - first value in the array\n * @param {number} [options.to=10] - last value in the array\n * @param {number} [options.size=input.length] - size of the array (if not provided calculated from step)\n * @param {number} [options.step] - if not provided calculated from size\n * @return {Array<number>}\n */\n\nfunction sequentialFill() {\n  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (_typeof(input) === 'object' && !isAnyArray(input)) {\n    options = input;\n    input = [];\n  }\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options = options,\n      _options$from = _options.from,\n      from = _options$from === void 0 ? 0 : _options$from,\n      _options$to = _options.to,\n      to = _options$to === void 0 ? 10 : _options$to,\n      _options$size = _options.size,\n      size = _options$size === void 0 ? input.length : _options$size,\n      step = _options.step;\n\n  if (size !== 0 && step) {\n    throw new Error('step is defined by the array size');\n  }\n\n  if (!size) {\n    if (step) {\n      size = Math.floor((to - from) / step) + 1;\n    } else {\n      size = to - from + 1;\n    }\n  }\n\n  if (!step && size) {\n    step = (to - from) / (size - 1);\n  }\n\n  if (Array.isArray(input)) {\n    // only works with normal array\n    input.length = 0;\n\n    for (var i = 0; i < size; i++) {\n      input.push(from);\n      from += step;\n    }\n  } else {\n    if (input.length !== size) {\n      throw new Error('sequentialFill typed array must have the correct length');\n    }\n\n    for (var _i = 0; _i < size; _i++) {\n      input[_i] = from;\n      from += step;\n    }\n  }\n\n  return input;\n}\n\nexport { sequentialFill as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n","import BaseView from './base';\n\nexport default class MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","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","export default function maybeToPrecision(value, digits) {\n  if (value < 0) {\n    value = 0 - value;\n    if (typeof digits === 'number') {\n      return `- ${value.toPrecision(digits)}`;\n    } else {\n      return `- ${value.toString()}`;\n    }\n  } else {\n    if (typeof digits === 'number') {\n      return value.toPrecision(digits);\n    } else {\n      return value.toString();\n    }\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport { default as maybeToPrecision } from './maybeToPrecision';\nexport { default as checkArrayLength } from './checkArrayLength';\n\nexport default class BaseRegression {\n  constructor() {\n    if (new.target === BaseRegression) {\n      throw new Error('BaseRegression must be subclassed');\n    }\n  }\n\n  predict(x) {\n    if (typeof x === 'number') {\n      return this._predict(x);\n    } else if (isAnyArray(x)) {\n      const y = [];\n      for (let i = 0; i < x.length; i++) {\n        y.push(this._predict(x[i]));\n      }\n      return y;\n    } else {\n      throw new TypeError('x must be a number or array');\n    }\n  }\n\n  _predict() {\n    throw new Error('_predict must be implemented');\n  }\n\n  train() {\n    // Do nothing for this package\n  }\n\n  toString() {\n    return '';\n  }\n\n  toLaTeX() {\n    return '';\n  }\n\n  /**\n   * Return the correlation coefficient of determination (r) and chi-square.\n   * @param {Array<number>} x\n   * @param {Array<number>} y\n   * @return {object}\n   */\n  score(x, y) {\n    if (!isAnyArray(x) || !isAnyArray(y) || x.length !== y.length) {\n      throw new Error('x and y must be arrays of the same length');\n    }\n\n    const n = x.length;\n    const y2 = new Array(n);\n    for (let i = 0; i < n; i++) {\n      y2[i] = this._predict(x[i]);\n    }\n\n    let xSum = 0;\n    let ySum = 0;\n    let chi2 = 0;\n    let rmsd = 0;\n    let xSquared = 0;\n    let ySquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n      xSum += y2[i];\n      ySum += y[i];\n      xSquared += y2[i] * y2[i];\n      ySquared += y[i] * y[i];\n      xY += y2[i] * y[i];\n      if (y[i] !== 0) {\n        chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n      }\n      rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n    }\n\n    const r =\n      (n * xY - xSum * ySum) /\n      Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n\n    return {\n      r: r,\n      r2: r * r,\n      chi2: chi2,\n      rmsd: Math.sqrt(rmsd / n),\n    };\n  }\n}\n","import { Matrix, MatrixTransposeView, solve } from 'ml-matrix';\nimport BaseRegression, {\n  checkArrayLength,\n  maybeToPrecision,\n} from 'ml-regression-base';\n\nexport default class PolynomialRegression extends BaseRegression {\n  constructor(x, y, degree) {\n    super();\n    if (x === true) {\n      this.degree = y.degree;\n      this.powers = y.powers;\n      this.coefficients = y.coefficients;\n    } else {\n      checkArrayLength(x, y);\n      regress(this, x, y, degree);\n    }\n  }\n\n  _predict(x) {\n    let y = 0;\n    for (let k = 0; k < this.powers.length; k++) {\n      y += this.coefficients[k] * Math.pow(x, this.powers[k]);\n    }\n    return y;\n  }\n\n  toJSON() {\n    return {\n      name: 'polynomialRegression',\n      degree: this.degree,\n      powers: this.powers,\n      coefficients: this.coefficients,\n    };\n  }\n\n  toString(precision) {\n    return this._toFormula(precision, false);\n  }\n\n  toLaTeX(precision) {\n    return this._toFormula(precision, true);\n  }\n\n  _toFormula(precision, isLaTeX) {\n    let sup = '^';\n    let closeSup = '';\n    let times = ' * ';\n    if (isLaTeX) {\n      sup = '^{';\n      closeSup = '}';\n      times = '';\n    }\n\n    let fn = '';\n    let str = '';\n    for (let k = 0; k < this.coefficients.length; k++) {\n      str = '';\n      if (this.coefficients[k] !== 0) {\n        if (this.powers[k] === 0) {\n          str = maybeToPrecision(this.coefficients[k], precision);\n        } else {\n          if (this.powers[k] === 1) {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x`;\n          } else {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x${sup}${this.powers[k]}${closeSup}`;\n          }\n        }\n\n        if (this.coefficients[k] > 0 && k !== this.coefficients.length - 1) {\n          str = ` + ${str}`;\n        } else if (k !== this.coefficients.length - 1) {\n          str = ` ${str}`;\n        }\n      }\n      fn = str + fn;\n    }\n    if (fn.charAt(0) === '+') {\n      fn = fn.slice(1);\n    }\n\n    return `f(x) = ${fn}`;\n  }\n\n  static load(json) {\n    if (json.name !== 'polynomialRegression') {\n      throw new TypeError('not a polynomial regression model');\n    }\n    return new PolynomialRegression(true, json);\n  }\n}\n\nfunction regress(pr, x, y, degree) {\n  const n = x.length;\n  let powers;\n  if (Array.isArray(degree)) {\n    powers = degree;\n    degree = powers.length;\n  } else {\n    degree++;\n    powers = new Array(degree);\n    for (let k = 0; k < degree; k++) {\n      powers[k] = k;\n    }\n  }\n  const F = new Matrix(n, degree);\n  const Y = new Matrix([y]);\n  for (let k = 0; k < degree; k++) {\n    for (let i = 0; i < n; i++) {\n      if (powers[k] === 0) {\n        F.set(i, k, 1);\n      } else {\n        F.set(i, k, Math.pow(x[i], powers[k]));\n      }\n    }\n  }\n\n  const FT = new MatrixTransposeView(F);\n  const A = FT.mmul(F);\n  const B = FT.mmul(new MatrixTransposeView(Y));\n\n  pr.degree = degree - 1;\n  pr.powers = powers;\n  pr.coefficients = solve(A, B).to1DArray();\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport default function checkArraySize(x, y) {\n  if (!isAnyArray(x) || !isAnyArray(y)) {\n    throw new TypeError('x and y must be arrays');\n  }\n  if (x.length !== y.length) {\n    throw new RangeError('x and y arrays must have the same length');\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 PolynomialRegression from 'ml-regression-polynomial';\r\n\r\n/**\r\n * Iterative regression-based baseline correction\r\n * @param {Array<number>} x - Independent axis variable\r\n * @param {Array<number>} y - Dependent axis variable\r\n * @param {object} [options] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximum number of allowed iterations\r\n * @param {function} [options.Regression = PolynomialRegression] - Regression class with a predict method\r\n * @param {*} [options.regressionOptions] - Options for regressionFunction\r\n * @param {number} [options.tolerance = 0.001] - Convergence error tolerance\r\n * @return {{corrected: Array<number>, delta: number, iteration: number, baseline: Array<number>}}\r\n */\r\nexport default function baselineCorrectionRegression(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    Regression = PolynomialRegression,\r\n    regressionOptions,\r\n    tolerance = 0.001,\r\n  } = options;\r\n\r\n  if (!regressionOptions && Regression === PolynomialRegression) {\r\n    regressionOptions = 3;\r\n  }\r\n\r\n  let baseline = y.slice();\r\n  let fitting = y.slice();\r\n  let oldFitting = y;\r\n  let iteration = 0;\r\n  let delta;\r\n  let regression;\r\n  while (iteration < maxIterations) {\r\n    // Calculate the fitting result\r\n    regression = new Regression(x, baseline, regressionOptions);\r\n\r\n    delta = 0;\r\n    for (let i = 0; i < baseline.length; i++) {\r\n      fitting[i] = regression.predict(x[i]);\r\n      if (baseline[i] > fitting[i]) {\r\n        baseline[i] = fitting[i];\r\n      }\r\n\r\n      delta += Math.abs((fitting[i] - oldFitting[i]) / oldFitting[i]);\r\n    }\r\n\r\n    // Stop criterion\r\n    if (delta < tolerance) {\r\n      break;\r\n    } else {\r\n      oldFitting = fitting.slice();\r\n      iteration++;\r\n    }\r\n  }\r\n\r\n  // removes baseline\r\n  let corrected = new Array(baseline.length);\r\n  for (let j = 0; j < baseline.length; j++) {\r\n    corrected[j] = y[j] - baseline[j];\r\n  }\r\n\r\n  return {\r\n    corrected,\r\n    delta,\r\n    iteration,\r\n    baseline,\r\n    regression: regression,\r\n  };\r\n}\r\n","(function(){function a(d){for(var e=0,f=d.length-1,g=void 0,h=void 0,i=void 0,j=c(e,f);!0;){if(f<=e)return d[j];if(f==e+1)return d[e]>d[f]&&b(d,e,f),d[j];for(g=c(e,f),d[g]>d[f]&&b(d,g,f),d[e]>d[f]&&b(d,e,f),d[g]>d[e]&&b(d,g,e),b(d,g,e+1),h=e+1,i=f;!0;){do h++;while(d[e]>d[h]);do i--;while(d[i]>d[e]);if(i<h)break;b(d,h,i)}b(d,e,i),i<=j&&(e=h),i>=j&&(f=i-1)}}var b=function b(d,e,f){var _ref;return _ref=[d[f],d[e]],d[e]=_ref[0],d[f]=_ref[1],_ref},c=function c(d,e){return~~((d+e)/2)};'undefined'!=typeof module&&module.exports?module.exports=a:window.median=a})();\n","import { isAnyArray } from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n/**\n * Calculates the median of an array\n *\n * @param input - Array containing values\n * @returns - median\n */\nexport function xMedian(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    // we need to slice because the order of elements is changed in the quickselect\n    // https://github.com/mad-gooze/median-quickselect\n    return quickSelectMedian(input.slice());\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the mean value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMean(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue / (toIndex - fromIndex + 1);\n}\n//# sourceMappingURL=xMean.js.map","import { xCheck } from './xCheck';\n/**\n * This function pads an array\n *s\n * @param array - the array that will be padded\n * @param options - options\n */\nexport function xPadding(array, options = {}) {\n    const { size = 0, value = 0, algorithm = '' } = options;\n    xCheck(array);\n    if (!algorithm) {\n        if (array instanceof Float64Array) {\n            return array.slice();\n        }\n        else {\n            return Float64Array.from(array);\n        }\n    }\n    let result = new Float64Array(array.length + size * 2);\n    for (let i = 0; i < array.length; i++) {\n        result[i + size] = array[i];\n    }\n    let fromEnd = size + array.length;\n    let toEnd = 2 * size + array.length;\n    switch (algorithm.toLowerCase()) {\n        case 'value':\n            for (let i = 0; i < size; i++) {\n                result[i] = value;\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = value;\n            }\n            break;\n        case 'duplicate':\n            for (let i = 0; i < size; i++) {\n                result[i] = array[0];\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = array[array.length - 1];\n            }\n            break;\n        case 'circular':\n            for (let i = 0; i < size; i++) {\n                result[i] =\n                    array[(array.length - (size % array.length) + i) % array.length];\n            }\n            for (let i = 0; i < size; i++) {\n                result[i + fromEnd] = array[i % array.length];\n            }\n            break;\n        default:\n            throw new Error('xPadding: unknown algorithm');\n    }\n    return result;\n}\n//# sourceMappingURL=xPadding.js.map","import { xCheck } from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param fct - callback function that from an array returns a value\n * @param options - options\n */\nexport function xRolling(array, fct, options = {}) {\n    xCheck(array);\n    if (typeof fct !== 'function')\n        throw new Error('fct has to be a function');\n    const { window = 5, padding = {} } = options;\n    const { size = window - 1, algorithm, value } = padding;\n    array = xPadding(array, { size, algorithm, value }); // ensure we get a copy and it is float64\n    const newArray = [];\n    for (let i = 0; i < array.length - window + 1; i++) {\n        // we will send a view to the original buffer\n        newArray.push(fct(array.subarray(i, i + window)));\n    }\n    return newArray;\n}\n//# sourceMappingURL=xRolling.js.map","import { xMean } from './xMean';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param options - option\n */\nexport function xRollingAverage(array, options = {}) {\n    return xRolling(array, xMean, options);\n}\n//# sourceMappingURL=xRollingAverage.js.map","import { xMedian } from './xMedian';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - array\n * @param options - options\n */\nexport function xRollingMedian(array, options = {}) {\n    return xRolling(array, xMedian, options);\n}\n//# sourceMappingURL=xRollingMedian.js.map","import { isAnyArray } from 'is-any-array';\nimport { xMean, xMaxValue, xMinValue } from 'ml-spectra-processing';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n * @export\n * @param {Array} spectrum\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the spectrum length\n */\nexport function rollingBall(spectrum, options = {}) {\n  if (!isAnyArray(spectrum)) {\n    throw new Error('Spectrum must be an array');\n  }\n\n  if (spectrum.length === 0) {\n    throw new TypeError('Spectrum must not be empty');\n  }\n\n  const numberPoints = spectrum.length;\n  const maxima = new Float64Array(numberPoints);\n  const minima = new Float64Array(numberPoints);\n  const baseline = new Float64Array(numberPoints);\n\n  // windowM 4 percent of spectrum length\n  // windowS 8 percent of spectrum length\n  const {\n    windowM = Math.round(numberPoints * 0.04),\n    windowS = Math.round(numberPoints * 0.08),\n  } = options;\n\n  // fi(1) in original paper\n  for (let i = 0; i < spectrum.length; i++) {\n    let windowLeft = Math.max(0, i - windowM);\n    let windowRight = Math.min(i + windowM + 1, spectrum.length);\n\n    minima[i] = xMinValue(spectrum, {\n      fromIndex: windowLeft,\n      toIndex: windowRight,\n    });\n  }\n\n  // fi in original paper\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = Math.max(0, i - windowM);\n    let windowRight = Math.min(i + windowM + 1, minima.length);\n    maxima[i] = xMaxValue(minima, {\n      fromIndex: windowLeft,\n      toIndex: windowRight,\n    });\n  }\n\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = Math.max(0, i - windowS);\n    let windowRight = Math.min(i + windowS + 1, maxima.length);\n    baseline[i] = xMean(maxima.subarray(windowLeft, windowRight));\n  }\n\n  return baseline;\n}\n","import airpls from 'ml-airpls';\nimport sequentialFill from 'ml-array-sequential-fill';\n/**\n * Adaptive iteratively reweighted penalized least squares [1]\n *\n * This function calls ml-airpls\n *\n * References:\n * [1] Zhang, Z.-M.; Chen, S.; Liang, Y.-Z.\n * Baseline Correction Using Adaptive Iteratively Reweighted Penalized Least Squares.\n * Analyst 2010, 135 (5), 1138–1146. https://doi.org/10.1039/B922045C.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {object} [options.regression] - Options for the regression\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {function} [options.regression.§Regression = PolynomialRegression] - Regression class with a predict method\n * @param {*} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function airPLSBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n  let output = airpls(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","import sequentialFill from 'ml-array-sequential-fill';\nimport baselineCorrection from 'ml-baseline-correction-regression';\n\n/**\n * Iterative polynomial fitting [1]\n *\n * Implementation based on ml-baseline-correction-regression\n *\n * References:\n * [1] Gan, F.; Ruan, G.; Mo, J.\n * Baseline Correction by Improved Iterative Polynomial Fitting with Automatic Threshold.\n *  Chemometrics and Intelligent Laboratory Systems 2006, 82 (1), 59–65.\n * https://doi.org/10.1016/j.chemolab.2005.08.009.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {Object} [options.regression]\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {Object} [options.regression]\n * @param {function} [options.regression.Regression = PolynomialRegression] - Regression class with a predict method\n * @param {Object} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function iterativePolynomialBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n\n  let output = baselineCorrection(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","import { xRollingAverage } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingAverageBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = { ...defaults, ...options };\n  let baseline = xRollingAverage(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline, correctedSpectrum: corrected };\n}\n","import { rollingBall } from 'ml-rolling-ball-baseline';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Algorithm described in (1), but in the implementation here the window width does not change.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the specturm length\n * @returns {BaselineOutput}\n */\nexport function rollingBallBaseline(ys, options = {}) {\n  const baseline = rollingBall(ys, options);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline, correctedSpectrum: corrected };\n}\n","import { xRollingMedian } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingMedianBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = { ...defaults, ...options };\n  let baseline = xRollingMedian(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline, correctedSpectrum: corrected };\n}\n"],"names":["prepare","M","n","P","Pinv","Array","k","Mt","a","length","ar","ac","t","i","Ap","Ai","Ax","LNZ","coloffset","e","col","adr","d","D","Y","Lp","Parent","Lnz","Flag","Pattern","bp1","x","p","kk","p2","ldlSymbolic","Lx","Li","yi","lKi","len","top","ldlNumeric","b","X","B","j","ldlPerm","ldlLsolve","ldlDsolve","ldlLTsolve","ldlPermt","compareNum","list","adj","visited","l","push","toVisit","eol","ptr","v","nbhd","sort","u","result","getClosestNumber","array","goal","closest","reduce","prev","curr","Math","abs","getCloseIndex","indexOf","updateSystem","matrix","y","weights","nbPoints","newMatrix","newVector","Float64Array","w","diag","next","slice","getDeltaMatrix","lambda","last","lowerTriangularNonZeros","permutationEncodedArray","cuthillMckee","airPLS","baseline","iteration","options","arguments","undefined","maxIterations","factorCriterion","fill","controlPoints","baseLineZones","forEach","arr","range","indexFrom","from","indexTo","to","sumNegDifferences","Number","MAX_SAFE_INTEGER","stopCriterion","sum","leftHandSide","rightHandSide","cho","Cholesky","difference","map","calculateError","maxNegativeDiff","diff","exp","value","corrected","error","toString","Object","prototype","isAnyArray","call","endsWith","_typeof","obj","Symbol","iterator","constructor","sequentialFill","input","TypeError","_options","_options$from","_options$to","_options$size","size","step","Error","floor","isArray","_i","max","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","maxValue","min","minValue","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","name","inspectData","rows","columns","maxI","maxJ","loop","get","line","formatNumber","join","num","formatNumber2","padEnd","str","fix","toFixed","startsWith","toExponential","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","Matrix","row","column","set","random","interval","round","this","zeros","data","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","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","by","NaN","NEGATIVE_INFINITY","maxIndex","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","norm","type","sqrt","cumulativeSum","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","r","c","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","BaseView","MatrixTransposeView","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","count","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","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","maybeToPrecision","digits","toPrecision","BaseRegression","predict","_predict","train","toLaTeX","score","y2","xSum","ySum","chi2","rmsd","xSquared","ySquared","xY","PolynomialRegression","degree","powers","coefficients","checkArrayLength","pr","F","FT","A","useSVD","regress","precision","_toFormula","isLaTeX","sup","closeSup","times","fn","charAt","json","baselineCorrectionRegression","Regression","regressionOptions","tolerance","delta","regression","fitting","oldFitting","_ref","module","exports","window","median","xMedian","quickSelectMedian","xCheck","xFindClosestIndex","target","sorted","low","high","currentDiff","xGetFromToIndex","xMaxValue","xMinValue","xMean","sumValue","xPadding","algorithm","fromEnd","toEnd","toLowerCase","xRolling","fct","padding","subarray","xRollingAverage","xRollingMedian","rollingBall","spectrum","numberPoints","maxima","minima","windowM","windowS","windowLeft","windowRight","ys","airpls","correctedSpectrum","baselineCorrection","defaults","actualOptions"],"mappings":"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"}