@@ -29,7 +29,8 @@ Model::Model(
2929 : output_directory_(output_directory), start_time_(start_time), running_since_(Clock::now()),
3030 time_limit_ (Settings::maximumTimeSeconds()), no_interim_save_since_(Clock::now()),
3131 interim_save_interval_(Settings::interimOutputIntervalSeconds()), env_(env),
32- latitude_(start_point.latitude()), longitude_(start_point.longitude())
32+ latitude_(start_point.latitude()), longitude_(start_point.longitude()),
33+ active_simulations_still_required_(Settings::minimumActiveSimulationCount())
3334{
3435 logging::debug (" Calculating for (%f, %f)" , start_point.latitude (), start_point.longitude ());
3536 const auto nd_for_point = calculate_nd_ref_for_point (env->elevation (), start_point);
@@ -475,6 +476,10 @@ bool Model::shouldStop() const noexcept
475476}
476477bool Model::isOutOfTime () const noexcept { return is_out_of_time_; }
477478bool Model::isUnderSimulationCountMinimum () const noexcept { return is_under_simulation_minimum_; }
479+ size_t Model::activeSimulationsStillRequired () const noexcept
480+ {
481+ return active_simulations_still_required_;
482+ }
478483bool Model::isOverSimulationCountMaximum () const noexcept { return is_over_simulation_count_; }
479484shared_ptr<ProbabilityMap> Model::makeProbabilityMap (
480485 const DurationSize time,
@@ -552,6 +557,29 @@ bool Model::add_statistics(
552557 {
553558 return true ;
554559 }
560+ active_simulations_still_required_ = [&]() {
561+ size_t num_left = Settings::minimumActiveSimulationCount ();
562+ for (const auto s : *all_sizes)
563+ {
564+ if (s > initial_size ())
565+ {
566+ --num_left;
567+ }
568+ if (0 == num_left)
569+ {
570+ logging::note (" Found enough active simulations to meet minimum" );
571+ return num_left;
572+ }
573+ }
574+ logging::note (
575+ " Not enough active simulations out of %ld results to meet minimum" , all_sizes->size ()
576+ );
577+ return num_left;
578+ }();
579+ if (0 < activeSimulationsStillRequired ())
580+ {
581+ return true ;
582+ }
555583 is_over_simulation_count_ = all_sizes->size () >= Settings::maximumSimulationCount ();
556584 if (isOverSimulationCountMaximum ())
557585 {
@@ -597,15 +625,6 @@ size_t runs_required(
597625 logging::note (" Stopping after iteration %ld because running in deterministic mode" , i);
598626 return 0 ;
599627 }
600- if (model.isUnderSimulationCountMinimum ())
601- {
602- logging::debug (
603- " Continuing after %d iterations. Simulation minimum of %d simulations has not been reached." ,
604- i,
605- Settings::minimumSimulationCount ()
606- );
607- return Settings::minimumSimulationCount () - i;
608- }
609628 if (model.isOverSimulationCountMaximum ())
610629 {
611630 logging::note (
@@ -624,6 +643,27 @@ size_t runs_required(
624643 );
625644 return 0 ;
626645 }
646+ const auto max_sims_left = Settings::maximumSimulationCount () - i;
647+ if (model.isUnderSimulationCountMinimum ())
648+ {
649+ logging::debug (
650+ " Continuing after %d iterations. Simulation minimum of %d simulations has not been reached." ,
651+ i,
652+ Settings::minimumSimulationCount ()
653+ );
654+ return min (max_sims_left, Settings::minimumSimulationCount () - i);
655+ }
656+ const auto active_still_required = model.activeSimulationsStillRequired ();
657+ if (0 < active_still_required)
658+ {
659+ logging::debug (
660+ " Continuing after %d iterations. Active simulation minimum of %d simulations has not been reached." ,
661+ i,
662+ Settings::minimumActiveSimulationCount ()
663+ );
664+ // HACK: if we have n active sims so far then expect that many per i simulations?
665+ return min (max_sims_left, i * active_still_required);
666+ }
627667 // HACK: statistics don't work if only one value, so need at least 2
628668 const auto min_values = min (min (all_sizes->size (), means->size ()), pct->size ());
629669 if (1 >= min_values)
0 commit comments