Spaces:
Runtime error
Runtime error
File size: 1,621 Bytes
3014f14 | 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | // 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);
}
}
|