diff options
| author | Sebastiano Tronto <sebastiano.tronto@gmail.com> | 2021-12-16 19:25:58 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano.tronto@gmail.com> | 2021-12-16 19:25:58 +0100 |
| commit | 2f924f942bd6e7126e8f1d8692e475c95bd9fe82 (patch) | |
| tree | dd5877c2fd836f43523263e48632946423401093 /src/alg.c | |
| parent | 4e2b4e603c7e84c7556f489d7d8dab06915b3a9b (diff) | |
| download | nissy-2f924f942bd6e7126e8f1d8692e475c95bd9fe82.tar.gz nissy-2f924f942bd6e7126e8f1d8692e475c95bd9fe82.zip | |
Added a new pruning table (equivalent to nxopt31). I have not tested it yet, it takes a while to generate.
Plus I have done a whole lot of refactoring in random places because I cannot focus on
one thing at the time.
Diffstat (limited to '')
| -rw-r--r-- | src/alg.c | 180 |
1 files changed, 141 insertions, 39 deletions
| @@ -2,27 +2,76 @@ | |||
| 2 | 2 | ||
| 3 | /* Local functions ***********************************************************/ | 3 | /* Local functions ***********************************************************/ |
| 4 | 4 | ||
| 5 | static bool allowed_HTM(Move m); | ||
| 6 | static bool allowed_URF(Move m); | ||
| 7 | static bool allowed_eofb(Move m); | ||
| 8 | static bool allowed_drud(Move m); | ||
| 9 | static bool allowed_htr(Move m); | ||
| 10 | static bool allowed_next_HTM(Move l2, Move l1, Move m); | ||
| 11 | static int axis(Move m); | ||
| 12 | |||
| 5 | static void free_alglistnode(AlgListNode *aln); | 13 | static void free_alglistnode(AlgListNode *aln); |
| 6 | static void realloc_alg(Alg *alg, int n); | 14 | static void realloc_alg(Alg *alg, int n); |
| 7 | 15 | ||
| 8 | /* Movesets ******************************************************************/ | 16 | /* Movesets ******************************************************************/ |
| 9 | 17 | ||
| 10 | bool | 18 | Moveset |
| 11 | moveset_HTM(Move m) | 19 | moveset_HTM = { |
| 20 | .allowed = allowed_HTM, | ||
| 21 | .allowed_next = allowed_next_HTM, | ||
| 22 | }; | ||
| 23 | |||
| 24 | Moveset | ||
| 25 | moveset_URF = { | ||
| 26 | .allowed = allowed_URF, | ||
| 27 | .allowed_next = allowed_next_HTM, | ||
| 28 | }; | ||
| 29 | |||
| 30 | Moveset | ||
| 31 | moveset_eofb = { | ||
| 32 | .allowed = allowed_eofb, | ||
| 33 | .allowed_next = allowed_next_HTM, | ||
| 34 | }; | ||
| 35 | |||
| 36 | Moveset | ||
| 37 | moveset_drud = { | ||
| 38 | .allowed = allowed_drud, | ||
| 39 | .allowed_next = allowed_next_HTM, | ||
| 40 | }; | ||
| 41 | |||
| 42 | Moveset | ||
| 43 | moveset_htr = { | ||
| 44 | .allowed = allowed_htr, | ||
| 45 | .allowed_next = allowed_next_HTM, | ||
| 46 | }; | ||
| 47 | |||
| 48 | static int nmoveset = 5; | ||
| 49 | static Moveset * all_ms[] = { | ||
| 50 | &moveset_HTM, | ||
| 51 | &moveset_URF, | ||
| 52 | &moveset_eofb, | ||
| 53 | &moveset_drud, | ||
| 54 | &moveset_htr, | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* Functions *****************************************************************/ | ||
| 58 | |||
| 59 | static bool | ||
| 60 | allowed_HTM(Move m) | ||
| 12 | { | 61 | { |
| 13 | return m >= U && m <= B3; | 62 | return m >= U && m <= B3; |
| 14 | } | 63 | } |
| 15 | 64 | ||
| 16 | bool | 65 | static bool |
| 17 | moveset_URF(Move m) | 66 | allowed_URF(Move m) |
| 18 | { | 67 | { |
| 19 | Move b = base_move(m); | 68 | Move b = base_move(m); |
| 20 | 69 | ||
| 21 | return b == U || b == R || b == F; | 70 | return b == U || b == R || b == F; |
| 22 | } | 71 | } |
| 23 | 72 | ||
| 24 | bool | 73 | static bool |
| 25 | moveset_eofb(Move m) | 74 | allowed_eofb(Move m) |
| 26 | { | 75 | { |
| 27 | Move b = base_move(m); | 76 | Move b = base_move(m); |
| 28 | 77 | ||
| @@ -30,8 +79,8 @@ moveset_eofb(Move m) | |||
| 30 | ((b == F || b == B) && m == b+1); | 79 | ((b == F || b == B) && m == b+1); |
| 31 | } | 80 | } |
| 32 | 81 | ||
| 33 | bool | 82 | static bool |
| 34 | moveset_drud(Move m) | 83 | allowed_drud(Move m) |
| 35 | { | 84 | { |
| 36 | Move b = base_move(m); | 85 | Move b = base_move(m); |
| 37 | 86 | ||
| @@ -39,16 +88,65 @@ moveset_drud(Move m) | |||
| 39 | ((b == R || b == L || b == F || b == B) && m == b + 1); | 88 | ((b == R || b == L || b == F || b == B) && m == b + 1); |
| 40 | } | 89 | } |
| 41 | 90 | ||
| 42 | bool | 91 | static bool |
| 43 | moveset_htr(Move m) | 92 | allowed_htr(Move m) |
| 44 | { | 93 | { |
| 45 | Move b = base_move(m); | 94 | Move b = base_move(m); |
| 46 | 95 | ||
| 47 | return moveset_HTM(m) && m == b + 1; | 96 | return moveset_HTM.allowed(m) && m == b + 1; |
| 48 | } | 97 | } |
| 49 | 98 | ||
| 99 | static bool | ||
| 100 | allowed_next_HTM(Move l2, Move l1, Move m) | ||
| 101 | { | ||
| 102 | bool p, q; | ||
| 50 | 103 | ||
| 51 | /* Functions *****************************************************************/ | 104 | p = l1 != NULLMOVE && base_move(l1) == base_move(m); |
| 105 | q = l2 != NULLMOVE && base_move(l2) == base_move(m); | ||
| 106 | |||
| 107 | return !(p || (commute(l1, l2) && q)); | ||
| 108 | } | ||
| 109 | |||
| 110 | static int | ||
| 111 | axis(Move m) | ||
| 112 | { | ||
| 113 | Move i; | ||
| 114 | |||
| 115 | static bool initialized = false; | ||
| 116 | static int aux[NMOVES]; | ||
| 117 | |||
| 118 | if (!initialized) { | ||
| 119 | for (i = 0; i < NMOVES; i++) { | ||
| 120 | if (i == NULLMOVE) | ||
| 121 | aux[i] = 0; | ||
| 122 | |||
| 123 | if (i >= U && i <= B3) | ||
| 124 | aux[i] = (i-1)/6 + 1; | ||
| 125 | |||
| 126 | if (i >= Uw && i <= Bw3) | ||
| 127 | aux[i] = (i-1)/6 - 2; | ||
| 128 | |||
| 129 | if (base_move(i) == E || base_move(i) == y) | ||
| 130 | aux[i] = 1; | ||
| 131 | |||
| 132 | if (base_move(i) == M || base_move(i) == x) | ||
| 133 | aux[i] = 2; | ||
| 134 | |||
| 135 | if (base_move(i) == S || base_move(i) == z) | ||
| 136 | aux[i] = 3; | ||
| 137 | } | ||
| 138 | |||
| 139 | initialized = true; | ||
| 140 | } | ||
| 141 | |||
| 142 | return aux[m]; | ||
| 143 | } | ||
| 144 | |||
| 145 | bool | ||
| 146 | commute(Move m1, Move m2) | ||
| 147 | { | ||
| 148 | return axis(m1) == axis(m2); | ||
| 149 | } | ||
| 52 | 150 | ||
| 53 | void | 151 | void |
| 54 | append_alg(AlgList *l, Alg *alg) | 152 | append_alg(AlgList *l, Alg *alg) |
| @@ -171,33 +269,6 @@ move_string(Move m) | |||
| 171 | return move_string_aux[m]; | 269 | return move_string_aux[m]; |
| 172 | } | 270 | } |
| 173 | 271 | ||
| 174 | void | ||
| 175 | movelist_to_position(Move *movelist, int *position) | ||
| 176 | { | ||
| 177 | Move m; | ||
| 178 | |||
| 179 | for (m = 0; m < NMOVES && movelist[m] != NULLMOVE; m++) | ||
| 180 | position[movelist[m]] = m; | ||
| 181 | } | ||
| 182 | |||
| 183 | void | ||
| 184 | moveset_to_list(Moveset ms, Move *r) | ||
| 185 | { | ||
| 186 | int n = 0; | ||
| 187 | Move i; | ||
| 188 | |||
| 189 | if (ms == NULL) { | ||
| 190 | fprintf(stderr, "Error: no moveset given\n"); | ||
| 191 | return; | ||
| 192 | } | ||
| 193 | |||
| 194 | for (i = U; i < NMOVES; i++) | ||
| 195 | if (ms(i)) | ||
| 196 | r[n++] = i; | ||
| 197 | |||
| 198 | r[n] = NULLMOVE; | ||
| 199 | } | ||
| 200 | |||
| 201 | Alg * | 272 | Alg * |
| 202 | new_alg(char *str) | 273 | new_alg(char *str) |
| 203 | { | 274 | { |
| @@ -405,3 +476,34 @@ unniss(Alg *alg) | |||
| 405 | } | 476 | } |
| 406 | free(aux); | 477 | free(aux); |
| 407 | } | 478 | } |
| 479 | |||
| 480 | void | ||
| 481 | init_movesets() | ||
| 482 | { | ||
| 483 | int i, j; | ||
| 484 | uint64_t l, one; | ||
| 485 | Move m, l2, l1; | ||
| 486 | Moveset *ms; | ||
| 487 | |||
| 488 | one = 1; | ||
| 489 | |||
| 490 | for (i = 0; i < nmoveset; i++) { | ||
| 491 | ms = all_ms[i]; | ||
| 492 | |||
| 493 | for (j = 0, m = U; m < NMOVES; m++) | ||
| 494 | if (ms->allowed(m)) | ||
| 495 | ms->sorted_moves[j++] = m; | ||
| 496 | ms->sorted_moves[j] = NULLMOVE; | ||
| 497 | |||
| 498 | for (l1 = 0; l1 < NMOVES; l1++) { | ||
| 499 | for (l2 = 0; l2 < NMOVES; l2++) { | ||
| 500 | ms->mask[l2][l1] = 0; | ||
| 501 | for (l=0; ms->sorted_moves[l]!=NULLMOVE; l++) { | ||
| 502 | m = ms->sorted_moves[l]; | ||
| 503 | if (ms->allowed_next(l2, l1, m)) | ||
| 504 | ms->mask[l2][l1] |= (one<<m); | ||
| 505 | } | ||
| 506 | } | ||
| 507 | } | ||
| 508 | } | ||
| 509 | } | ||
