Compare commits

..

8 Commits

Author SHA1 Message Date
503e624b3f add 9 movers 2025-06-02 21:11:17 +03:00
6dd45363e7 buh 2025-05-31 21:14:03 +03:00
074878ee9f change settings 2024-09-12 17:05:53 +03:00
e3b065ff53 this never worked lol 2024-08-31 10:18:44 +03:00
acf43781b2 add custom regrip for F floating 2024-08-30 20:52:24 +03:00
0a1c25460e U2' feido 2024-08-25 20:29:19 +03:00
cebfd1a5bf rewrite the config format 2024-08-24 22:21:33 +03:00
473adc64b8 add blacklisting 2024-08-24 18:11:59 +03:00
10 changed files with 816 additions and 220 deletions

View File

@ -13,17 +13,17 @@ from dataclasses import dataclass
from solver import EOLRBSolution, solve_eolrb, create_eolrb_prune_table from solver import EOLRBSolution, solve_eolrb, create_eolrb_prune_table
from scorer import ( from scorer import (
FingerTrickWithRegrip, FingerTrickWithRegrip,
load_config, load_definitions,
generate_finger_tricks, generate_finger_tricks,
build_pretty_string_from_finger_tricks_with_regrips, build_pretty_string_from_finger_tricks_with_regrips,
) )
import heapq import heapq
from typing import List, Any, Generator, Dict from typing import List, Any, Generator, Dict
SOLUTIONS_TO_EVAL = 1000 SOLUTIONS_TO_EVAL = 100
SOLUTIONS_TO_SHOW = 3 SOLUTIONS_TO_SHOW = 3
PRUNE = 10 PRUNE = 9
SOLVE = 7 SOLVE = 7
@ -38,7 +38,8 @@ def get_first_n_from_generator(gen: Generator[Any, None, Any], n: int) -> List[A
try: try:
while len(results) < n: while len(results) < n:
item = next(gen) item = next(gen)
results.append(item) if item not in results:
results.append(item)
except StopIteration: except StopIteration:
pass pass
return results return results
@ -59,19 +60,19 @@ def load_or_generate_prune_table(file_path: str, prune_size: int) -> Dict:
def main(): def main():
config = load_config("./moves.yaml") definitions = load_definitions("./moves.yaml")
prune_table = load_or_generate_prune_table("prune_table.pkl", PRUNE) prune_table = load_or_generate_prune_table("prune_table.pkl", PRUNE)
print("prune table size:", humanize.naturalsize(sys.getsizeof(prune_table))) print("prune table size:", humanize.naturalsize(sys.getsizeof(prune_table)))
# TODO: make this function a method of an object that contains a list of finger tricks # TODO: make this function a method of an object that contains a list of finger tricks
score_func = lambda solution: sum(ft.score() for ft in solution.finger_tricks) score_func = lambda solution: sum(ft.score() for ft in solution.finger_tricks)
data = defaultdict(list) data = defaultdict(list)
# eolrb_states, n_states = eolrb_states_generator(
# list(EOLROrientation), EOLR_PERMUTATIONS
# )
eolrb_states, n_states = eolrb_states_generator( eolrb_states, n_states = eolrb_states_generator(
list(EOLROrientation), EOLR_PERMUTATIONS list(EOLROrientation), EOLR_PERMUTATIONS
) )
# eolrb_states, n_states = eolrb_states_generator(
# [EOLROrientation.Solved], [EOLRPermutation(UR="UR", UL="UL")]
# )
for i, (eolrb_cube, ori, perm, pre_auf) in enumerate(eolrb_states): for i, (eolrb_cube, ori, perm, pre_auf) in enumerate(eolrb_states):
print( print(
f"generating algs for {ori.name} (UR in {perm.UR}, UL in {perm.UL}, pre AUF {pre_auf}) ({i}/{n_states})" f"generating algs for {ori.name} (UR in {perm.UR}, UL in {perm.UL}, pre AUF {pre_auf}) ({i}/{n_states})"
@ -80,7 +81,7 @@ def main():
solutions = get_first_n_from_generator(alg_generator, SOLUTIONS_TO_EVAL) solutions = get_first_n_from_generator(alg_generator, SOLUTIONS_TO_EVAL)
solutions_with_finger_tricks = [ solutions_with_finger_tricks = [
EOLRBSolutionWithFingertricks( EOLRBSolutionWithFingertricks(
solution, generate_finger_tricks(config, solution.alg) solution, generate_finger_tricks(definitions, solution.alg)
) )
for solution in solutions for solution in solutions
] ]
@ -121,7 +122,7 @@ def main():
} }
) )
with open("output.json", "w") as f: with open("output.json", "w") as f:
f.write(json.dumps(data)) f.write(json.dumps(data, indent=4))
if __name__ == "__main__": if __name__ == "__main__":

25
alg_trainer.py Normal file
View File

@ -0,0 +1,25 @@
import json
def main():
with open("./output.json") as f:
data = json.loads(f.read())
covered_cases = set()
for case, scrambles in data.items():
if not scrambles:
continue
scramble = scrambles[0]
if scramble["raw_alg"] in covered_cases:
continue
if scramble["stm"] > 7:
continue
if case.startswith("Solved"):
continue
if "Arrow" in case:
continue
print(f'{case}: "{scramble['alg']}"')
covered_cases.add(scramble["raw_alg"])
if __name__ == "__main__":
main()

