{"version":3,"file":"openchemlib-utils.min.js","sources":["../src/util/tagAtom.js","../src/diastereotopic/addDiastereotopicMissingChirality.js","../src/util/makeRacemic.js","../src/diastereotopic/getDiastereotopicAtomIDs.js","../src/diastereotopic/getDiastereotopicAtomIDsAndH.js","../src/util/isCsp3.js","../src/hose/getHoseCodesForAtom.js","../src/hose/getHoseCodesFromDiastereotopicID.js","../src/util/combineSmiles.js","../src/util/getAtomsInfo.js","../node_modules/is-any-array/src/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","../src/util/getConnectivityMatrix.js","../node_modules/ml-floyd-warshall/src/index.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/atom-sorter/src/index.js","../src/util/getMF.js","../src/hose/getHoseCodesForPath.js","../src/path/getPathsInfo.js","../src/diastereotopic/getGroupedDiastereotopicAtomIDs.js","../src/hose/getHoseCodesAndDiastereotopicIDs.js","../src/path/getShortestPaths.js","../src/diastereotopic/toDiastereotopicSVG.js"],"sourcesContent":["let xAtomicNumber = 0;\n\n/**\n * Tag an atom to be able to visualize it\n * @param {OCL.Molecule} molecule\n * @param {number} iAtom\n */\nexport function tagAtom(molecule, iAtom) {\n  let customLabel = `${molecule.getAtomLabel(iAtom)}*`;\n  molecule.setAtomCustomLabel(iAtom, customLabel);\n  if (molecule.getAtomicNo(iAtom) === 1) {\n    molecule.setAtomicNo(iAtom, getXAtomicNumber(molecule));\n  } else {\n    // we can not use X because we would have problems with valencies if it is\n    // expanded hydrogens or not\n    // we can not only use a custom label because it does not count for the canonisation\n    molecule.setAtomMass(iAtom, molecule.getAtomMass(iAtom) + 5);\n  }\n  return customLabel;\n}\n\nfunction getXAtomicNumber(molecule) {\n  if (!xAtomicNumber) {\n    const OCL = molecule.getOCL();\n    xAtomicNumber = OCL.Molecule.getAtomicNoFromLabel('X');\n  }\n  return xAtomicNumber;\n}\n","import { tagAtom } from '../util/tagAtom';\n\n/**\n * Add either missing chirality of diastereotopic missing chirality\n * The problem is that sometimes we need to add chiral bond that was not planned because it is the same group\n * This is the case for example for the valine where the 2 C of the methyl groups are diastereotopic\n * @param {OCL.Molecule} molecule\n * @param {object} [options={}]\n * @param {number} [options.esrType=cESRTypeAnd]\n */\nexport function addDiastereotopicMissingChirality(molecule, options = {}) {\n  const { Molecule } = molecule.getOCL();\n  const { esrType = Molecule.cESRTypeAnd } = options;\n\n  for (let iAtom = 0; iAtom < molecule.getAllAtoms(); iAtom++) {\n    let tempMolecule = molecule.getCompactCopy();\n    tagAtom(tempMolecule, iAtom);\n    // After copy, helpers must be recalculated\n    tempMolecule.ensureHelperArrays(Molecule.cHelperBitsStereo);\n    // We need to have >0 and not >1 because there could be unspecified chirality in racemate\n\n    for (let i = 0; i < tempMolecule.getAtoms(); i++) {\n      // changed from from handling below; TLS 9.Nov.2015\n      if (\n        tempMolecule.isAtomStereoCenter(i) &&\n        tempMolecule.getStereoBond(i) === -1\n      ) {\n        let stereoBond = tempMolecule.getAtomPreferredStereoBond(i);\n        if (stereoBond !== -1) {\n          molecule.setBondType(stereoBond, Molecule.cBondTypeUp);\n          if (molecule.getBondAtom(1, stereoBond) === i) {\n            let connAtom = molecule.getBondAtom(0, stereoBond);\n            molecule.setBondAtom(0, stereoBond, i);\n            molecule.setBondAtom(1, stereoBond, connAtom);\n          }\n          // To me it seems that we have to add all stereo centers into AND group 0. TLS 9.Nov.2015\n          molecule.setAtomESR(i, esrType, 0);\n        }\n      }\n    }\n  }\n}\n","/**\n *\n * @param {OCL.Molecule} [molecule] An instance of a molecule\n * @param {object} [options={}]\n * @param {object} [options.OCL] openchemlib library\n */\nexport function makeRacemic(molecule) {\n  const { Molecule } = molecule.getOCL();\n\n  // if we don't calculate this we have 2 epimers\n  molecule.ensureHelperArrays(Molecule.cHelperCIP);\n\n  // we need to make one group \"AND\" for chiral (to force to racemic, this means diastereotopic and not enantiotopic)\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomParity(i) !== Molecule.cAtomParityNone) {\n      molecule.setAtomESR(i, Molecule.cESRTypeAnd, 0); // changed to group 0; TLS 9.Nov.2015\n    }\n  }\n}\n","import { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nimport { addDiastereotopicMissingChirality } from './addDiastereotopicMissingChirality';\n\n/**\n * Returns an array of diastereotopic ID (as oclCode)\n * @param {OCL.Molecule} molecule\n */\nexport function getDiastereotopicAtomIDs(molecule) {\n  const OCL = molecule.getOCL();\n  addDiastereotopicMissingChirality(molecule);\n\n  let numberAtoms = molecule.getAllAtoms();\n  let ids = [];\n  for (let iAtom = 0; iAtom < numberAtoms; iAtom++) {\n    let tempMolecule = molecule.getCompactCopy();\n    tagAtom(tempMolecule, iAtom);\n    makeRacemic(tempMolecule);\n    // We need to ensure the helper array in order to get correctly the result of racemisation\n    ids[iAtom] = tempMolecule.getCanonizedIDCode(\n      OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n    );\n  }\n  return ids;\n}\n","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs';\n// Previously getExtendedDiastereotopicAtomIDs\n\n/**\n *\n * @param {OCL.Molecule} molecule\n */\nexport function getDiastereotopicAtomIDsAndH(originalMolecule) {\n  const OCL = originalMolecule.getOCL();\n  const molecule = originalMolecule.getCompactCopy();\n  molecule.addImplicitHydrogens();\n  // TODO Temporary code ???\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n\n  const diaIDs = getDiastereotopicAtomIDs(molecule);\n  const newDiaIDs = [];\n\n  for (let i = 0; i < diaIDs.length; i++) {\n    const diaID = diaIDs[i];\n    const newDiaID = {\n      oclID: diaID,\n      hydrogenOCLIDs: [],\n      nbHydrogens: 0,\n    };\n    if (molecule.getAtomicNo(i) === 1) {\n      const atom = molecule.getConnAtom(i, 0);\n      newDiaID.heavyAtom = diaIDs[atom];\n    }\n    for (let j = 0; j < molecule.getAllConnAtoms(i); j++) {\n      const atom = molecule.getConnAtom(i, j);\n      if (molecule.getAtomicNo(atom) === 1) {\n        newDiaID.nbHydrogens++;\n        if (newDiaID.hydrogenOCLIDs.indexOf(diaIDs[atom]) === -1) {\n          newDiaID.hydrogenOCLIDs.push(diaIDs[atom]);\n        }\n      }\n    }\n\n    newDiaIDs.push(newDiaID);\n  }\n\n  return newDiaIDs;\n}\n","/**\n * Check if a specific atom is a sp3 carbon\n * @param {OCL.Molecule} molecule\n * @param {number} atomID\n */\n\nexport function isCsp3(molecule, atomID) {\n  if (molecule.getAtomicNo(atomID) !== 6) return false;\n  if (molecule.getAtomCharge(atomID) !== 0) return false;\n  if (\n    molecule.getImplicitHydrogens(atomID) + molecule.getConnAtoms(atomID) !==\n    4\n  ) {\n    return false;\n  }\n  return true;\n}\n","import { isCsp3 } from '../util/isCsp3';\nimport { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nexport const FULL_HOSE_CODE = 1;\nexport const HOSE_CODE_CUT_C_SP3_SP3 = 2;\n\n/**\n * Returns the hose code for a specific atom number\n * @param {OCL.Molecule} originalMolecule\n * @param {number} rootAtom\n * @param {object} [options={}]\n * @param {boolean} [options.isTagged] Specify is the atom is already tagged\n */\nexport function getHoseCodesForAtom(originalMolecule, rootAtom, options = {}) {\n  const OCL = originalMolecule.getOCL();\n  const {\n    minSphereSize = 0,\n    maxSphereSize = 4,\n    kind = FULL_HOSE_CODE,\n    isTagged = false,\n  } = options;\n\n  const molecule = originalMolecule.getCompactCopy();\n\n  if (!isTagged) {\n    let tag = tagAtom(molecule, rootAtom);\n    molecule.addImplicitHydrogens();\n    molecule.addMissingChirality();\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    // because ensuring helper reorder atoms we need to look again for it\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n      if (tag === molecule.getAtomCustomLabel(i)) {\n        rootAtom = i;\n        break;\n      }\n    }\n  }\n\n  let fragment = new OCL.Molecule(0, 0);\n  let results = [];\n  let min = 0;\n  let max = 0;\n  let atomMask = new Array(molecule.getAllAtoms());\n  let atomList = new Array(molecule.getAllAtoms());\n\n  for (let sphere = 0; sphere <= maxSphereSize; sphere++) {\n    if (max === 0) {\n      atomList[0] = rootAtom;\n      atomMask[rootAtom] = true;\n      max = 1;\n    } else {\n      let newMax = max;\n      for (let i = min; i < max; i++) {\n        let atom = atomList[i];\n        for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n          let connAtom = molecule.getConnAtom(atom, j);\n          if (!atomMask[connAtom]) {\n            switch (kind) {\n              case FULL_HOSE_CODE:\n                atomMask[connAtom] = true;\n                atomList[newMax++] = connAtom;\n                break;\n              case HOSE_CODE_CUT_C_SP3_SP3:\n                if (!(isCsp3(molecule, atom) && isCsp3(molecule, connAtom))) {\n                  atomMask[connAtom] = true;\n                  atomList[newMax++] = connAtom;\n                }\n                break;\n              default:\n                throw new Error('getHoseCoesForAtom unknown kind');\n            }\n          }\n        }\n      }\n      min = max;\n      max = newMax;\n    }\n    molecule.copyMoleculeByAtoms(fragment, atomMask, true, null);\n    if (sphere >= minSphereSize) {\n      makeRacemic(fragment);\n      results.push(\n        fragment.getCanonizedIDCode(\n          OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n        ),\n      );\n    }\n  }\n  return results;\n}\n","import { getHoseCodesForAtom } from './getHoseCodesForAtom';\n/**\n * Returns the hose code for a specific marked atom\n * @param {OCL.Molecule} diastereotopicID\n * @param {object} options\n */\n\nexport function getHoseCodesFromDiastereotopicID(molecule, options = {}) {\n  molecule.addImplicitHydrogens();\n  molecule.addMissingChirality();\n\n  // One of the atom has to be marked !\n  let atomID = -1;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    // we need to find the marked atom\n    const atomCustomLabel = molecule.getAtomCustomLabel(i);\n    if (atomCustomLabel != null && atomCustomLabel.endsWith('*')) {\n      atomID = i;\n      break;\n    }\n  }\n  if (atomID >= 0) {\n    options.isTagged = true;\n    return getHoseCodesForAtom(molecule, atomID, options);\n  }\n  return undefined;\n}\n","const MAX_R = 10;\n\n/**\n * Generate molecules and calcule predicted properties form a list of smiles and fragments\n * @param {string} [coreSmiles]\n * @param {array} [fragments] Array of {smiles,R1,R2,...}\n * @param {object} [options={}]\n * @param {function} [options.onStep] method to execute each new molecules\n * @param {boolean} [options.complexity] returns only the number of molecules to evaluate\n * @return {Promise} promise that resolves to molecules or complexity as a number\n */\nexport async function combineSmiles(coreSmiles, fragments, OCL, options = {}) {\n  const { complexity = false } = options;\n  const core = getCore(coreSmiles);\n  const rGroups = getRGroups(core, fragments);\n  if (complexity) {\n    return getComplexity(rGroups);\n  }\n  return generate(core, rGroups, OCL, options);\n}\n\nfunction getComplexity(rGroups) {\n  let complexity = 1;\n  for (let rGroup of rGroups) {\n    complexity *= rGroup.smiles.length;\n  }\n  return complexity;\n}\n\nasync function generate(core, rGroups, OCL, options = {}) {\n  const { onStep } = options;\n  const molecules = {};\n  const sizes = new Array(rGroups.length);\n  const currents = new Array(rGroups.length);\n  for (let i = 0; i < rGroups.length; i++) {\n    sizes[i] = rGroups[i].smiles.length - 1;\n    currents[i] = 0;\n  }\n  let position = 0;\n  let counter = 0;\n\n  while (true) {\n    counter++;\n    while (position < currents.length) {\n      if (currents[position] < sizes[position]) {\n        if (onStep) {\n          await onStep(counter);\n        }\n        appendMolecule(molecules, core, rGroups, currents, OCL);\n        currents[position]++;\n        for (let i = 0; i < position; i++) {\n          currents[i] = 0;\n        }\n        position = 0;\n      } else {\n        position++;\n      }\n    }\n    if ((position = currents.length)) {\n      if (onStep) {\n        await onStep(counter);\n      }\n      appendMolecule(molecules, core, rGroups, currents, OCL);\n      break;\n    }\n  }\n  return Object.keys(molecules)\n    .map((key) => molecules[key])\n    .sort((m1, m2) => m1.mw - m2.mw);\n}\n\nfunction appendMolecule(molecules, core, rGroups, currents, OCL) {\n  let newSmiles = core.smiles;\n  for (let i = 0; i < currents.length; i++) {\n    newSmiles += `.${rGroups[i].smiles[currents[i]]}`;\n  }\n\n  const currentMol = OCL.Molecule.fromSmiles(newSmiles);\n  const idCode = currentMol.getIDCode();\n\n  if (!molecules[idCode]) {\n    let molecule = {};\n    molecules[idCode] = molecule;\n    molecule.smiles = currentMol.toSmiles();\n    molecule.combinedSmiles = newSmiles;\n    molecule.idCode = idCode;\n    molecule.molfile = currentMol.toMolfile();\n\n    const props = new OCL.MoleculeProperties(currentMol);\n    molecule.nbHAcceptor = props.acceptorCount;\n    molecule.nbHDonor = props.donorCount;\n    molecule.logP = props.logP;\n    molecule.logS = props.logS;\n    molecule.PSA = props.polarSurfaceArea;\n    molecule.nbRottable = props.rotatableBondCount;\n    molecule.nbStereoCenter = props.stereoCenterCount;\n    let mf = currentMol.getMolecularFormula();\n    molecule.mf = mf.formula;\n    molecule.mw = mf.relativeWeight;\n  }\n}\n\nfunction getCore(coreSmiles) {\n  let core = {\n    originalSmiles: coreSmiles,\n    smiles: coreSmiles.replace(/\\[R(?<group>[1-4])\\]/g, '%5$<group>'),\n  };\n\n  for (let i = 0; i < MAX_R; i++) {\n    if (core.originalSmiles.indexOf(`[R${i}]`) > -1) core[`R${i}`] = true;\n  }\n  return core;\n}\n\nfunction getRGroups(core, fragments) {\n  let rGroups = {};\n  for (const fragment of fragments) {\n    if (fragment.smiles) {\n      const smiles = updateRPosition(fragment.smiles);\n      for (let i = 0; i < MAX_R; i++) {\n        if (core[`R${i}`]) {\n          // we only consider the R that are in the core\n          if (fragment[`R${i}`]) {\n            if (!rGroups[`R${i}`]) {\n              rGroups[`R${i}`] = {\n                group: `R${i}`,\n                smiles: [],\n              };\n            }\n            rGroups[`R${i}`].smiles.push(smiles.replace(/\\[R\\]/, `(%5${i})`));\n          }\n        }\n      }\n    }\n  }\n  return Object.keys(rGroups).map((key) => rGroups[key]);\n}\n\nfunction updateRPosition(smiles) {\n  // R group should not be at the beginning\n  if (smiles.indexOf('[R]') !== 0) return smiles;\n  if (smiles.length === 3) return '[H][R]';\n  // we are in trouble ... we need to move the R\n  let newSmiles = smiles.replace('[R]', '');\n  // we need to check where we should put the R group\n  let level = 0;\n  for (let j = 0; j < newSmiles.length; j++) {\n    let currentChar = newSmiles.charAt(j);\n    let currentSubstring = newSmiles.substr(j);\n    if (currentChar === '(') {\n      level++;\n    } else if (currentChar === ')') {\n      level--;\n    } else if (level === 0) {\n      if (currentSubstring.match(/^[a-z]/)) {\n        return `${newSmiles.substr(0, j + 1)}([R])${newSmiles.substr(j + 1)}`;\n      } else if (currentSubstring.match(/^[A-Z][a-z]/)) {\n        return `${newSmiles.substr(0, j + 2)}([R])${newSmiles.substr(j + 2)}`;\n      } else if (currentSubstring.match(/^[A-Z]/)) {\n        return `${newSmiles.substr(0, j + 1)}([R])${newSmiles.substr(j + 1)}`;\n      }\n    }\n  }\n  return smiles;\n}\n","import { getDiastereotopicAtomIDs } from '../diastereotopic/getDiastereotopicAtomIDs';\n\n/**\n * Returns various information about atoms in the molecule\n * @param {OCL.Molecule} [molecule]\n */\nexport function getAtomsInfo(molecule) {\n  const OCL = molecule.getOCL();\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperRings);\n\n  let diaIDs = getDiastereotopicAtomIDs(molecule);\n\n  let results = [];\n  for (let i = 0; i < diaIDs.length; i++) {\n    let result = {\n      oclID: diaIDs[i],\n      extra: {\n        singleBonds: 0,\n        doubleBonds: 0,\n        tripleBonds: 0,\n        aromaticBonds: 0,\n        cnoHybridation: 0, // should be 1 (sp), 2 (sp2) or 3 (sp3)\n      },\n    };\n    let extra = result.extra;\n    results.push(result);\n    result.abnormalValence = molecule.getAtomAbnormalValence(i); // -1 is normal otherwise specified\n    result.charge = molecule.getAtomCharge(i);\n    result.cipParity = molecule.getAtomCIPParity(i);\n    result.color = molecule.getAtomColor(i);\n    result.customLabel = molecule.getAtomCustomLabel(i);\n    //        result.esrGroup=molecule.getAtomESRGroup(i);\n    //        result.esrType=molecule.getAtomESRType(i);\n    result.atomicNo = molecule.getAtomicNo(i);\n    result.label = molecule.getAtomLabel(i);\n    //        result.list=molecule.getAtomList(i);\n    //        result.listString=molecule.getAtomListString(i);\n    //        result.mapNo=molecule.getAtomMapNo(i);\n    result.mass = molecule.getAtomMass(i);\n    //        result.parity=molecule.getAtomParity(i);\n    //        result.pi=molecule.getAtomPi(i);\n    //        result.preferredStereoBond=molecule.getAtomPreferredStereoBond(i);\n    //        result.queryFeatures=molecule.getAtomQueryFeatures(i);\n    result.radical = molecule.getAtomRadical(i);\n    result.ringBondCount = molecule.getAtomRingBondCount(i);\n    //        result.ringCount=molecule.getAtomRingCount(i);\n    result.ringSize = molecule.getAtomRingSize(i);\n    result.x = molecule.getAtomX(i);\n    result.y = molecule.getAtomY(i);\n    result.z = molecule.getAtomZ(i);\n    result.allHydrogens = molecule.getAllHydrogens(i);\n    result.connAtoms = molecule.getConnAtoms(i);\n    result.allConnAtoms = molecule.getAllConnAtoms(i);\n\n    result.implicitHydrogens =\n      result.allHydrogens + result.connAtoms - result.allConnAtoms;\n\n    result.isAromatic = molecule.isAromaticAtom(i);\n    result.isAllylic = molecule.isAllylicAtom(i);\n    result.isStereoCenter = molecule.isAtomStereoCenter(i);\n    result.isRing = molecule.isRingAtom(i);\n    result.isSmallRing = molecule.isSmallRingAtom(i);\n    result.isStabilized = molecule.isStabilizedAtom(i);\n\n    // todo HACK to circumvent bug in OCL that consider than an hydrogen is connected to itself\n    result.extra.singleBonds =\n      result.atomicNo === 1 ? 0 : result.implicitHydrogens;\n    for (let j = 0; j < molecule.getAllConnAtoms(i); j++) {\n      let bond = molecule.getConnBond(i, j);\n      let bondOrder = molecule.getBondOrder(bond);\n      if (molecule.isAromaticBond(bond)) {\n        extra.aromaticBonds++;\n      } else if (bondOrder === 1) {\n        // not an hydrogen\n        extra.singleBonds++;\n      } else if (bondOrder === 2) {\n        extra.doubleBonds++;\n      } else if (bondOrder === 3) {\n        extra.tripleBonds++;\n      }\n    }\n    result.extra.totalBonds =\n      result.extra.singleBonds +\n      result.extra.doubleBonds +\n      result.extra.tripleBonds +\n      result.extra.aromaticBonds;\n\n    if (result.atomicNo === 6) {\n      result.extra.cnoHybridation = result.extra.totalBonds - 1;\n    } else if (result.atomicNo === 7) {\n      result.extra.cnoHybridation = result.extra.totalBonds;\n    } else if (result.atomicNo === 8) {\n      result.extra.cnoHybridation = result.extra.totalBonds + 1;\n    } else if (result.atomicNo === 1) {\n      let connectedAtom =\n        molecule.getAllConnAtoms(i) === 0\n          ? 0\n          : molecule.getAtomicNo(molecule.getConnAtom(i, 0));\n      result.extra.hydrogenOnAtomicNo = connectedAtom;\n      if (connectedAtom === 7 || connectedAtom === 8) {\n        result.extra.labileHydrogen = true;\n      }\n    }\n  }\n  return results;\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport default min;\n","import isArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport default rescale;\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkIndices,\n  checkNonEmpty,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","import floydWarshall from 'ml-floyd-warshall';\nimport { Matrix } from 'ml-matrix';\n\n/**\n * Returns a connectivity matrix\n * @param {OCL.Molecule} molecule\n * @param {object} [options={}]\n * @param {boolean} [options.pathLength=false] get the path length between atoms\n * @param {boolean} [options.mass=false] set the nominal mass of the atoms on diagonal\n * @param {boolean} [options.atomicNo=false] set the atomic number of the atom on diagonal\n * @param {boolean} [options.negativeAtomicNo=false] set the atomic number * -1 of the atom on diagonal\n * @param {boolean} [options.sdt=false] set 1, 2 or 3 depending if single, double or triple bond\n * @param {boolean} [options.sdta=false] set 1, 2, 3 or 4 depending if single, double, triple or aromatic  bond\n */\nexport function getConnectivityMatrix(molecule, options = {}) {\n  const OCL = molecule.getOCL();\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n  let nbAtoms = molecule.getAllAtoms();\n\n  let result = new Array(nbAtoms).fill();\n  result = result.map(() => new Array(nbAtoms).fill(0));\n\n  if (!options.pathLength) {\n    if (options.atomicNo) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = molecule.getAtomicNo(i);\n      }\n    } else if (options.negativeAtomicNo) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = -molecule.getAtomicNo(i);\n      }\n    } else if (options.mass) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = OCL.Molecule.cRoundedMass[molecule.getAtomicNo(i)];\n      }\n    } else {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = 1;\n      }\n    }\n  }\n\n  if (options.sdt) {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        result[i][molecule.getConnAtom(i, j)] = molecule.getConnBondOrder(i, j);\n      }\n    }\n  } else if (options.sdta) {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        let bondNumber = molecule.getConnBond(i, j);\n        if (molecule.isAromaticBond(bondNumber)) {\n          result[i][molecule.getConnAtom(i, j)] = 4;\n        } else {\n          result[i][molecule.getConnAtom(i, j)] = molecule.getConnBondOrder(\n            i,\n            j,\n          );\n        }\n      }\n    }\n  } else {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        result[i][molecule.getConnAtom(i, j)] = 1;\n      }\n    }\n  }\n\n  if (options.pathLength) {\n    result = floydWarshall(new Matrix(result)).to2DArray();\n  }\n  return result;\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * Algorithm that finds the shortest distance from one node to the other\n * @param {Matrix} adjMatrix - A squared adjacency matrix\n * @return {Matrix} - Distance from a node to the other, -1 if the node is unreachable\n */\nexport default function floydWarshall(adjMatrix) {\n  if (Matrix.isMatrix(adjMatrix) && adjMatrix.columns !== adjMatrix.rows) {\n    throw new TypeError('The adjacency matrix should be squared');\n  }\n  const numVertices = adjMatrix.columns;\n  let distMatrix = new Matrix(numVertices, numVertices);\n  distMatrix.apply((row, column) => {\n    // principal diagonal is 0\n    if (row === column) {\n      distMatrix.set(row, column, 0);\n    } else {\n      let val = adjMatrix.get(row, column);\n\n      if (val) {\n        // edges values remain the same\n        distMatrix.set(row, column, val);\n      } else {\n        // 0 values become infinity\n        distMatrix.set(row, column, Number.POSITIVE_INFINITY);\n      }\n    }\n  });\n\n  for (let k = 0; k < numVertices; ++k) {\n    for (let i = 0; i < numVertices; ++i) {\n      for (let j = 0; j < numVertices; ++j) {\n        let dist = distMatrix.get(i, k) + distMatrix.get(k, j);\n        if (distMatrix.get(i, j) > dist) {\n          distMatrix.set(i, j, dist);\n        }\n      }\n    }\n  }\n\n  // When there's no connection the value is -1\n  distMatrix.apply((row, column) => {\n    if (distMatrix.get(row, column) === Number.POSITIVE_INFINITY) {\n      distMatrix.set(row, column, -1);\n    }\n  });\n  return distMatrix;\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","'use strict';\n\nfunction atomSorter(a, b) {\n  if (a === b) return 0;\n  if (a === 'C') return -1;\n  if (b === 'C') return 1;\n  if (a === 'H') return -1;\n  if (b === 'H') return 1;\n  if (a < b) return -1;\n  return 1;\n}\n\nmodule.exports = atomSorter;\n","import atomSorter from 'atom-sorter';\n\n/**\n * Calculate the molecular formula in 'chemcalc' notation taking into account fragments, isotopes and charges\n * {OCL.Molecule} [molecule] an instance of OCL.Molecule\n * @returns {String}\n */\n\nexport function getMF(molecule) {\n  let entries = molecule.getFragments();\n  let result = {};\n  let parts = [];\n  let allAtoms = [];\n\n  entries.forEach(function (entry) {\n    let mf = getFragmentMF(entry, allAtoms);\n    parts.push(mf);\n  });\n\n  let counts = {};\n  for (let part of parts) {\n    if (!counts[part]) counts[part] = 0;\n    counts[part]++;\n  }\n  parts = [];\n  for (let key of Object.keys(counts).sort()) {\n    if (counts[key] > 1) {\n      parts.push(counts[key] + key);\n    } else {\n      parts.push(key);\n    }\n  }\n\n  result.parts = parts;\n  result.mf = toMFString(allAtoms);\n  return result;\n}\n\nfunction getFragmentMF(molecule, allAtoms) {\n  let atoms = [];\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    let atom = {};\n    atom.charge = molecule.getAtomCharge(i);\n    atom.label = molecule.getAtomLabel(i);\n    atom.mass = molecule.getAtomMass(i);\n    atom.implicitHydrogens = molecule.getImplicitHydrogens(i);\n    atoms.push(atom);\n    allAtoms.push(atom);\n  }\n  return toMFString(atoms);\n}\n\nfunction toMFString(atoms) {\n  let charge = 0;\n  let mfs = {};\n  for (let atom of atoms) {\n    let label = atom.label;\n    charge += atom.charge;\n    if (atom.mass) {\n      label = `[${atom.mass}${label}]`;\n    }\n    let mfAtom = mfs[label];\n    if (!mfAtom) {\n      mfs[label] = 0;\n    }\n    mfs[label] += 1;\n    if (atom.implicitHydrogens) {\n      if (!mfs.H) mfs.H = 0;\n      mfs.H += atom.implicitHydrogens;\n    }\n  }\n\n  let mf = '';\n  let keys = Object.keys(mfs).sort(atomSorter);\n  for (let key of keys) {\n    mf += key;\n    if (mfs[key] > 1) mf += mfs[key];\n  }\n\n  if (charge > 0) {\n    mf += `(+${charge > 1 ? charge : ''})`;\n  } else if (charge < 0) {\n    mf += `(${charge < -1 ? charge : '-'})`;\n  }\n  return mf;\n}\n","import { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nlet fragment;\n\n/**\n * Returns the hose code for a specific atom number\n * @param {OCL.Molecule} molecule\n */\nexport function getHoseCodesForPath(molecule, from, to, maxLength) {\n  const OCL = molecule.getOCL();\n  const originalFrom = from;\n  const originalTo = to;\n  molecule = molecule.getCompactCopy();\n\n  let originalAtoms = []; // path before renumbering\n  molecule.getPath(originalAtoms, from, to, maxLength + 1);\n  let torsion;\n  if (originalAtoms.length === 4) {\n    torsion = molecule.calculateTorsion(originalAtoms);\n  }\n\n  const tag1 = tagAtom(molecule, from);\n  const tag2 = tagAtom(molecule, to);\n\n  molecule.addImplicitHydrogens();\n  molecule.addMissingChirality();\n\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n\n  from = -1;\n  to = -1;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (tag1 === tag2) {\n      if (molecule.getAtomCustomLabel(i) === tag1) {\n        if (from === -1) {\n          from = i;\n        } else {\n          to = i;\n        }\n      }\n    } else {\n      if (tag1 === molecule.getAtomCustomLabel(i)) {\n        from = i;\n      }\n      if (tag2 === molecule.getAtomCustomLabel(i)) {\n        to = i;\n      }\n    }\n  }\n\n  if (!fragment) fragment = new OCL.Molecule(0, 0);\n\n  let atoms = [];\n  molecule.getPath(atoms, from, to, maxLength + 1);\n\n  let min = 0;\n  let max = 0;\n  let atomMask = new Array(molecule.getAllAtoms()).fill(false);\n  let atomList = new Array(molecule.getAllAtoms()).fill(-1);\n  let hoses = [];\n\n  for (let sphere = 0; sphere <= 2; sphere++) {\n    if (max === 0) {\n      for (let atom of atoms) {\n        atomMask[atom] = true;\n        atomList[max++] = atom;\n      }\n    } else {\n      let newMax = max;\n      for (let i = min; i < max; i++) {\n        let atom = atomList[i];\n        for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n          let connAtom = molecule.getConnAtom(atom, j);\n          if (!atomMask[connAtom]) {\n            atomMask[connAtom] = true;\n            atomList[newMax++] = connAtom;\n          }\n        }\n      }\n      min = max;\n      max = newMax;\n    }\n    let atomMap = [];\n\n    molecule.copyMoleculeByAtoms(fragment, atomMask, true, atomMap);\n    makeRacemic(fragment);\n    let oclID = fragment.getCanonizedIDCode(\n      OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n    );\n\n    hoses.push({\n      sphere,\n      oclID,\n    });\n  }\n\n  return {\n    atoms: originalAtoms,\n    from: originalFrom,\n    to: originalTo,\n    torsion,\n    hoses,\n    length: originalAtoms.length - 1,\n  };\n}\n","import { getHoseCodesForPath } from '../hose/getHoseCodesForPath';\nimport { getAtomsInfo } from '../util/getAtomsInfo';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix';\n\nlet fragment;\n\n/**\n *\n * @param {OCL.Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [opions.fromLabel='H']\n * @param {string} [opions.toLabel='H']\n * @param {string} [opions.minLength=1]\n * @param {string} [opions.maxLength=4]\n\n */\nexport function getPathsInfo(molecule, options = {}) {\n  const {\n    fromLabel = 'H',\n    toLabel = 'H',\n    minLength = 1,\n    maxLength = 4,\n  } = options;\n\n  const OCL = molecule.getOCL();\n\n  if (!fragment) {\n    fragment = new OCL.Molecule(0, 0);\n  }\n\n  let fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n  let toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n\n  // we need to find all the atoms 'fromLabel' and 'toLabel'\n  let atomsInfo = getAtomsInfo(molecule);\n\n  let pathLengthMatrix = getConnectivityMatrix(molecule, {\n    pathLength: true,\n  });\n\n  for (let from = 0; from < molecule.getAllAtoms(); from++) {\n    atomsInfo[from].paths = [];\n    for (let to = 0; to < molecule.getAllAtoms(); to++) {\n      if (from !== to) {\n        if (molecule.getAtomicNo(from) === fromAtomicNumber) {\n          if (molecule.getAtomicNo(to) === toAtomicNumber) {\n            let pathLength = pathLengthMatrix[from][to];\n            if (pathLength >= minLength && pathLength <= maxLength) {\n              atomsInfo[from].paths.push(\n                getHoseCodesForPath(\n                  molecule,\n                  from,\n                  to,\n                  pathLength,\n                  atomsInfo[to].oclID,\n                ),\n              );\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return atomsInfo;\n}\n","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs';\n/**\n * This function groups the diasterotopic atomIds of the molecule based on equivalence of atoms. The output object contains\n * a set of chemically equivalent atoms(element.atoms) and the groups of magnetically equivalent atoms (element.magneticGroups)\n * @param {OCL.Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [options.atomLabel] Select atoms of the given atomLabel. By default it returns all the explicit atoms in the molecule\n * @returns {Array}\n */\n\nexport function getGroupedDiastereotopicAtomIDs(molecule, options = {}) {\n  const { atomLabel } = options;\n  let diaIDs = getDiastereotopicAtomIDs(molecule, options);\n  let diaIDsObject = {};\n  for (let i = 0; i < diaIDs.length; i++) {\n    if (!atomLabel || molecule.getAtomLabel(i) === atomLabel) {\n      let diaID = diaIDs[i];\n      if (!diaIDsObject[diaID]) {\n        diaIDsObject[diaID] = {\n          counter: 0,\n          atoms: [],\n          oclID: diaID,\n          atomLabel: molecule.getAtomLabel(i),\n        };\n      }\n      diaIDsObject[diaID].counter++;\n      diaIDsObject[diaID].atoms.push(i);\n    }\n  }\n\n  return Object.keys(diaIDsObject).map((key) => diaIDsObject[key]);\n}\n","import { getDiastereotopicAtomIDs } from '../diastereotopic/getDiastereotopicAtomIDs';\n\nimport { getHoseCodesFromDiastereotopicID } from './getHoseCodesFromDiastereotopicID';\n/**\n * Returns an array containing one entry per atom containing\n * diaID and hose code\n * @param {OCL.Molecule} molecule\n * @param {object} options\n */\n\nexport function getHoseCodesAndDiastereotopicIDs(molecule, options) {\n  const diaIDs = getDiastereotopicAtomIDs(molecule).map((oclID) => ({\n    oclID,\n  }));\n  const OCL = molecule.getOCL();\n  // TODO: seems like a very slow approach\n  diaIDs.forEach(function (diaID) {\n    const hoses = getHoseCodesFromDiastereotopicID(\n      OCL.Molecule.fromIDCode(diaID.oclID),\n      options,\n    );\n    diaID.hoses = [];\n    let sphere = 0;\n    for (const hose of hoses) {\n      diaID.hoses.push({\n        sphere: sphere++,\n        oclID: hose,\n      });\n    }\n  });\n  return diaIDs;\n}\n","/**\n * Get the shortest path between each pair of atoms in the molecule\n * @param {OCL.Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [opions.fromLabel='H']\n * @param {string} [opions.toLabel='H']\n * @param {string} [opions.maxLength=4]\n * @returns {Array<Array>} A matrix containing on each cell (i,j) the shortest path from atom i to atom j\n */\nexport function getShortestPaths(molecule, options = {}) {\n  const OCL = molecule.getOCL();\n  const { fromLabel = '', toLabel = '', maxLength = 3 } = options;\n\n  let fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n  let toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n\n  const nbAtoms = molecule.getAllAtoms();\n  let allShortestPaths = new Array(nbAtoms);\n  for (let i = 0; i < nbAtoms; i++) {\n    allShortestPaths[i] = new Array(nbAtoms);\n  }\n\n  for (let from = 0; from < nbAtoms; from++) {\n    allShortestPaths[from][from] = [from];\n    for (let to = from + 1; to < nbAtoms; to++) {\n      if (\n        (fromAtomicNumber === 0 ||\n          molecule.getAtomicNo(from) === fromAtomicNumber) &&\n        (toAtomicNumber === 0 || molecule.getAtomicNo(to) === toAtomicNumber)\n      ) {\n        let path = [];\n        molecule.getPath(path, from, to, maxLength);\n        if (path.length) {\n          allShortestPaths[from][to] = path.slice();\n          allShortestPaths[to][from] = path.reverse();\n        } else {\n          allShortestPaths[from][to] = null;\n          allShortestPaths[to][from] = null;\n        }\n      } else {\n        allShortestPaths[from][to] = null;\n        allShortestPaths[to][from] = null;\n      }\n    }\n  }\n\n  return allShortestPaths;\n}\n","import { getDiastereotopicAtomIDsAndH } from './getDiastereotopicAtomIDsAndH';\n\n/**\n * Returns a SVG\n * @param {*} molecule\n * @param {*} [options={}]\n */\nexport function toDiastereotopicSVG(molecule, options = {}) {\n  let {\n    width = 300,\n    height = 200,\n    prefix = 'ocl',\n    heavyAtomHydrogen = false,\n  } = options;\n  let svg = options.svg;\n  let diaIDs = [];\n\n  let hydrogenInfo = {};\n  getDiastereotopicAtomIDsAndH(molecule).forEach(function (line) {\n    hydrogenInfo[line.oclID] = line;\n  });\n\n  if (heavyAtomHydrogen) {\n    for (let i = 0; i < molecule.getAtoms(); i++) {\n      diaIDs.push([]);\n    }\n    let groupedDiaIDs = molecule.getGroupedDiastereotopicAtomIDs();\n    groupedDiaIDs.forEach(function (diaID) {\n      if (\n        hydrogenInfo[diaID.oclID] &&\n        hydrogenInfo[diaID.oclID].nbHydrogens > 0\n      ) {\n        diaID.atoms.forEach((atom) => {\n          hydrogenInfo[diaID.oclID].hydrogenOCLIDs.forEach((id) => {\n            if (!diaIDs[atom * 1].includes(id)) diaIDs[atom].push(id);\n          });\n        });\n      }\n    });\n  } else {\n    diaIDs = molecule.getDiastereotopicAtomIDs().map((a) => [a]);\n  }\n\n  if (!svg) svg = molecule.toSVG(width, height, prefix);\n\n  svg = svg.replace(/Atom:[0-9]+\"/g, function (value) {\n    let atom = value.replace(/[^0-9]/g, '');\n    return `${value} data-diaid=\"${diaIDs[atom].join(',')}\"`;\n  });\n\n  return svg;\n}\n"],"names":["xAtomicNumber","tagAtom","molecule","iAtom","customLabel","getAtomLabel","setAtomCustomLabel","getAtomicNo","setAtomicNo","OCL","getOCL","Molecule","getAtomicNoFromLabel","getXAtomicNumber","setAtomMass","getAtomMass","addDiastereotopicMissingChirality","options","esrType","cESRTypeAnd","getAllAtoms","tempMolecule","getCompactCopy","ensureHelperArrays","cHelperBitsStereo","i","getAtoms","isAtomStereoCenter","getStereoBond","stereoBond","getAtomPreferredStereoBond","setBondType","cBondTypeUp","getBondAtom","connAtom","setBondAtom","setAtomESR","makeRacemic","cHelperCIP","getAtomParity","cAtomParityNone","getDiastereotopicAtomIDs","numberAtoms","ids","getCanonizedIDCode","CANONIZER_ENCODE_ATOM_CUSTOM_LABELS","getDiastereotopicAtomIDsAndH","originalMolecule","addImplicitHydrogens","cHelperNeighbours","diaIDs","newDiaIDs","length","newDiaID","oclID","hydrogenOCLIDs","nbHydrogens","atom","getConnAtom","heavyAtom","j","getAllConnAtoms","indexOf","push","isCsp3","atomID","getAtomCharge","getImplicitHydrogens","getConnAtoms","FULL_HOSE_CODE","getHoseCodesForAtom","rootAtom","minSphereSize","maxSphereSize","kind","isTagged","tag","addMissingChirality","getAtomCustomLabel","fragment","results","min","max","atomMask","Array","atomList","sphere","newMax","Error","copyMoleculeByAtoms","getHoseCodesFromDiastereotopicID","atomCustomLabel","endsWith","appendMolecule","molecules","core","rGroups","currents","newSmiles","smiles","currentMol","fromSmiles","idCode","getIDCode","toSmiles","combinedSmiles","molfile","toMolfile","props","MoleculeProperties","nbHAcceptor","acceptorCount","nbHDonor","donorCount","logP","logS","PSA","polarSurfaceArea","nbRottable","rotatableBondCount","nbStereoCenter","stereoCenterCount","mf","getMolecularFormula","formula","mw","relativeWeight","updateRPosition","replace","level","currentChar","charAt","currentSubstring","substr","match","getAtomsInfo","cHelperRings","result","extra","singleBonds","doubleBonds","tripleBonds","aromaticBonds","cnoHybridation","abnormalValence","getAtomAbnormalValence","charge","cipParity","getAtomCIPParity","color","getAtomColor","atomicNo","label","mass","radical","getAtomRadical","ringBondCount","getAtomRingBondCount","ringSize","getAtomRingSize","x","getAtomX","y","getAtomY","z","getAtomZ","allHydrogens","getAllHydrogens","connAtoms","allConnAtoms","implicitHydrogens","isAromatic","isAromaticAtom","isAllylic","isAllylicAtom","isStereoCenter","isRing","isRingAtom","isSmallRing","isSmallRingAtom","isStabilized","isStabilizedAtom","bond","getConnBond","bondOrder","getBondOrder","isAromaticBond","totalBonds","connectedAtom","hydrogenOnAtomicNo","labileHydrogen","toString","Object","prototype","isAnyArray","object","call","input","arguments","undefined","isArray","TypeError","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","maxValue","minValue","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","constructor","name","rows","columns","maxI","Math","maxJ","line","formatNumber","get","join","inspectData","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","e","slice","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","r","from","checkColumnIndices","columnIndices","c","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","value","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","fill","random","interval","round","this","zeros","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","NaN","v","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","sqrt","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","Float64Array","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","size","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","getConnectivityMatrix","nbAtoms","map","pathLength","negativeAtomicNo","cRoundedMass","sdt","getConnBondOrder","sdta","bondNumber","adjMatrix","numVertices","distMatrix","val","POSITIVE_INFINITY","dist","floydWarshall","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","exp","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","toMFString","atoms","mfs","H","keys","atomSorter","key","getHoseCodesForPath","to","maxLength","originalFrom","originalTo","torsion","originalAtoms","getPath","calculateTorsion","tag1","tag2","hoses","atomMap","async","coreSmiles","fragments","complexity","originalSmiles","getCore","group","getRGroups","rGroup","getComplexity","onStep","sizes","position","counter","generate","atomLabel","diaIDsObject","diaID","forEach","fromIDCode","hose","entries","getFragments","parts","allAtoms","entry","getFragmentMF","counts","part","fromLabel","toLabel","minLength","fromAtomicNumber","toAtomicNumber","atomsInfo","pathLengthMatrix","paths","allShortestPaths","path","reverse","width","height","prefix","heavyAtomHydrogen","svg","hydrogenInfo","getGroupedDiastereotopicAtomIDs","id","includes","toSVG"],"mappings":"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"}