17#ifndef ORTOOLS_SAT_SUBSOLVER_H_
18#define ORTOOLS_SAT_SUBSOLVER_H_
29#include "absl/strings/string_view.h"
33#if !defined(__PORTABLE_PLATFORM__)
74 virtual bool IsDone() {
return false; }
95 std::string
name()
const {
return name_; }
103 ++num_finished_tasks_;
104 duration_in_seconds = std::max(0.0, duration_in_seconds);
105 wall_time_ += duration_in_seconds;
106 timing_.AddTimeInSec(duration_in_seconds);
116 if (deterministic_duration <= 0)
return;
117 deterministic_time_ += deterministic_duration;
118 dtiming_.AddTimeInSec(deterministic_duration);
124 std::string data = timing_.ValueAsString();
125 if (!data.empty()) data.pop_back();
131 std::string data = dtiming_.ValueAsString();
132 if (!data.empty()) data.pop_back();
143 const double time = deterministic ? deterministic_time_ : wall_time_;
144 const double divisor = num_scheduled_tasks_ > 0
145 ?
static_cast<double>(num_scheduled_tasks_)
151 const int64_t in_flight = num_scheduled_tasks_ - num_finished_tasks_;
152 const double confidence_factor =
153 num_finished_tasks_ > 10 ? 1.0 : std::exp(in_flight);
157 return num_scheduled_tasks_ * std::max(0.1, time / divisor) *
162 const std::string name_;
165 int64_t num_scheduled_tasks_ = 0;
166 int64_t num_finished_tasks_ = 0;
169 double wall_time_ = 0.0;
170 double deterministic_time_ = 0.0;
188 std::function<void()> f_;
203 int num_threads, ModelSharedTimeLimit* time_limit);
218 int num_threads,
int batch_size,
219 int max_num_batches = 0);
225void SequentialLoop(std::vector<std::unique_ptr<SubSolver>>& subsolvers);
std::string TimingInfo() const
SubSolver(absl::string_view name, SubsolverType type)
void AddTaskDeterministicDuration(double deterministic_duration)
std::string DeterministicTimingInfo() const
virtual ~SubSolver()=default
SubsolverType type() const
virtual std::function< void()> GenerateTask(int64_t task_id)=0
virtual bool TaskIsAvailable()=0
double deterministic_time() const
double GetSelectionScore(bool deterministic) const
void AddTaskDuration(double duration_in_seconds)
virtual void Synchronize()=0
SynchronizationPoint(absl::string_view name, std::function< void()> f)
std::function< void()> GenerateTask(int64_t) final
bool TaskIsAvailable() final
void DeterministicLoop(std::vector< std::unique_ptr< SubSolver > > &subsolvers, int num_threads, int batch_size, int max_num_batches)
void NonDeterministicLoop(std::vector< std::unique_ptr< SubSolver > > &subsolvers, const int num_threads, ModelSharedTimeLimit *time_limit)
void SequentialLoop(std::vector< std::unique_ptr< SubSolver > > &subsolvers)