VeloCT_Base / src /perft.rs
Taperx's picture
Deploy Base model with clean official lichess-bot folder
3014f14
Raw
History Blame Contribute Delete
1.62 kB
// 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);
}
}