kociemba_multiphase/
kociemba_multiphase.rs1use cubing::{
7 alg::{parse_alg, parse_move},
8 kpuzzle::{kpattern_from_json_file, kpuzzle_from_json_file, KPuzzle},
9};
10use twsearch::{
11 _internal::{cli::args::VerbosityLevel, search::search_logger::SearchLogger},
12 experimental_lib_api::{KPuzzleSimpleMaskPhase, MultiPhaseSearch, MultiPhaseSearchOptions},
13};
14
15kpuzzle_from_json_file!(pub(crate), cube3x3x3_centerless, "./kociemba_multiphase/3x3x3-centerless.kpuzzle.json");
16kpattern_from_json_file!(pub(crate), cube3x3x3_centerless_g1_target, "./kociemba_multiphase/3x3x3-G1-centerless.target-pattern.json", cube3x3x3_centerless_kpuzzle());
17
18struct KociembaTwoPhase(MultiPhaseSearch<KPuzzle>);
19
20impl KociembaTwoPhase {
21 pub fn new() -> Self {
22 let kpuzzle = cube3x3x3_centerless_kpuzzle();
23 Self(
24 MultiPhaseSearch::try_new(
25 kpuzzle.clone(),
26 vec![
27 Box::new(
28 KPuzzleSimpleMaskPhase::try_new(
29 "G1 reduction".to_owned(),
30 cube3x3x3_centerless_g1_target_kpattern().clone(),
31 vec![
32 parse_move!("U").to_owned(),
33 parse_move!("L").to_owned(),
34 parse_move!("F").to_owned(),
35 parse_move!("R").to_owned(),
36 parse_move!("B").to_owned(),
37 parse_move!("D").to_owned(),
38 ],
39 Default::default(),
40 )
41 .unwrap(),
42 ),
43 Box::new(
44 KPuzzleSimpleMaskPhase::try_new(
45 "Domino".to_owned(),
46 kpuzzle.default_pattern().clone(),
47 vec![
48 parse_move!("U").to_owned(),
49 parse_move!("L2").to_owned(),
50 parse_move!("F2").to_owned(),
51 parse_move!("R2").to_owned(),
52 parse_move!("B2").to_owned(),
53 parse_move!("D").to_owned(),
54 ],
55 Default::default(),
56 )
57 .unwrap(),
58 ),
59 ],
60 MultiPhaseSearchOptions {
61 search_logger: SearchLogger {
62 verbosity: VerbosityLevel::Info,
63 },
64 ..Default::default()
65 },
66 )
67 .unwrap(),
68 )
69 }
70}
71
72pub fn main() {
73 let kpuzzle = cube3x3x3_centerless_kpuzzle();
74
75 let mut kociemba_two_phase = KociembaTwoPhase::new();
76
77 let scramble = kpuzzle
78 .default_pattern()
79 .apply_alg(parse_alg!(
80 "F B2 L' U2 D' B2 D B' U2 B2 U2 L2 B2 L2 D B2 U' F2 R2 F2 L"
81 ))
82 .unwrap();
83 assert_ne!(scramble, cube3x3x3_centerless_kpuzzle().default_pattern());
84 let solution = kociemba_two_phase
85 .0
86 .chain_first_solution_for_each_phase(&scramble)
87 .unwrap();
88 println!("{}", solution);
89 assert_eq!(
90 scramble.apply_alg(&solution).unwrap(),
91 cube3x3x3_centerless_kpuzzle().default_pattern()
92 );
93}