// perft.rs use crate::position::Position; use crate::movegen::generate_moves; use std::time::Instant; pub fn perft(pos: &mut Position, depth: i32) -> u64 { if depth == 0 { return 1; } let mut nodes = 0; let mut moves = Vec::new(); generate_moves(pos, &mut moves); for m in moves { if pos.do_move(m) { nodes += perft(pos, depth - 1); pos.undo_move(m); } } nodes } pub fn divide(pos: &mut Position, depth: i32) { println!("--- Perft Divide Depth {} ---", depth); let start = Instant::now(); let mut total_nodes = 0; let mut moves = Vec::new(); generate_moves(pos, &mut moves); for m in moves { if pos.do_move(m) { let nodes = perft(pos, depth - 1); pos.undo_move(m); let from = crate::uci::sq_to_str(m.from()); let to = crate::uci::sq_to_str(m.to()); let promo = match m.promotion() { crate::types::PieceType::Queen => "q", crate::types::PieceType::Rook => "r", crate::types::PieceType::Bishop => "b", crate::types::PieceType::Knight => "n", _ => "" }; println!("{}{}{}: {}", from, to, promo, nodes); total_nodes += nodes; } } let elapsed = start.elapsed(); println!("Total nodes: {}", total_nodes); println!("Time elapsed: {:?}", elapsed); if elapsed.as_secs_f64() > 0.0 { println!("NPS: {}", (total_nodes as f64 / elapsed.as_secs_f64()) as u64); } }