Skip to content

Commit 5778a2b

Browse files
committed
correct existing programs
1 parent 485f09f commit 5778a2b

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ To install or update LODA, please follow the [installation instructions](https:/
55
### Enhancements
66

77
* Faster `nrt` using Newton's method
8+
* Correct existing programs
89

910
### v25.9.13
1011

src/mine/checker.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -284,28 +284,37 @@ std::string Checker::isOptimizedBetter(Program existing, Program optimized,
284284
// evaluate optimized program for fixed number of terms
285285
num_check = std::min<size_t>(num_check, terms.size());
286286
num_check = std::max<size_t>(num_check, SequenceUtil::EXTENDED_SEQ_LENGTH);
287-
Sequence tmp;
287+
Sequence optimized_seq, existing_seq;
288288
evaluator.clearCaches();
289-
auto optimized_steps = evaluator.eval(optimized, tmp, num_check, false);
289+
auto optimized_steps =
290+
evaluator.eval(optimized, optimized_seq, num_check, false);
290291
if (Signals::HALT) {
291292
return not_better; // interrupted evaluation
292293
}
293294

294295
// check if the first decreasing/non-increasing term is beyond the known
295296
// sequence terms => fake "better" program
296297
const int64_t s = terms.size();
297-
if (tmp.get_first_delta_lt(Number::ZERO) >= s || // decreasing
298-
tmp.get_first_delta_lt(Number::ONE) >= s) { // non-increasing
299-
return not_better; // => fake "better" program
298+
if (optimized_seq.get_first_delta_lt(Number::ZERO) >= s || // decreasing
299+
optimized_seq.get_first_delta_lt(Number::ONE) >= s) { // non-increasing
300+
return not_better; // => fake "better" program
300301
}
301302

302303
// evaluate existing program for same number of terms
303304
evaluator.clearCaches();
304-
const auto existing_steps = evaluator.eval(existing, tmp, num_check, false);
305+
const auto existing_steps =
306+
evaluator.eval(existing, existing_seq, num_check, false);
305307
if (Signals::HALT) {
306308
return not_better; // interrupted evaluation
307309
}
308310

311+
// check correctness of the existing program
312+
size_t num_checked_terms = std::min(terms.size(), existing_seq.size());
313+
if (existing_seq.subsequence(0, num_checked_terms) !=
314+
terms.subsequence(0, num_checked_terms)) {
315+
return "Corrected";
316+
}
317+
309318
// check number of successfully computed terms
310319
// we don't try to optimize for number of terms
311320
double existing_terms = existing_steps.runs;

0 commit comments

Comments
 (0)