|
@@ -84,6 +84,7 @@ pub fn decrease_mate_in(mut val: PosValue) -> PosValue {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
fn side_value(game: &Game, side: Side) -> u32 {
|
|
|
let adv_pawn_mask = match side { WHITE => ROW_7, BLACK => ROW_2 };
|
|
|
let semi_adv_pawn_mask = match side { WHITE => ROW_6, BLACK => ROW_3 };
|
|
@@ -92,6 +93,26 @@ fn side_value(game: &Game, side: Side) -> u32 {
|
|
|
advanced_pawns + semi_advanced_pawns
|
|
|
}
|
|
|
|
|
|
+fn pawn_structure(game: &Game, side: Side) -> PosValue {
|
|
|
+ let pawns = game.pawns(side);
|
|
|
+ let all_own_pieces = game.get_all_side(side);
|
|
|
+ let all_pieces = all_own_pieces | game.get_all_side(!side);
|
|
|
+
|
|
|
+ let pawn_protect = if side == WHITE {
|
|
|
+ northeast_one(pawns) | northwest_one(pawns)
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ southeast_one(pawns) | southwest_one(pawns)
|
|
|
+ };
|
|
|
+
|
|
|
+ let pawn_pushes = if side == WHITE { north_one(pawns) } else { south_one(pawns) };
|
|
|
+
|
|
|
+ let protections = (pawn_protect & all_own_pieces).count_ones();
|
|
|
+ let pushable_pawns = (pawn_pushes & !all_pieces).count_ones();
|
|
|
+
|
|
|
+ return (protections * 15 + pushable_pawns * 10) as _;
|
|
|
+}
|
|
|
+
|
|
|
fn knight_value(game: &Game, side: Side) -> PosValue {
|
|
|
let knights = game.get_piece(KNIGHT, side);
|
|
|
let ks = BitboardIterator(knights);
|
|
@@ -180,7 +201,9 @@ pub fn evaluate(game: &Game) -> PosValue {
|
|
|
let king_there = king_there(game, game.turn) - king_there(game, !game.turn);
|
|
|
let castling_rights = castling_rights(game, game.turn) - castling_rights(game, !game.turn);
|
|
|
|
|
|
- let mge = sv + kv + king_safety + king_there + castling_rights;
|
|
|
+ let pawn_structure = pawn_structure(game, game.turn) - pawn_structure(game, !game.turn);
|
|
|
+
|
|
|
+ let mge = sv + kv + king_safety + king_there + castling_rights + pawn_structure;
|
|
|
let lge = late_game_eval(game);
|
|
|
|
|
|
let lateness = game_lateness(game);
|