Skip to main content

debug_moves/
debug_moves.rs

1use atomic_movegen::board::Board;
2use atomic_movegen::movegen;
3use atomic_movegen::types::sq_str;
4use atomic_movegen::types::*;
5use std::collections::HashSet;
6use std::env;
7
8fn main() {
9    atomic_movegen::attacks::init();
10    let args: Vec<String> = env::args().collect();
11    if args.len() < 2 {
12        eprintln!("Usage: debug_moves <fen>");
13        return;
14    }
15    let fen = &args[1];
16    let board = Board::from_fen(fen).expect("Invalid FEN");
17
18    let mut pseudo = MoveList::new();
19    movegen::generate_pseudo_legal(&board, &mut pseudo);
20
21    let mut pseudo_set = HashSet::new();
22    for &m in pseudo.as_slice() {
23        if !pseudo_set.insert((m.from_sq(), m.to_sq(), m.move_type())) {
24            println!(
25                "DUPLICATE PSEUDO-LEGAL: {}{}",
26                sq_str(m.from_sq()),
27                sq_str(m.to_sq())
28            );
29        }
30    }
31
32    let mut legal = MoveList::new();
33    movegen::generate_legal(&board, &mut legal);
34
35    let mut legal_set = HashSet::new();
36    for &m in legal.as_slice() {
37        if !legal_set.insert((m.from_sq(), m.to_sq(), m.move_type())) {
38            println!(
39                "DUPLICATE LEGAL: {}{}",
40                sq_str(m.from_sq()),
41                sq_str(m.to_sq())
42            );
43        }
44    }
45
46    println!(
47        "Pseudo-legal moves: {} (unique: {})",
48        pseudo.len(),
49        pseudo_set.len()
50    );
51    println!("Legal moves: {} (unique: {})", legal.len(), legal_set.len());
52}