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