mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-30 15:39:54 +00:00
rulegen:: tests:: forking
This commit is contained in:
parent
e425bf9bf9
commit
09ec5b0ee0
@ -400,7 +400,7 @@ void test_rules() {
|
|||||||
println(hlog, "sequence: ", seq);
|
println(hlog, "sequence: ", seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
fhstream *seq_stream;
|
hstream *seq_stream, *test_out;
|
||||||
|
|
||||||
void list_all_sequences(string tesname) {
|
void list_all_sequences(string tesname) {
|
||||||
|
|
||||||
@ -432,7 +432,7 @@ void list_all_sequences(string tesname) {
|
|||||||
println(*seq_stream, seq);
|
println(*seq_stream, seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush(seq_stream->f);
|
seq_stream->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_rules();
|
void print_rules();
|
||||||
@ -722,6 +722,17 @@ string count_uniform() {
|
|||||||
return lalign(0, num_tile, ";", num_vert, ";", num_edges, ";", num_tile_sym, ";", num_vert_sym, ";", num_edges_sym,";", num_edges_ev, ";", num_edges_et, ";", num_edges_ez);
|
return lalign(0, num_tile, ";", num_vert, ";", num_edges, ";", num_tile_sym, ";", num_vert_sym, ";", num_edges_sym,";", num_edges_ev, ";", num_edges_et, ";", num_edges_ez);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sem_t sem;
|
||||||
|
int max_children = 7;
|
||||||
|
bool forked;
|
||||||
|
|
||||||
|
void setup_fork(int m, string fname) {
|
||||||
|
max_children = m;
|
||||||
|
forked = true;
|
||||||
|
sem_init(&sem, true, 1);
|
||||||
|
test_out = new fhstream(fname, "wt");
|
||||||
|
}
|
||||||
|
|
||||||
void test_current(string tesname) {
|
void test_current(string tesname) {
|
||||||
|
|
||||||
disable_bigstuff = true;
|
disable_bigstuff = true;
|
||||||
@ -900,13 +911,16 @@ void test_current(string tesname) {
|
|||||||
}
|
}
|
||||||
sort(edgelens.begin(), edgelens.end());
|
sort(edgelens.begin(), edgelens.end());
|
||||||
|
|
||||||
|
if(!test_out) test_out = &hlog;
|
||||||
|
|
||||||
|
if(forked) sem_wait(&sem);
|
||||||
again:
|
again:
|
||||||
print(hlog, "CSV");
|
print(*test_out, "CSV");
|
||||||
|
|
||||||
// easier parsing
|
// easier parsing
|
||||||
for(auto& ch: message) if(ch == ' ') ch = '_';
|
for(auto& ch: message) if(ch == ' ') ch = '_';
|
||||||
|
|
||||||
#define Out(title,value) if(add_header) print(hlog, ";", title); else if(add_labels) print(hlog, " ", title, "=", value); else print(hlog, ";", value); break;
|
#define Out(title,value) if(add_header) print(*test_out, ";", title); else if(add_labels) print(*test_out, " ", title, "=", value); else print(*test_out, ";", value); break;
|
||||||
|
|
||||||
for(char c: test_stats) switch(c) {
|
for(char c: test_stats) switch(c) {
|
||||||
case 'g': Out("geom", euclid ? "E" : hyperbolic ? "H" : "?");
|
case 'g': Out("geom", euclid ? "E" : hyperbolic ? "H" : "?");
|
||||||
@ -955,8 +969,8 @@ void test_current(string tesname) {
|
|||||||
case 'p': Out("premini", states_premini);
|
case 'p': Out("premini", states_premini);
|
||||||
case 'K': Out("movecount", format("%ld", rulegen::movecount));
|
case 'K': Out("movecount", format("%ld", rulegen::movecount));
|
||||||
}
|
}
|
||||||
println(hlog);
|
println(*test_out);
|
||||||
fflush(stdout);
|
test_out->flush();
|
||||||
if(add_header) { add_header = false; goto again; }
|
if(add_header) { add_header = false; goto again; }
|
||||||
|
|
||||||
// for(auto& sh: shortcuts) println(hlog, sh.first, " : ", isize(sh.second), " shortcuts (CSV)");
|
// for(auto& sh: shortcuts) println(hlog, sh.first, " : ", isize(sh.second), " shortcuts (CSV)");
|
||||||
@ -970,7 +984,8 @@ void test_current(string tesname) {
|
|||||||
if(seq_stream)
|
if(seq_stream)
|
||||||
list_all_sequences(tesname);
|
list_all_sequences(tesname);
|
||||||
|
|
||||||
fflush(stdout);
|
test_out->flush();
|
||||||
|
if(forked) sem_post(&sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void out_reg() {
|
void out_reg() {
|
||||||
@ -1098,11 +1113,34 @@ void test_from_file(string list) {
|
|||||||
|
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
||||||
|
int children = 0;
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
for(const string& s: filenames) {
|
for(const string& s: filenames) {
|
||||||
|
|
||||||
println(hlog, "loading ", s, "... ", id++, "/", isize(filenames));
|
println(hlog, "loading ", s, "... ", id++, "/", isize(filenames));
|
||||||
|
println(hlog, "START: ", s); fflush(stdout);
|
||||||
if(trv) { trv--; id++; continue; }
|
if(trv) { trv--; id++; continue; }
|
||||||
|
|
||||||
|
if(forked && id > 1) {
|
||||||
|
int pid;
|
||||||
|
if(children >= max_children) {
|
||||||
|
wait(&pid); children--;
|
||||||
|
}
|
||||||
|
if((pid = fork())) children++;
|
||||||
|
else goto doit;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
doit:
|
||||||
|
|
||||||
if(set_general(s))
|
if(set_general(s))
|
||||||
test_current(s);
|
test_current(s);
|
||||||
|
|
||||||
|
println(hlog, "DONE: ", s); fflush(stdout);
|
||||||
|
|
||||||
|
if(forked && id > 1) exit(0);
|
||||||
|
if(forked && id == 1) stop_game();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1242,6 +1280,11 @@ int testargs() {
|
|||||||
shift();
|
shift();
|
||||||
test_from_file(args());
|
test_from_file(args());
|
||||||
}
|
}
|
||||||
|
else if(argis("-test-fork")) {
|
||||||
|
PHASEFROM(3);
|
||||||
|
shift(); int i = argi();
|
||||||
|
shift(); setup_fork(i, args());
|
||||||
|
}
|
||||||
else if(argis("-rulecat")) {
|
else if(argis("-rulecat")) {
|
||||||
PHASEFROM(3);
|
PHASEFROM(3);
|
||||||
shift();
|
shift();
|
||||||
|
Loading…
Reference in New Issue
Block a user