Ver Fonte

adding pawn structure to evaluation

Nicolas Winkler há 2 anos atrás
pai
commit
30b44be8a8
1 ficheiros alterados com 24 adições e 1 exclusões
  1. 24 1
      src/evaluate.rs

+ 24 - 1
src/evaluate.rs

@@ -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);