diff options
Diffstat (limited to 'src/solvers/coord/common.h')
| -rw-r--r-- | src/solvers/coord/common.h | 133 |
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 @@ | |||
| 1 | STATIC void append_coord_name(const coord_t *, char *); | 1 | STATIC uint64_t coord_coord_generic( |
| 2 | const coord_t [static 1], cube_t, const void *); | ||
| 3 | STATIC cube_t coord_cube_generic( | ||
| 4 | const coord_t [static 1], uint64_t, const void *); | ||
| 5 | STATIC bool coord_isnasty_generic( | ||
| 6 | const coord_t [static 1], uint64_t, const void *); | ||
| 7 | STATIC size_t coord_gendata_generic(const coord_t [static 1], void *); | ||
| 8 | |||
| 9 | STATIC void append_coord_name(const coord_t [static 1], char *); | ||
| 2 | STATIC bool solution_lastqt_cw(const solution_moves_t [static 1]); | 10 | STATIC bool solution_lastqt_cw(const solution_moves_t [static 1]); |
| 3 | STATIC bool coord_can_switch( | 11 | STATIC 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 | ||
| 14 | STATIC uint64_t | ||
| 15 | coord_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 | |||
| 30 | STATIC cube_t | ||
| 31 | coord_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 | |||
| 44 | STATIC bool | ||
| 45 | coord_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 | |||
| 63 | STATIC size_t | ||
| 64 | coord_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 | |||
| 6 | STATIC void | 135 | STATIC void |
| 7 | append_coord_name(const coord_t *coord, char *str) | 136 | append_coord_name(const coord_t coord[static 1], char *str) |
| 8 | { | 137 | { |
| 9 | int i, j; | 138 | int i, j; |
| 10 | 139 | ||
