Пример #1
0
    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));
    }
Пример #2
0
    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);
    }
Пример #3
0
    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);
    }