Skip to main content

kociemba_multiphase/
kociemba_multiphase.rs

1/* Run using:
2
3    cargo run --package twsearch --release --example kociemba_multiphase
4
5*/
6use 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}