32 strategy_counter_ = 0;
33 strategy_change_conflicts_ =
34 parameters_.num_conflicts_before_strategy_changes();
35 conflicts_until_next_strategy_change_ = strategy_change_conflicts_;
38 conflicts_until_next_restart_ = parameters_.restart_period();
40 dl_running_average_.Reset(parameters_.restart_running_window_size());
41 lbd_running_average_.Reset(parameters_.restart_running_window_size());
42 trail_size_running_average_.Reset(parameters_.blocking_restart_window_size());
49 for (
int i = 0;
i < parameters_.restart_algorithms_size(); ++
i) {
50 strategies_.push_back(parameters_.restart_algorithms(
i));
52 if (strategies_.empty()) {
53 const std::vector<std::string> string_values = absl::StrSplit(
54 parameters_.default_restart_algorithms(),
',', absl::SkipEmpty());
55 for (
const std::string& string_value : string_values) {
57#if defined(__PORTABLE_PLATFORM__)
58 if (string_value ==
"NO_RESTART") {
60 }
else if (string_value ==
"LUBY_RESTART") {
62 }
else if (string_value ==
"DL_MOVING_AVERAGE_RESTART") {
64 }
else if (string_value ==
"LBD_MOVING_AVERAGE_RESTART") {
66 }
else if (string_value ==
"FIXED_RESTART") {
69 LOG(WARNING) <<
"Couldn't parse the RestartAlgorithm name: '"
70 << string_value <<
"'.";
75 LOG(WARNING) <<
"Couldn't parse the RestartAlgorithm name: '"
76 << string_value <<
"'.";
80 strategies_.push_back(tmp);
83 if (strategies_.empty()) {
89 bool should_restart =
false;
90 switch (strategies_[strategy_counter_ % strategies_.size()]) {
94 if (conflicts_until_next_restart_ == 0) {
96 should_restart =
true;
100 if (dl_running_average_.IsWindowFull() &&
101 dl_running_average_.GlobalAverage() <
102 parameters_.restart_dl_average_ratio() *
103 dl_running_average_.WindowAverage()) {
104 should_restart =
true;
108 if (lbd_running_average_.IsWindowFull() &&
109 lbd_running_average_.GlobalAverage() <
110 parameters_.restart_lbd_average_ratio() *
111 lbd_running_average_.WindowAverage()) {
112 should_restart =
true;
116 if (conflicts_until_next_restart_ == 0) {
117 should_restart =
true;
121 if (should_restart) {
125 if (conflicts_until_next_strategy_change_ == 0) {
127 strategy_change_conflicts_ +=
128 static_cast<int>(parameters_.strategy_change_increase_ratio() *
129 strategy_change_conflicts_);
130 conflicts_until_next_strategy_change_ = strategy_change_conflicts_;
134 decision_policy_->SetStablePhase(
135 strategies_[strategy_counter_ % strategies_.size()] ==
140 dl_running_average_.ClearWindow();
141 lbd_running_average_.ClearWindow();
142 conflicts_until_next_restart_ = parameters_.restart_period();
143 if (strategies_[strategy_counter_ % strategies_.size()] ==
145 conflicts_until_next_restart_ *=
SUniv(luby_count_ + 1);
148 return should_restart;
152 int conflict_decision_level,
int conflict_lbd) {
154 if (conflicts_until_next_restart_ > 0) {
155 --conflicts_until_next_restart_;
157 if (conflicts_until_next_strategy_change_ > 0) {
158 --conflicts_until_next_strategy_change_;
161 trail_size_running_average_.Add(conflict_trail_index);
162 dl_running_average_.Add(conflict_decision_level);
163 lbd_running_average_.Add(conflict_lbd);
167 if (parameters_.use_blocking_restart()) {
168 if (lbd_running_average_.IsWindowFull() &&
169 dl_running_average_.IsWindowFull() &&
170 trail_size_running_average_.IsWindowFull() &&
171 conflict_trail_index >
172 parameters_.blocking_restart_multiplier() *
173 trail_size_running_average_.WindowAverage()) {
174 dl_running_average_.ClearWindow();
175 lbd_running_average_.ClearWindow();
182 absl::StrFormat(
" num restarts: %d\n", num_restarts_) +
184 " current_strategy: %s\n",
186 strategies_[strategy_counter_ % strategies_.size()])) +
187 absl::StrFormat(
" conflict decision level avg: %f window: %f\n",
188 dl_running_average_.GlobalAverage(),
189 dl_running_average_.WindowAverage()) +
190 absl::StrFormat(
" conflict lbd avg: %f window: %f\n",
191 lbd_running_average_.GlobalAverage(),
192 lbd_running_average_.WindowAverage()) +
193 absl::StrFormat(
" conflict trail size avg: %f window: %f\n",
194 trail_size_running_average_.GlobalAverage(),
195 trail_size_running_average_.WindowAverage());