Subset RestraintCache::get_subset(Restraint *r, const DepMap &dependencies) const { ParticlesTemp ups = IMP::get_input_particles(r->get_inputs()); std::sort(ups.begin(), ups.end()); ups.erase(std::unique(ups.begin(), ups.end()), ups.end()); ParticlesTemp outps; for (unsigned int i = 0; i < ups.size(); ++i) { DepMap::const_iterator it = dependencies.find(ups[i]); if (it != dependencies.end()) { outps = outps + it->second; } } std::sort(outps.begin(), outps.end()); outps.erase(std::unique(outps.begin(), outps.end()), outps.end()); return Subset(outps); }
SubsetGraph get_restraint_graph(ScoringFunctionAdaptor in, const ParticleStatesTable *pst) { RestraintsTemp rs = IMP::create_decomposition(in->create_restraints()); // ScoreStatesTemp ss= get_required_score_states(rs); SubsetGraph ret(rs.size()); // + ss.size()); IMP_LOG_TERSE("Creating restraint graph on " << rs.size() << " restraints." << std::endl); boost::unordered_map<Particle *, int> map; SubsetGraphVertexName pm = boost::get(boost::vertex_name, ret); DependencyGraph dg = get_dependency_graph(rs[0]->get_model()); DependencyGraphVertexIndex index = IMP::get_vertex_index(dg); /*IMP_IF_LOG(VERBOSE) { IMP_LOG_VERBOSE( "dependency graph is \n"); IMP::internal::show_as_graphviz(dg, std::cout); }*/ Subset ps = pst->get_subset(); for (unsigned int i = 0; i < ps.size(); ++i) { ParticlesTemp t = get_dependent_particles( ps[i], ParticlesTemp(ps.begin(), ps.end()), dg, index); for (unsigned int j = 0; j < t.size(); ++j) { IMP_USAGE_CHECK(map.find(t[j]) == map.end(), "Currently particles which depend on more " << "than one particle " << "from the input set are not supported." << " Particle \"" << t[j]->get_name() << "\" depends on \"" << ps[i]->get_name() << "\" and \"" << ps[map.find(t[j])->second]->get_name() << "\""); map[t[j]] = i; } IMP_IF_LOG(VERBOSE) { IMP_LOG_VERBOSE("Particle \"" << ps[i]->get_name() << "\" controls "); for (unsigned int i = 0; i < t.size(); ++i) { IMP_LOG_VERBOSE("\"" << t[i]->get_name() << "\" "); } IMP_LOG_VERBOSE(std::endl); } } for (unsigned int i = 0; i < rs.size(); ++i) { ParticlesTemp pl = IMP::get_input_particles(rs[i]->get_inputs()); std::sort(pl.begin(), pl.end()); pl.erase(std::unique(pl.begin(), pl.end()), pl.end()); Subset os(pl); for (unsigned int j = 0; j < pl.size(); ++j) { pl[j] = ps[map[pl[j]]]; } std::sort(pl.begin(), pl.end()); pl.erase(std::unique(pl.begin(), pl.end()), pl.end()); Subset s(pl); IMP_LOG_VERBOSE("Subset for restraint " << rs[i]->get_name() << " is " << s << " from " << os << std::endl); pm[i] = s; } /*ScoreStatesTemp ss= get_required_score_states(rs); for (ScoreStatesTemp::const_iterator it= ss.begin(); it != ss.end(); ++it) { ParticlesTemp pl= (*it)->get_input_particles(); add_edges(ps, pl, map, *it, ret); ParticlesTemp opl= (*it)->get_output_particles(); add_edges(ps, opl, map, *it, ret); } IMP_INTERNAL_CHECK(boost::num_vertices(ret) == ps.size(), "Wrong number of vertices " << boost::num_vertices(ret) << " vs " << ps.size());*/ for (unsigned int i = 0; i < boost::num_vertices(ret); ++i) { for (unsigned int j = 0; j < i; ++j) { if (get_intersection(pm[i], pm[j]).size() > 0) { boost::add_edge(i, j, ret); IMP_LOG_VERBOSE("Connecting " << rs[i]->get_name() << " with " << rs[j]->get_name() << std::endl); } } } return ret; }