bool count_subsystem_particle_counts_for_match (const Wavefunction<amplitude_t>::Amplitude &wf1, const Wavefunction<amplitude_t>::Amplitude &wf2, const Subsystem &subsystem) { assert(subsystem.lattice_makes_sense(wf1.get_lattice())); assert(subsystem.lattice_makes_sense(wf2.get_lattice())); // (we are also assuming that the lattices are in fact equivalent) const PositionArguments &r1 = wf1.get_positions(); const PositionArguments &r2 = wf2.get_positions(); assert(r1.get_N_species() == r2.get_N_species()); assert(r1.get_N_sites() == r2.get_N_sites()); for (unsigned int species = 0; species < r1.get_N_species(); ++species) { assert(r1.get_N_filled(species) == r2.get_N_filled(species)); unsigned int count1 = 0, count2 = 0; for (unsigned int i = 0; i < r1.get_N_filled(species); ++i) { const Particle particle(i, species); if (subsystem.position_is_within(r1[particle], wf1.get_lattice())) ++count1; if (subsystem.position_is_within(r2[particle], wf2.get_lattice())) ++count2; } if (count1 != count2) return false; } return true; }
unsigned int BaseSwapPossibleWalk::count_subsystem_sites (const Subsystem &subsystem, const Lattice &lattice) { // (this is a static method) unsigned int N_subsystem_sites = 0; for (unsigned int i = 0; i < lattice.total_sites(); ++i) { if (subsystem.position_is_within(i, lattice)) ++N_subsystem_sites; } return N_subsystem_sites; }