From 87a15e960e31365698df7e06cd3e6b851e17c1a5 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 5 Mar 2023 10:13:01 +0100 Subject: I made a mess, but it works. Still need to implement new optimal solver. After that, a big redesign is due. --- src/alg.c | 127 ++++++++++++++++++-------------------------------------------- 1 file changed, 37 insertions(+), 90 deletions(-) (limited to 'src/alg.c') diff --git a/src/alg.c b/src/alg.c index 2815599..d806178 100644 --- a/src/alg.c +++ b/src/alg.c @@ -6,57 +6,6 @@ static int axis(Move m); static void free_alglistnode(AlgListNode *aln); static void realloc_alg(Alg *alg, int n); -bool -allowed_HTM(Move m) -{ - return m >= U && m <= B3; -} - -bool -allowed_URF(Move m) -{ - Move b = base_move(m); - - return b == U || b == R || b == F; -} - -bool -allowed_eofb(Move m) -{ - Move b = base_move(m); - - return b == U || b == D || b == R || b == L || - ((b == F || b == B) && m == b+1); -} - -bool -allowed_drud(Move m) -{ - Move b = base_move(m); - - return b == U || b == D || - ((b == R || b == L || b == F || b == B) && m == b + 1); -} - -bool -allowed_htr(Move m) -{ - Move b = base_move(m); - - return moveset_HTM.allowed(m) && m == b + 1; -} - -bool -allowed_next_all(Move l2, Move l1, Move m) -{ - bool p, q; - - p = l1 != NULLMOVE && base_move(l1) == base_move(m); - q = l2 != NULLMOVE && base_move(l2) == base_move(m); - - return !(p || (commute(l1, l2) && q)); -} - void append_alg(AlgList *l, Alg *alg) { @@ -137,6 +86,32 @@ commute(Move m1, Move m2) return axis(m1) == axis(m2); } +int +compare(Move m1, Move m2) +{ + if (!commute(m1, m2)) + return 0; + + return m1 < m2 ? 1 : -1; +} + +int +compare_last(Alg *alg, Move m, bool inverse) +{ + Move last; + int n; + + if (inverse) { + n = alg->len_inverse; + last = n > 0 ? alg->move_inverse[n-1] : NULLMOVE; + } else { + n = alg->len_normal; + last = n > 0 ? alg->move_normal[n-1] : NULLMOVE; + } + + return compare(last, m); +} + void compose_alg(Alg *alg1, Alg *alg2) { @@ -355,19 +330,6 @@ on_inverse(Alg *alg) return ret; } -bool -possible_next(Move m, Moveset *ms, Move l0, Move l1) -{ - bool allowed, order; - uint64_t mbit; - - mbit = ((uint64_t)1) << m; - allowed = mbit & ms->mask[l1][l0]; - order = !commute(l0, m) || l0 < m; - - return allowed && order; -} - void print_alg(Alg *alg, bool l) { @@ -430,6 +392,17 @@ realloc_alg(Alg *alg, int n) alg->allocated = n; } +void +remove_last_move(Alg *a) +{ + a->len--; + + if (a->inv[a->len]) + a->len_inverse--; + else + a->len_normal--; +} + void swapmove(Move *m1, Move *m2) { @@ -484,29 +457,3 @@ unniss(Alg *alg) return ret; } - -void -init_moveset(Moveset *ms) -{ - int j; - uint64_t l, one; - Move m, l2, l1; - - one = 1; - - for (j = 0, m = U; m < NMOVES; m++) - if (ms->allowed(m)) - ms->sorted_moves[j++] = m; - ms->sorted_moves[j] = NULLMOVE; - - for (l1 = 0; l1 < NMOVES; l1++) { - for (l2 = 0; l2 < NMOVES; l2++) { - ms->mask[l2][l1] = 0; - for (l = 0; ms->sorted_moves[l] != NULLMOVE; l++) { - m = ms->sorted_moves[l]; - if (ms->allowed_next(l2, l1, m)) - ms->mask[l2][l1] |= (one<