From f707876581e54d6f16ec6bd517520caa6e58e71a Mon Sep 17 00:00:00 2001 From: DomNomNomVR <108088541+DomNomNomVR@users.noreply.github.com> Date: Sat, 20 Dec 2025 01:47:30 +1300 Subject: [PATCH] skerwb --- ..._solver.evaluate_permutation.shelve.sqlite | Bin 28672 -> 28672 bytes skewb_solver.py | 189 ++++++++++++++---- starchild_teaching.py | 4 +- 3 files changed, 155 insertions(+), 38 deletions(-) diff --git a/skewb_solver.evaluate_permutation.shelve.sqlite b/skewb_solver.evaluate_permutation.shelve.sqlite index 03786697292840a9485b65da5ac2871d2966c093..c469b78028f52efbb545137569eda4c86f511764 100644 GIT binary patch literal 28672 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 literal 28672 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 CvG?f! diff --git a/skewb_solver.py b/skewb_solver.py index d37bdec..51740b5 100644 --- a/skewb_solver.py +++ b/skewb_solver.py @@ -1,16 +1,28 @@ +from multiprocessing import Pool, TimeoutError from math import sqrt import shelve from collections import deque from dataclasses import dataclass, replace from functools import reduce import random -from typing import TYPE_CHECKING, Callable, Counter, Dict, List, Literal, Set, Tuple +from typing import ( + TYPE_CHECKING, + Callable, + Counter, + Dict, + Iterable, + Iterator, + List, + Literal, + Set, + Tuple, +) from functools import lru_cache import pytest -print() +# print() # twisting the bottom, opposing this color clockwise when this color is facing away # RBOG @@ -35,7 +47,9 @@ class Corner: return f"{self.col}{self.rot}" -MidRotState = Literal["Y", "O", "R"] +MidRotState = Literal[ + "Y", "O", "G" +] # which direction it's pointing in (target middle solved colour) @dataclass(frozen=True) @@ -51,7 +65,7 @@ class Middle: class Skewb: """Represents a Rubics cube variant sold as 'Qiyi Twisty Skewb'.""" - # order: vertically below Axis primary color + # order: screw down-right from start top: Tuple[Corner, Corner, Corner, Corner] bot: Tuple[Corner, Corner, Corner, Corner] mids: Tuple[Middle, Middle, Middle, Middle, Middle] @@ -86,10 +100,10 @@ R1 = Corner("R", 1) R2 = Corner("R", 2) -GR = Middle("G", "R") -OR = Middle("O", "R") -BR = Middle("B", "R") -RR = Middle("R", "R") +GG = Middle("G", "G") +OG = Middle("O", "G") +BG = Middle("B", "G") +RG = Middle("R", "G") GO = Middle("G", "O") OO = Middle("O", "O") BO = Middle("B", "O") @@ -103,7 +117,7 @@ YY = Middle("Y", "Y") def rotate_mid_about_W(m: Middle) -> Middle: return Middle( - col=m.col, rot="Y" if m.rot == "Y" else ("R" if m.rot == "O" else "O") + col=m.col, rot="Y" if m.rot == "Y" else ("G" if m.rot == "O" else "O") ) @@ -122,6 +136,9 @@ def rotate_everything_about_W(s: Skewb) -> Skewb: ) +# 0 1 2 3 +# 3 0 1 2 + solved_skewb = Skewb( top=(G0, O0, B0, R0), bot=(G0, O0, B0, R0), @@ -158,7 +175,7 @@ def test_rotation_permutations(p: CornerRotPermutation): assert set(p.values()) == {0, 1, 2} -MID_DIR_INCREMENT: dict[MidRotState, MidRotState] = {"Y": "O", "R": "Y", "O": "R"} +MID_DIR_INCREMENT: dict[MidRotState, MidRotState] = {"Y": "O", "G": "Y", "O": "G"} def clockwise_twist(s: Skewb, axis: Axis) -> Skewb: @@ -198,7 +215,7 @@ def clockwise_twist(s: Skewb, axis: Axis) -> Skewb: ), Middle( (m := s.mids[2]).col, - "Y" if m.col == "Y" else ("O" if m.rot == "Y" else "R"), + "Y" if m.col == "Y" else ("O" if m.rot == "Y" else "G"), ), ), ) @@ -213,7 +230,7 @@ def clockwise_twist(s: Skewb, axis: Axis) -> Skewb: ( "O", Skewb( - top=(G0, O0, B0, O2), bot=(G1, R2, B0, R2), mids=(YY, OY, BY, GR, RR) + top=(G0, O0, B0, O2), bot=(G1, R2, B0, R2), mids=(YY, OY, BY, GG, RG) ), ) ], @@ -299,7 +316,7 @@ def breadth_first_search( step_count = 0 while q and max_steps > 0: if step_count % 1000 == 0 and step_count: - print(f".", end="", flush=True) + # print(f".", end="", flush=True) if ( bidirectional_fallback_threshold is not None and step_count > bidirectional_fallback_threshold @@ -332,8 +349,18 @@ def test_breadth_first_search(): def bidirectional_search( start: Skewb, max_steps: int, end: Skewb = solved_skewb ) -> list[Twist] | None: + try: + return next(bidirectional_search_all(start, max_steps, end)) + except StopIteration: + return None + + +def bidirectional_search_all( + start: Skewb, max_steps: int, end: Skewb = solved_skewb +) -> Iterator[list[Twist]]: if start == end: - return [] + yield [] + return start.assert_valid() q = deque([start]) q2 = deque([end]) @@ -367,12 +394,14 @@ def bidirectional_search( out = out.replace("LLL", "J") return out - def on_meet(meet: Skewb) -> list[Twist]: - path = get_path(meet) - assert apply_twists(start, path) == end - return path - # print(f"{heuristic_list(end)=} {''.join(path)=} {instructions(path)=}") - # return + # def on_meet(meet: Skewb) -> list[Twist]: + # path = get_path(meet) + # assert apply_twists(start, path) == end + # return path + # # print(f"{heuristic_list(end)=} {''.join(path)=} {instructions(path)=}") + # # return + last_path = None + seen_paths: set[tuple[Twist, ...]] = set() while q and max_steps > 0: max_steps -= 1 @@ -386,7 +415,20 @@ def bidirectional_search( continue skewb_to_twist2[child] = twist if child in skewb_to_twist: - return on_meet(child) + # DUPLICATED + path = get_path(child) + assert apply_twists(start, path) == end + + # if last_path is not None and len(path) > len(last_path): + # return + # last_path = path + + if tuple(path) not in seen_paths and ( + last_path is None or len(path) <= len(last_path) + ): + yield path + seen_paths.add(tuple(path)) + last_path = path q2.append(child) parent = q.popleft() @@ -398,11 +440,23 @@ def bidirectional_search( skewb_to_twist[child] = twist if child in skewb_to_twist2: - return on_meet(child) + # DUPLICATED + path = get_path(child) + assert apply_twists(start, path) == end + + # if last_path is not None and len(path) > len(last_path): + # return + # last_path = path + + if tuple(path) not in seen_paths and ( + last_path is None or len(path) <= len(last_path) + ): + yield path + seen_paths.add(tuple(path)) + last_path = path q.append(child) print(f"{len(skewb_to_twist)}") - return None def heuristic(got: Skewb) -> float: @@ -541,7 +595,7 @@ def get_paths_from_heuristic( # print(f"{mask=} {s=}", end=" ") if sum(mask) == len(heuristic_permutation) - 3: # print("going bidirectional now.") - print("end-bi", end=" ", flush=True) + # print("end-bi", end=" ", flush=True) path = bidirectional_search(s, max_steps=200000) else: path = breadth_first_search( @@ -574,19 +628,22 @@ def score_fn(values: list[float]) -> float: return -sum(2**i * v for i, v in enumerate(sorted(values))) +def parallel_task(seed: int, heuristic_permutation: list[int]): + paths = get_paths_from_heuristic(random_skewb(seed), heuristic_permutation) + return score_fn([len(p) for p in paths]) + + @shelve_it("skewb_solver.evaluate_permutation.shelve.sqlite") def evaluate_permutation( heuristic_permutation: list[int], seed=4, sample_size: int = 10 ) -> float: scores = [] rng = random.Random(seed) - for i in range(sample_size): - start = random_skewb(rng.randint(0, 2**63)) - print(f"{heuristic_permutation=} {start=}", end=" ") - paths = get_paths_from_heuristic(start, heuristic_permutation) - score = score_fn([len(p) for p in paths]) - print(f"{score=}") - scores.append(score) + args = [(rng.randint(0, 2**63), heuristic_permutation) for i in range(sample_size)] + with Pool(processes=32) as pool: + for score in pool.starmap(parallel_task, args): + print(f"{heuristic_permutation=} {score=}", flush=True) + scores.append(score) return sum(scores) / len(scores) @@ -598,21 +655,79 @@ def evaluate_all_1_swaps(hp: list[int]): hp[i], hp[j] = hp[j], hp[i] -def evaluate_all_1_swaps_except_first(hp: list[int]): +def evaluate_all_1_swaps_except_first(hp: list[int], sample_size: int): for i in range(len(hp)): for j in range(1, i): hp[i], hp[j] = hp[j], hp[i] - evaluation = evaluate_permutation(hp, sample_size=100) + evaluation = evaluate_permutation(hp, sample_size=sample_size) print(f"{hp=} {evaluation=}") hp[i], hp[j] = hp[j], hp[i] +def print_path_detailed(s: Skewb, paths: list[list[Twist]]): + for path in paths: + print(s, path) + s = apply_twists(s, path) + + +def reverse_path(path: List[Twist]) -> List[Twist]: + return [to_opposite[t] for t in reversed(path)] + + if __name__ == "__main__": - hp = top_bot_mids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - hp = top_down_modified = [0, 1, 2, 3, 8, 9, 10, 11, 12, 4, 5, 6, 7] - hp = top_down = [0, 1, 2, 3, 8, 9, 10, 11, 12, 4, 5, 6, 7] + # hp = top_bot_mids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + # hp = top_down_modified = [0, 1, 2, 3, 8, 9, 10, 11, 12, 4, 5, 6, 7] + # hp = top_down = [0, 1, 2, 3, 8, 9, 10, 11, 12, 4, 5, 6, 7] + # hp = local_minimum = [0, 1, 6, 3, 8, 9, 10, 11, 12, 4, 5, 2, 7] + # hp = second_1_swap_min = [0, 3, 6, 1, 8, 9, 10, 11, 12, 4, 5, 2, 7] + # good_hps = [ + # [0, 1, 12, 3, 8, 9, 10, 11, 6, 4, 5, 2, 7], + # [0, 1, 3, 6, 8, 9, 10, 11, 12, 4, 5, 2, 7], + # [0, 1, 6, 3, 11, 9, 10, 8, 12, 4, 5, 2, 7], + # [0, 1, 6, 8, 3, 9, 10, 11, 12, 4, 5, 2, 7], + # [0, 1, 6, 9, 8, 3, 10, 11, 12, 4, 5, 2, 7], + # [0, 1, 8, 3, 6, 9, 10, 11, 12, 4, 5, 2, 7], + # [0, 3, 6, 1, 8, 9, 10, 11, 12, 4, 5, 2, 7], + # [0, 5, 6, 3, 8, 9, 10, 11, 12, 4, 1, 2, 7], + # [0, 8, 6, 3, 1, 9, 10, 11, 12, 4, 5, 2, 7], + # [0, 10, 6, 3, 8, 9, 1, 11, 12, 4, 5, 2, 7], + # ] + # hp = second_1_swap_min_200 = [0, 3, 6, 1, 8, 9, 10, 11, 12, 4, 5, 2, 7] + # start = Skewb( + # (G0, O0, G2, R0), + # (B2, R1, B1, O0), + # (GY, OY, RO, YY, BO), + # ) + # print_path_detailed(start, get_paths_from_heuristic(start, hp)) + + # start = Skewb( + # (G0, O0, G2, R0), + # (B2, R1, B1, O0), + # (GY, OY, RO, YY, BO), + # ) + + start = Skewb( # midswap + top=(G0, R0, B0, O0), + mids=(YY, RY, BY, OY, GO), + bot=(G0, R0, B0, O0), + ) + # start = Skewb( + # top=(G0, O0, B1, R0), + # mids=(YY, OY, GY, RY, BO), + # bot=(B2, O2, G0, R0), + # ) + print(bidirectional_search(start, 100000, solved_skewb)) + print(reverse_path(bidirectional_search(start, 100000, solved_skewb) or [])) + + print() + for path in bidirectional_search_all(start, 100000, solved_skewb): + print(path) + # for hp in good_hps: + # evaluate_permutation(hp, seed=64, sample_size=200) + # evaluate_all_1_swaps(top_down) - evaluate_all_1_swaps_except_first(hp) + # evaluate_all_1_swaps_except_first(hp, 100) + # evaluate_all_1_swaps_except_first(hp, sample_size=10) # start = hard = Skewb((O0, B0, R0, G2), (B0, R0, G1, O0), (BY, RY, GY, OY, YY)) # start = subtle_invalid = Skewb((O0, B0, R0, G2), (B0, R0, G1, O0), (BY, RY, GY, OY, YY)) diff --git a/starchild_teaching.py b/starchild_teaching.py index d8c9278..6127d48 100644 --- a/starchild_teaching.py +++ b/starchild_teaching.py @@ -57,6 +57,8 @@ hand: List[Card] = [ Card(suit="hearts", rank=10), ] +print(hand[0].__str__()) + def suit_first(card: Card) -> Tuple: return (card.suit, card.rank) @@ -70,7 +72,7 @@ def rank_first(card: Card) -> Tuple: # hand.sort(key=rank_first) # print(hand) -print((1, "clubs", "cinnamon") < (1, "clubs", "vanilla")) +# print((1, "clubs", "cinnamon") < (1, "clubs", "vanilla")) # O(N ^ 2)