26 int relevant_prefix_size,
27 std::vector<Literal>* literals) {
28 if (literals->empty())
return -1;
30 return std::min<int>(relevant_prefix_size, literals->size());
40 int num_processed = 0;
41 int num_not_processed = 0;
42 int target_prefix_size = literals->size() - 1;
43 for (
int i = literals->size() - 1; i >= 0; i--) {
48 target_prefix_size = i;
50 if (num_not_processed >= num_processed)
break;
52 if (num_not_processed == 0)
return -1;
53 target_prefix_size =
std::min(target_prefix_size, relevant_prefix_size);
57 std::stable_partition(literals->begin() + target_prefix_size, literals->end(),
59 return gtl::ContainsKey(processed, l.Index());
61 return target_prefix_size;
66 average_ = reset_value;
71 average_ += (new_record - average_) / num_records_;
76 average_ = (num_records_ == 1)
78 : (new_record + decaying_factor_ * (average_ - new_record));
82 records_.push_front(record);
83 if (records_.size() > record_limit_) {
92 std::vector<double> sorted_records(records_.begin(), records_.end());
93 std::sort(sorted_records.begin(), sorted_records.end());
94 const int num_records = sorted_records.size();
96 const double percentile_rank =
97 static_cast<double>(num_records) * percent / 100.0 - 0.5;
98 if (percentile_rank <= 0) {
99 return sorted_records.front();
100 }
else if (percentile_rank >= num_records - 1) {
101 return sorted_records.back();
105 DCHECK_LT(percentile_rank, num_records - 1);
106 const int lower_rank =
static_cast<int>(std::floor(percentile_rank));
108 return sorted_records[lower_rank] +
109 (percentile_rank - lower_rank) *
110 (sorted_records[lower_rank + 1] - sorted_records[lower_rank]);
114 std::vector<std::vector<int64_t>>* tuples) {
115 if (tuples->empty())
return;
120 const int num_vars = (*tuples)[0].size();
122 std::vector<int> to_remove;
123 std::vector<int64_t> tuple_minus_var_i(num_vars - 1);
124 for (
int i = 0; i < num_vars; ++i) {
125 const int domain_size = domain_sizes[i];
126 if (domain_size == 1)
continue;
127 absl::flat_hash_map<const std::vector<int64_t>, std::vector<int>>
128 masked_tuples_to_indices;
129 for (
int t = 0; t < tuples->size(); ++t) {
131 for (
int j = 0; j < num_vars; ++j) {
132 if (i == j)
continue;
133 tuple_minus_var_i[out++] = (*tuples)[t][j];
135 masked_tuples_to_indices[tuple_minus_var_i].push_back(t);
138 for (
const auto& it : masked_tuples_to_indices) {
139 if (it.second.size() != domain_size)
continue;
140 (*tuples)[it.second.front()][i] = any_value;
141 to_remove.insert(to_remove.end(), it.second.begin() + 1, it.second.end());
143 std::sort(to_remove.begin(), to_remove.end(), std::greater<int>());
144 for (
const int t : to_remove) {
145 (*tuples)[t] = tuples->back();
#define CHECK_GE(val1, val2)
#define CHECK_GT(val1, val2)
#define DCHECK_GE(val1, val2)
#define DCHECK_LT(val1, val2)
#define CHECK_LE(val1, val2)
void AddData(double new_record)
void AddData(double new_record)
void Reset(double reset_value)
double GetPercentile(double percent)
void AddRecord(double record)
void STLSortAndRemoveDuplicates(T *v, const LessFunc &less_func)
bool ContainsKey(const Collection &collection, const Key &key)
int MoveOneUnprocessedLiteralLast(const std::set< LiteralIndex > &processed, int relevant_prefix_size, std::vector< Literal > *literals)
void CompressTuples(absl::Span< const int64_t > domain_sizes, int64_t any_value, std::vector< std::vector< int64_t >> *tuples)
Collection of objects used to extend the Constraint Solver library.