コード例 #1
0
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();
}
コード例 #2
0
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;
}