debug_moves/
debug_moves.rs1use 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}