piece square evaluation
This commit is contained in:
parent
4a8e1ce52c
commit
32be42e283
5 changed files with 248 additions and 15 deletions
|
|
@ -1,18 +1,74 @@
|
|||
use crate::board::{Board, Color, PieceType};
|
||||
use crate::board::*;
|
||||
use crate::eval::piece_square_tables::PSQT;
|
||||
|
||||
// Pawn, Knight, Bishop, Rook, Queen
|
||||
pub const MATERIAL_WEIGHTS: [i32; 5] = [100, 300, 300, 500, 900];
|
||||
pub const PHASE_WEIGHTS: [i32; 5] = [0, 1, 1, 2, 4];
|
||||
|
||||
pub fn evaluate_board(board: &Board) -> i32 {
|
||||
let mut score = 0_i32;
|
||||
score += board.pieces[PieceType::Pawn as usize][Color::White as usize].count_ones() as i32 * 100;
|
||||
score += board.pieces[PieceType::Knight as usize][Color::White as usize].count_ones() as i32 * 300;
|
||||
score += board.pieces[PieceType::Bishop as usize][Color::White as usize].count_ones() as i32 * 300;
|
||||
score += board.pieces[PieceType::Rook as usize][Color::White as usize].count_ones() as i32 * 500;
|
||||
score += board.pieces[PieceType::Queen as usize][Color::White as usize].count_ones() as i32 * 900;
|
||||
let mut mg_score = 0_i32;
|
||||
let mut eg_score = 0_i32;
|
||||
let mut phase = 0_i32;
|
||||
|
||||
score -= board.pieces[PieceType::Pawn as usize][Color::Black as usize].count_ones() as i32 * 100;
|
||||
score -= board.pieces[PieceType::Knight as usize][Color::Black as usize].count_ones() as i32 * 300;
|
||||
score -= board.pieces[PieceType::Bishop as usize][Color::Black as usize].count_ones() as i32 * 300;
|
||||
score -= board.pieces[PieceType::Rook as usize][Color::Black as usize].count_ones() as i32 * 500;
|
||||
score -= board.pieces[PieceType::Queen as usize][Color::Black as usize].count_ones() as i32 * 900;
|
||||
// --- WHITE PIECES ---
|
||||
// Iterating Pawn (0) to Queen (4) for Material + Phase + PSQT
|
||||
for pt in 0..5 {
|
||||
let mut pieces = board.pieces[pt][Color::White as usize];
|
||||
let count = pieces.count_ones() as i32;
|
||||
|
||||
mg_score += count * MATERIAL_WEIGHTS[pt];
|
||||
eg_score += count * MATERIAL_WEIGHTS[pt];
|
||||
phase += count * PHASE_WEIGHTS[pt];
|
||||
|
||||
score
|
||||
}
|
||||
while pieces > 0 {
|
||||
let sq = pieces.trailing_zeros() as usize;
|
||||
pieces &= pieces - 1; // Clear LS1B
|
||||
|
||||
// Access: [Piece][Color][Phase (0=MG, 1=EG)][Square]
|
||||
mg_score += PSQT[pt][Color::White as usize][0][sq];
|
||||
eg_score += PSQT[pt][Color::White as usize][1][sq];
|
||||
}
|
||||
}
|
||||
|
||||
// King (Index 5) - No Material/Phase weight, only PSQT
|
||||
let mut white_king = board.pieces[5][Color::White as usize];
|
||||
if white_king > 0 {
|
||||
let sq = white_king.trailing_zeros() as usize;
|
||||
mg_score += PSQT[5][Color::White as usize][0][sq];
|
||||
eg_score += PSQT[5][Color::White as usize][1][sq];
|
||||
}
|
||||
|
||||
// --- BLACK PIECES ---
|
||||
// Iterating Pawn (0) to Queen (4)
|
||||
for pt in 0..5 {
|
||||
let mut pieces = board.pieces[pt][Color::Black as usize];
|
||||
let count = pieces.count_ones() as i32;
|
||||
|
||||
mg_score -= count * MATERIAL_WEIGHTS[pt];
|
||||
eg_score -= count * MATERIAL_WEIGHTS[pt];
|
||||
phase += count * PHASE_WEIGHTS[pt];
|
||||
|
||||
while pieces > 0 {
|
||||
let sq = pieces.trailing_zeros() as usize;
|
||||
pieces &= pieces - 1;
|
||||
|
||||
mg_score -= PSQT[pt][Color::Black as usize][0][sq];
|
||||
eg_score -= PSQT[pt][Color::Black as usize][1][sq];
|
||||
}
|
||||
}
|
||||
|
||||
// King (Index 5) for Black
|
||||
let mut black_king = board.pieces[5][Color::Black as usize];
|
||||
if black_king > 0 {
|
||||
let sq = black_king.trailing_zeros() as usize;
|
||||
mg_score -= PSQT[5][Color::Black as usize][0][sq];
|
||||
eg_score -= PSQT[5][Color::Black as usize][1][sq];
|
||||
}
|
||||
|
||||
// Tapered Evaluation Interpolation
|
||||
let phase = phase.min(24); // Clamp to 24 max
|
||||
let mg_phase = phase;
|
||||
let eg_phase = 24 - phase;
|
||||
|
||||
((mg_score * mg_phase) + (eg_score * eg_phase)) / 24
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue