Spaces:
Runtime error
Runtime error
| // 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); | |
| } | |
| } | |