1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use super::{
    index::{index_to_co, index_to_cp, index_to_eo, index_to_ep},
    state::State,
};
use rand::{thread_rng, Rng};

pub fn generate_random_state() -> State {
    let mut rng = thread_rng();
    let mut state = State {
        cp: index_to_cp(rng.gen_range(0..40320)),
        co: index_to_co(rng.gen_range(0..2187)),
        ep: index_to_ep(rng.gen_range(0..479001599)),
        eo: index_to_eo(rng.gen_range(0..2048)),
    };

    let c_perm = state.count_corner_perm();
    let e_perm = state.count_edge_perm();
    let is_even = |a| a % 2 == 0;

    if !is_even(c_perm) && is_even(e_perm) {
        state.cp.swap(0, 1);
    } else if !is_even(e_perm) && is_even(c_perm) {
        state.ep.swap(0, 1);
    }

    state
}