Index: kernel/include/IMP/optimizers/MonteCarlo.h =================================================================== --- kernel/include/IMP/optimizers/MonteCarlo.h (revision 533) +++ kernel/include/IMP/optimizers/MonteCarlo.h (working copy) @@ -66,6 +66,18 @@ int get_local_steps() const { return num_local_steps_; } + //! Set the probability of each move being made + /** Make this low if the space is rough and there are many particles. + The movers should make each individual move with this probability. + That is, a NormalMover with 100 particles will move each particle + with probability p. + */ + void set_move_probability(Float p) { + IMP_check(p>0 && p <=1, "Not a valid probability", + ValueException("Not a probability")); + probability_=p; + } + //! Take this many steps of the local optimizer for each MC step void set_local_steps(unsigned int n) { num_local_steps_=n; @@ -74,15 +86,21 @@ unsigned int get_number_of_forward_steps() const { return stat_forward_steps_taken_; } + //! Return how many times the optimizer has stepped to higher energy + unsigned int get_number_of_upward_steps() const { + return stat_upward_steps_taken_; + } void show(std::ostream &out= std::cout) const; private: Float temp_; Float prior_energy_; Float stop_energy_; + Float probability_; internal::ObjectPointer cg_; unsigned int num_local_steps_; unsigned int stat_forward_steps_taken_; + unsigned int stat_upward_steps_taken_; unsigned int stat_num_failures_; }; Index: kernel/src/optimizers/MonteCarlo.cpp =================================================================== --- kernel/src/optimizers/MonteCarlo.cpp (revision 533) +++ kernel/src/optimizers/MonteCarlo.cpp (working copy) @@ -26,8 +26,10 @@ MonteCarlo::MonteCarlo(): temp_(1), prior_energy_(std::numeric_limits::max()), stop_energy_(-std::numeric_limits::max()), + probability_(1), num_local_steps_(50), stat_forward_steps_taken_(0), + stat_upward_steps_taken_(0), stat_num_failures_(0){} MonteCarlo::~MonteCarlo() @@ -53,7 +55,7 @@ for (MoverIterator it = movers_begin(); it != movers_end(); ++it) { IMP_LOG(VERBOSE, "MC Trying move " << **it << std::endl); IMP_CHECK_OBJECT(*it); - (*it)->propose_move(.5); + (*it)->propose_move(probability_); } Float next_energy; if (cg_.get() != NULL && num_local_steps_!= 0) { @@ -75,6 +77,7 @@ << std::endl); if (e > r) { accept=true; + ++stat_upward_steps_taken_; } } IMP_LOG(VERBOSE, "MC Prior energy is " << prior_energy_ Index: kernel/src/optimizers/movers/NormalMover.cpp =================================================================== --- kernel/src/optimizers/movers/NormalMover.cpp (revision 533) +++ kernel/src/optimizers/movers/NormalMover.cpp (working copy) @@ -24,14 +24,16 @@ set_sigma(max); } -void NormalMover::generate_move(float scale) +void NormalMover::generate_move(float probability) { + boost::uniform_real<> rand(0,1); boost::normal_distribution mrng(0, stddev_); boost::variate_generator > sampler(random_number_generator, mrng); for (unsigned int i = 0; i < number_of_particles(); ++i) { + if (rand(random_number_generator) > probability) continue; for (unsigned int j = 0; j < number_of_float_keys(); ++j) { float c = get_float(i, j); float r = sampler();