Seperate logic in main() into genpuzzles() and runbench()
This commit is contained in:
parent
a1c71f8f06
commit
71db045c9f
59
main.c
59
main.c
@ -27,6 +27,12 @@
|
||||
#define PROG_UPDATEPRD 20
|
||||
#define NPUZZLES 256U
|
||||
|
||||
struct bench_res {
|
||||
double succ_rate;
|
||||
double avg_time_us;
|
||||
unsigned avg_passes;
|
||||
};
|
||||
|
||||
static uint32_t getseed(void)
|
||||
{
|
||||
FILE *urandom = fopen("/dev/urandom", "rb");
|
||||
@ -42,31 +48,37 @@ static uint32_t getseed(void)
|
||||
return seed;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
static void genpuzzles(struct sudoku puzzles_out[NPUZZLES], bool print_progress)
|
||||
{
|
||||
uint32_t seed = getseed();
|
||||
printf("Seed: %u\n", seed);
|
||||
srand(seed);
|
||||
|
||||
struct sudoku puzzles[NPUZZLES];
|
||||
unsigned i, j, bslen = 0;
|
||||
|
||||
if (print_progress)
|
||||
fputs("Generating... ", stdout);
|
||||
|
||||
for (i = 0; i < NPUZZLES; ++i) {
|
||||
if (i % PROG_UPDATEPRD == 0) {
|
||||
if (print_progress && i % PROG_UPDATEPRD == 0) {
|
||||
for (j = 0; j < bslen; ++j)
|
||||
putchar('\b');
|
||||
bslen = (unsigned)printf("%u%%", 100 * i / NPUZZLES);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
gen(&puzzles[i]);
|
||||
gen(&puzzles_out[i]);
|
||||
}
|
||||
for (j = 0; j < bslen; ++j)
|
||||
|
||||
if (print_progress) {
|
||||
for (i = 0; i < bslen; ++i)
|
||||
putchar('\b');
|
||||
puts("100%");
|
||||
}
|
||||
}
|
||||
|
||||
static struct bench_res runbench(struct sudoku puzzles[NPUZZLES])
|
||||
{
|
||||
int res[NPUZZLES];
|
||||
unsigned i;
|
||||
struct timespec start, end;
|
||||
|
||||
fputs("Solving... ", stdout);
|
||||
fflush(stdout);
|
||||
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
|
||||
@ -82,10 +94,8 @@ int main(void)
|
||||
nanos += 1000000000;
|
||||
}
|
||||
const double tot_micros = 1e6 * (double)secs + (double)nanos / 1e3;
|
||||
const double avg_micros = tot_micros / NPUZZLES;
|
||||
|
||||
unsigned solved = 0;
|
||||
unsigned tot_passes = 0;
|
||||
unsigned solved = 0, tot_passes = 0;
|
||||
for (i = 0; i < NPUZZLES; ++i) {
|
||||
if (res[i] < 0)
|
||||
continue;
|
||||
@ -93,13 +103,28 @@ int main(void)
|
||||
++solved;
|
||||
tot_passes += (unsigned long)res[i];
|
||||
}
|
||||
const double succ_rate = (double)solved / NPUZZLES;
|
||||
const unsigned avg_passes = tot_passes / NPUZZLES;
|
||||
|
||||
return (struct bench_res) {
|
||||
.succ_rate = (double)solved / NPUZZLES,
|
||||
.avg_time_us = tot_micros / NPUZZLES,
|
||||
.avg_passes = tot_passes / NPUZZLES,
|
||||
};
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uint32_t seed = getseed();
|
||||
printf("Seed: %u\n", seed);
|
||||
srand(seed);
|
||||
|
||||
struct sudoku puzzles[NPUZZLES];
|
||||
genpuzzles(puzzles, true);
|
||||
struct bench_res res = runbench(puzzles);
|
||||
|
||||
puts("\n SUMMARY\n =======");
|
||||
printf("Success rate: %.0lf%%\n", 1e2 * succ_rate);
|
||||
printf("Average time: %.3lf µs\n", avg_micros);
|
||||
printf("Average n.o. passes: %u\n", avg_passes);
|
||||
printf("Success rate: %.0lf%%\n", 1e2 * res.succ_rate);
|
||||
printf("Average time: %.3lf µs\n", res.avg_time_us);
|
||||
printf("Average n.o. passes: %u\n", res.avg_passes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user