View File

@ -211,9 +211,6 @@ def condense_algorithm(moves: List[str]) -> List[str]:
return result return result
reduced_moves = apply_reduction(moves) reduced_moves = apply_reduction(moves)
# print(reduced_moves)
counted_moves = reduce_moves(reduced_moves) counted_moves = reduce_moves(reduced_moves)
# print(counted_moves)
reduced_alg = build_reduced_alg(counted_moves) reduced_alg = build_reduced_alg(counted_moves)
# print(reduced_alg)
return reduced_alg return reduced_alg

View File

@ -1,82 +1,164 @@
# TODO: do a lot of random MU algs and find out which moves are statistically faster fingers:
- name: index
default_score: 1
home_grips:
- BL
- LB
# TODO: change to grip_set
grips:
side:
- B
- BL
- LB
- LF
- FL
- F
top:
- UF
regrips:
- start: UF
end: BL
score: 3
# TODO: this doesn't need to be here
finger: index
- start: UF
end: LB
score: 3
# TODO: this doesn't need to be here
finger: index
- name: ring
default_score: 1
home_grips:
- B
- DB
grips:
slice:
- B
- DB
- DF
- F
regrips: []
- name: pinky
default_score: 1
home_grips:
- DB
- DF
grips:
slice:
- B
- DB
- DF
- F
- F floating
regrips:
- start: F floating
end: F
score: 2
# F floating is hard
# TODO: this doesn't need to be here
finger: pinky
finger_tricks: finger_tricks:
- name: "U push" - name: "U push"
move: "U" move: "U"
grip_pre: grip_pre:
index: BL index: LB
grip_post: grip_post:
index: B index: B
score: 5 grip_pre_blacklist: {}
score: 1001
- name: "U flick" - name: "U flick"
move: "U" move: "U"
grip_pre: grip_pre:
index: F index: F
grip_post: grip_post:
index: BL # TODO: rethink this parameter
score: 4 index: LB
grip_pre_blacklist: {}
score: 1001
- name: "U' push" - name: "U' push"
move: "U'" move: "U'"
grip_pre: grip_pre:
index: FL index: LF
grip_post: grip_post:
index: F index: F
score: 5 grip_pre_blacklist: {}
score: 1000
- name: "U' flick" - name: "U' flick"
move: "U'" move: "U'"
grip_pre: grip_pre:
index: B index: BL
grip_post: grip_post:
index: FL index: LF
score: 3 grip_pre_blacklist: {}
- name: "U2 feido" score: 1000
- name: "U2' feido"
move: "U2" move: "U2"
grip_pre: grip_pre:
index: B index: BL
grip_post: grip_post:
index: F index: F
score: 5 grip_pre_blacklist: {}
score: 1002
- name: "U2 double flick" - name: "U2 double flick"
move: "U2" move: "U2"
grip_pre: grip_pre:
index: B index: BL
grip_post: grip_post:
index: FL index: LF
score: 6 grip_pre_blacklist: {}
score: 1002
- name: "U2' double flick" - name: "U2' double flick"
move: "U2" move: "U2"
grip_pre: grip_pre:
index: F index: F
grip_post: grip_post:
index: BL index: BL
score: 9 grip_pre_blacklist: {}
score: 1002
- name: "U2 beido" - name: "U2 beido"
move: "U2" move: "U2"
grip_pre: grip_pre:
index: F index: F
grip_post: grip_post:
index: B index: B
score: 5 grip_pre_blacklist: {}
score: 1002
- name: "M' ring flick" - name: "M' ring flick"
move: "M'" move: "M'"
grip_pre: grip_pre:
ring: B ring: B
grip_post: grip_post:
ring: DF ring: DF
score: 3 grip_pre_blacklist: {}
score: 1000
- name: "M' pinky flick" - name: "M' pinky flick"
move: "M'" move: "M'"
# I can't do M' after finishing beido
grip_pre: grip_pre:
pinky: B pinky: B
grip_post: grip_post:
pinky: F floating pinky: F floating
score: 6 grip_pre_blacklist:
index:
- BL
- UF
score: 1000
- name: "M push" - name: "M push"
move: "M" move: "M"
grip_pre: grip_pre:
pinky: F pinky: F
grip_post: grip_post:
pinky: DB pinky: DB
score: 6 grip_pre_blacklist: {}
score: 1001
- name: "M index push"
move: "M"
grip_pre:
index: B
grip_post:
index: UF
grip_pre_blacklist: {}
score: 1001
- name: "M2 double flick" - name: "M2 double flick"
move: "M2" move: "M2"
grip_pre: grip_pre:
@ -85,158 +167,5 @@ finger_tricks:
grip_post: grip_post:
pinky: F floating pinky: F floating
ring: DB ring: DB
score: 7 grip_pre_blacklist: {}
regrips: score: 1002
# TODO: rethink this format?
- finger: index
pre: B
post: BL
score: 1
- finger: index
pre: B
post: FL
score: 2
- finger: index
pre: B
post: F
score: 2
- finger: index
pre: BL
post: B
score: 1
- finger: index
pre: BL
post: FL
score: 1
- finger: index
pre: BL
post: F
score: 2
- finger: index
pre: FL
post: B
score: 2
- finger: index
pre: FL
post: BL
score: 1
- finger: index
pre: FL
post: F
score: 1
- finger: index
pre: F
post: B
score: 2
- finger: index
pre: F
post: BL
score: 2
- finger: index
pre: F
post: FL
score: 1
- finger: ring
pre: B
post: DB
score: 1
- finger: ring
pre: B
post: DF
score: 2
- finger: ring
pre: DB
post: B
score: 2
- finger: ring
pre: DB
post: DF
score: 1
- finger: ring
pre: DF
post: B
score: 2
- finger: ring
pre: DF
post: DB
score: 1
- finger: pinky
pre: B
post: DB
score: 1
- finger: pinky
pre: B
post: DF
score: 2
- finger: pinky
pre: B
post: F
score: 2
- finger: pinky
pre: B
post: F floating
score: 2
- finger: pinky
pre: DB
post: B
score: 1
- finger: pinky
pre: DB
post: DF
score: 1
- finger: pinky
pre: DB
post: F
score: 2
- finger: pinky
pre: DB
post: F floating
score: 2
- finger: pinky
pre: DF
post: B
score: 2
- finger: pinky
pre: DF
post: DB
score: 1
- finger: pinky
pre: DF
post: F
score: 1
- finger: pinky
pre: DF
post: F floating
score: 1
- finger: pinky
pre: F
post: B
score: 3
- finger: pinky
pre: F
post: DB
score: 2
- finger: pinky
pre: F
post: DF
score: 1
- finger: pinky
pre: F
post: F floating
score: 1
- finger: pinky
pre: F floating
post: B
score: 2
- finger: pinky
pre: F floating
post: DB
score: 2
- finger: pinky
pre: F floating
post: DF
score: 2
- finger: pinky
pre: F floating
post: F
score: 2

