Skip to content

Commit a158bcd

Browse files
authored
fix range test (#453)
1 parent 14a4e8c commit a158bcd

File tree

8 files changed

+67
-31
lines changed

8 files changed

+67
-31
lines changed

src/cmd/benchmark.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ void Benchmark::program(size_t id, size_t num_terms) {
119119
std::string Benchmark::programEval(const Program& p, eval_mode_t eval_mode,
120120
size_t num_terms) {
121121
Settings settings;
122-
Evaluator evaluator(settings, eval_mode);
122+
Evaluator evaluator(settings, eval_mode, false);
123123
if (!evaluator.supportsEvalModes(p, eval_mode)) {
124124
return "-";
125125
}
@@ -149,7 +149,7 @@ void Benchmark::findSlow(int64_t num_terms, Operation::Type type) {
149149
Parser parser;
150150
Settings settings;
151151
Interpreter interpreter(settings);
152-
Evaluator evaluator(settings);
152+
Evaluator evaluator(settings, EVAL_ALL, false);
153153
Sequence seq;
154154
Program program;
155155
std::priority_queue<std::pair<int64_t, UID> > queue;

src/cmd/commands.cpp

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ void Commands::upgrade() {
169169
void Commands::evaluate(const std::string& path) {
170170
initLog(true);
171171
Program program = OeisProgram::getProgramAndSeqId(path).first;
172-
Evaluator evaluator(settings);
172+
Evaluator evaluator(settings, EVAL_ALL, false);
173173
Sequence seq;
174174
evaluator.eval(program, seq);
175175
if (!settings.print_as_b_file) {
@@ -188,7 +188,7 @@ void Commands::check(const std::string& path) {
188188
uid = UID(Comments::getSequenceIdFromProgram(program));
189189
}
190190
auto seq = ManagedSequence(uid);
191-
Evaluator evaluator(settings);
191+
Evaluator evaluator(settings, EVAL_ALL, true);
192192
auto terms = seq.getTerms(SequenceUtil::FULL_SEQ_LENGTH);
193193
auto num_required = OeisProgram::getNumRequiredTerms(program);
194194
auto result = evaluator.check(program, terms, num_required, uid);
@@ -273,7 +273,7 @@ void Commands::profile(const std::string& path) {
273273
initLog(true);
274274
Program program = OeisProgram::getProgramAndSeqId(path).first;
275275
Sequence res;
276-
Evaluator evaluator(settings);
276+
Evaluator evaluator(settings, EVAL_ALL, false);
277277
auto start_time = std::chrono::steady_clock::now();
278278
evaluator.eval(program, res);
279279
auto cur_time = std::chrono::steady_clock::now();
@@ -355,7 +355,7 @@ void Commands::autoFold() {
355355
AdaptiveScheduler log_scheduler(30);
356356
bool folded;
357357
Program main, sub;
358-
Evaluator evaluator(settings);
358+
Evaluator evaluator(settings, EVAL_ALL, false);
359359
std::map<int64_t, int64_t> cell_map;
360360
size_t main_loops, sub_loops;
361361
UID sub_id;
@@ -574,7 +574,7 @@ void Commands::testPari(const std::string& test_id) {
574574
initLog(false);
575575
Parser parser;
576576
Interpreter interpreter(settings);
577-
Evaluator evaluator(settings);
577+
Evaluator evaluator(settings, EVAL_ALL, false);
578578
IncrementalEvaluator inceval(interpreter);
579579
OeisManager manager(settings);
580580
Memory tmp_memory;
@@ -736,7 +736,8 @@ bool checkRange(const ManagedSequence& seq, const Program& program,
736736
void Commands::testRange(const std::string& id) {
737737
initLog(false);
738738
Parser parser;
739-
int64_t numChecked = 0;
739+
size_t numChecked = 0, numInvalid = 0;
740+
std::vector<UID> failedIds;
740741
OeisManager manager(settings);
741742
manager.load();
742743
auto& stats = manager.getStats();
@@ -748,6 +749,7 @@ void Commands::testRange(const std::string& id) {
748749
} else {
749750
seqs.push_back(manager.getSequences().get(UID(id)));
750751
}
752+
Evaluator evaluator(settings, EVAL_ALL, false);
751753
for (const auto& seq : seqs) {
752754
if (seq.id.number() == 0 || !stats.all_program_ids.exists(seq.id)) {
753755
continue;
@@ -757,18 +759,41 @@ void Commands::testRange(const std::string& id) {
757759
program = parser.parse(ProgramUtil::getProgramPath(seq.id));
758760
} catch (const std::exception& e) {
759761
Log::get().warn(std::string(e.what()));
762+
numInvalid++;
760763
continue;
761764
}
762-
if (manager.getStats().getTransitiveLength(seq.id) < 0) {
765+
const auto initialTerms = seq.getTerms(8);
766+
auto status = evaluator.check(program, initialTerms, -1, seq.id);
767+
if (status.first == status_t::ERROR) {
763768
Log::get().warn("Skipping invalid program for " + seq.id.string());
769+
numInvalid++;
764770
continue;
765771
}
766-
if (checkRange(seq, program, false) && checkRange(seq, program, true)) {
767-
numChecked++;
772+
try {
773+
if (checkRange(seq, program, false) && checkRange(seq, program, true)) {
774+
numChecked++;
775+
}
776+
} catch (const std::exception& e) {
777+
Log::get().error("Error during range check for " + seq.id.string() +
778+
": " + std::string(e.what()),
779+
false);
780+
failedIds.push_back(seq.id);
768781
}
769782
}
770-
Log::get().info("Successfully finished range check for " +
771-
std::to_string(numChecked) + " programs");
783+
if (!failedIds.empty()) {
784+
std::stringstream ss;
785+
for (const auto& id : failedIds) {
786+
ss << id.string() << " ";
787+
}
788+
Log::get().error("Range check failed for " +
789+
std::to_string(failedIds.size()) +
790+
" programs: " + ss.str(),
791+
true);
792+
} else {
793+
Log::get().info("Successfully finished range check for " +
794+
std::to_string(numChecked) + " programs, ingnored " +
795+
std::to_string(numInvalid) + " invalid programs");
796+
}
772797
}
773798

774799
void Commands::generate() {

src/cmd/test.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ void Test::fold() {
694694
loadInOutTests(std::string("tests") + FILE_SEP + "fold" + FILE_SEP + "F");
695695
size_t i = 1;
696696
Parser parser;
697-
Evaluator evaluator(settings, false);
697+
Evaluator evaluator(settings, EVAL_ALL, false);
698698
std::map<int64_t, int64_t> cellMap;
699699
for (const auto& t : tests) {
700700
Log::get().info("Testing fold " + std::to_string(i));
@@ -734,7 +734,7 @@ void Test::unfold() {
734734
auto tests = loadInOutTests(std::string("tests") + FILE_SEP + "unfold" +
735735
FILE_SEP + "U");
736736
size_t i = 1;
737-
Evaluator evaluator(settings, false);
737+
Evaluator evaluator(settings, EVAL_ALL, false);
738738
for (const auto& t : tests) {
739739
Log::get().info("Testing unfold " + std::to_string(i));
740740
auto p = t.first;
@@ -818,8 +818,8 @@ bool Test::checkEvaluator(const Settings& settings, size_t id, std::string path,
818818
} else {
819819
Log::get().error("Unknown eval mode", true);
820820
}
821-
Evaluator eval_reg(settings, EVAL_REGULAR);
822-
Evaluator eval_other(settings, evalMode);
821+
Evaluator eval_reg(settings, EVAL_REGULAR, false);
822+
Evaluator eval_other(settings, evalMode, false);
823823
if (!eval_other.supportsEvalModes(p, evalMode)) {
824824
if (mustSupportEvalMode) {
825825
Log::get().error("Error initializing " + msg, true);
@@ -1339,7 +1339,7 @@ void Test::optimizer() {
13391339
}
13401340

13411341
void Test::minimizer(size_t tests) {
1342-
Evaluator evaluator(settings);
1342+
Evaluator evaluator(settings, EVAL_ALL, false);
13431343
Minimizer minimizer(settings);
13441344
MultiGenerator multi_generator(settings, getManager().getStats());
13451345
Sequence s1, s2, s3;
@@ -1418,7 +1418,7 @@ bool checkRange(const Sequence& seq, const Program& program, bool finiteInput) {
14181418
}
14191419

14201420
void Test::randomRange(size_t tests) {
1421-
Evaluator evaluator(settings);
1421+
Evaluator evaluator(settings, EVAL_ALL, false);
14221422
MultiGenerator multi_generator(settings, getManager().getStats());
14231423
Sequence seq;
14241424
Program program;
@@ -1541,7 +1541,7 @@ void Test::testSeq(size_t id, const Sequence& expected) {
15411541
Parser parser;
15421542
Settings settings; // special settings
15431543
settings.num_terms = expected.size();
1544-
Evaluator evaluator(settings);
1544+
Evaluator evaluator(settings, EVAL_ALL, false);
15451545
auto p = parser.parse(file);
15461546
Sequence result;
15471547
evaluator.eval(p, result);
@@ -1573,7 +1573,7 @@ void Test::testMatcherPair(Matcher& matcher, size_t id1, size_t id2) {
15731573
Log::get().info("Testing " + matcher.getName() + " matcher for " +
15741574
uid1.string() + " -> " + uid2.string());
15751575
Parser parser;
1576-
Evaluator evaluator(settings);
1576+
Evaluator evaluator(settings, EVAL_ALL, false);
15771577
auto p1 = parser.parse(ProgramUtil::getProgramPath(uid1));
15781578
auto p2 = parser.parse(ProgramUtil::getProgramPath(uid2));
15791579
ProgramUtil::removeOps(p1, Operation::Type::NOP);

src/eval/evaluator.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ void steps_t::add(const steps_t &s) {
2121
runs += s.runs;
2222
}
2323

24-
Evaluator::Evaluator(const Settings &settings, eval_mode_t eval_modes)
24+
Evaluator::Evaluator(const Settings &settings, eval_mode_t eval_modes,
25+
bool check_range)
2526
: settings(settings),
2627
interpreter(settings),
2728
inc_evaluator(interpreter),
2829
vir_evaluator(settings),
2930
use_inc_eval(eval_modes & EVAL_INCREMENTAL),
3031
use_vir_eval(eval_modes & EVAL_VIRTUAL),
31-
check_range(true),
32+
check_range(check_range),
3233
check_eval_time(settings.max_eval_secs >= 0),
3334
is_debug(Log::get().level == Log::Level::DEBUG) {}
3435

@@ -155,15 +156,23 @@ std::pair<status_t, steps_t> Evaluator::check(const Program &p,
155156
// compute range
156157
Range range;
157158
const int64_t offset = ProgramUtil::getOffset(p);
159+
std::pair<status_t, steps_t> result;
158160
if (check_range) {
159-
range = generateRange(p, offset + expected_seq.size() - 1);
161+
try {
162+
range = generateRange(p, offset + expected_seq.size() - 1);
163+
} catch (const std::exception &e) {
164+
result.first = status_t::ERROR;
165+
if (settings.print_as_b_file) {
166+
std::cout << std::string(e.what()) << std::endl;
167+
}
168+
return result;
169+
}
160170
}
161171
// clear cache to correctly detect recursion errors
162172
interpreter.clearCaches();
163173
const bool use_inc = use_inc_eval && inc_evaluator.init(p);
164174
const bool use_vir = !use_inc && use_vir_eval && vir_evaluator.init(p);
165175
std::pair<Number, size_t> tmp_result;
166-
std::pair<status_t, steps_t> result;
167176
result.first = status_t::OK;
168177
Memory mem;
169178
Number out;

src/eval/evaluator.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ constexpr eval_mode_t EVAL_ALL = EVAL_REGULAR | EVAL_INCREMENTAL | EVAL_VIRTUAL;
2929

3030
class Evaluator {
3131
public:
32-
explicit Evaluator(const Settings &settings,
33-
eval_mode_t eval_modes = EVAL_ALL);
32+
explicit Evaluator(const Settings &settings, eval_mode_t eval_modes,
33+
bool check_range);
3434

3535
steps_t eval(const Program &p, Sequence &seq, int64_t num_terms = -1,
3636
const bool throw_on_error = true);

src/eval/minimizer.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
class Minimizer {
99
public:
1010
explicit Minimizer(const Settings &settings)
11-
: settings(settings), optimizer(settings), evaluator(settings) {}
11+
: settings(settings),
12+
optimizer(settings),
13+
evaluator(settings, EVAL_ALL, false) {}
1214

1315
bool minimize(Program &p, size_t num_terms) const;
1416

src/mine/miner.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ void Miner::submit(const std::string &path, std::string id_str) {
415415
auto seq = ManagedSequence(uid);
416416
Settings settings(this->settings);
417417
settings.print_as_b_file = false;
418-
Evaluator evaluator(settings);
418+
Evaluator evaluator(settings, EVAL_ALL, true);
419419
auto terms = seq.getTerms(SequenceUtil::FULL_SEQ_LENGTH);
420420
auto num_required = OeisProgram::getNumRequiredTerms(program);
421421
Log::get().info(
@@ -425,7 +425,7 @@ void Miner::submit(const std::string &path, std::string id_str) {
425425
if (result.first == status_t::ERROR) {
426426
Log::get().error("Validation failed", false);
427427
settings.print_as_b_file = true;
428-
Evaluator evaluator2(settings);
428+
Evaluator evaluator2(settings, EVAL_ALL, true);
429429
evaluator2.check(program, terms, num_required, uid);
430430
return; // error
431431
}

src/oeis/oeis_manager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ OeisManager::OeisManager(const Settings &settings,
4545
const std::string &stats_home)
4646
: settings(settings),
4747
overwrite_mode(ConfigLoader::load(settings).overwrite_mode),
48-
evaluator(settings),
48+
evaluator(settings, EVAL_ALL, true),
4949
finder(settings, evaluator),
5050
finder_initialized(false),
5151
update_oeis(false),

0 commit comments

Comments
 (0)