commit bc2cba8529a163d129dec91b5ec448a29a14591a
parent 818186b480d7c05e0c58ff89da2180f5b2476434
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date: Thu, 26 Sep 2024 15:57:25 +0200
Added checkdata function
Diffstat:
5 files changed, 104 insertions(+), 1 deletion(-)
diff --git a/src/nissy.c b/src/nissy.c
@@ -13,6 +13,9 @@
int parse_h48_options(const char *, uint8_t *, uint8_t *, uint8_t *);
STATIC int64_t write_result(cube_t, char [static 22]);
+STATIC bool distribution_equal(
+ const uint64_t [static 21], const uint64_t [static 21], uint8_t);
+STATIC bool checkdata(const void *, const tableinfo_t *);
/* TODO: add option to get DR, maybe C-only, E-only, eo... */
#define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F }
@@ -62,6 +65,49 @@ parse_h48_options_error:
return -1;
}
+STATIC bool
+checkdata(const void *buf, const tableinfo_t *info)
+{
+ uint64_t distr[21];
+
+ if (!strncmp(info->solver, "cocsep", 6)) {
+ getdistribution_cocsep(
+ (uint32_t *)((char *)buf + INFOSIZE), distr);
+ } else if (!strncmp(info->solver, "h48", 3)) {
+ getdistribution_h48((uint8_t *)buf + INFOSIZE, distr,
+ info->h48h, info->bits);
+ } else {
+ LOG("checkdata: unknown solver %s\n", info->solver);
+ return false;
+ }
+
+ return distribution_equal(info->distribution, distr, info->maxvalue);
+}
+
+STATIC bool
+distribution_equal(
+ const uint64_t expected[static 21],
+ const uint64_t actual[static 21],
+ uint8_t maxvalue
+)
+{
+ int wrong;
+ uint8_t i;
+
+ for (i = 0, wrong = 0; i <= MAX(maxvalue, 20); i++) {
+ if (expected[i] != actual[i]) {
+ wrong++;
+ LOG("Value %" PRIu8 ": expected %" PRIu64 ", found %"
+ PRIu64 "\n", i, expected[i], actual[i]);
+ }
+ }
+
+ if (wrong > 0)
+ LOG("chekdata: %d wrong values\n", wrong);
+
+ return wrong > 0;
+}
+
STATIC int64_t
write_result(cube_t cube, char result[static 22])
{
@@ -275,6 +321,23 @@ nissy_gendata(
}
int64_t
+nissy_checkdata(
+ const char *solver,
+ const char *options,
+ const void *data
+)
+{
+ char *buf;
+ tableinfo_t info;
+
+ for (buf = (char *)data; readtableinfo(buf, &info); buf += info.next)
+ if (!checkdata(buf, &info))
+ return 1;
+
+ return 0;
+}
+
+int64_t
nissy_solve(
const char cube[static 22],
const char *solver,
diff --git a/src/nissy.h b/src/nissy.h
@@ -86,6 +86,12 @@ int64_t nissy_gendata(
void *generated_data
);
+int64_t nissy_checkdata(
+ const char *solver,
+ const char *options,
+ const void *data
+);
+
/* Print information on a data table via the provided callback writer */
int64_t nissy_datainfo(
const void *table,
diff --git a/src/solvers/h48/gendata_cocsep.h b/src/solvers/h48/gendata_cocsep.h
@@ -25,6 +25,7 @@ STATIC_INLINE void set_visited(uint8_t *, int64_t);
STATIC size_t gendata_cocsep(void *, uint64_t *, cube_t *);
STATIC uint32_t gendata_cocsep_dfs(cocsep_dfs_arg_t *);
+STATIC void getdistribution_cocsep(const uint32_t *, uint64_t [static 21]);
STATIC_INLINE int8_t get_h48_cdata(cube_t, uint32_t *, uint32_t *);
@@ -157,6 +158,17 @@ gendata_cocsep_dfs(cocsep_dfs_arg_t *arg)
return cc;
}
+STATIC void
+getdistribution_cocsep(const uint32_t *table, uint64_t distr[static 21])
+{
+ size_t i;
+
+ memset(distr, 0, 21 * sizeof(uint64_t));
+
+ for (i = 0; i < COCSEP_TABLESIZE; i++)
+ distr[CBOUND(table[i])]++;
+}
+
STATIC_INLINE bool
get_visited(const uint8_t *a, int64_t i)
{
diff --git a/src/solvers/h48/gendata_h48.h b/src/solvers/h48/gendata_h48.h
@@ -104,13 +104,16 @@ STATIC size_t gendata_h48k2_realcoord(gendata_h48_arg_t *);
STATIC void gendata_h48k2_dfs(h48k2_dfs_arg_t *arg);
STATIC void * gendata_h48k2_runthread(void *);
STATIC tableinfo_t makeinfo_h48k2(gendata_h48_arg_t *, uint8_t);
+STATIC void getdistribution_h48(
+ const uint8_t *, uint64_t [static 21], uint8_t, uint8_t);
STATIC uint32_t *get_cocsepdata_ptr(const void *);
STATIC uint8_t *get_h48data_ptr(const void *);
STATIC_INLINE uint8_t get_h48_pval(const uint8_t *, int64_t, uint8_t);
STATIC_INLINE void set_h48_pval(uint8_t *, int64_t, uint8_t, uint8_t);
-STATIC_INLINE uint8_t get_h48_bound(cube_t, uint32_t, uint8_t, uint8_t, uint8_t *);
+STATIC_INLINE uint8_t get_h48_bound(
+ cube_t, uint32_t, uint8_t, uint8_t, uint8_t *);
STATIC uint64_t
gendata_h48short(gendata_h48short_arg_t *arg)
@@ -662,6 +665,25 @@ makeinfo_h48k2(gendata_h48_arg_t *arg, uint8_t base)
return info;
}
+STATIC void
+getdistribution_h48(
+ const uint8_t *table,
+ uint64_t distr[static 21],
+ uint8_t h,
+ uint8_t k
+) {
+ uint8_t val;
+ int64_t i, h48max;
+
+ memset(distr, 0, 21 * sizeof(uint64_t));
+
+ h48max = H48_COORDMAX(h);
+ for (i = 0; i < h48max; i++) {
+ val = get_h48_pval(table, i, k);
+ distr[val]++;
+ }
+}
+
STATIC uint32_t *
get_cocsepdata_ptr(const void *data)
{
diff --git a/tools/100_gendata/gendata.c b/tools/000_gendata/gendata.c