149
roux_7_movers.txt Normal file
View File

@ -0,0 +1,149 @@
U' M U' M' U' M' U' M' U' M2
M' U' M' U M U2 M U'
U M' U2 M U M' U M U'
M' U' M' U' M U2 M U'
U' M' U2 M U' M' U' M U'
M' U' M' U' M' U2 M U M2
M' U' M' U2 M' U2 M U M2
M' U' M U2 M' U2 M' U' M2
M' U' M' U' M U2 M' U' M2
M' U' M' U' M' U2 M' U
M' U' M' U2 M U2 M' U M2
U M U M' U M' U M U'
M' U' M' U2 M' U2 M' U'
U' M U' M' U' M' U' M U
M' U' M' U M' U2 M' U
M' U' M' U M U2 M' U' M2
M' U' M U' M' U2 M' U' M2
M' U' M U' M U2 M' U
M' U' M U M' U2 M U
U' M U' M' U' M' U M' U' M2
M' U' M U' M U2 M U' M2
M' U' M U' M' U2 M U
U' M' U2 M U' M' U M' U' M2
M' U' M U M U2 M' U
M' U' M U M' U2 M' U' M2
M' U M' U2 M' U2 M U' M2
U M' U M' U' M' U' M' U'
U2 M U' M U M' U2 M' U
U2 M U' M' U2 M' U2 M U'
U2 M U M' U2 M' U2 M U'
U M' U2 M' U M' U M U' M2
U2 M U' M U' M' U2 M' U
U' M' U2 M' U' M' U' M U' M2
U2 M U' M U' M U2 M' U' M2
U2 M U' M U' M' U2 M U M2
U' M' U2 M' U' M' U M'
U2 M U' M' U2 M U2 M' U'
U' M' U M U M U M' U
U2 M U M' U2 M' U2 M' U' M2
U M' U' M U' M U' M' U'
U M' U M' U' M' U' M U' M2
U2 M U M' U M U2 M' U'
U2 M U' M' U' M U2 M U M2
U2 M U' M' U' M' U2 M U'
U2 M U' M' U M U2 M' U'
U' M' U' M' U M' U M U' M2
U2 M U' M' U' M U2 M' U'
U M' U' M U' M U M'
U2 M U' M' U M U2 M U' M2
U2 M U' M' U M' U2 M U
U2 M U' M U M' U2 M U' M2
M' U2 M U2 M' U' M' M2
M' U2 M' U2 M' U' M' U2
U M' U2 M' U2 M' U' M U M2
U M' U2 M' U2 M' U M U' M2
M U' M U' M' U' M U' M2
M' U' M U' M' U M U
M U' M U' M' U M U' M2
M' U' M U' M' U' M' U' M2
M' U M U M' U M' U' M2
M' U M U M' U' M' U2 M2
M U' M U' M' U M' U'
U M U' M' U2 M' U M U
M' U' M U' M' U' M U
U M U' M U2 M' U M' U
M U M U M' U' M' U2
M' U' M U' M' U M' U' M2
M U M U M' U M' U
M U' M U' M' U' M' U
U M U' M' U2 M' U M' U2 M2
U M U' M' U2 M' U' M' U' M2
M' U M U M' U M U
U' M U M' U2 M' U M U'
U2 M' U' M' U' M U' M' U M2
U' M' U' M' U2 M U' M' U M2
U M' U M' U2 M U M' U M2
U2 M U' M' U' M U M' U'
U2 M' U' M' U' M U M' U M2
U2 M U M' U M U' M'
U2 M' U' M' U' M U M U
U' M' U' M U2 M U M' U'
U' M' U' M' U2 M U M U'
U2 M' U M' U M U' M' M2
U2 M U' M' U' M U M U M2
U2 M U' M' U' M U' M' U'
U2 M' U M' U M U M U'
U' M' U' M' U2 M U M' U2 M2
U2 M' U' M' U' M U' M U'
U2 M' U M' U M U' M U
U2 M U M' U M U' M U M2
U M' U M U2 M U M' U
U2 M U M' U M U M' U'
U' M2 U' M U' M2 U M' U2
U' M2 U' M U2 M2 U M' U2
M' U' M' U' M' U M'
U2 M' U2 M' U' M U M U
M' U M U' M U' M' U'
U M' U2 M' U M U M' M2
U2 M U M' U' M' U' M U
U' M' U M' U M' U' M' U
U' M' U2 M U' M U' M' U'
M' U' M' U' M' U' M' U'
U M' U2 M' U M U' M U'
U2 M' U2 M' U' M U M' M2
U' M' U' M U M U M' U'
U M U' M' U M' U M U
U2 M' U2 M' U' M U' M' U M2
M' U2 M U M U M' U
U M' U2 M' U M U' M' M2
M' U' M' U' M' U' M U' M2
U M U M U M U M' U' M2
U2 M U' M U' M U' M' U' M2
U' M' U M' U M' U M U' M2
U' M' U M' U2 M' U M' U
U M U M' U2 M U' M' U
M' U' M' U2 M' U M' U
U' M' U M U2 M' U M' U2 M2
M' U' M' U2 M' U' M' U
U2 M U' M' U2 M U M' U
U2 M U' M' U2 M U M U M2
M' U' M U2 M' U M' U' M2
U M U M U2 M U M' U' M2
U' M' U M' U2 M' U M U M2
U M U M' U2 M U M U' M2
M' U' M' U2 M' U M U M2
U2 M U' M U2 M U M' U M2
U' M U2 M' U2 M' U' M' U' M2
U' M' U2 M' U2 M U M U'
U M' U2 M' U2 M U' M' U M2
U2 M' U M U' M' U' M U'
M' U' M U M' U' M U
M' U M U' M' U M U
U2 M U' M' U M U M U M2
U2 M U M' U' M U' M U M2
M' U' M U M' U M' U' M2
M' U M U' M' U' M' U' M2
M' U' M U M' U M U
U2 M' U' M U M' U' M' U2 M2
M U M' U' M U M U M2
M U' M' U M U' M'
U2 M U M' U' M U' M'
U M' U' M' U M U' M' M2
U2 M' U M' U' M U' M' U2 M2
U M' U' M' U M U M
U2 M U' M U M' U M' U
U2 M U M U' M' U' M' U
U' M U M U' M' U' M U M2
M' U M' U' M U' M U'
U2

