First, Harmonic.h needs to include utility.h since it uses square.
Second, I changed the check macro to be IMP_IF_CHECK as discussed. The patch also brings in a few other cleanups to the runtime checks.
Index: kernel/include/IMP/unary_functions/Harmonic.h =================================================================== --- kernel/include/IMP/unary_functions/Harmonic.h (revision 557) +++ kernel/include/IMP/unary_functions/Harmonic.h (working copy) @@ -8,6 +8,7 @@ #define __IMP_HARMONIC_H
#include "../UnaryFunction.h" +#include "../utility.h"
namespace IMP {
Index: kernel/include/IMP/internal/ObjectContainer.h =================================================================== --- kernel/include/IMP/internal/ObjectContainer.h (revision 557) +++ kernel/include/IMP/internal/ObjectContainer.h (working copy) @@ -8,6 +8,8 @@ #ifndef __IMP_OBJECT_CONTAINER_H #define __IMP_OBJECT_CONTAINER_H
+#include "Object.h" + #include <boost/iterator/filter_iterator.hpp>
#include <vector> @@ -104,15 +106,15 @@ return Vector::operator[](get_index(i)); } I push_back(O* d) { + IMP_CHECK_OBJECT(d); ref(d); - IMP_BEGIN_CHECK(EXPENSIVE); - IMP_CHECK_OBJECT(d); - for (typename Vector::const_iterator it= Vector::begin(); - it != Vector::end(); ++it) { - IMP_assert(*it != d, "IMP Containers can only have one copy of " - << " each object"); + IMP_IF_CHECK(EXPENSIVE) { + for (typename Vector::const_iterator it= Vector::begin(); + it != Vector::end(); ++it) { + IMP_assert(*it != d, "IMP Containers can only have one copy of " + << " each object"); + } } - IMP_END_CHECK; if (free_.empty()) { Vector::push_back(d); unsigned int idx= Vector::size()-1; @@ -126,16 +128,16 @@ } template <class It> void insert(iterator c, It b, It e) { - IMP_BEGIN_CHECK(EXPENSIVE); - for (It cc= b; cc != e; ++cc) { - IMP_CHECK_OBJECT(*cc); - for (typename Vector::const_iterator it= Vector::begin(); - it != Vector::end(); ++it) { - IMP_assert(*it != *cc, "IMP Containers can only have one copy of " - << " each object"); + IMP_IF_CHECK(EXPENSIVE) { + for (It cc= b; cc != e; ++cc) { + IMP_CHECK_OBJECT(*cc); + for (typename Vector::const_iterator it= Vector::begin(); + it != Vector::end(); ++it) { + IMP_assert(*it != *cc, "IMP Containers can only have one copy of " + << " each object"); + } } } - IMP_END_CHECK; for (It cc= b; cc != e; ++cc) { ref(*cc); } Index: kernel/include/IMP/exception.h =================================================================== --- kernel/include/IMP/exception.h (revision 557) +++ kernel/include/IMP/exception.h (working copy) @@ -125,12 +125,10 @@ IMPDLLEXPORT CheckLevel get_check_level();
-#define IMP_BEGIN_CHECK(level)\ - if (level <= ::IMP::get_check_level()) { do {} while(false)
-#define IMP_END_CHECK } do {} while(false) +#define IMP_IF_CHECK(level)\ + if (level <= ::IMP::get_check_level())
- namespace internal {
Index: kernel/src/Model.cpp =================================================================== --- kernel/src/Model.cpp (revision 557) +++ kernel/src/Model.cpp (working copy) @@ -101,6 +101,20 @@
IMP_LOG(TERSE, "End Model::evaluate. Final score: " << score << std::endl);
+ for (ParticleIterator pit= particles_begin(); + pit != particles_end(); ++pit) { + for (Particle::FloatKeyIterator fkit = (*pit)->float_keys_begin(); + fkit != (*pit)->float_keys_end(); ++fkit) { + Float v= (*pit)->get_value(*fkit); + IMP_check(v==v, "NaN found in particle " << (*pit)->get_index() + << " attribute " << *fkit, + ValueException("NaN found")); + Float d= (*pit)->get_derivative(*fkit); + IMP_check(d==d, "NaN found in particle derivative " << (*pit)->get_index() + << " attribute " << *fkit, + ValueException("NaN found")); + } + } ++iteration_; return score; } Index: kernel/src/Particle.cpp =================================================================== --- kernel/src/Particle.cpp (revision 557) +++ kernel/src/Particle.cpp (working copy) @@ -25,10 +25,14 @@
void Particle::set_model(Model *md, ParticleIndex pi) { + IMP_check(model_==NULL || md==NULL, + "Set_model called for particle already in model", + ValueException("Cannot transfer particles directly")); model_ = md; pi_ = pi; - IMP_assert(model_==NULL || model_->get_particle(pi_)== this, - "Set_model called with inconsistent data"); + IMP_check(model_==NULL || model_->get_particle(pi_)== this, + "Set_model called with inconsistent data", + ValueException("Cannot transfter particles directly")); }
void Particle::set_is_active(const bool is_active) Index: kernel/src/score_states/BondDecoratorListScoreState.cpp =================================================================== --- kernel/src/score_states/BondDecoratorListScoreState.cpp (revision 557) +++ kernel/src/score_states/BondDecoratorListScoreState.cpp (working copy) @@ -24,7 +24,7 @@ bonds_.clear(); for (unsigned int i=0; i< ps_.size(); ++i) { if (!ps_[i]->get_is_active()) continue; - BondedDecorator di= BondedDecorator::cast(ps_[i]); + BondedDecorator di(ps_[i]); ParticleIndex pi= ps_[i]->get_index(); for (unsigned int j=0; j< di.get_number_of_bonds(); ++j) { BondedDecorator dj= di.get_bonded(j); Index: kernel/src/score_states/BipartiteNonbondedListScoreState.cpp =================================================================== --- kernel/src/score_states/BipartiteNonbondedListScoreState.cpp (revision 557) +++ kernel/src/score_states/BipartiteNonbondedListScoreState.cpp (working copy) @@ -17,7 +17,7 @@
//! Turn the default into an actual algorithm and work around missing algorithms /** This cannot be shared with AllNBL because that one has grid and this does - not. + not. */ static BipartiteNonbondedListScoreState::Algorithm translate_algorithm(BipartiteNonbondedListScoreState::Algorithm a) @@ -100,9 +100,9 @@ mc1_->reset(); mcr_->reset(); } - IMP_BEGIN_CHECK(EXPENSIVE); - check_nbl(); - IMP_END_CHECK; + IMP_IF_CHECK(EXPENSIVE) { + check_nbl(); + } }
void BipartiteNonbondedListScoreState::process_sets(const Particles &p0, Index: kernel/src/score_states/AllNonbondedListScoreState.cpp =================================================================== --- kernel/src/score_states/AllNonbondedListScoreState.cpp (revision 557) +++ kernel/src/score_states/AllNonbondedListScoreState.cpp (working copy) @@ -95,9 +95,9 @@ if (P::update(mc, cost)) { mc_->reset(); } - IMP_BEGIN_CHECK(EXPENSIVE); - check_nbl(); - IMP_END_CHECK; + IMP_IF_CHECK(EXPENSIVE) { + check_nbl(); + } }
Index: kernel/src/pair_scores/DistancePairScore.cpp =================================================================== --- kernel/src/pair_scores/DistancePairScore.cpp (revision 557) +++ kernel/src/pair_scores/DistancePairScore.cpp (working copy) @@ -29,14 +29,13 @@ Float d2 = 0, delta[3]; Float score;
- IMP_BEGIN_CHECK(CHEAP); - XYZDecorator::cast(a); - XYZDecorator::cast(b); - IMP_END_CHECK; + IMP_IF_CHECK(CHEAP) { + XYZDecorator::cast(a); + XYZDecorator::cast(b); + }
XYZDecorator d0(a); XYZDecorator d1(b); - for (int i = 0; i < 3; ++i) { delta[i] = d0.get_coordinate(i) - d1.get_coordinate(i); d2 += square(delta[i]); Index: kernel/src/pair_scores/SphereDistancePairScore.cpp =================================================================== --- kernel/src/pair_scores/SphereDistancePairScore.cpp (revision 557) +++ kernel/src/pair_scores/SphereDistancePairScore.cpp (working copy) @@ -21,6 +21,12 @@ Float SphereDistancePairScore::evaluate(Particle *a, Particle *b, DerivativeAccumulator *da) { + IMP_check(a->has_attribute(radius_), "Particle " << a->get_index() + << "missing radius in SphereDistancePairScore", + ValueException("Missing radius")); + IMP_check(b->has_attribute(radius_), "Particle " << b->get_index() + << "missing radius in SphereDistancePairScore", + ValueException("Missing radius")); Float ra = a->get_value(radius_); Float rb = b->get_value(radius_); return internal::evaluate_distance_pair_score(a,b, da, f_.get(), Index: kernel/src/internal/bbox_nbl_helpers.cpp =================================================================== --- kernel/src/internal/bbox_nbl_helpers.cpp (revision 557) +++ kernel/src/internal/bbox_nbl_helpers.cpp (working copy) @@ -9,6 +9,10 @@ #include "IMP/decorators/XYZDecorator.h" #include "IMP/score_states/NonbondedListScoreState.h"
+/* compile the CGAL code with NDEBUG since it doesn't have the + same level of control over errors as IMP +*/ +#define NDEBUG #ifdef IMP_USE_CGAL #include <CGAL/box_intersection_d.h> #include <vector>
participants (1)
-
Daniel Russel