17#ifndef OR_TOOLS_SAT_SUBSOLVER_H_
18#define OR_TOOLS_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 wall_time_ += duration_in_seconds;
105 timing_.AddTimeInSec(duration_in_seconds);
115 if (deterministic_duration <= 0)
return;
116 deterministic_time_ += deterministic_duration;
117 dtiming_.AddTimeInSec(deterministic_duration);
123 std::string data = timing_.ValueAsString();
124 if (!data.empty()) data.pop_back();
130 std::string data = dtiming_.ValueAsString();
131 if (!data.empty()) data.pop_back();
142 const double time = deterministic ? deterministic_time_ : wall_time_;
143 const double divisor = num_scheduled_tasks_ > 0
144 ?
static_cast<double>(num_scheduled_tasks_)
150 const int64_t in_flight = num_scheduled_tasks_ - num_finished_tasks_;
151 const double confidence_factor =
152 num_finished_tasks_ > 10 ? 1.0 : std::exp(in_flight);
156 return num_scheduled_tasks_ * std::max(0.1, time / divisor) *
161 const std::string name_;
164 int64_t num_scheduled_tasks_ = 0;
165 int64_t num_finished_tasks_ = 0;
168 double wall_time_ = 0.0;
169 double deterministic_time_ = 0.0;
187 std::function<void()> f_;
202 int num_threads, ModelSharedTimeLimit*
time_limit);
217 int num_threads,
int batch_size,
218 int max_num_batches = 0);
224void 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
Returns the type of the subsolver.
virtual std::function< void()> GenerateTask(int64_t task_id)=0
virtual bool TaskIsAvailable()=0
double deterministic_time() const
std::string name() const
Returns the name of this SubSolver. Used in logs.
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)
In SWIG mode, we don't want anything besides these top-level includes.