double SortedDistanceComparator::compareStructures( const SortedDistanceComparisonData & dist1, const SortedDistanceComparisonData & dist2) const { typedef StridedIndexAdapter< size_t> IndexAdapter; const size_t numSpecies = dist1.species.size(); if(numSpecies != dist2.species.size()) return std::numeric_limits< double>::max(); // Species mismatch std::set< std::string> speciesCheck(dist1.species.begin(), dist1.species.end()); std::set< std::string>::const_iterator it; BOOST_FOREACH(const std::string & species2, dist2.species) { it = speciesCheck.find(species2); if(it == speciesCheck.end()) return std::numeric_limits< double>::max(); // Species mismatch else speciesCheck.erase(it); } if(!speciesCheck.empty()) return std::numeric_limits< double>::max(); // Species mismatch // Set up the adapters const unsigned int leastCommonMultiple = math::leastCommonMultiple( dist1.numAtoms, dist2.numAtoms); IndexAdapter adapt1(leastCommonMultiple / dist1.numAtoms); IndexAdapter adapt2(leastCommonMultiple / dist2.numAtoms); spl::math::RunningStats stats; common::AtomSpeciesId::Value specI, specJ; for(size_t i = 0; i < numSpecies; ++i) { specI = dist1.species[i]; // Do others const SortedDistanceComparisonData::DistancesMap & distMapI1 = dist1.speciesDistancesMap(specI); const SortedDistanceComparisonData::DistancesMap & distMapI2 = dist2.speciesDistancesMap(specI); for(size_t j = i; j < numSpecies; ++j) { specJ = dist1.species[j]; calcProperties(stats, *distMapI1(specJ), adapt1, *distMapI2(specJ), adapt2); } } return stats.rms(); }
double SortedDistanceComparator::compareStructures( const SortedDistanceComparisonData & dist1, const SortedDistanceComparisonData & dist2) const { typedef ::std::vector<double> DistancesVec; typedef StridedIndexAdapter<size_t> IndexAdapter; const size_t numSpecies = dist1.species.size(); if(numSpecies != dist2.species.size()) { // Species mismatch! return ::std::numeric_limits<double>::max(); } // Set up the adapters const unsigned int leastCommonMultiple = math::leastCommonMultiple(dist1.numAtoms, dist2.numAtoms); IndexAdapter adapt1(leastCommonMultiple / dist1.numAtoms); IndexAdapter adapt2(leastCommonMultiple / dist2.numAtoms); double max = ::std::numeric_limits<double>::min(); double sqSum = 0.0; unsigned int totalCompared = 0; common::AtomSpeciesId::Value specI, specJ; for(size_t i = 0; i < numSpecies - 1; ++i) { specI = dist1.species[i]; // Do others const SortedDistanceComparisonData::DistancesMap & distMapI1 = dist1.speciesDistancesMap(specI); const SortedDistanceComparisonData::DistancesMap & distMapI2 = dist2.speciesDistancesMap(specI); for(size_t j = i; j < numSpecies; ++j) { specJ = dist1.species[j]; calcProperties(*distMapI1(specJ), adapt1, *distMapI2(specJ), adapt2, sqSum, max, totalCompared); } } return sqrt(sqSum / totalCompared); //return max; }