Index: kernel/include/IMP/optimizers/MonteCarlo.h =================================================================== --- kernel/include/IMP/optimizers/MonteCarlo.h (revision 399) +++ kernel/include/IMP/optimizers/MonteCarlo.h (working copy) @@ -44,10 +44,8 @@ /** The number of local steps must be nonzero for the local optimizer to be used. */ - void set_local_optimizer(Optimizer* cg) { - cg_=std::auto_ptr(cg); - cg_->set_model(get_model()); - } + void set_local_optimizer(Optimizer* cg); + //! Set the temperature for the Metropolis criteria void set_temperature(Float t) { IMP_assert(t>0, "Temperature must be positive"); Index: kernel/src/Optimizer.cpp =================================================================== --- kernel/src/Optimizer.cpp (revision 399) +++ kernel/src/Optimizer.cpp (working copy) @@ -12,7 +12,7 @@ { //! Constructor -Optimizer::Optimizer() +Optimizer::Optimizer(): model_(NULL) { IMP_LOG(VERBOSE, "MEMORY: Optimizer created " << this << std::endl); } Index: kernel/src/optimizers/MonteCarlo.cpp =================================================================== --- kernel/src/optimizers/MonteCarlo.cpp (revision 399) +++ kernel/src/optimizers/MonteCarlo.cpp (working copy) @@ -37,6 +37,13 @@ Float MonteCarlo::optimize(unsigned int max_steps) { IMP_CHECK_OBJECT(this); + if (cg_.get() != NULL) { + IMP_CHECK_OBJECT(cg_.get()); + IMP_check(cg_->get_model() == get_model(), + "The model used by the local optimizer does not match "\ + " that used by the montecarlo optimizer", + InvalidStateException("Bad model pointer")); + } update_states(); prior_energy_ =get_model()->evaluate(0); IMP_LOG(VERBOSE, "MC Initial energy is " << prior_energy_ << std::endl); @@ -98,6 +105,11 @@ } +void MonteCarlo::set_local_optimizer(Optimizer* cg) { + cg_=std::auto_ptr(cg); + cg_->set_model(get_model()); +} + void MonteCarlo::show(std::ostream &out) const { out << "MonteCarlo +" << stat_forward_steps_taken_