Seperate logic in main() into genpuzzles() and runbench()

This commit is contained in:
Camden Dixie O'Brien 2022-11-23 17:45:17 +00:00
parent a1c71f8f06
commit 71db045c9f

65
main.c
View File

@ -27,6 +27,12 @@
#define PROG_UPDATEPRD 20 #define PROG_UPDATEPRD 20
#define NPUZZLES 256U #define NPUZZLES 256U
struct bench_res {
double succ_rate;
double avg_time_us;
unsigned avg_passes;
};
static uint32_t getseed(void) static uint32_t getseed(void)
{ {
FILE *urandom = fopen("/dev/urandom", "rb"); FILE *urandom = fopen("/dev/urandom", "rb");
@ -42,31 +48,37 @@ static uint32_t getseed(void)
return seed; 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; unsigned i, j, bslen = 0;
fputs("Generating... ", stdout);
if (print_progress)
fputs("Generating... ", stdout);
for (i = 0; i < NPUZZLES; ++i) { for (i = 0; i < NPUZZLES; ++i) {
if (i % PROG_UPDATEPRD == 0) { if (print_progress && i % PROG_UPDATEPRD == 0) {
for (j = 0; j < bslen; ++j) for (j = 0; j < bslen; ++j)
putchar('\b'); putchar('\b');
bslen = (unsigned)printf("%u%%", 100 * i / NPUZZLES); bslen = (unsigned)printf("%u%%", 100 * i / NPUZZLES);
fflush(stdout); fflush(stdout);
} }
gen(&puzzles[i]); gen(&puzzles_out[i]);
} }
for (j = 0; j < bslen; ++j)
putchar('\b');
puts("100%");
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]; int res[NPUZZLES];
unsigned i;
struct timespec start, end; struct timespec start, end;
fputs("Solving... ", stdout); fputs("Solving... ", stdout);
fflush(stdout); fflush(stdout);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
@ -82,10 +94,8 @@ int main(void)
nanos += 1000000000; nanos += 1000000000;
} }
const double tot_micros = 1e6 * (double)secs + (double)nanos / 1e3; const double tot_micros = 1e6 * (double)secs + (double)nanos / 1e3;
const double avg_micros = tot_micros / NPUZZLES;
unsigned solved = 0; unsigned solved = 0, tot_passes = 0;
unsigned tot_passes = 0;
for (i = 0; i < NPUZZLES; ++i) { for (i = 0; i < NPUZZLES; ++i) {
if (res[i] < 0) if (res[i] < 0)
continue; continue;
@ -93,13 +103,28 @@ int main(void)
++solved; ++solved;
tot_passes += (unsigned long)res[i]; 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 ======="); puts("\n SUMMARY\n =======");
printf("Success rate: %.0lf%%\n", 1e2 * succ_rate); printf("Success rate: %.0lf%%\n", 1e2 * res.succ_rate);
printf("Average time: %.3lf µs\n", avg_micros); printf("Average time: %.3lf µs\n", res.avg_time_us);
printf("Average n.o. passes: %u\n", avg_passes); printf("Average n.o. passes: %u\n", res.avg_passes);
return 0; return 0;
} }