aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-03-28 20:57:04 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2025-03-28 20:57:04 +0100
commit0f23987edbbabdf88fbe175f695b4fdb727586fd (patch)
tree00e523aa0b714698768e62070e7bda09f2bdad3b /src
parent50fedbdbf98bcf01bcd95259ac5a93ae108b3c68 (diff)
downloadnissy-core-0f23987edbbabdf88fbe175f695b4fdb727586fd.tar.gz
nissy-core-0f23987edbbabdf88fbe175f695b4fdb727586fd.zip
DR coordinate solver
Diffstat (limited to 'src')
-rw-r--r--src/solvers/coord/coord.h1
-rw-r--r--src/solvers/coord/dr.h178
-rw-r--r--src/solvers/coord/eo.h10
-rw-r--r--src/solvers/coord/gendata.h54
-rw-r--r--src/solvers/coord/list.h1
-rw-r--r--src/solvers/coord/types_macros.h1
-rw-r--r--src/utils/constants.h7
7 files changed, 238 insertions, 14 deletions
diff --git a/src/solvers/coord/coord.h b/src/solvers/coord/coord.h
index f42739d..11d41bc 100644
--- a/src/solvers/coord/coord.h
+++ b/src/solvers/coord/coord.h
@@ -1,6 +1,7 @@
1#include "types_macros.h" 1#include "types_macros.h"
2#include "common.h" 2#include "common.h"
3#include "eo.h" 3#include "eo.h"
4#include "dr.h"
4#include "list.h" 5#include "list.h"
5#include "utils.h" 6#include "utils.h"
6#include "gendata.h" 7#include "gendata.h"
diff --git a/src/solvers/coord/dr.h b/src/solvers/coord/dr.h
new file mode 100644
index 0000000..5f3a99b
--- /dev/null
+++ b/src/solvers/coord/dr.h
@@ -0,0 +1,178 @@
1#define DREOESEP_CLASSES UINT64_C(64430)
2#define DREOESEP_MAX (POW_2_11 * COMB_12_4)
3
4#define DR_CLASS_TABLESIZE (sizeof(uint32_t) * (size_t)DREOESEP_MAX)
5#define DR_REP_TABLESIZE (sizeof(uint32_t) * (size_t)DREOESEP_CLASSES)
6#define DR_COORD_DATASIZE (INFOSIZE + DR_CLASS_TABLESIZE + DR_REP_TABLESIZE)
7
8#define DR_CLASS_SHIFT UINT32_C(16)
9#define DR_CLASS_MASK (UINT32_C(0xFFFF) << DR_CLASS_SHIFT)
10#define DR_CLASS(d) (((d) & DR_CLASS_MASK) >> DR_CLASS_SHIFT)
11
12#define DR_TTREP_SHIFT UINT32_C(0)
13#define DR_TTREP_MASK (UINT32_C(0xFF) << DR_TTREP_SHIFT)
14#define DR_TTREP(d) (((d) & DR_TTREP_MASK) >> DR_TTREP_SHIFT)
15
16#define DR_ISNASTY_SHIFT UINT32_C(8)
17#define DR_ISNASTY_MASK (UINT32_C(0xFF) << DR_ISNASTY_SHIFT)
18#define DR_ISNASTY(d) (((d) & DR_ISNASTY_MASK) >> DR_ISNASTY_SHIFT)
19
20STATIC uint64_t coord_dreoesep_nosym(cube_t);
21STATIC cube_t invcoord_dreoesep_nosym(uint64_t);
22
23STATIC uint64_t coordinate_dr_coord(cube_t, const void *);
24STATIC cube_t coordinate_dr_cube(uint64_t, const void *);
25STATIC bool coordinate_dr_isnasty(uint64_t, const void *);
26STATIC uint64_t coordinate_dr_gendata(void *);
27
28STATIC coord_t coordinate_dr = {
29 .name = "DR",
30 .coord = &coordinate_dr_coord,
31 .cube = &coordinate_dr_cube,
32 .isnasty = &coordinate_dr_isnasty,
33 .gendata = coordinate_dr_gendata,
34 .max = DREOESEP_CLASSES * POW_3_7,
35 .trans_mask = TM_UDFIX,
36 .moves_mask = MM_ALLMOVES,
37 .axistrans = {
38 [AXIS_UD] = TRANS_UFr,
39 [AXIS_RL] = TRANS_RFr,
40 [AXIS_FB] = TRANS_FDr,
41 },
42 .is_admissible = &solution_lastqt_cw,
43};
44
45STATIC uint64_t
46coord_dreoesep_nosym(cube_t cube)
47{
48 uint64_t eo, esep;
49
50 esep = coord_esep(cube) / COMB_8_4;
51 eo = coord_eo(cube);
52
53 return esep * POW_2_11 + eo;
54}
55
56STATIC cube_t
57invcoord_dreoesep_nosym(uint64_t coord)
58{
59 uint64_t eo, esep;
60 cube_t cube;
61
62 eo = coord % POW_2_11;
63 esep = (coord / POW_2_11) * COMB_8_4;
64 cube = invcoord_esep(esep);
65 set_eo(&cube, eo);
66
67 return cube;
68}
69
70STATIC uint64_t
71coordinate_dr_coord(cube_t cube, const void *data)
72{
73 const char *datanoinfo;
74 const uint32_t *data32;
75 uint32_t d;
76 cube_t transformed;
77
78 datanoinfo = (const char *)data + INFOSIZE;
79 data32 = (const uint32_t *)datanoinfo;
80 d = data32[coord_dreoesep_nosym(cube)];
81 transformed = transform(cube, DR_TTREP(d));
82
83 return DR_CLASS(d) * POW_3_7 + coord_co(transformed);
84}
85
86STATIC cube_t
87coordinate_dr_cube(uint64_t coord, const void *data)
88{
89 const char *datanoinfo;
90 const uint32_t *rep32;
91 cube_t cube;
92
93 datanoinfo = (const char *)data + INFOSIZE;
94 rep32 = (const uint32_t *)(datanoinfo + DR_CLASS_TABLESIZE);
95 cube = invcoord_dreoesep_nosym(rep32[coord / POW_3_7]);
96 copy_corners(&cube, invcoord_co(coord % POW_3_7));
97
98 return cube;
99}
100
101STATIC bool
102coordinate_dr_isnasty(uint64_t coord, const void *data)
103{
104 const char *datanoinfo;
105 const uint32_t *classttrep;
106
107 datanoinfo = (const char *)data + INFOSIZE;
108 classttrep = (const uint32_t *)datanoinfo;
109
110 return DR_ISNASTY(classttrep[coord]);
111}
112
113STATIC size_t
114coordinate_dr_gendata(void *data)
115{
116 uint64_t i, ii, j, n, t, nasty;
117 char *datanoinfo;
118 uint32_t *classttrep, *rep;
119 cube_t c;
120 tableinfo_t info;
121
122 if (data == NULL)
123 goto coordinate_dr_gendata_returnsize;
124
125 datanoinfo = (char *)data + INFOSIZE;
126 classttrep = (uint32_t *)datanoinfo;
127 rep = classttrep + (DR_CLASS_TABLESIZE / sizeof(uint32_t));
128 memset(data, 0xFF, DR_COORD_DATASIZE);
129
130 info = (tableinfo_t) {
131 .solver = "coord data for DR",
132 .type = TABLETYPE_SPECIAL,
133 .infosize = INFOSIZE,
134 .fullsize = DR_COORD_DATASIZE,
135 .hash = 0,
136 .entries = DREOESEP_CLASSES + DREOESEP_MAX,
137 .classes = DREOESEP_CLASSES,
138 .bits = 32,
139 .base = 0,
140 .maxvalue = 0,
141 .next = 0
142 };
143
144 for (i = 0, n = 0; i < COMB_12_4 * POW_2_11; i++) {
145 if (classttrep[i] != 0xFFFFFFFF)
146 continue;
147
148 c = invcoord_dreoesep_nosym(i);
149 ii = coord_dreoesep_nosym(c);
150 for (t = 0, nasty = 0; t < NTRANS && !nasty; t++) {
151 if (!((UINT64_C(1) << t) & coordinate_dr.trans_mask))
152 continue;
153
154 nasty = ii == coord_dreoesep_nosym(transform(c, t));
155 }
156
157 for (t = 0; t < NTRANS; t++) {
158 if (!((UINT64_C(1) << t) & coordinate_dr.trans_mask))
159 continue;
160
161 j = coord_dreoesep_nosym(transform(c, t));
162 classttrep[j] =
163 (n << DR_CLASS_SHIFT) |
164 (nasty << DR_ISNASTY_SHIFT) |
165 (inverse_trans(t) << DR_TTREP_SHIFT);
166 }
167 rep[n++] = i;
168 }
169
170 writetableinfo(&info, DR_COORD_DATASIZE, data);
171
172 DBG_ASSERT(n == DREOESEP_CLASSES, 0,
173 "dr coordinate data: computed %" PRIu64 " classes, "
174 "expected %" PRIu64 "\n", n, DREOESEP_CLASSES);
175
176coordinate_dr_gendata_returnsize:
177 return DR_COORD_DATASIZE;
178}
diff --git a/src/solvers/coord/eo.h b/src/solvers/coord/eo.h
index ef9b27a..3fabf9f 100644
--- a/src/solvers/coord/eo.h
+++ b/src/solvers/coord/eo.h
@@ -1,14 +1,16 @@
1STATIC uint64_t coordinate_eo_coord(cube_t, const void *); 1STATIC uint64_t coordinate_eo_coord(cube_t, const void *);
2STATIC cube_t coordinate_eo_cube(uint64_t, const void *); 2STATIC cube_t coordinate_eo_cube(uint64_t, const void *);
3STATIC bool coordinate_eo_isnasty(uint64_t, const void *);
3STATIC uint64_t coordinate_eo_gendata(void *); 4STATIC uint64_t coordinate_eo_gendata(void *);
4 5
5STATIC coord_t coordinate_eo = { 6STATIC coord_t coordinate_eo = {
6 .name = "EO", 7 .name = "EO",
7 .coord = &coordinate_eo_coord, 8 .coord = &coordinate_eo_coord,
8 .cube = &coordinate_eo_cube, 9 .cube = &coordinate_eo_cube,
10 .isnasty = &coordinate_eo_isnasty,
9 .gendata = coordinate_eo_gendata, 11 .gendata = coordinate_eo_gendata,
10 .max = POW_2_11, 12 .max = POW_2_11,
11 .trans_mask = TM_ALLTRANS, 13 .trans_mask = TM_SINGLE(TRANS_UFr),
12 .moves_mask = MM_ALLMOVES, 14 .moves_mask = MM_ALLMOVES,
13 .axistrans = { 15 .axistrans = {
14 [AXIS_UD] = TRANS_FDr, 16 [AXIS_UD] = TRANS_FDr,
@@ -32,6 +34,12 @@ coordinate_eo_cube(uint64_t c, const void *data)
32 return cube; 34 return cube;
33} 35}
34 36
37STATIC bool
38coordinate_eo_isnasty(uint64_t c, const void *data)
39{
40 return false;
41}
42
35STATIC size_t 43STATIC size_t
36coordinate_eo_gendata(void *data) 44coordinate_eo_gendata(void *data)
37{ 45{
diff --git a/src/solvers/coord/gendata.h b/src/solvers/coord/gendata.h
index ca058b0..5e40575 100644
--- a/src/solvers/coord/gendata.h
+++ b/src/solvers/coord/gendata.h
@@ -2,6 +2,8 @@ STATIC size_t gendata_coord(const coord_t [static 1], void *);
2STATIC int64_t gendata_coord_dispatch(const char *, void *); 2STATIC int64_t gendata_coord_dispatch(const char *, void *);
3STATIC tableinfo_t genptable_coord( 3STATIC tableinfo_t genptable_coord(
4 const coord_t [static 1], const void *, uint8_t *); 4 const coord_t [static 1], const void *, uint8_t *);
5STATIC uint64_t genptable_coord_fillneighbors(
6 const coord_t [static 1], const void *, uint64_t, uint8_t, uint8_t *);
5STATIC void getdistribution_coord( 7STATIC void getdistribution_coord(
6 const uint8_t *, const char *, uint64_t [static INFO_DISTRIBUTION_LEN]); 8 const uint8_t *, const char *, uint64_t [static INFO_DISTRIBUTION_LEN]);
7STATIC uint8_t get_coord_pval( 9STATIC uint8_t get_coord_pval(
@@ -81,10 +83,8 @@ genptable_coord(
81 uint8_t *table 83 uint8_t *table
82) 84)
83{ 85{
84 uint64_t tablesize, i, j, d, tot; 86 uint64_t tablesize, i, d, tot, t;
85 tableinfo_t info; 87 tableinfo_t info;
86 uint8_t m;
87 cube_t c, cc;
88 88
89 tablesize = DIV_ROUND_UP(coord->max, 2); 89 tablesize = DIV_ROUND_UP(coord->max, 2);
90 90
@@ -113,24 +113,52 @@ genptable_coord(
113 for (d = 1, tot = 1; tot < coord->max; d++) { 113 for (d = 1, tot = 1; tot < coord->max; d++) {
114 for (i = 0; i < coord->max; i++) { 114 for (i = 0; i < coord->max; i++) {
115 if (get_coord_pval(coord, table, i) == d-1) { 115 if (get_coord_pval(coord, table, i) == d-1) {
116 c = coord->cube(i, data); 116 t = genptable_coord_fillneighbors(
117 for (m = 0; m < 18; m++) { 117 coord, data, i, d, table);
118 cc = move(c, m); 118 tot += t;
119 j = coord->coord(cc, data); 119 info.distribution[d] += t;
120 if (get_coord_pval(coord, table, j) > d) {
121 set_coord_pval(coord, table, j, d);
122 tot++;
123 info.distribution[d]++;
124 }
125 }
126 } 120 }
127 } 121 }
122 LOG("Depth %" PRIu64 ": %" PRIu64 " of %" PRIu64 "\n",
123 d, tot, coord->max);
128 } 124 }
129 info.maxvalue = d-1; 125 info.maxvalue = d-1;
130 126
131 return info; 127 return info;
132} 128}
133 129
130STATIC uint64_t
131genptable_coord_fillneighbors(
132 const coord_t coord[static 1],
133 const void *data,
134 uint64_t i,
135 uint8_t d,
136 uint8_t *table
137)
138{
139 uint8_t m;
140 uint64_t j, t, tot;
141 cube_t c, moved;
142
143 c = coord->cube(i, data);
144 tot = 0;
145 for (m = 0; m < NMOVES; m++) {
146 moved = move(c, m);
147 for (t = 0; t < NTRANS; t++) {
148 if (!((UINT64_C(1) << t) & coord->trans_mask))
149 continue;
150
151 j = coord->coord(transform(moved, t), data);
152 if (get_coord_pval(coord, table, j) > d) {
153 set_coord_pval(coord, table, j, d);
154 tot++;
155 }
156 }
157 }
158
159 return tot;
160}
161
134STATIC void 162STATIC void
135getdistribution_coord( 163getdistribution_coord(
136 const uint8_t *table, 164 const uint8_t *table,
diff --git a/src/solvers/coord/list.h b/src/solvers/coord/list.h
index 32c94a4..7d43d45 100644
--- a/src/solvers/coord/list.h
+++ b/src/solvers/coord/list.h
@@ -1,4 +1,5 @@
1coord_t *all_coordinates[] = { 1coord_t *all_coordinates[] = {
2 &coordinate_eo, 2 &coordinate_eo,
3 &coordinate_dr,
3 NULL 4 NULL
4}; 5};
diff --git a/src/solvers/coord/types_macros.h b/src/solvers/coord/types_macros.h
index 9eaeca0..8741e27 100644
--- a/src/solvers/coord/types_macros.h
+++ b/src/solvers/coord/types_macros.h
@@ -6,6 +6,7 @@ typedef struct {
6 const char name[255]; 6 const char name[255];
7 uint64_t (*coord)(cube_t, const void *); 7 uint64_t (*coord)(cube_t, const void *);
8 cube_t (*cube)(uint64_t, const void *); 8 cube_t (*cube)(uint64_t, const void *);
9 bool (*isnasty)(uint64_t, const void *);
9 size_t (*gendata)(void *); 10 size_t (*gendata)(void *);
10 uint64_t max; 11 uint64_t max;
11 uint32_t moves_mask; 12 uint32_t moves_mask;
diff --git a/src/utils/constants.h b/src/utils/constants.h
index ef8c7e0..a6c6b7a 100644
--- a/src/utils/constants.h
+++ b/src/utils/constants.h
@@ -106,6 +106,13 @@ STATIC int64_t binomial[12][12] = {
106 106
107#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF) 107#define TM_ALLTRANS UINT64_C(0xFFFFFFFFFFFF)
108#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t)) 108#define TM_SINGLE(t) (UINT64_C(1) << (uint64_t)(t))
109#define TM_UDFIX (\
110 TM_SINGLE(TRANS_UFr) | TM_SINGLE(TRANS_UBr) | TM_SINGLE(TRANS_URr) | \
111 TM_SINGLE(TRANS_ULr) | TM_SINGLE(TRANS_UFm) | TM_SINGLE(TRANS_UBm) | \
112 TM_SINGLE(TRANS_URm) | TM_SINGLE(TRANS_ULm) | TM_SINGLE(TRANS_DFr) | \
113 TM_SINGLE(TRANS_DBr) | TM_SINGLE(TRANS_DRr) | TM_SINGLE(TRANS_DLr) | \
114 TM_SINGLE(TRANS_DFm) | TM_SINGLE(TRANS_DBm) | TM_SINGLE(TRANS_DRm) | \
115 TM_SINGLE(TRANS_DLm))
109 116
110#define CORNER_UFR UINT8_C(0) 117#define CORNER_UFR UINT8_C(0)
111#define CORNER_UBL UINT8_C(1) 118#define CORNER_UBL UINT8_C(1)

Generated with cgit - Back to sebastiano.tronto.net