From e6ff0ce6926fa921a13055c9c35d8e60b691e776 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Wed, 11 Sep 2024 17:01:49 +0200 Subject: Finished table refactor --- src/nissy.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/nissy.h | 6 ++++++ src/solvers/tables.h | 6 +++--- 3 files changed, 56 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nissy.c b/src/nissy.c index de95e94..2d6af4b 100644 --- a/src/nissy.c +++ b/src/nissy.c @@ -195,6 +195,53 @@ nissy_datasize( return nissy_gendata(solver, options, NULL); } +int64_t +nissy_datainfo( + const void *table, + void (*write)(const char *, ...) +) +{ + uint8_t i; + tableinfo_t info; + + readtableinfo(table, &info); + + write("\n---------\n\n"); + write("Table information for '%s'\n", info.solver); + write("\n"); + write("Size: %" PRIu64 " bytes\n", info.fullsize); + write("Entries: %" PRIu64 " (%" PRIu8 " bits per entry)", + info.entries, info.bits); + write("\n"); + + switch (info.type) { + case TABLETYPE_PRUNING: + write("\n"); + if (info.base != 0) + write(" (base value = %" PRIu8 ")", info.base); + write(":\nValue\tPositions\n"); + for (i = 0; i <= info.maxvalue; i++) { + write("%" PRIu8 "\t%" PRIu64 "\n", + i, info.distribution[i]); + } + break; + case TABLETYPE_SPECIAL: + write("This is an ad-hoc table\n"); + break; + default: + LOG("datainfo: unknown table type\n"); + return 1; + } + + if (info.next != 0) { + return nissy_datainfo((char *)table + info.next, write); + } + + write("\n---------\n"); + + return 0; +} + int64_t nissy_gendata( const char *solver, diff --git a/src/nissy.h b/src/nissy.h index 346b99a..336130c 100644 --- a/src/nissy.h +++ b/src/nissy.h @@ -86,6 +86,12 @@ int64_t nissy_gendata( void *generated_data ); +/* Print information on a data table via the provided callback writer */ +int64_t nissy_datainfo( + const void *table, + void (*write)(const char *, ...) +); + /* Returns the number of solutions found, or -1 in case of error */ int64_t nissy_solve( const char cube[static 22], diff --git a/src/solvers/tables.h b/src/solvers/tables.h index 44363fe..988de52 100644 --- a/src/solvers/tables.h +++ b/src/solvers/tables.h @@ -4,6 +4,9 @@ #define INFO_SOLVER_STRLEN 100 #define INFO_DISTRIBUTION_LEN 21 +#define TABLETYPE_PRUNING 0 +#define TABLETYPE_SPECIAL 1 + #define INFO_OFFSET_SOLVER 0 #define INFO_OFFSET_TYPE INFO_SOLVER_STRLEN #define INFO_OFFSET_INFOSIZE (INFO_OFFSET_TYPE + sizeof(uint64_t)) @@ -17,9 +20,6 @@ #define INFO_OFFSET_NEXT (INFO_OFFSET_MAXVALUE + sizeof(uint8_t)) #define INFO_OFFSET_DISTRIBUTION (INFO_OFFSET_NEXT + sizeof(uint64_t)) -const uint64_t TABLETYPE_PRUNING = 0; -const uint64_t TABLETYPE_SPECIAL = 1; - typedef struct { char solver[INFO_SOLVER_STRLEN]; uint64_t type; -- cgit v1.3