aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2024-09-27 08:22:55 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2024-09-27 08:25:41 +0200
commitcee9856b2cb151f705acf6d27454ec08ef2b9a4e (patch)
tree4616e5c59e01be16e96103f9e9897ef004434eb7 /src
parent0b32395de2500ad87e15fbb0ff4a852e313037e9 (diff)
parent79500f46632ba50b1640d16983942b940dd7955f (diff)
downloadnissy-core-cee9856b2cb151f705acf6d27454ec08ef2b9a4e.tar.gz
nissy-core-cee9856b2cb151f705acf6d27454ec08ef2b9a4e.zip
Merge branch 'master' of tronto.net:h48
Diffstat (limited to 'src')
-rw-r--r--src/nissy.c70
-rw-r--r--src/nissy.h6
-rw-r--r--src/solvers/h48/gendata_cocsep.h12
-rw-r--r--src/solvers/h48/gendata_h48.h24
4 files changed, 109 insertions, 3 deletions
diff --git a/src/nissy.c b/src/nissy.c
index 6bc4aea..953471f 100644
--- a/src/nissy.c
+++ b/src/nissy.c
@@ -11,8 +11,11 @@
11 11
12#include "nissy.h" 12#include "nissy.h"
13 13
14STATIC int parse_h48_options(const char *, uint8_t *, uint8_t *, uint8_t *); 14int parse_h48_options(const char *, uint8_t *, uint8_t *, uint8_t *);
15STATIC int64_t write_result(cube_t, char [static 22]); 15STATIC int64_t write_result(cube_t, char [static 22]);
16STATIC bool distribution_equal(
17 const uint64_t [static 21], const uint64_t [static 21], uint8_t);
18STATIC bool checkdata(const void *, const tableinfo_t *);
16 19
17/* TODO: add option to get DR, maybe C-only, E-only, eo... */ 20/* TODO: add option to get DR, maybe C-only, E-only, eo... */
18#define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F } 21#define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F }
@@ -24,7 +27,7 @@ struct {
24 GETCUBE_OPTIONS(NULL, NULL) 27 GETCUBE_OPTIONS(NULL, NULL)
25}; 28};
26 29
27STATIC int 30int
28parse_h48_options(const char *buf, uint8_t *h, uint8_t *k, uint8_t *maxdepth) 31parse_h48_options(const char *buf, uint8_t *h, uint8_t *k, uint8_t *maxdepth)
29{ 32{
30 bool h_valid, k_valid, maxdepth_valid; 33 bool h_valid, k_valid, maxdepth_valid;
@@ -62,6 +65,52 @@ parse_h48_options_error:
62 return -1; 65 return -1;
63} 66}
64 67
68STATIC bool
69checkdata(const void *buf, const tableinfo_t *info)
70{
71 uint64_t distr[21];
72
73 if (!strncmp(info->solver, "cocsep", 6)) {
74 getdistribution_cocsep(
75 (uint32_t *)((char *)buf + INFOSIZE), distr);
76 } else if (!strncmp(info->solver, "h48", 3)) {
77 getdistribution_h48((uint8_t *)buf + INFOSIZE, distr,
78 info->h48h, info->bits);
79 } else {
80 LOG("checkdata: unknown solver %s\n", info->solver);
81 return false;
82 }
83
84 return distribution_equal(info->distribution, distr, info->maxvalue);
85}
86
87STATIC bool
88distribution_equal(
89 const uint64_t expected[static 21],
90 const uint64_t actual[static 21],
91 uint8_t maxvalue
92)
93{
94 int wrong;
95 uint8_t i;
96
97 for (i = 0, wrong = 0; i <= MAX(maxvalue, 20); i++) {
98 if (expected[i] != actual[i]) {
99 wrong++;
100 LOG("Value %" PRIu8 ": expected %" PRIu64 ", found %"
101 PRIu64 "\n", i, expected[i], actual[i]);
102 }
103 }
104
105 if (wrong > 0) {
106 LOG("checkdata: %d wrong values\n", wrong);
107 } else {
108 LOG("checkdata: table is consistent with info\n");
109 }
110
111 return wrong > 0;
112}
113
65STATIC int64_t 114STATIC int64_t
66write_result(cube_t cube, char result[static 22]) 115write_result(cube_t cube, char result[static 22])
67{ 116{
@@ -275,6 +324,23 @@ nissy_gendata(
275} 324}
276 325
277int64_t 326int64_t
327nissy_checkdata(
328 const char *solver,
329 const char *options,
330 const void *data
331)
332{
333 char *buf;
334 tableinfo_t info;
335
336 for (buf = (char *)data; readtableinfo(buf, &info); buf += info.next)
337 if (!checkdata(buf, &info))
338 return 1;
339
340 return 0;
341}
342
343int64_t
278nissy_solve( 344nissy_solve(
279 const char cube[static 22], 345 const char cube[static 22],
280 const char *solver, 346 const char *solver,
diff --git a/src/nissy.h b/src/nissy.h
index 63e7a90..0545556 100644
--- a/src/nissy.h
+++ b/src/nissy.h
@@ -93,6 +93,12 @@ int64_t nissy_derivedata(
93 void *generated_data 93 void *generated_data
94); 94);
95 95
96int64_t nissy_checkdata(
97 const char *solver,
98 const char *options,
99 const void *data
100);
101
96/* Print information on a data table via the provided callback writer */ 102/* Print information on a data table via the provided callback writer */
97int64_t nissy_datainfo( 103int64_t nissy_datainfo(
98 const void *table, 104 const void *table,
diff --git a/src/solvers/h48/gendata_cocsep.h b/src/solvers/h48/gendata_cocsep.h
index 2189145..262793b 100644
--- 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);
25 25
26STATIC size_t gendata_cocsep(void *, uint64_t *, cube_t *); 26STATIC size_t gendata_cocsep(void *, uint64_t *, cube_t *);
27STATIC uint32_t gendata_cocsep_dfs(cocsep_dfs_arg_t *); 27STATIC uint32_t gendata_cocsep_dfs(cocsep_dfs_arg_t *);
28STATIC void getdistribution_cocsep(const uint32_t *, uint64_t [static 21]);
28 29
29STATIC_INLINE int8_t get_h48_cdata(cube_t, uint32_t *, uint32_t *); 30STATIC_INLINE int8_t get_h48_cdata(cube_t, uint32_t *, uint32_t *);
30 31
@@ -157,6 +158,17 @@ gendata_cocsep_dfs(cocsep_dfs_arg_t *arg)
157 return cc; 158 return cc;
158} 159}
159 160
161STATIC void
162getdistribution_cocsep(const uint32_t *table, uint64_t distr[static 21])
163{
164 size_t i;
165
166 memset(distr, 0, 21 * sizeof(uint64_t));
167
168 for (i = 0; i < COCSEP_TABLESIZE; i++)
169 distr[CBOUND(table[i])]++;
170}
171
160STATIC_INLINE bool 172STATIC_INLINE bool
161get_visited(const uint8_t *a, int64_t i) 173get_visited(const uint8_t *a, int64_t i)
162{ 174{
diff --git a/src/solvers/h48/gendata_h48.h b/src/solvers/h48/gendata_h48.h
index a88eb4f..48d5582 100644
--- 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 *);
104STATIC void gendata_h48k2_dfs(h48k2_dfs_arg_t *arg); 104STATIC void gendata_h48k2_dfs(h48k2_dfs_arg_t *arg);
105STATIC void * gendata_h48k2_runthread(void *); 105STATIC void * gendata_h48k2_runthread(void *);
106STATIC tableinfo_t makeinfo_h48k2(gendata_h48_arg_t *); 106STATIC tableinfo_t makeinfo_h48k2(gendata_h48_arg_t *);
107STATIC void getdistribution_h48(
108 const uint8_t *, uint64_t [static 21], uint8_t, uint8_t);
107 109
108STATIC uint32_t *get_cocsepdata_ptr(const void *); 110STATIC uint32_t *get_cocsepdata_ptr(const void *);
109STATIC uint8_t *get_h48data_ptr(const void *); 111STATIC uint8_t *get_h48data_ptr(const void *);
110 112
111STATIC_INLINE uint8_t get_h48_pval(const uint8_t *, int64_t, uint8_t); 113STATIC_INLINE uint8_t get_h48_pval(const uint8_t *, int64_t, uint8_t);
112STATIC_INLINE void set_h48_pval(uint8_t *, int64_t, uint8_t, uint8_t); 114STATIC_INLINE void set_h48_pval(uint8_t *, int64_t, uint8_t, uint8_t);
113STATIC_INLINE uint8_t get_h48_bound(cube_t, uint32_t, uint8_t, uint8_t, uint8_t *); 115STATIC_INLINE uint8_t get_h48_bound(
116 cube_t, uint32_t, uint8_t, uint8_t, uint8_t *);
114 117
115size_t gendata_h48_derive(uint8_t, const void *, void *); 118size_t gendata_h48_derive(uint8_t, const void *, void *);
116 119
@@ -665,6 +668,25 @@ makeinfo_h48k2(gendata_h48_arg_t *arg)
665 return info; 668 return info;
666} 669}
667 670
671STATIC void
672getdistribution_h48(
673 const uint8_t *table,
674 uint64_t distr[static 21],
675 uint8_t h,
676 uint8_t k
677) {
678 uint8_t val;
679 int64_t i, h48max;
680
681 memset(distr, 0, 21 * sizeof(uint64_t));
682
683 h48max = H48_COORDMAX(h);
684 for (i = 0; i < h48max; i++) {
685 val = get_h48_pval(table, i, k);
686 distr[val]++;
687 }
688}
689
668STATIC uint32_t * 690STATIC uint32_t *
669get_cocsepdata_ptr(const void *data) 691get_cocsepdata_ptr(const void *data)
670{ 692{

Generated with cgit - Back to sebastiano.tronto.net