25 int relevant_prefix_size,
26 std::vector<Literal>* literals) {
27 if (literals->empty())
return -1;
29 return std::min<int>(relevant_prefix_size, literals->size());
39 int num_processed = 0;
40 int num_not_processed = 0;
41 int target_prefix_size = literals->size() - 1;
42 for (
int i = literals->size() - 1; i >= 0; i--) {
47 target_prefix_size = i;
49 if (num_not_processed >= num_processed)
break;
51 if (num_not_processed == 0)
return -1;
52 target_prefix_size =
std::min(target_prefix_size, relevant_prefix_size);
56 std::stable_partition(literals->begin() + target_prefix_size, literals->end(),
58 return gtl::ContainsKey(processed, l.Index());
60 return target_prefix_size;
65 average_ = reset_value;
70 average_ += (new_record - average_) / num_records_;
75 average_ = (num_records_ == 1)
77 : (new_record + decaying_factor_ * (average_ - new_record));
81 records_.push_front(record);
82 if (records_.size() > record_limit_) {
91 std::vector<double> sorted_records(records_.begin(), records_.end());
92 std::sort(sorted_records.begin(), sorted_records.end());
93 const int num_records = sorted_records.size();
95 const double percentile_rank =
96 static_cast<double>(num_records) * percent / 100.0 - 0.5;
97 if (percentile_rank <= 0) {
98 return sorted_records.front();
99 }
else if (percentile_rank >= num_records - 1) {
100 return sorted_records.back();
104 DCHECK_LT(percentile_rank, num_records - 1);
105 const int lower_rank =
static_cast<int>(std::floor(percentile_rank));
107 return sorted_records[lower_rank] +
108 (percentile_rank - lower_rank) *
109 (sorted_records[lower_rank + 1] - sorted_records[lower_rank]);
113 std::vector<std::vector<int64>>* tuples) {
114 if (tuples->empty())
return;
119 const int num_vars = (*tuples)[0].size();
121 std::vector<int> to_remove;
122 std::vector<int64> tuple_minus_var_i(num_vars - 1);
123 for (
int i = 0; i < num_vars; ++i) {
124 const int domain_size = domain_sizes[i];
125 if (domain_size == 1)
continue;
126 absl::flat_hash_map<const std::vector<int64>, std::vector<int>>
127 masked_tuples_to_indices;
128 for (
int t = 0; t < tuples->size(); ++t) {
130 for (
int j = 0; j < num_vars; ++j) {
131 if (i == j)
continue;
132 tuple_minus_var_i[out++] = (*tuples)[t][j];
134 masked_tuples_to_indices[tuple_minus_var_i].push_back(t);
137 for (
const auto& it : masked_tuples_to_indices) {
138 if (it.second.size() != domain_size)
continue;
139 (*tuples)[it.second.front()][i] = any_value;
140 to_remove.insert(to_remove.end(), it.second.begin() + 1, it.second.end());
142 std::sort(to_remove.begin(), to_remove.end(), std::greater<int>());
143 for (
const int t : to_remove) {
144 (*tuples)[t] = tuples->back();