aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/coord/common.h
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-04-01 22:26:44 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-04-01 22:26:44 +0200
commitae0e5295daa7618b6facebac31c3a88eaccfc368 (patch)
tree60ccd4de018a0a36d7204a81cd950c47d31548b2 /src/solvers/coord/common.h
parent29f61e2b4e0f73c83d6d86e4f09d79e129358750 (diff)
downloadnissy-core-ae0e5295daa7618b6facebac31c3a88eaccfc368.tar.gz
nissy-core-ae0e5295daa7618b6facebac31c3a88eaccfc368.zip
Make symcoord logic generic
Diffstat (limited to 'src/solvers/coord/common.h')
-rw-r--r--src/solvers/coord/common.h133
1 files changed, 131 insertions, 2 deletions
diff --git a/src/solvers/coord/common.h b/src/solvers/coord/common.h
index 4cfc36f..95c0e6c 100644
--- a/src/solvers/coord/common.h
+++ b/src/solvers/coord/common.h
@@ -1,10 +1,139 @@
1STATIC void append_coord_name(const coord_t *, char *); 1STATIC uint64_t coord_coord_generic(
2 const coord_t [static 1], cube_t, const void *);
3STATIC cube_t coord_cube_generic(
4 const coord_t [static 1], uint64_t, const void *);
5STATIC bool coord_isnasty_generic(
6 const coord_t [static 1], uint64_t, const void *);
7STATIC size_t coord_gendata_generic(const coord_t [static 1], void *);
8
9STATIC void append_coord_name(const coord_t [static 1], char *);
2STATIC bool solution_lastqt_cw(const solution_moves_t [static 1]); 10STATIC bool solution_lastqt_cw(const solution_moves_t [static 1]);
3STATIC bool coord_can_switch( 11STATIC bool coord_can_switch(
4 const coord_t [static 1], const void *, size_t n, const uint8_t [n]); 12 const coord_t [static 1], const void *, size_t n, const uint8_t [n]);
5 13
14STATIC uint64_t
15coord_coord_generic(const coord_t coord[static 1], cube_t c, const void *data)
16{
17 const char *datanoinfo;
18 const uint32_t *data32;
19 uint32_t d;
20 cube_t tr;
21
22 datanoinfo = (const char *)data + INFOSIZE;
23 data32 = (const uint32_t *)datanoinfo;
24 d = data32[coord->sym.coord(c)];
25 tr = transform(c, COORD_TTREP(d));
26
27 return COORD_CLASS(d) * coord->sym.max2 + coord->sym.coord2(tr);
28}
29
30STATIC cube_t
31coord_cube_generic(const coord_t coord[static 1], uint64_t i, const void *data)
32{
33 const char *datanoinfo;
34 const uint32_t *rep32;
35 cube_t c;
36
37 datanoinfo = (const char *)data + INFOSIZE;
38 rep32 = (const uint32_t *)(datanoinfo + 4 * (size_t)coord->sym.max);
39 c = coord->sym.cube(rep32[i / coord->sym.max2]);
40
41 return coord->sym.merge(c, coord->sym.cube2(i % coord->sym.max2));
42}
43
44STATIC bool
45coord_isnasty_generic(
46 const coord_t coord[static 1],
47 uint64_t i,
48 const void *data
49)
50{
51 const char *datanoinfo;
52 const uint32_t *classttrep, *rep32;
53 uint32_t r;
54
55 datanoinfo = (const char *)data + INFOSIZE;
56 classttrep = (const uint32_t *)datanoinfo;
57 rep32 = (const uint32_t *)(datanoinfo + 4 * (size_t)coord->sym.max);
58 r = rep32[i / coord->sym.max2];
59
60 return COORD_ISNASTY(classttrep[r]);
61}
62
63STATIC size_t
64coord_gendata_generic(
65 const coord_t coord[static 1],
66 void *data
67)
68{
69 uint64_t i, j, n, t, nasty;
70 char *datanoinfo;
71 uint32_t *classttrep, *rep;
72 size_t coord_datasize;
73 cube_t c;
74 tableinfo_t info;
75
76 coord_datasize = INFOSIZE + 4*(coord->sym.classes + coord->sym.max);
77
78 if (data == NULL)
79 return coord_datasize;
80
81 datanoinfo = (char *)data + INFOSIZE;
82 classttrep = (uint32_t *)datanoinfo;
83 rep = classttrep + coord->sym.max;
84 memset(data, 0xFF, coord_datasize);
85
86 info = (tableinfo_t) {
87 .solver = "coord data for ",
88 .type = TABLETYPE_SPECIAL,
89 .infosize = INFOSIZE,
90 .fullsize = coord_datasize,
91 .hash = 0,
92 .entries = coord->sym.classes + coord->sym.max,
93 .classes = coord->sym.classes,
94 .bits = 32,
95 .base = 0,
96 .maxvalue = 0,
97 .next = 0
98 };
99 append_coord_name(coord, info.solver);
100
101 for (i = 0, n = 0; i < coord->sym.max; i++) {
102 if (classttrep[i] != 0xFFFFFFFF)
103 continue;
104
105 c = coord->sym.cube(i);
106 for (t = 1, nasty = 0; t < NTRANS && !nasty; t++) {
107 if (!((UINT64_C(1) << t) & coord->trans_mask))
108 continue;
109
110 nasty = i == coord->sym.coord(transform(c, t));
111 }
112
113 for (t = 0; t < NTRANS; t++) {
114 if (!((UINT64_C(1) << t) & coord->trans_mask))
115 continue;
116
117 j = coord->sym.coord(transform(c, t));
118 classttrep[j] =
119 (n << COORD_CLASS_SHIFT) |
120 (nasty << COORD_ISNASTY_SHIFT) |
121 (inverse_trans(t) << COORD_TTREP_SHIFT);
122 }
123 rep[n++] = i;
124 }
125
126 writetableinfo(&info, coord_datasize, data);
127
128 DBG_ASSERT(n == coord->sym.classes, 0,
129 "%s coordinate data: computed %" PRIu64 " classes, "
130 "expected %" PRIu64 "\n", coord->name, n, coord->sym.classes);
131
132 return coord_datasize;
133}
134
6STATIC void 135STATIC void
7append_coord_name(const coord_t *coord, char *str) 136append_coord_name(const coord_t coord[static 1], char *str)
8{ 137{
9 int i, j; 138 int i, j;
10 139

Generated with cgit - Back to sebastiano.tronto.net