IncrementalScoringFunction::Data IncrementalScoringFunction::create_data( ParticleIndex pi, RestraintsTemp cr, const boost::unordered_map<Restraint *, int> &all, const Restraints &dummies) const { IMP_LOG_TERSE("Dependent restraints for particle " << get_model()->get_particle_name(pi) << " are " << cr << std::endl); Data ret; for (unsigned int j = 0; j < cr.size(); ++j) { if (all.find(cr[j]) != all.end()) { int index = all.find(cr[j])->second; IMP_INTERNAL_CHECK( std::find(ret.indexes.begin(), ret.indexes.end(), index) == ret.indexes.end(), "Found duplicate restraint " << Showable(cr[j]) << " in list " << cr); ret.indexes.push_back(index); } } cr += RestraintsTemp(dummies.begin(), dummies.end()); ret.sf = new IncrementalRestraintsScoringFunction( cr, 1.0, NO_MAX, get_model()->get_particle_name(pi) + " restraints"); return ret; }
RestraintsTemp get_restraints(const Subset &s, const ParticleStatesTable *pst, const DependencyGraph &dg, RestraintSet *rs) { RestraintsTemp rw= get_restraints(RestraintsTemp(1, rs)); Subset other=pst->get_subset(); ParticlesTemp oms; std::set_difference(other.begin(), other.end(), s.begin(), s.end(), std::back_inserter(oms)); IMP::compatibility::map<Restraint*, int> index = IMP::base::internal::get_graph_index<Restraint>(dg); Ints to_remove; for (unsigned int i=0; i< rw.size(); ++i) { if (IMP::internal::get_has_ancestor(dg, index[rw[i]], oms)) { to_remove.push_back(i); } } for (int i=to_remove.size()-1; i >=0; --i) { rw.erase(rw.begin()+to_remove[i]); } return rw; }