183
roux_9_movers.txt Normal file
View File

@ -0,0 +1,183 @@
U M' U' M2 U M' U' M U' M U M2
U M' U' M2 U' M' U M U M U M2
M U' M2 U' M' U2 M' U2 M' U
M' U' M' U2 M U2 M' U' M2 U'
U M' U M2 U' M U' M' U M' U'
U M2 U' M U M' U' M' U' M U' M2
U M2 U M' U' M' U' M' U M' U' M2
M' U' M U' M2 U' M' U2 M U' M2
U M' U' M2 U' M' U M U' M U' M2
M' U' M' U' M2 U M U2 M' U'
M' U' M' U' M2 U M' U2 M' U M2
M' U M U' M2 U' M' U2 M U' M2
M' U' M' U' M2 U' M' U2 M' U' M2
U M' U' M2 U M' U' M U' M' U
M' U' M U' M U2 M' U' M2 U' M2
U M' U' M U' M' U M2 U M U' M2
U M' U' M' U' M2 U M' U M U
U2 M' U' M2 U' M' U2 M' U2 M' U' M2
U2 M' U' M2 U' M U2 M' U2 M U M2
U M2 U' M U' M' U M' U M U' M2
U2 M' U' M2 U' M' U' M' U2 M U
U M' U M' U' M U' M2 U M' U'
U2 M' U' M2 U' M' U M U2 M U' M2
U2 M' U' M2 U' M' U M U2 M' U
U2 M' U' M2 U' M' U M' U2 M' U' M2
U M' U' M U' M' U M2 U' M' U
U M' U2 M' U M U M2 U' M' U2
U' M2 U' M' U' M' U' M' U M' U' M2
U' M' U' M U' M2 U' M' U M' U
M U2 M U2 M' U' M2 U' M' U2 M2
M U2 M' U2 M' U' M2 U' M'
U' M' U2 M' U2 M' U' M U' M2 U'
U M' U2 M' U2 M' U' M2 U2 M' U M2
U' M' U2 M' U2 M' U' M U M2 U'
U M' U2 M' U2 M' U' M' U' M2 U M2
U M' U2 M U2 M' U' M2 U2 M' U
U M' U2 M' U2 M' U' M' U M2 U M2
U M' U2 M' U2 M' U' M U2 M2 U'
U M' U2 M U2 M' U' M U M2 U' M2
U M' U2 M U2 M' U' M U' M2 U' M2
U M' U2 M U2 M' U' M U2 M2 U' M2
U' M' U' M2 U' M' U2 M U M U' M2
U' M' U2 M2 U M' U2 M U M' U
M' U' M2 U M' U M' U M U'
M' U' M2 U' M U M U' M' U M2
M' U' M U' M' U M' U M2 U
M' U' M' U' M2 U M U M' U'
M' U' M U' M U M2 U M' U M2
M U M2 U' M' U' M' U M'
M U' M' U' M2 U M U' M' U' M2
U' M' U' M2 U' M' U2 M U' M' U
U M' U2 M2 U' M' U2 M U M U M2
U M' U M2 U M' U2 M U M' U'
M' U' M U' M' U' M' U2 M2 U
M' U' M U' M U M2 U M U'
M' U' M' U' M2 U M U M U M2
M' U' M' U' M2 U M U' M' U'
M' U' M2 U' M U M U M' U' M2
U M' U2 M2 U' M' U2 M U' M' U'
U M U' M' U2 M U M2 U M' U M2
M' U' M U' M U' M2 U M' M2
M' U' M U' M U2 M2 U' M' U2 M2
M' U M' U' M2 U' M' U M' U' M2
M' U M' U2 M2 U M U' M' U'
M' U M' U M2 U' M U' M U M2
M' U2 M2 U' M' U M U' M'
U2 M' U' M U' M2 U M' U M' U
U2 M' U' M' U' M U M2 U2 M' U'
U2 M' U' M' U' M' U M2 U M' U' M2
M2 U' M U' M U2 M' U' M' M2
U2 M' U' M2 U' M' U M' U M' U' M2
U2 M' U' M' U' M U M U M2 U M2
U2 M' U' M U' M2 U M' U' M' U
U2 M' U' M' U' M U' M2 U2 M U' M2
U2 M' U' M' U' M' U M2 U' M' U M2
U M2 U' M' U' M U2 M' U' M' U'
U' M2 U2 M' U' M U2 M' U' M' U
U' M' U' M' U2 M' U M2 U M U'
U2 M U' M' U' M' U M2 U' M' U
U2 M U' M' U' M U M2 U2 M' U M2
U2 M U' M' U' M' U M2 U M' U
U2 M U' M U' M2 U M' U M' U' M2
U2 M U' M2 U' M' U M' U M U M2
U M2 U2 M' U M' U2 M' U M' U' M2
U2 M' U M U M2 U' M' U' M' U'
M2 U' M U' M' U2 M' U' M U' M2
U2 M U' M' U' M' U2 M2 U' M'
U2 M' U' M' U' M' U2 M2 U' M' M2
U2 M' U' M2 U' M' U M' U M U
U2 M U M U2 M2 U M' U' M U
U2 M U M U M2 U' M' U' M' U' M2
M' U' M' U' M U M2 U M'
U M' U' M2 U' M U M' U M' U
U M' U' M2 U' M U M' U' M' U
U' M2 U' M' U' M U M' U2 M U' M2
M2 U M' U' M U' M' U2 M U' M2
U' M2 U' M' U' M' U' M U2 M' U
U M2 U' M U' M U' M' U2 M' U' M2
U' M2 U' M' U' M' U' M' U2 M U'
U' M' U' M U M' U' M2 U' M' U
U' M2 U' M' U' M U' M' U2 M U' M2
M' U' M' U' M' U' M2 U2 M' U' M2
M' U' M' U' M' U M U M2 U
M' U' M' U' M U M2 U' M'
M2 U M' U' M' U' M U2 M U' M2
M2 U M' U' M' U' M' U2 M U
U M2 U' M U' M' U2 M' U2 M U M2
M2 U M' U' M U2 M' U2 M' U'
U' M2 U' M' U' M U2 M' U2 M' U
M2 U M' U' M' U2 M' U2 M U
M' U' M' U' M' U M U2 M2 U'
U M2 U M U' M' U' M U M' U' M2
U2 M2 U' M' U' M' U' M U M' U'
U M2 U M' U' M' U' M U M' U
M2 U' M' U' M U' M' U M U' M2
U2 M2 U' M U' M' U' M U' M' U M2
U' M' U M' U2 M' U' M2 U2 M' U' M2
M2 U' M' U M U M' U M U' M2
U M' U' M2 U' M' U2 M' U' M U'
U' M2 U2 M U' M' U2 M' U' M' U
U2 M2 U' M U M' U M U M' U M2
U M' U' M2 U' M' U2 M' U' M' M2
U M' U' M2 U' M U2 M' U' M' U2
U' M2 U M' U' M U' M' U' M U' M2
U2 M2 U' M' U' M' U' M U' M' U
M' U' M' U2 M U M2 U M' U'
U M2 U M U' M' U' M U' M' U M2
M2 U' M U' M U' M' U' M U'
U2 M U' M U2 M' U M2 U M U
M2 U' M U' M U' M' U M' U2 M2
U2 M' U2 M2 U' M U2 M' U' M' U'
U2 M' U M2 U M' U2 M' U M' U' M2
M2 U' M' U' M U' M' U M' U
M' U' M' U2 M U M2 U M U' M2
M' U' M' U2 M U M2 U' M'
U M' U2 M2 U M U2 M' U M' U'
U M2 U2 M' U' M U2 M U' M' U' M2
U' M2 U M U' M U' M' U M' U2 M2
U' M' U M' U2 M' U M U2 M2 U'
M2 U2 M U M' U2 M' U M' U'
U M' U2 M' U2 M' U' M2 U' M' U M2
U M U2 M U2 M' U' M2 U2 M' U M2
U M' U2 M U2 M' U' M2 U M' U
M2 U' M U2 M' U2 M' U' M' U2
U M2 U' M' U2 M U2 M' U' M'
M2 U' M U2 M U2 M' U' M' M2
U' M2 U' M' U2 M' U2 M' U' M' M2
U' M' U2 M U2 M' U' M2 U' M' U'
U M' U2 M' U2 M U M2 U2 M' U'
U M' U2 M' U2 M' U' M2 U M U
U2 M2 U' M U2 M' U2 M' U M U' M2
U' M2 U' M' U2 M U2 M' U' M U' M2
U2 M2 U' M U2 M' U2 M' U' M U' M2
U M2 U' M' U2 M' U2 M' U' M U'
M2 U M U2 M U2 M' U' M' U M2
U M' U2 M' U2 M U' M U2 M2 U' M2
U M' U2 M' U2 M' U' M2 U M' U' M2
U M U2 M' U2 M' U' M2 U2 M' U'
U M U2 M' U2 M' U' M U2 M2 U M2
U M' U2 M U2 M' U' M2 U M U M2
U M2 U M' U2 M U2 M' U' M' U'
U' M2 U M' U2 M' U2 M' U' M' U' M2
M' U' M2 U' M' U' M' U' M U'
U M2 U' M' U M U' M' U' M' U'
U2 M' U M U' M U' M2 U M' U' M2
M2 U' M' U' M' U M U' M' U
M' U' M2 U' M' U' M' U M U'
U2 M U M' U' M' U' M2 U M' U
M2 U' M' U' M' U M U M' U
M2 U' M' U M' U' M U' M' U
U2 M2 U' M U' M U M' U M U'
M' U' M' U2 M2 U M U' M' U'
M2 U' M' U' M' U M U M U' M2
M' U' M' U' M2 U' M' U M' U' M2
U2 M' U' M2 U' M' U' M' U M' M2
U M2 U' M' U' M U M' U' M' U'
M' U' M2 U' M U' M U M' M2
M' U2 M2 U M' U M U M M2
M' U2 M2 U M' U M U' M'
U2 M' U' M2 U M' U' M' U' M' U M2
M' U' M U M2 U' M' U' M U' M2
U M' U M' U' M' U' M2 U M' M2
U2

