bool MSConnectivityScore::check_assignment(NNGraph &G, unsigned int node_handle, Assignment const &assignment, EdgeSet &picked) const { MSConnectivityRestraint::ExperimentalTree::Node const *node = tree_.get_node(node_handle); MSConnectivityRestraint::ExperimentalTree::Node::Label const &lb = node->get_label(); Vector<Tuples> new_tuples; Ints empty_vector; for (unsigned int i = 0; i < lb.size(); ++i) { int prot_count = lb[i].second; unsigned int id = lb[i].first; while (new_tuples.size() < id) new_tuples.push_back(Tuples(empty_vector, 0)); if (prot_count > 0) { if (!assignment[id].empty()) { Ints const &configuration = assignment[id].get_tuple(); if (prot_count > int(configuration.size())) { IMP_THROW("Experimental tree is inconsistent", IMP::ValueException); } new_tuples.push_back(Tuples(configuration, prot_count)); } else { IMP_THROW("Experimental tree is inconsistent", IMP::ValueException); } } else new_tuples.push_back(Tuples(empty_vector, 0)); } while (new_tuples.size() < restraint_.particle_matrix_.get_number_of_classes()) new_tuples.push_back(Tuples(empty_vector, 0)); Assignment new_assignment(new_tuples); if (new_assignment.empty()) return false; do { NNGraph ng = build_subgraph_from_assignment(G, new_assignment); if (is_connected(ng)) { EdgeSet n_picked; bool good = true; for (unsigned int i = 0; i < node->get_number_of_children(); ++i) { unsigned int child_handle = node->get_child(i); if (!check_assignment(ng, child_handle, new_assignment, n_picked)) { good = false; break; } } if (good) { add_edges_to_set(ng, n_picked); picked.insert(n_picked.begin(), n_picked.end()); return true; } } } while (new_assignment.next()); return false; }
bool MSConnectivityScore::perform_search(NNGraph &G, EdgeSet &picked) const { unsigned int root_handle = tree_.get_root(); MSConnectivityRestraint::ExperimentalTree::Node const *node = tree_.get_node(root_handle); MSConnectivityRestraint::ExperimentalTree::Node::Label const &lb = node->get_label(); Vector<Tuples> tuples; Ints empty_vector; for (unsigned int i = 0; i < lb.size(); ++i) { int prot_count = lb[i].second; unsigned int id = lb[i].first; while (tuples.size() < id) tuples.push_back(Tuples(empty_vector, 0)); if (prot_count > 0) { tuples.push_back( Tuples(restraint_.particle_matrix_.get_all_proteins_in_class(id), prot_count)); } else tuples.push_back(Tuples(empty_vector, 0)); } while (tuples.size() < restraint_.particle_matrix_.get_number_of_classes()) tuples.push_back(Tuples(empty_vector, 0)); Assignment assignment(tuples); if (assignment.empty()) return false; do { NNGraph ng = build_subgraph_from_assignment(G, assignment); if (is_connected(ng)) { EdgeSet n_picked; bool good = true; for (unsigned int i = 0; i < node->get_number_of_children(); ++i) { unsigned int child_handle = node->get_child(i); if (!check_assignment(ng, child_handle, assignment, n_picked)) { good = false; break; } } if (good) { add_edges_to_set(ng, n_picked); picked.insert(n_picked.begin(), n_picked.end()); return true; } } } while (assignment.next()); return false; }
TupleSet ConstraintTree::tupleSet (unsigned stopLevel) const { assert (root_->isRoot()); Tuples tuples; if (stopLevel == 0) { stopLevel = logVars_.size(); } getTuples (root_, Tuples(), stopLevel, tuples, CTNodes() = {}); return TupleSet (tuples); }
void ConstraintTree::join (ConstraintTree* ct, bool oneTwoOne) { if (logVarSet_.empty()) { CTNode::deleteSubtree (root_); root_ = CTNode::copySubtree (ct->root()); logVars_ = ct->logVars(); logVarSet_ = ct->logVarSet(); return; } if (oneTwoOne) { if (logVarSet_.contains (ct->logVarSet())) { return; } if (ct->logVarSet().contains (logVarSet_)) { CTNode::deleteSubtree (root_); root_ = CTNode::copySubtree (ct->root()); logVars_ = ct->logVars(); logVarSet_ = ct->logVarSet(); return; } } LogVarSet intersect = logVarSet_ & ct->logVarSet_; if (intersect.empty()) { // cartesian product appendOnBottom (root_, ct->root()->childs()); Util::addToVector (logVars_, ct->logVars_); logVarSet_ |= ct->logVarSet_; } else { moveToTop (intersect.elements()); ct->moveToTop (intersect.elements()); Tuples tuples; CTNodes appendNodes; getTuples (ct->root(), Tuples(), intersect.size(), tuples, appendNodes); CTNodes::const_iterator appendIt = appendNodes.begin(); for (size_t i = 0; i < tuples.size(); ++ i, ++ appendIt) { bool tupleFounded = join (root_, tuples[i], 0, *appendIt); if (oneTwoOne && tupleFounded == false) { assert (false); } } LogVars newLvs (ct->logVars().begin() + intersect.size(), ct->logVars().end()); Util::addToVector (logVars_, newLvs); logVarSet_ |= LogVarSet (newLvs); } }
TupleSet ConstraintTree::tupleSet (const LogVars& originalLvs) { LogVars uniqueLvs; for (size_t i = 0; i < originalLvs.size(); i++) { if (Util::contains (uniqueLvs, originalLvs[i]) == false) { uniqueLvs.push_back (originalLvs[i]); } } Tuples tuples; moveToTop (uniqueLvs); unsigned stopLevel = uniqueLvs.size(); getTuples (root_, Tuples(), stopLevel, tuples, CTNodes() = {}); if (originalLvs.size() != uniqueLvs.size()) { vector<size_t> indexes; indexes.reserve (originalLvs.size()); for (size_t i = 0; i < originalLvs.size(); i++) { indexes.push_back (Util::indexOf (uniqueLvs, originalLvs[i])); } Tuples tuples2; tuples2.reserve (tuples.size()); for (size_t i = 0; i < tuples.size(); i++) { Tuple t; t.reserve (originalLvs.size()); for (size_t j = 0; j < originalLvs.size(); j++) { t.push_back (tuples[i][indexes[j]]); } tuples2.push_back (t); } return TupleSet (tuples2); } return TupleSet (tuples); }