Skip to main content

2x2x2_three_phase/
2x2x2_three_phase.rs

1// Run using: cargo run --package twsearch --release --example 2x2x2_three_phase
2
3use cubing::{alg::parse_move, kpuzzle::kpattern_from_json_file, puzzles::cube2x2x2_kpuzzle};
4use twsearch::{
5    _internal::{cli::args::VerbosityLevel, search::search_logger::SearchLogger},
6    experimental_lib_api::{KPuzzleSimpleMaskPhase, MultiPhaseSearch, MultiPhaseSearchOptions},
7    scramble::{random_scramble_for_event, Event},
8};
9
10kpattern_from_json_file!(
11    pub(crate),
12    phase1,
13    "./2x2x2_three_phase/phase1-D-orientation.kpattern.json",
14    cube2x2x2_kpuzzle()
15);
16
17kpattern_from_json_file!(
18    pub(crate),
19    phase2,
20    "./2x2x2_three_phase/phase2-U-orientation.kpattern.json",
21    cube2x2x2_kpuzzle()
22);
23
24pub fn main() {
25    let kpuzzle = cube2x2x2_kpuzzle();
26
27    // Note: this solver isn't really a "good idea". It's just a convenient test
28    // of three phases, on a puzzle with few-ish states.
29    let mut search = MultiPhaseSearch::try_new(
30        kpuzzle.clone(),
31        vec![
32            Box::new(
33                KPuzzleSimpleMaskPhase::try_new(
34                    "D orientation".to_owned(),
35                    phase1_kpattern().clone(),
36                    vec![
37                        parse_move!("U").to_owned(),
38                        parse_move!("L").to_owned(),
39                        parse_move!("F").to_owned(),
40                        parse_move!("R").to_owned(),
41                        parse_move!("B").to_owned(),
42                        parse_move!("D").to_owned(),
43                    ],
44                    Default::default(),
45                )
46                .unwrap(),
47            ),
48            Box::new(
49                KPuzzleSimpleMaskPhase::try_new(
50                    "U orientation".to_owned(),
51                    phase2_kpattern().clone(),
52                    vec![
53                        parse_move!("U").to_owned(),
54                        parse_move!("F").to_owned(),
55                        parse_move!("R").to_owned(),
56                    ],
57                    Default::default(),
58                )
59                .unwrap(),
60            ),
61            Box::new(
62                KPuzzleSimpleMaskPhase::try_new(
63                    "PBL".to_owned(),
64                    kpuzzle.default_pattern().clone(),
65                    vec![
66                        parse_move!("U").to_owned(),
67                        parse_move!("R2").to_owned(),
68                        parse_move!("F2").to_owned(),
69                        parse_move!("L2").to_owned(),
70                        parse_move!("D").to_owned(),
71                    ],
72                    Default::default(),
73                )
74                .unwrap(),
75            ),
76        ],
77        MultiPhaseSearchOptions {
78            search_logger: SearchLogger {
79                verbosity: VerbosityLevel::Info,
80            },
81            ..Default::default()
82        },
83    )
84    .unwrap();
85
86    let scramble_alg = random_scramble_for_event(Event::Cube2x2x2Speedsolving).unwrap();
87    let scramble = kpuzzle.default_pattern().apply_alg(&scramble_alg).unwrap();
88    println!(
89        "{} // scramble alg
90{} // solution",
91        scramble_alg,
92        search
93            .chain_first_solution_for_each_phase(&scramble)
94            .unwrap()
95    );
96}