public static bool AreEqual(ParticleInfo part1, ParticleInfo part2, bool exact, AtomsReordering reordering = null) { // compare by hashes if (exact) { if (part1.structureHashExact != 0 & part2.structureHashExact != 0) // only if hashes are already calculated { if (part1.structureHashExact != part2.structureHashExact) { return(false); } } } else { if (part1.structureHash != 0 & part2.structureHash != 0) // only if hashes are already calculated { if (part1.structureHash != part2.structureHash) { return(false); } } } // init particles and compare the rest var atoms1 = part1.atoms; var atoms2 = part2.atoms; if (atoms1.Count != atoms2.Count) { return(false); } if (part1.bonds.Count != part2.bonds.Count) { return(false); } // compare by molecular formula var a1hash = ParticleInfo.GetAtomsHash(atoms1); var a2hash = ParticleInfo.GetAtomsHash(atoms2); if (a1hash != a2hash) { return(false); } // compare by topology _atomsList.Clear(); for (int i = 0; i < part1.atoms.Count; i++) { _atomsList.Add(part1.atoms[i].element); } return(AreEqual(_atomsList, part1.bonds, part2, exact, reordering, false)); }
public static uint GetStructureHash(ParticleInfo particle, bool exact, AtomsReordering reordering = null) { if (particle.atoms.Count == 0) { return(0); } var gr = new ParticleGraphProto(particle, exact, rHashes); int variant = reordering == null ? 0 : reordering.selectedReordering; int total; var hash = GetHashInner(gr, variant, out total); if (reordering != null) { reordering.totalReorderings = total; BuildReorderingArray(gr, reordering.reordering); } return(hash); }
public static bool AreEqual(List <Element> atms, List <BondInfo> bonds, ParticleInfo part2, bool exact, AtomsReordering reordering = null, bool checkMolecularFormula = true) { var atoms2 = part2.atoms; if (atms.Count != atoms2.Count) { return(false); } if (bonds.Count != part2.bonds.Count) { return(false); } if (checkMolecularFormula) { // compare by molecular formula var a1hash = ParticleInfo.GetAtomsHash(atms); var a2hash = ParticleInfo.GetAtomsHash(atoms2); if (a1hash != a2hash) { return(false); } } // compare by hashes var p1hash = GetStructureHash(atms, bonds, exact, _reorderingList); if (exact && p1hash != part2.structureHashExact & part2.structureHashExact != 0) { return(false); } if (!exact && p1hash != part2.structureHash & part2.structureHash != 0) { return(false); } if (reordering == null) { reordering = _reordering1; } if (reordering.reordering == null) { reordering.reordering = _reorderingList2; } reordering.reordering.Clear(); var p2hash = GetStructureHash(part2, exact, reordering); if (p1hash != p2hash) { return(false); } var rr = reordering.reordering; CombineReorderings(rr, _reorderingList); // compare each atom and bond, to be exactly sure the particles are equal for (int i = atms.Count - 1; i >= 0; i--) { if (atms[i] != atoms2[rr[i]].element) { return(false); } } #if COMPARE_BONDS // bonds comparison is not necessary - hash almost guarantees correct bonds var pbonds = part2.bonds; int maxBonds = bonds.Count - 1; for (int i = maxBonds; i >= 0;) { var b = bonds[i]; int indx1 = rr[b.atom1]; int indx2 = rr[b.atom2]; for (int j = maxBonds; j >= 0; j--) { var b2 = pbonds[j]; if (b2.atom1 == indx1 & b2.atom2 == indx2) { goto bond_found; } if (b2.atom1 == indx2 & b2.atom2 == indx1) { goto bond_found; } } return(false); bond_found: i--; } #endif return(true); }