aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-03-04 08:24:39 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2025-03-04 08:24:39 +0100
commit7defd8041e6050a9adf7927b43fd249d75d6389f (patch)
tree345675fbdbb94a8027e35556d3a116a48f486dd8
parent038469b6f27106ab2002c7da11c6bca2a5fe30ee (diff)
downloadnissy-core-7defd8041e6050a9adf7927b43fd249d75d6389f.tar.gz
nissy-core-7defd8041e6050a9adf7927b43fd249d75d6389f.zip
Begin work for coordinate solver
-rw-r--r--TODO_COORDINATES7
-rw-r--r--src/solvers/coord/common.h20
-rw-r--r--src/solvers/coord/coord_solve.h3
-rw-r--r--src/solvers/coord/coord_types_macros.h13
-rw-r--r--src/solvers/coord/eo.h33
-rw-r--r--src/solvers/coord/gendata_coord.h134
-rw-r--r--src/solvers/solvers.h1
-rw-r--r--src/utils/constants.h2
-rw-r--r--test/120_gendata_eo/00_all.in0
-rw-r--r--test/120_gendata_eo/00_all.out12
-rw-r--r--test/120_gendata_eo/gendata_eo_tests.c37
-rw-r--r--test/test.h1
12 files changed, 263 insertions, 0 deletions
diff --git a/TODO_COORDINATES b/TODO_COORDINATES
new file mode 100644
index 0000000..7e5628b
--- /dev/null
+++ b/TODO_COORDINATES
@@ -0,0 +1,7 @@
1- solver
2 - include NISS
3- test solver for EO
4- make solve parallelized
5- other coordinates
6 - gendata must handle symmetry
7- make gendata parallelized
diff --git a/src/solvers/coord/common.h b/src/solvers/coord/common.h
new file mode 100644
index 0000000..b54e5e2
--- /dev/null
+++ b/src/solvers/coord/common.h
@@ -0,0 +1,20 @@
1#include "eo.h"
2
3coord_t *all_coordinates[] = {
4 &coordinate_eo,
5 NULL
6};
7
8STATIC void append_coord_name(const coord_t *, char *);
9
10STATIC void
11append_coord_name(const coord_t *coord, char *str)
12{
13 int i, j;
14
15 i = 0;
16 j = strlen(str);
17 while (coord->name[i]) str[j++] = coord->name[i++];
18
19 str[j] = '\0';
20}
diff --git a/src/solvers/coord/coord_solve.h b/src/solvers/coord/coord_solve.h
new file mode 100644
index 0000000..1d7c036
--- /dev/null
+++ b/src/solvers/coord/coord_solve.h
@@ -0,0 +1,3 @@
1#include "coord_types_macros.h"
2#include "common.h"
3#include "gendata_coord.h"
diff --git a/src/solvers/coord/coord_types_macros.h b/src/solvers/coord/coord_types_macros.h
new file mode 100644
index 0000000..4f2877c
--- /dev/null
+++ b/src/solvers/coord/coord_types_macros.h
@@ -0,0 +1,13 @@
1#define COORD_INDEX(i) ((i)/2)
2#define COORD_SHIFT(i) (UINT8_C(4) * (uint8_t)((i) % 2))
3#define COORD_MASK(i) (UINT8_C(0xF) << COORD_SHIFT(i))
4
5typedef struct {
6 char name[255];
7 uint64_t (*coord)(cube_t, const void *);
8 cube_t (*cube)(uint64_t, const void *);
9 size_t (*gendata)(void *);
10 uint64_t max;
11 uint32_t moves_mask;
12 uint64_t trans_mask;
13} coord_t;
diff --git a/src/solvers/coord/eo.h b/src/solvers/coord/eo.h
new file mode 100644
index 0000000..d6604d9
--- /dev/null
+++ b/src/solvers/coord/eo.h
@@ -0,0 +1,33 @@
1STATIC uint64_t coordinate_eo_coord(cube_t, const void *);
2STATIC cube_t coordinate_eo_cube(uint64_t, const void *);
3STATIC uint64_t coordinate_eo_gendata(void *);
4
5STATIC coord_t coordinate_eo = {
6 .name = "EO",
7 .coord = &coordinate_eo_coord,
8 .cube = &coordinate_eo_cube,
9 .gendata = coordinate_eo_gendata,
10 .max = POW_2_11,
11 .trans_mask = TM_ALLTRANS,
12 .moves_mask = MM_ALLMOVES,
13};
14
15STATIC uint64_t
16coordinate_eo_coord(cube_t c, const void *data)
17{
18 return (uint64_t)coord_eo(c);
19}
20
21STATIC cube_t
22coordinate_eo_cube(uint64_t c, const void *data)
23{
24 cube_t cube = SOLVED_CUBE;
25 set_eo(&cube, (int64_t)c);
26 return cube;
27}
28
29STATIC size_t
30coordinate_eo_gendata(void *data)
31{
32 return 0;
33}
diff --git a/src/solvers/coord/gendata_coord.h b/src/solvers/coord/gendata_coord.h
new file mode 100644
index 0000000..b3932cd
--- /dev/null
+++ b/src/solvers/coord/gendata_coord.h
@@ -0,0 +1,134 @@
1STATIC size_t gendata_coordinate(const coord_t *, void *);
2STATIC size_t gendata_coordinate_name(const char *, void *);
3STATIC tableinfo_t genptable_coordinate(const coord_t *, const void *, uint8_t *);
4STATIC uint8_t get_coord_pval(const coord_t *, const uint8_t *, uint64_t);
5STATIC void set_coord_pval(const coord_t *, uint8_t *, uint64_t, uint8_t);
6
7STATIC size_t
8gendata_coordinate_name(const char *name, void *buf)
9{
10 int i;
11
12 for (i = 0; all_coordinates[i] != NULL; i++)
13 if (strcmp(all_coordinates[i]->name, name) == 0)
14 return gendata_coordinate(all_coordinates[i], buf);
15
16 LOG("Cannot generate data for coordinate '%s': not found\n", name);
17 return 0;
18}
19
20STATIC size_t
21gendata_coordinate(const coord_t *coord, void *buf)
22{
23 uint64_t coord_dsize, tablesize, ninfo;
24 void *pruningbuf, *coord_data;
25 uint8_t *table;
26 tableinfo_t coord_data_info, pruning_info;
27
28 coord_data = buf == NULL ? NULL : ((uint8_t *)buf) + INFOSIZE;
29 coord_dsize = coord->gendata(coord_data);
30 ninfo = coord_dsize == 0 ? 1 : 2;
31 tablesize = DIV_ROUND_UP(coord->max, 2);
32
33 if (buf == NULL)
34 goto gendata_coordinate_return_size;
35
36 if (ninfo == 2) {
37 coord_data_info = (tableinfo_t) {
38 .solver = "coord helper table for ",
39 .type = TABLETYPE_SPECIAL,
40 .infosize = INFOSIZE,
41 .fullsize = INFOSIZE + coord_dsize,
42 .hash = 0, /* TODO */
43 .next = INFOSIZE + coord_dsize,
44
45 /* Unknown / non-applicable values */
46 .entries = 0,
47 .classes = 0,
48 .bits = 0,
49 .base = 0,
50 .maxvalue = 0,
51 };
52
53 append_coord_name(coord, coord_data_info.solver);
54
55 writetableinfo(&coord_data_info, INFOSIZE + coord_dsize, buf);
56
57 pruningbuf = ((uint8_t *)buf) + INFOSIZE + coord_dsize;
58 } else {
59 pruningbuf = buf;
60 }
61
62 table = ((uint8_t *)pruningbuf) + INFOSIZE;
63 pruning_info = genptable_coordinate(coord, coord_data, table);
64 writetableinfo(&pruning_info, INFOSIZE + tablesize, pruningbuf);
65
66gendata_coordinate_return_size:
67 return ninfo * INFOSIZE + coord_dsize + tablesize;
68}
69
70STATIC tableinfo_t
71genptable_coordinate(const coord_t *coord, const void *data, uint8_t *table)
72{
73 uint64_t tablesize, i, j, d, tot;
74 tableinfo_t info;
75 uint8_t m;
76 cube_t c, cc;
77
78 tablesize = DIV_ROUND_UP(coord->max, 2);
79
80 memset(table, 0xFF, tablesize);
81
82 info = (tableinfo_t) {
83 .solver = "coordinate solver for ",
84 .type = TABLETYPE_PRUNING,
85 .infosize = INFOSIZE,
86 .fullsize = INFOSIZE + tablesize,
87 .hash = 0, /* TODO */
88 .entries = coord->max,
89 .classes = 0,
90 .bits = 4,
91 .base = 0,
92 .maxvalue = 0,
93 .next = 0
94 };
95
96 memset(info.distribution, 0, INFO_DISTRIBUTION_LEN * sizeof(uint64_t));
97 append_coord_name(coord, info.solver);
98
99 i = coord->coord(SOLVED_CUBE, data);
100 set_coord_pval(coord, table, i, 0);
101 info.distribution[0] = 1;
102 for (d = 1, tot = 1; tot < coord->max; d++) {
103 for (i = 0; i < coord->max; i++) {
104 if (get_coord_pval(coord, table, i) == d-1) {
105 c = coord->cube(i, data);
106 for (m = 0; m < 18; m++) {
107 cc = move(c, m);
108 j = coord->coord(cc, data);
109 if (get_coord_pval(coord, table, j) > d) {
110 set_coord_pval(coord, table, j, d);
111 tot++;
112 info.distribution[d]++;
113 }
114 }
115 }
116 }
117 }
118 info.maxvalue = d-1;
119
120 return info;
121}
122
123STATIC uint8_t
124get_coord_pval(const coord_t *coord, const uint8_t *table, uint64_t i)
125{
126 return (table[COORD_INDEX(i)] & COORD_MASK(i)) >> COORD_SHIFT(i);
127}
128
129STATIC void
130set_coord_pval(const coord_t *coord, uint8_t *table, uint64_t i, uint8_t val)
131{
132 table[COORD_INDEX(i)] = (table[COORD_INDEX(i)] & (~COORD_MASK(i)))
133 | (val << COORD_SHIFT(i));
134}
diff --git a/src/solvers/solvers.h b/src/solvers/solvers.h
index 7b7f355..154f8cc 100644
--- a/src/solvers/solvers.h
+++ b/src/solvers/solvers.h
@@ -1,2 +1,3 @@
1#include "tables.h" 1#include "tables.h"
2#include "h48/h48.h" 2#include "h48/h48.h"
3#include "coord/coord_solve.h"
diff --git a/src/utils/constants.h b/src/utils/constants.h
index 1e4a630..3d8bf5e 100644
--- a/src/utils/constants.h
+++ b/src/utils/constants.h
@@ -99,6 +99,8 @@ STATIC int64_t binomial[12][12] = {
99#define MM_ALLMOVES UINT32_C(0x3FFFF) 99#define MM_ALLMOVES UINT32_C(0x3FFFF)
100#define MM_NOHALFTURNS UINT32_C(0x2DB6D) 100#define MM_NOHALFTURNS UINT32_C(0x2DB6D)
101 101
102#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
103
102#define CORNER_UFR UINT8_C(0) 104#define CORNER_UFR UINT8_C(0)
103#define CORNER_UBL UINT8_C(1) 105#define CORNER_UBL UINT8_C(1)
104#define CORNER_DFL UINT8_C(2) 106#define CORNER_DFL UINT8_C(2)
diff --git a/test/120_gendata_eo/00_all.in b/test/120_gendata_eo/00_all.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/120_gendata_eo/00_all.in
diff --git a/test/120_gendata_eo/00_all.out b/test/120_gendata_eo/00_all.out
new file mode 100644
index 0000000..42e8c66
--- /dev/null
+++ b/test/120_gendata_eo/00_all.out
@@ -0,0 +1,12 @@
11536
20: 1
31: 2
42: 25
53: 202
64: 620
75: 900
86: 285
97: 13
108: 0
119: 0
1210: 0
diff --git a/test/120_gendata_eo/gendata_eo_tests.c b/test/120_gendata_eo/gendata_eo_tests.c
new file mode 100644
index 0000000..3a6ac07
--- /dev/null
+++ b/test/120_gendata_eo/gendata_eo_tests.c
@@ -0,0 +1,37 @@
1/*
2Pruning table values (from nissy):
30: 1
41: 2
52: 25
63: 202
74: 620
85: 900
96: 285
107: 13
11*/
12
13#include "../test.h"
14
15#define ISIZE 512
16#define FULLSIZE (ISIZE + 1024)
17
18char buf[FULLSIZE];
19
20size_t gendata_coordinate_name(const char *, void *);
21bool readtableinfo(uint64_t, const char *, tableinfo_t *);
22
23void run(void) {
24 uint32_t i;
25 size_t result;
26 tableinfo_t info;
27
28 result = gendata_coordinate_name("EO", buf);
29 if (readtableinfo(FULLSIZE, buf, &info) != NISSY_OK) {
30 printf("Error reading info from table\n");
31 return;
32 }
33
34 printf("%zu\n", result);
35 for (i = 0; i <= 10; i++)
36 printf("%" PRIu32 ": %" PRIu64 "\n", i, info.distribution[i]);
37}
diff --git a/test/test.h b/test/test.h
index fe362c7..e144527 100644
--- a/test/test.h
+++ b/test/test.h
@@ -14,6 +14,7 @@
14#include "../src/solvers/h48/coordinate_macros.h" 14#include "../src/solvers/h48/coordinate_macros.h"
15#include "../src/solvers/h48/map_types_macros.h" 15#include "../src/solvers/h48/map_types_macros.h"
16#include "../src/solvers/h48/gendata_types_macros.h" 16#include "../src/solvers/h48/gendata_types_macros.h"
17#include "../src/solvers/coord/coord_types_macros.h"
17 18
18#define STRLENMAX 10000 19#define STRLENMAX 10000
19 20

Generated with cgit - Back to sebastiano.tronto.net