Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Partial migration from range-v3 to std::ranges #452

Merged
merged 19 commits into from
Jul 4, 2024
10 changes: 0 additions & 10 deletions .idea/inspectionProfiles/Project_Default.xml

This file was deleted.

11 changes: 6 additions & 5 deletions src/actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "io.h"
#include "aux/arange.h"
#include <progress_tracker.h>
#include <ranges>
#include <range/v3/view/concat.hpp>

namespace Faunus {
Expand Down Expand Up @@ -49,7 +50,7 @@ AngularScan::AngularScan(const json& j, const Space& spc)
*/
void AngularScan::Molecule::initialize(const Space::GroupVector& groups, int molecule_index)
{
namespace rv = ranges::cpp20::views;
namespace rv = std::views;
index = molecule_index;
const auto& group = groups.at(index);
if (group.isAtomic()) {
Expand All @@ -66,7 +67,7 @@ void AngularScan::Molecule::initialize(const Space::GroupVector& groups, int mol
ParticleVector AngularScan::Molecule::getRotatedReference(const Space::GroupVector& groups,
const Eigen::Quaterniond& q)
{
namespace rv = ranges::cpp20::views;
namespace rv = std::views;
const auto& group = groups.at(index);
auto particles = ParticleVector(group.begin(), group.end()); // copy particles from Space
auto positions =
Expand Down Expand Up @@ -94,8 +95,8 @@ void AngularScan::report(const Group& group1, const Group& group2, const Eigen::
*stream << format(q1) << format(q2)
<< fmt::format("{:8.4f} {:>10.3E}\n", group2.mass_center.z(), energy / 1.0_kJmol);
if (trajectory) {
auto positions = ranges::views::concat(group1, group2) |
ranges::cpp20::views::transform(&Particle::pos);
auto positions =
ranges::views::concat(group1, group2) | std::views::transform(&Particle::pos);
trajectory->writeNext({500, 500, 500}, positions.begin(), positions.end());
}
}
Expand Down Expand Up @@ -127,7 +128,7 @@ void AngularScan::operator()(Space& spc, Energy::Hamiltonian& hamiltonian)
const auto q2 =
q_dihedral * q_body2; // simultaneous rotations (non-commutative)
auto particles2 = molecules.second.getRotatedReference(spc.groups, q2);
ranges::cpp20::for_each(particles2, translate);
std::ranges::for_each(particles2, translate);
auto group2 = Group(0, particles2.begin(), particles2.end());
group2.mass_center = {0.0, 0.0, z_pos};
report(group1, group2, q1, q2, *nonbonded);
Expand Down
101 changes: 52 additions & 49 deletions src/analysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ void SystemEnergy::createOutputStream()
*output_stream << "#";
}
*output_stream << fmt::format("{:>9}{}{:12}", "step", separator, "total");
ranges::for_each(hamiltonian, [&](auto& energy) {
std::ranges::for_each(hamiltonian, [&](auto& energy) {
*output_stream << fmt::format("{}{:12}", separator, energy->name);
});
*output_stream << "\n";
Expand All @@ -405,7 +405,7 @@ std::vector<double> SystemEnergy::calculateEnergies() const
{
Change change;
change.everything = true; // trigger full energy calculation
return hamiltonian | ranges::views::transform([&](auto& i) { return i->energy(change); }) |
return hamiltonian | std::views::transform([&](auto& i) { return i->energy(change); }) |
ranges::to_vector;
}

Expand Down Expand Up @@ -540,7 +540,7 @@ GroupMatrixAnalysis::GroupMatrixAnalysis(const json& j, const Space& spc,
Energy::Hamiltonian& hamiltonian)
: PairMatrixAnalysis(j, spc)
{
namespace rv = ranges::cpp20::views;
namespace rv = std::views;
// finds the molecule ids and store their indices
auto molids = Faunus::parseMolecules(j.at("molecules"));
auto is_selected = [&](const auto& group) {
Expand All @@ -562,8 +562,7 @@ GroupMatrixAnalysis::GroupMatrixAnalysis(const json& j, const Space& spc,
void GroupMatrixAnalysis::setPairMatrix()
{
auto is_active = [&](auto index) { return !spc.groups.at(index).empty(); };
const auto indices =
group_indices | ranges::cpp20::views::filter(is_active) | ranges::to_vector;
const auto indices = group_indices | std::views::filter(is_active) | ranges::to_vector;

// zero matrix, then fill it
pair_matrix.setZero();
Expand Down Expand Up @@ -1090,7 +1089,7 @@ AtomicDisplacement::AtomicDisplacement(const json& j, const Space& spc, std::str
molid = molecule_data.id();

auto positions = getPositions();
const auto num_positions = ranges::cpp20::distance(positions.begin(), positions.end());
const auto num_positions = std::ranges::distance(positions.begin(), positions.end());
reference_positions = positions | ranges::to_vector;
cell_indices.resize(num_positions, {0, 0, 0});
mean_squared_displacement.resize(num_positions);
Expand Down Expand Up @@ -1191,7 +1190,7 @@ void AtomicDisplacement::_to_disk()
PointVector AtomicDisplacement::getPositions() const
{
auto active_and_inactive = [&](const Group& group) {
return ranges::make_subrange(group.begin(), group.trueend());
return std::ranges::subrange(group.begin(), group.trueend());
};
namespace rv = ranges::cpp20::views;
return spc.findMolecules(molid, Space::Selection::ALL) | rv::transform(active_and_inactive) |
Expand All @@ -1211,7 +1210,7 @@ MassCenterDisplacement::MassCenterDisplacement(const json& j, const Space& spc,

PointVector MassCenterDisplacement::getPositions() const
{
namespace rv = ranges::cpp20::views;
namespace rv = std::views;
return spc.findMolecules(molid, Space::Selection::ACTIVE) | rv::transform(&Group::mass_center) |
ranges::to<PointVector>;
}
Expand All @@ -1227,7 +1226,7 @@ void WidomInsertion::selectGhostGroup()
{
change.clear();
auto inactive_groups = spc.findMolecules(molid, Space::Selection::INACTIVE);
if (!ranges::cpp20::empty(inactive_groups)) {
if (!std::ranges::empty(inactive_groups)) {
const auto& group = *inactive_groups.begin(); // select first group
if (group.empty() && group.capacity() > 0) {
// must be inactive and have a non-zero capacity
Expand Down Expand Up @@ -1384,7 +1383,7 @@ void AtomDensity::_sample()
const auto& atomic_ids = reaction.participatingAtomsAndMolecules().first;
unique_reactive_atoms.insert(atomic_ids.begin(), atomic_ids.end());
}
ranges::cpp20::for_each(unique_reactive_atoms, [&](auto id) {
std::ranges::for_each(unique_reactive_atoms, [&](auto id) {
const auto count = spc.countAtoms(id);
atomswap_probability_density[id](count)++;
});
Expand All @@ -1395,21 +1394,23 @@ void AtomDensity::_sample()
*/
std::map<Density::id_type, int> AtomDensity::count() const
{
namespace rv = ranges::cpp20::views;
using ranges::cpp20::views::filter;
using ranges::cpp20::views::join;
using ranges::cpp20::views::transform;

// All ids incl. inactive are counted; std::vector ensures constant lookup (index = id)
std::vector<int> atom_count(names.size(), 0);

// Count number of active atoms in atomic groups
auto particle_ids_in_atomic_groups =
spc.groups | rv::filter(&Group::isAtomic) | rv::join | rv::transform(&Particle::id);
ranges::cpp20::for_each(particle_ids_in_atomic_groups, [&](auto id) { atom_count.at(id)++; });
spc.groups | filter(&Group::isAtomic) | join | transform(&Particle::id);
std::ranges::for_each(particle_ids_in_atomic_groups, [&](auto id) { atom_count.at(id)++; });

// Copy vector --> map
id_type id = 0U;
std::map<id_type, int> map;
ranges::cpp20::for_each(atom_count,
[&id, &map](auto count) { map.emplace_hint(map.end(), id++, count); });
std::ranges::for_each(atom_count,
[&id, &map](auto count) { map.emplace_hint(map.end(), id++, count); });
return map;
}

Expand Down Expand Up @@ -1442,20 +1443,20 @@ void AtomDensity::_to_disk()
*/
std::map<Density::id_type, int> MoleculeDensity::count() const
{
using namespace ranges::cpp20;
using std::views::transform;
using std::views::filter;
std::map<id_type, int> molecular_group_count;

// ensure that also inactive groups are registered (as zero)
for_each(Faunus::molecules | views::filter(&MoleculeData::isMolecular),
[&](auto& moldata) { molecular_group_count[moldata.id()] = 0; });
std::ranges::for_each(Faunus::molecules | filter(&MoleculeData::isMolecular),
[&](auto& moldata) { molecular_group_count[moldata.id()] = 0; });

auto non_empty_molecular = [](const Group& group) {
return group.isMolecular() && !group.empty();
};
auto molecular_group_ids =
spc.groups | views::filter(non_empty_molecular) | views::transform(&Group::id);
auto molecular_group_ids = spc.groups | filter(non_empty_molecular) | transform(&Group::id);

for_each(molecular_group_ids, [&](auto id) { molecular_group_count[id]++; });
std::ranges::for_each(molecular_group_ids, [&](auto id) { molecular_group_count[id]++; });
return molecular_group_count;
}

Expand Down Expand Up @@ -1506,7 +1507,7 @@ void SanityCheck::checkGroupsCoverParticles()
void SanityCheck::checkWithinContainer(const Space::GroupType& group)
{
bool outside_simulation_cell = false;
auto outside_particles = group | ranges::cpp20::views::filter([&](const Particle& particle) {
auto outside_particles = group | std::views::filter([&](const Particle& particle) {
return spc.geometry.collision(particle.pos);
});

Expand Down Expand Up @@ -1703,15 +1704,19 @@ XTCtraj::XTCtraj(const Space& spc, const std::string& filename,
const std::vector<std::string>& molecule_names)
: Analysis(spc, "xtcfile")
{
namespace rv = ranges::cpp20::views;
using ranges::cpp20::views::filter;
using ranges::cpp20::views::join;
using ranges::cpp20::views::transform;
using ranges::views::cache1;

writer = std::make_unique<XTCWriter>(filename);
if (!molecule_names.empty()) {
group_ids = Faunus::names2ids(Faunus::molecules, molecule_names); // molecule types to save
group_indices =
group_ids |
rv::transform([&](auto id) { return spc.findMolecules(id, Space::Selection::ALL); }) |
ranges::views::cache1 | rv::join |
rv::transform([&](const Group& group) { return spc.getGroupIndex(group); }) |
transform([&](auto id) { return spc.findMolecules(id, Space::Selection::ALL); }) |
cache1 | join |
transform([&](const Group& group) { return spc.getGroupIndex(group); }) |
ranges::to_vector;
if (group_indices.empty()) {
throw ConfigurationError("xtc selection is empty - nothing to sample");
Expand All @@ -1732,7 +1737,7 @@ void XTCtraj::_to_json(json& j) const
if (!group_ids.empty()) {
j["molecules"] =
group_ids |
ranges::cpp20::views::transform([](auto id) { return Faunus::molecules.at(id).name; }) |
std::views::transform([](auto id) { return Faunus::molecules.at(id).name; }) |
ranges::to_vector;
}
}
Expand All @@ -1744,7 +1749,7 @@ void XTCtraj::_sample()
{
namespace rv = ranges::cpp20::views;
if (group_ids.empty()) {
auto positions = spc.particles | rv::transform(&Particle::pos);
auto positions = spc.particles | std::views::transform(&Particle::pos);
writer->writeNext(spc.geometry.getLength(), positions.begin(), positions.end());
}
else {
Expand Down Expand Up @@ -1895,7 +1900,7 @@ void InertiaTensor::_to_json(json& j) const
std::pair<Point, Point> InertiaTensor::compute() const
{
const auto& group = spc.groups.at(group_index);
auto subgroup = ranges::make_subrange(group.begin() + particle_range.at(0),
auto subgroup = std::ranges::subrange(group.begin() + particle_range.at(0),
group.begin() + particle_range.at(1) + 1);

auto I = Geometry::inertia(subgroup.begin(), subgroup.end(), group.mass_center,
Expand Down Expand Up @@ -2323,11 +2328,11 @@ void AtomsInMoleculePolicy::sample(const Space& spc, SASAAnalysis& analysis)
{

auto molecules = spc.findMolecules(molecule_id);
ranges::for_each(molecules, [&](const auto& molecule) {
std::ranges::for_each(molecules, [&](const auto& molecule) {
auto is_selected = [&](const Particle& particle) {
return selected_indices.count(molecule.getParticleIndex(particle)) > 0;
};
auto selected_atoms = molecule | ranges::cpp20::views::filter(is_selected);
auto selected_atoms = molecule | std::views::filter(is_selected);
sampleTotalSASA(selected_atoms.begin(), selected_atoms.end(), analysis);
});
}
Expand Down Expand Up @@ -2396,7 +2401,7 @@ void AtomProfile::_sample()
}

auto selected_particles =
spc.activeParticles() | ranges::cpp20::views::filter([&](const Particle& particle) {
spc.activeParticles() | std::views::filter([&](const Particle& particle) {
return atom_id_selection.count(particle.id) > 0;
});

Expand Down Expand Up @@ -2485,7 +2490,7 @@ void SlicedDensity::_sample()
}

auto filtered_particles =
spc.activeParticles() | ranges::cpp20::views::filter([&](const auto& particle) {
spc.activeParticles() | std::views::filter([&](const auto& particle) {
return std::find(atom_ids.begin(), atom_ids.end(), particle.id) != atom_ids.end();
});

Expand Down Expand Up @@ -2553,29 +2558,28 @@ std::vector<std::string> ChargeFluctuations::getPredominantParticleNames() const
return Faunus::atoms[atomid].name;
}; // in a histogram, find the atom name with most counts

auto atom_names = atom_histograms | ranges::cpp20::views::transform(most_frequent_name);
return std::vector<std::string>(ranges::cpp20::begin(atom_names),
ranges::cpp20::end(atom_names));
auto atom_names = atom_histograms | std::views::transform(most_frequent_name);
return std::vector<std::string>(std::ranges::begin(atom_names), std::ranges::end(atom_names));
}

std::vector<double> ChargeFluctuations::getChargeStandardDeviation() const
{
auto stdev =
atom_mean_charges | ranges::cpp20::views::transform([](auto& i) { return i.stdev(); });
return std::vector<double>(ranges::cpp20::begin(stdev), ranges::cpp20::end(stdev));
using namespace std::ranges;
auto stdev = atom_mean_charges | views::transform([](auto& i) { return i.stdev(); });
return std::vector<double>(begin(stdev), end(stdev));
}

std::vector<double> ChargeFluctuations::getMeanCharges() const
{
return std::vector<double>(ranges::cpp20::begin(atom_mean_charges),
ranges::cpp20::end(atom_mean_charges));
return std::vector<double>(std::ranges::begin(atom_mean_charges),
std::ranges::end(atom_mean_charges));
}

void ChargeFluctuations::_to_disk()
{
if (not filename.empty()) {
auto molecules = spc.findMolecules(mol_iter->id(), Space::Selection::ALL);
if (not ranges::cpp20::empty(molecules)) {
if (not std::ranges::empty(molecules)) {
const auto particles_with_avg_charges = averageChargeParticles(*molecules.begin());
PQRWriter().save(MPI::prefix + filename, particles_with_avg_charges.begin(),
particles_with_avg_charges.end(), spc.geometry.getLength());
Expand Down Expand Up @@ -2667,7 +2671,8 @@ void ScatteringFunction::_sample()
scatter_positions.clear();
auto groups =
molecule_ids | rv::transform([&](auto id) { return spc.findMolecules(id); }) | rv::join;
ranges::cpp20::for_each(groups, [&](auto& group) {

std::ranges::for_each(groups, [&](auto& group) {
if (mass_center_scattering && group.isMolecular()) {
scatter_positions.push_back(group.mass_center);
}
Expand Down Expand Up @@ -2809,8 +2814,8 @@ void VirtualTranslate::_sample()
return;
}
if (auto mollist = mutable_space.findMolecules(molid, Space::Selection::ACTIVE);
!ranges::cpp20::empty(mollist)) {
if (ranges::distance(mollist.begin(), mollist.end()) > 1) {
!std::ranges::empty(mollist)) {
if (std::ranges::distance(mollist.begin(), mollist.end()) > 1) {
throw std::runtime_error("exactly ONE active molecule expected");
}
if (auto group_it = random.sample(mollist.begin(), mollist.end()); not group_it->empty()) {
Expand Down Expand Up @@ -3004,8 +3009,7 @@ void ElectricPotential::getTargets(const json& j)
if (structure->is_string()) {
// load positions from chemical structure file
auto particles = loadStructure(structure->get<std::string>(), false);
positions =
particles | ranges::cpp20::views::transform(&Particle::pos) | ranges::to_vector;
positions = particles | std::views::transform(&Particle::pos) | ranges::to_vector;
}
else if (structure->is_array()) {
// list of positions
Expand Down Expand Up @@ -3049,8 +3053,7 @@ double ElectricPotential::calcPotentialOnTarget(const ElectricPotential::Target&
std::sqrt(spc.geometry.sqdist(particle.pos, target.position));
return coulomb->getCoulombGalore().ion_potential(particle.charge, distance_to_target);
};
auto potentials =
spc.activeParticles() | ranges::cpp20::views::transform(potential_from_particle);
auto potentials = spc.activeParticles() | std::views::transform(potential_from_particle);
return std::accumulate(potentials.begin(), potentials.end(), 0.0);
}

Expand Down
Loading
Loading