API changes: Restraint.set_name/Restraint.get_name went away because no one was using them.
There are a couple of minor changes: - RestraintSet uses the IMP_CONTAINER macros. - RestraintSet uses an auto_ptr instead of catching all exceptions
Index: test/xml/test_xml.py =================================================================== --- test/xml/test_xml.py (revision 664) +++ test/xml/test_xml.py (working copy) @@ -35,18 +35,6 @@ #restraint_sets = self.imp_model.get_restraints self.assertEqual(self.imp_model.number_of_restraints(), 3, "xml file contains three restraint sets") - self.assertEqual(self.imp_model.get_restraint(IMP.RestraintIndex(0)).get_name(), - 'exclusion_volumes', - "not expecting restraint set name: " - + self.imp_model.get_restraint(IMP.RestraintIndex(0)).get_name()) - self.assertEqual(self.imp_model.get_restraint(IMP.RestraintIndex(1)).get_name(), - 'torus', - "not expecting restraint set name: " - + self.imp_model.get_restraint(IMP.RestraintIndex(1)).get_name()) - self.assertEqual(self.imp_model.get_restraint(IMP.RestraintIndex(2)).get_name(), - 'connections', - "not expecting restraint set name: " - + self.imp_model.get_restraint(IMP.RestraintIndex(2)).get_name())
# test restraints score = self.imp_model.get_restraint(IMP.RestraintIndex(0)).evaluate(None) Index: include/IMP/utility.h =================================================================== --- include/IMP/utility.h (revision 664) +++ include/IMP/utility.h (working copy) @@ -164,7 +164,7 @@ \param[in] init Code to modify the passed in object. The object is obj its index index. */ -#define IMP_CONTAINER_IMPL(Class, Ucname, lcname, IndexType, init) \ +#define IMP_CONTAINER_IMPL(Class, Ucname, lcname, IndexType, init) \ IndexType Class::add_##lcname(Ucname *obj) { \ IndexType index(lcname##_vector_.size()); \ lcname##_vector_.push_back(obj); \ Index: include/IMP/restraints/RestraintSet.h =================================================================== --- include/IMP/restraints/RestraintSet.h (revision 664) +++ include/IMP/restraints/RestraintSet.h (working copy) @@ -25,32 +25,20 @@
IMP_RESTRAINT("0.5", "Daniel Russel")
- //! The type to use to retrieve a restraint - typedef int RestraintIndex; + IMP_CONTAINER(Restraint, restraint, RestraintIndex);
+ public: + //! Set weight for all restraints contained by this set. - /** \param[in] weight The new value of the weight. + /** Setting the weight to 0 disables the restraints in the set. + + \param[in] weight The new value of the weight. */ void set_weight(Float weight) { weight_ = weight; }
- //! Add restraint to the restraint set. - /** \param[in] restraint The restraint to add to the restraint set. - \return the index of the newly-added restraint in the restraint set. - */ - RestraintIndex add_restraint(Restraint *restraint); + //! Get weight for all restraints contained by this set. + Float get_weight() { return weight_; }
- //! Access a restraint in the restraint set. - /** \param[in] i The RestraintIndex of the restraint to retrieve. - \exception std::out_of_range the index is out of range. - \return Pointer to the Restraint. - */ - Restraint *get_restraint(RestraintIndex i) const; - - //! Return the total number of restraints - unsigned int number_of_restraints() const { - return restraints_.size(); - } - //! Called when at least one particle has been inactivated. /** Check each restraint to see if it changes its active status. */ @@ -58,15 +46,10 @@
protected:
- //! Restraints to evaluate. - /** These can be accessed with an iterator by a filter. - In the case where the restraint is a single simple restraint, - this vector contains a pointer to itself. - */ - std::vector<Restraint *> restraints_; - //! Weight for all restraints. Float weight_; + + std::string name_; };
} // namespace IMP Index: include/IMP/Restraint.h =================================================================== --- include/IMP/Restraint.h (revision 664) +++ include/IMP/Restraint.h (working copy) @@ -29,8 +29,8 @@ class IMPDLLEXPORT Restraint : public Object { public: - //! Initialize the Restraint and its model pointer - Restraint(std::string name=std::string()); + //! Initialize the Restraint + Restraint(); virtual ~Restraint();
//! Return the score for this restraint for the current state of the model. @@ -65,16 +65,6 @@
virtual std::string last_modified_by() const = 0;
- //! Get the name of the restraint - const std::string& get_name() const { - return name_; - } - - //! Set the name of the restraint - void set_name(const std::string &name) { - name_=name; - } - //! The model the restraint is part of. /** \param[in] model The model. */ @@ -134,8 +124,6 @@ bool are_particles_active_;
std::vector<Particle*> particles_; - - std::string name_; };
IMP_OUTPUT_OPERATOR(Restraint); Index: impEM/pyext/IMPEM.i =================================================================== --- impEM/pyext/IMPEM.i (revision 664) +++ impEM/pyext/IMPEM.i (working copy) @@ -28,6 +28,7 @@ }
/* Get definitions of IMP base classes (but do not wrap; that is done by IMP) */ +%import "IMP/Object.h" %import "IMP/Restraint.h"
/* Get definitions of EMLIB base classes (but do not wrap) */ Index: src/Model.cpp =================================================================== --- src/Model.cpp (revision 664) +++ src/Model.cpp (working copy) @@ -105,7 +105,7 @@ for (RestraintIterator it = restraints_begin(); it != restraints_end(); ++it) { IMP_CHECK_OBJECT(*it); - IMP_LOG(VERBOSE, (*it)->get_name() << ": " << std::flush); + IMP_LOG(VERBOSE, **it); Float tscore=0; if ((*it)->get_is_active()) { tscore = (*it)->evaluate(accpt); @@ -203,12 +203,6 @@ out << "version: " << version() << " "; out << "last_modified_by: " << last_modified_by() << std::endl; out << number_of_particles() << " particles" << std::endl; - out << "Restraints:" << std::endl; - for (RestraintConstIterator it = restraints_begin(); - it != restraints_end(); ++it) { - IMP_CHECK_OBJECT(*it); - out << (*it)->get_name() << std::endl; - }
internal::show_attributes(out); } Index: src/Restraint.cpp =================================================================== --- src/Restraint.cpp (revision 664) +++ src/Restraint.cpp (working copy) @@ -15,7 +15,7 @@ namespace IMP {
-Restraint::Restraint(std::string name): name_(name) +Restraint::Restraint() { model_ = NULL; is_active_ = true; // active by default @@ -57,8 +57,8 @@ out << "unknown restraint (inactive):" << std::endl; }
- out << "version: " << version() << std::endl; - out << "last_modified_by: " << last_modified_by() << std::endl; + out << " version: " << version() << std::endl; + out << " last_modified_by: " << last_modified_by() << std::endl; }
Index: src/restraints/RestraintSet.cpp =================================================================== --- src/restraints/RestraintSet.cpp (revision 664) +++ src/restraints/RestraintSet.cpp (working copy) @@ -10,6 +10,7 @@ #include "IMP/log.h" #include "IMP/restraints/RestraintSet.h" #include "../mystdexcept.h" +#include <utility>
namespace IMP { @@ -17,12 +18,14 @@
//! Constructor RestraintSet::RestraintSet(const std::string& name) - : Restraint(name), weight_(1.0) + : weight_(1.0) { IMP_LOG(VERBOSE, "Restraint set constructed"); + name_=name; }
+ //! Destructor /** \todo Should reference count restraints correctly, to avoid deleting restraints here which live in two or more RestraintSets. @@ -30,39 +33,15 @@ RestraintSet::~RestraintSet() { IMP_LOG(VERBOSE, "Delete RestraintSet"); - for (unsigned int i = 0; i < restraints_.size(); ++i) { - restraints_[i]->set_model(NULL); - delete restraints_[i]; - } + IMP_CONTAINER_DELETE(Restraint, restraint);
}
+IMP_CONTAINER_IMPL(RestraintSet, Restraint, restraint, RestraintIndex, + obj->set_model(get_model()););
-//! Add restraint to the restraint set. -/** \param[in] restraint The restraint to add to the restraint set. - \return the index of the newly-added restraint in the restraint set. - */ -RestraintSet::RestraintIndex RestraintSet::add_restraint(Restraint* restraint) -{ - restraints_.push_back(restraint); - restraint->set_model(get_model()); - return restraints_.size() - 1; -}
-//! Access a restraint in the restraint set. -/** \param[in] i The RestraintIndex of the restraint to retrieve. - \exception std::out_of_range the index is out of range. - \return Pointer to the Restraint. - */ -Restraint* RestraintSet::get_restraint(RestraintIndex i) const -{ - IMP_check(static_cast<unsigned int>(i) < restraints_.size(), - "Invalid restraint requested", - std::out_of_range("Invalid restraint")); - return restraints_[i]; -} - //! Calculate the score for this restraint for the current model state. /** \param[in] accum If not NULL, use this object to accumulate partial first derivatives. @@ -70,25 +49,21 @@ */ Float RestraintSet::evaluate(DerivativeAccumulator *accum) { + if (get_weight() == 0) return 0; Float score; - + typedef std::auto_ptr<DerivativeAccumulator> DAP; // Use a local copy of the accumulator for our sub-restraints - DerivativeAccumulator *ouracc = NULL; + DAP ouracc; if (accum) { - ouracc = new DerivativeAccumulator(*accum, weight_); + ouracc = DAP(new DerivativeAccumulator(*accum, weight_)); }
score = (Float) 0.0; - try { - for (size_t i = 0; i < restraints_.size(); i++) { - if (restraints_[i]->get_is_active()) - score += restraints_[i]->evaluate(ouracc); + for (RestraintIterator it= restraints_begin(); it != restraints_end(); ++it) { + if ((*it)->get_is_active()) { + score += (*it)->evaluate(ouracc.get()); } - } catch (...) { - delete ouracc; - throw; } - delete ouracc;
return score * weight_; } @@ -99,8 +74,8 @@ */ void RestraintSet::check_particles_active() { - for (size_t i = 0; i < restraints_.size(); i++) { - restraints_[i]->check_particles_active(); + for (RestraintIterator it= restraints_begin(); it != restraints_end(); ++it) { + (*it)->check_particles_active(); } }
@@ -111,11 +86,12 @@ */ void RestraintSet::show(std::ostream& out) const { - out << "restraint set " << get_name() << ":" << std::endl; - for (size_t i = 0; i < restraints_.size(); i++) { - restraints_[i]->show(out); + out << "restraint set " << name_ << ":..." << std::endl; + for (RestraintConstIterator it= restraints_begin(); + it != restraints_end(); ++it) { + (*it)->show(out); } - out << "... end restraint set " << get_name() << std::endl; + out << "... end restraint set " << name_ << std::endl; }