24
roux_trainer.py Normal file
View File

@ -0,0 +1,24 @@
import json
def main():
with open("./output.json") as f:
data = json.loads(f.read())
covered_cases = set()
for case, scrambles in data.items():
if not scrambles:
continue
scramble = scrambles[0]
if scramble["raw_alg"] in covered_cases:
continue
if scramble["stm"] != 9:
continue
if case.startswith("Solved"):
continue
print(scramble["alg"])
covered_cases.add(scramble["raw_alg"])
print("U2")
if __name__ == "__main__":
main()

174
scorer.py
View File

@ -1,4 +1,4 @@
from typing import Dict, List from typing import Dict, List, Set, Tuple
import yaml import yaml
import dacite import dacite
from dataclasses import dataclass from dataclasses import dataclass
@ -8,13 +8,14 @@ from dataclasses import dataclass
class FingerTrick: class FingerTrick:
name: str name: str
move: str move: str
grip_pre_blacklist: Dict[str, List[str]]
grip_pre: Dict[str, str] grip_pre: Dict[str, str]
grip_post: Dict[str, str] grip_post: Dict[str, str]
score: float score: float
@dataclass @dataclass
class Regrip: class Grip:
finger: str finger: str
pre: str pre: str
post: str post: str
@ -22,23 +23,104 @@ class Regrip:
@dataclass @dataclass
class Config: class Regrip:
finger_tricks: List[FingerTrick] finger: str
start: str
end: str
score: float
@dataclass
class Finger:
name: str
default_score: int
home_grips: List[str]
grips: Dict[str, List[str]]
regrips: List[Regrip] regrips: List[Regrip]
def home_grip() -> Dict[str, str]: @dataclass
return { class Config:
"index": "B", # this could also be BL fingers: List[Finger]
"ring": "B", finger_tricks: List[FingerTrick]
"pinky": "BD",
}
def load_config(file_path: str) -> Config: @dataclass
class Definitions:
fingers: List[Finger]
finger_tricks: List[FingerTrick]
finger_regrips: List[Regrip]
def build_missing_regrips(
finger_regrips: Dict[Tuple[str, str], Regrip], finger: Finger, grips: Set[str]
) -> Dict[Tuple[str, str], Regrip]:
# this might just be the worst piece of code I have ever written
# fill in missing regrips so every pair of grips has a regrip
for grip_start in grips:
for grip_end in grips:
if grip_start != grip_end:
if (grip_start, grip_end) not in finger_regrips:
# TODO: this only works for regrips which are 2 apart
possible_start_regrips = {
grips: regrip
for grips, regrip in finger_regrips.items()
if grip_start == regrip.start
}
possible_end_regrips = {
grips: regrip
for grips, regrip in finger_regrips.items()
if grip_end == regrip.end
}
for start_regrip in possible_start_regrips.values():
for end_regrip in possible_end_regrips.values():
# if start grips ends at the beginning of end grip
if start_regrip.end == end_regrip.start:
finger_regrips[(start_regrip.start, end_regrip.end)] = (
Regrip(
finger=finger.name,
start=start_regrip.start,
end=end_regrip.end,
score=start_regrip.score + end_regrip.score,
)
)
return finger_regrips
def build_regrips_from_fingers(fingers: List[Finger]) -> List[Regrip]:
regrips = []
for finger in fingers:
finger_regrips = {}
for grip_set in finger.grips.values():
# reate a dict with distances of every two elements in a list
for i, grip_start in enumerate(grip_set):
for j, grip_end in enumerate(grip_set):
if grip_start != grip_end:
finger_regrips[(grip_start, grip_end)] = Regrip(
start=grip_start,
end=grip_end,
score=abs(j - i) * finger.default_score,
finger=finger.name,
)
for regrip in finger.regrips:
finger_regrips[(regrip.start, regrip.end)] = regrip
grips = {grip for grip_set in finger.grips.values() for grip in grip_set}
finger_regrips = build_missing_regrips(finger_regrips, finger, grips)
regrips.extend(finger_regrips.values())
return regrips
def load_definitions(file_path: str) -> Definitions:
with open(file_path, "r") as f: with open(file_path, "r") as f:
data_dict = yaml.safe_load(f.read()) data_dict = yaml.safe_load(f.read())
return dacite.from_dict(data_class=Config, data=data_dict) config = dacite.from_dict(data_class=Config, data=data_dict)
return Definitions(
fingers=config.fingers,
finger_tricks=config.finger_tricks,
finger_regrips=build_regrips_from_fingers(config.fingers),
)
def grip_correct(current_grip: Dict[str, str], required_grip: Dict[str, str]): def grip_correct(current_grip: Dict[str, str], required_grip: Dict[str, str]):
@ -59,47 +141,69 @@ class FingerTrickWithRegrip:
return score return score
def calculate_finger_trick_regrips( @dataclass
config: Config, finger_trick: FingerTrick, grip: Dict[str, str] class Algorithm:
score: float
finger_tricks_with_regrips: List[FingerTrickWithRegrip]
def find_finger_trick_regrips(
regrips: List[Regrip], finger_trick: FingerTrick, grip: Dict[str, str]
) -> List[Regrip]: ) -> List[Regrip]:
regrips = [] alg_regrips = []
for finger in finger_trick.grip_pre.keys(): for finger in finger_trick.grip_pre.keys():
current_location = grip[finger] current_location = grip[finger]
desired_location = finger_trick.grip_pre.get(finger) desired_location = finger_trick.grip_pre.get(finger)
blacklisted_locations = finger_trick.grip_pre_blacklist.get(finger, [])
if current_location != desired_location: if current_location != desired_location:
regrip = next( # print("FINGA", finger)
# print("CURRENT", current_location)
# print("DESIRED", desired_location)
# print("BLACK", blacklisted_locations)
# __import__("pprint").pprint(regrips)
alg_regrip = next(
( (
regrip regrip
for regrip in config.regrips for regrip in regrips
if regrip.finger == finger if regrip.finger == finger
and regrip.pre == current_location and regrip.start == current_location
and regrip.post == desired_location and regrip.end == desired_location
and regrip.start not in blacklisted_locations
), ),
None,
) )
if regrip: if alg_regrip:
regrips.append(regrip) alg_regrips.append(alg_regrip)
return regrips return alg_regrips
def generate_home_grip(fingers: List[Finger]) -> Dict[str, str]:
# TODO: make this smarter
home_grip = {}
for finger in fingers:
home_grip[finger.name] = finger.home_grips[0]
return home_grip
def generate_finger_tricks( def generate_finger_tricks(
config: Config, moves: List[str] definitions: Definitions, moves: List[str]
) -> List[FingerTrickWithRegrip]: ) -> List[FingerTrickWithRegrip]:
grip = home_grip() grip = generate_home_grip(definitions.fingers)
alg = [] alg: List[FingerTrickWithRegrip] = []
for move in moves: for move in moves:
# print("current grip:", grip) # print("current grip:", grip)
# prit("current move:", move) # prit("current move:", move)
possible_finger_tricks = [ possible_finger_tricks = [
finger_trick finger_trick
for finger_trick in config.finger_tricks for finger_trick in definitions.finger_tricks
if move == finger_trick.move if move == finger_trick.move
] ]
# print("possible finger tricks:", possible_finger_tricks) # print("possible finger tricks:", possible_finger_tricks)
finger_tricks_with_regrips = [ finger_tricks_with_regrips = [
FingerTrickWithRegrip( FingerTrickWithRegrip(
finger_trick=finger_trick, finger_trick=finger_trick,
regrips=calculate_finger_trick_regrips(config, finger_trick, grip), regrips=find_finger_trick_regrips(
definitions.finger_regrips, finger_trick, grip
),
) )
for finger_trick in possible_finger_tricks for finger_trick in possible_finger_tricks
] ]
@ -109,10 +213,14 @@ def generate_finger_tricks(
# print("best finger trick:", best_finger_trick) # print("best finger trick:", best_finger_trick)
# apply regrips # apply regrips
for regrip in best_finger_trick.regrips: for regrip in best_finger_trick.regrips:
grip[regrip.finger] = regrip.post grip[regrip.finger] = regrip.end
# apply move # apply move
grip.update(best_finger_trick.finger_trick.grip_post) grip.update(best_finger_trick.finger_trick.grip_post)
alg.append(best_finger_trick) alg.append(best_finger_trick)
# TODO: think about this
# don't count the first regrip
# alg[0].finger_trick.score = 0
return alg return alg
@ -123,7 +231,11 @@ def build_pretty_string_from_finger_tricks_with_regrips(
for finger_trick_with_regrips in finger_tricks_with_regrips: for finger_trick_with_regrips in finger_tricks_with_regrips:
for regrip in finger_trick_with_regrips.regrips: for regrip in finger_trick_with_regrips.regrips:
elems.append(f"regrip {regrip.finger} from {regrip.pre} to {regrip.post}") elems.append(
elems.append(finger_trick_with_regrips.finger_trick.name) f"regrip {regrip.finger} from {regrip.start} to {regrip.end} ({regrip.score})"
)
elems.append(
f"{finger_trick_with_regrips.finger_trick.name} ({finger_trick_with_regrips.finger_trick.score})"
)
return elems return elems

View File

@ -56,11 +56,16 @@ def create_eolrb_prune_table(prune_depth: int):
generator = lse_brute_force_generator(prune_depth) generator = lse_brute_force_generator(prune_depth)
pruned = 0
# TODO: for every solved state (pre auf), we can apply the generator's moves and save to prune table? # TODO: for every solved state (pre auf), we can apply the generator's moves and save to prune table?
for alg in generator: for alg in generator:
cube.reset() cube.reset()
cube.alg(" ".join(alg)) cube.alg(" ".join(alg))
prune_table[cube.eolrb_hash()].append(reverse_algorithm(alg)) prune_table[cube.eolrb_hash()].append(reverse_algorithm(alg))
pruned += 1
if pruned % 1000 == 0:
print(pruned)
return prune_table return prune_table

171
weighted_moves.yaml Normal file
View File

@ -0,0 +1,171 @@
fingers:
- name: index
default_score: 1
home_grips:
- BL
- LB
# TODO: change to grip_set
grips:
side:
- B
- BL
- LB
- LF
- FL
- F
top:
- UF
regrips:
- start: UF
end: BL
score: 3
# TODO: this doesn't need to be here
finger: index
- start: UF
end: LB
score: 3
# TODO: this doesn't need to be here
finger: index
- name: ring
default_score: 1
home_grips:
- B
- DB
grips:
slice:
- B
- DB
- DF
- F
regrips: []
- name: pinky
default_score: 1
home_grips:
- DB
- DF
grips:
slice:
- B
- DB
- DF
- F
- F floating
regrips:
- start: F floating
end: F
score: 2
# F floating is hard
# TODO: this doesn't need to be here
finger: pinky
finger_tricks:
- name: "U push"
move: "U"
grip_pre:
index: LB
grip_post:
index: B
grip_pre_blacklist: {}
score: 5
- name: "U flick"
move: "U"
grip_pre:
index: F
grip_post:
# TODO: rethink this parameter
index: LB
grip_pre_blacklist: {}
score: 4
- name: "U' push"
move: "U'"
grip_pre:
index: LF
grip_post:
index: F
grip_pre_blacklist: {}
score: 5
- name: "U' flick"
move: "U'"
grip_pre:
index: BL
grip_post:
index: LF
grip_pre_blacklist: {}
score: 3
- name: "U2' feido"
move: "U2"
grip_pre:
index: BL
grip_post:
index: F
grip_pre_blacklist: {}
score: 5
- name: "U2 double flick"
move: "U2"
grip_pre:
index: BL
grip_post:
index: LF
grip_pre_blacklist: {}
score: 6
- name: "U2' double flick"
move: "U2"
grip_pre:
index: F
grip_post:
index: BL
grip_pre_blacklist: {}
score: 9
- name: "U2 beido"
move: "U2"
grip_pre:
index: F
grip_post:
index: B
grip_pre_blacklist: {}
score: 5
- name: "M' ring flick"
move: "M'"
grip_pre:
ring: B
grip_post:
ring: DF
grip_pre_blacklist: {}
score: 3
- name: "M' pinky flick"
move: "M'"
# I can't do M' after finishing beido
grip_pre:
pinky: B
grip_post:
pinky: F floating
grip_pre_blacklist:
index:
- BL
- UF
score: 6
- name: "M push"
move: "M"
grip_pre:
pinky: F
grip_post:
pinky: DB
grip_pre_blacklist: {}
score: 5
- name: "M index push"
move: "M"
grip_pre:
index: B
grip_post:
index: UF
grip_pre_blacklist: {}
score: 6
- name: "M2 double flick"
move: "M2"
grip_pre:
pinky: B
ring: B
grip_post:
pinky: F floating
ring: DB
grip_pre_blacklist: {}
score: 7