@@ -43,14 +43,31 @@ namespace Evaluation {
4343 };
4444
4545 // Bonuses and penalties
46+ // Mobility
4647 constexpr int piece_mobility_factor = 8 ;
4748 constexpr int pawn_mobility_factor = 4 ;
49+ // Pawns
4850 constexpr int isolated_pawn = -16 ;
4951 constexpr int doubled_pawn = -16 ;
5052 constexpr int backward_pawn = -8 ;
5153 constexpr int passed_pawn = 32 ;
54+ // Bonuses
5255 constexpr int bishop_pair = 32 ;
5356 constexpr int move_bonus = 25 ;
57+ constexpr int rook_in_semiopen_file = 20 ;
58+ constexpr int rook_in_open_file = 40 ;
59+ // King safety
60+ constexpr int king_in_the_center = 40 ;
61+ constexpr int king_zone_attacked = 30 ;
62+ constexpr int pawn_shelter_bonus = 20 ;
63+ constexpr int pawn_shelter_small_bonus = 10 ;
64+ constexpr int pawn_storm_close_range = 25 ;
65+ constexpr int pawn_storm_medium_range = 15 ;
66+ constexpr int pawn_storm_long_range = 5 ;
67+ constexpr int enemy_semiopen_king_file = 50 ;
68+ constexpr int own_semiopen_king_file = 60 ;
69+ constexpr int enemy_semiopen_file_next_to_king = 30 ;
70+ constexpr int own_semiopen_file_next_to_king = 20 ;
5471
5572 // Piece values in centipawns
5673 constexpr int pawn_value = 100 ;
@@ -408,8 +425,12 @@ namespace Evaluation {
408425 occupancy >>= 52 ;
409426 piece_mobility += rook_mobility[occupancy][rook_index];
410427 // Semi open file bonus
411- if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (WHITE, PAWN)))
412- score += 20 ;
428+ if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (WHITE, PAWN))) {
429+ if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (BLACK, PAWN)))
430+ score += rook_in_open_file;
431+ else
432+ score += rook_in_semiopen_file;
433+ }
413434 white_rooks &= white_rooks - 1 ;
414435 }
415436
@@ -422,8 +443,12 @@ namespace Evaluation {
422443 occupancy >>= 52 ;
423444 piece_mobility -= rook_mobility[occupancy][rook_index];
424445 // Semi open file bonus
425- if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (BLACK, PAWN)))
426- score -= 20 ;
446+ if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (BLACK, PAWN))) {
447+ if (!(Bitboards::files_bb[rook_index & 7 ] & pos.get_piece_bitboard (WHITE, PAWN)))
448+ score -= rook_in_open_file;
449+ else
450+ score -= rook_in_semiopen_file;
451+ }
427452 black_rooks &= black_rooks - 1 ;
428453 }
429454
@@ -502,7 +527,7 @@ namespace Evaluation {
502527 // Bonus for having the move
503528 // ***********************************************************
504529 if (endgame_percentage < 80 ) {
505- score += (~pos.get_side_to_move () - pos.get_side_to_move ()) * 25 ;
530+ score += (~pos.get_side_to_move () - pos.get_side_to_move ()) * move_bonus ;
506531 }
507532 // ***********************************************************
508533
@@ -523,20 +548,20 @@ namespace Evaluation {
523548 else if ((white_king_square & 7 ) < FILE_D)
524549 king_safety += pawns_info.queen_wing_safety [WHITE];
525550 else
526- king_safety -= 40 ; // king in the center...
551+ king_safety -= king_in_the_center;
527552
528553 if (FILE_E < (black_king_square & 7 ))
529554 king_safety -= pawns_info.king_wing_safety [BLACK];
530555 else if ((black_king_square & 7 ) < FILE_D)
531556 king_safety -= pawns_info.queen_wing_safety [BLACK];
532557 else
533- king_safety += 40 ; // king in the center...
558+ king_safety += king_in_the_center;
534559
535560 if (king_attacks[white_king_square] & black_queens_attacks)
536- king_safety -= 30 ;
561+ king_safety -= king_zone_attacked ;
537562
538563 if (king_attacks[black_king_square] & white_queens_attacks)
539- king_safety += 30 ;
564+ king_safety += king_zone_attacked ;
540565
541566 score += ((king_middlegame_score + king_safety) * middlegame_percentage + king_endgame_score * endgame_percentage) / 100 ;
542567 // ***********************************************************
@@ -583,51 +608,51 @@ namespace Evaluation {
583608 while (white_king_wing_shelter) {
584609 int pawn_index = Bitboards::bit_scan_forward (white_king_wing_shelter);
585610 switch (pawn_index) {
586- case (F2): white_king_wing_safety += 20 ; break ;
587- case (G2): white_king_wing_safety += 20 ; break ;
588- case (H2): white_king_wing_safety += 20 ; break ;
589- case (F3): white_king_wing_safety += 10 ; break ;
590- case (G3): white_king_wing_safety += 10 ; break ;
591- case (H3): white_king_wing_safety += 10 ; break ;
611+ case (F2): white_king_wing_safety += pawn_shelter_bonus ; break ;
612+ case (G2): white_king_wing_safety += pawn_shelter_bonus ; break ;
613+ case (H2): white_king_wing_safety += pawn_shelter_bonus ; break ;
614+ case (F3): white_king_wing_safety += pawn_shelter_small_bonus ; break ;
615+ case (G3): white_king_wing_safety += pawn_shelter_small_bonus ; break ;
616+ case (H3): white_king_wing_safety += pawn_shelter_small_bonus ; break ;
592617 }
593618 white_king_wing_shelter &= white_king_wing_shelter - 1 ;
594619 }
595620
596621 while (white_queen_wing_shelter) {
597622 int pawn_index = Bitboards::bit_scan_forward (white_queen_wing_shelter);
598623 switch (pawn_index) {
599- case (A2): white_queen_wing_safety += 20 ; break ;
600- case (B2): white_queen_wing_safety += 20 ; break ;
601- case (C2): white_queen_wing_safety += 20 ; break ;
602- case (A3): white_queen_wing_safety += 10 ; break ;
603- case (B3): white_queen_wing_safety += 10 ; break ;
604- case (C3): white_queen_wing_safety += 10 ; break ;
624+ case (A2): white_queen_wing_safety += pawn_shelter_bonus ; break ;
625+ case (B2): white_queen_wing_safety += pawn_shelter_bonus ; break ;
626+ case (C2): white_queen_wing_safety += pawn_shelter_bonus ; break ;
627+ case (A3): white_queen_wing_safety += pawn_shelter_small_bonus ; break ;
628+ case (B3): white_queen_wing_safety += pawn_shelter_small_bonus ; break ;
629+ case (C3): white_queen_wing_safety += pawn_shelter_small_bonus ; break ;
605630 }
606631 white_queen_wing_shelter &= white_queen_wing_shelter - 1 ;
607632 }
608633
609634 while (black_king_wing_shelter) {
610635 int pawn_index = Bitboards::bit_scan_forward (black_king_wing_shelter);
611636 switch (pawn_index) {
612- case (F7): black_king_wing_safety += 20 ; break ;
613- case (G7): black_king_wing_safety += 20 ; break ;
614- case (H7): black_king_wing_safety += 20 ; break ;
615- case (F6): black_king_wing_safety += 10 ; break ;
616- case (G6): black_king_wing_safety += 10 ; break ;
617- case (H6): black_king_wing_safety += 10 ; break ;
637+ case (F7): black_king_wing_safety += pawn_shelter_bonus ; break ;
638+ case (G7): black_king_wing_safety += pawn_shelter_bonus ; break ;
639+ case (H7): black_king_wing_safety += pawn_shelter_bonus ; break ;
640+ case (F6): black_king_wing_safety += pawn_shelter_small_bonus ; break ;
641+ case (G6): black_king_wing_safety += pawn_shelter_small_bonus ; break ;
642+ case (H6): black_king_wing_safety += pawn_shelter_small_bonus ; break ;
618643 }
619644 black_king_wing_shelter &= black_king_wing_shelter - 1 ;
620645 }
621646
622647 while (black_queen_wing_shelter) {
623648 int pawn_index = Bitboards::bit_scan_forward (black_queen_wing_shelter);
624649 switch (pawn_index) {
625- case (A7): black_queen_wing_safety += 20 ; break ;
626- case (B7): black_queen_wing_safety += 20 ; break ;
627- case (C7): black_queen_wing_safety += 20 ; break ;
628- case (A6): black_queen_wing_safety += 10 ; break ;
629- case (B6): black_queen_wing_safety += 10 ; break ;
630- case (C6): black_queen_wing_safety += 10 ; break ;
650+ case (A7): black_queen_wing_safety += pawn_shelter_bonus ; break ;
651+ case (B7): black_queen_wing_safety += pawn_shelter_bonus ; break ;
652+ case (C7): black_queen_wing_safety += pawn_shelter_bonus ; break ;
653+ case (A6): black_queen_wing_safety += pawn_shelter_small_bonus ; break ;
654+ case (B6): black_queen_wing_safety += pawn_shelter_small_bonus ; break ;
655+ case (C6): black_queen_wing_safety += pawn_shelter_small_bonus ; break ;
631656 }
632657 black_queen_wing_shelter &= black_queen_wing_shelter - 1 ;
633658 }
@@ -643,39 +668,39 @@ namespace Evaluation {
643668 while (white_king_wing_pawn_storm) {
644669 int pawn_index = Bitboards::bit_scan_forward (white_king_wing_pawn_storm);
645670 switch (pawn_index >> 3 ) {
646- case (RANK_6): black_king_wing_safety -= 25 ; break ;
647- case (RANK_5): black_king_wing_safety -= 15 ; break ;
648- case (RANK_4): black_king_wing_safety -= 5 ; break ;
671+ case (RANK_6): black_king_wing_safety -= pawn_storm_close_range ; break ;
672+ case (RANK_5): black_king_wing_safety -= pawn_storm_medium_range ; break ;
673+ case (RANK_4): black_king_wing_safety -= pawn_storm_long_range ; break ;
649674 }
650675 white_king_wing_pawn_storm &= white_king_wing_pawn_storm - 1 ;
651676 }
652677
653678 while (white_queen_wing_pawn_storm) {
654679 int pawn_index = Bitboards::bit_scan_forward (white_queen_wing_pawn_storm);
655680 switch (pawn_index >> 3 ) {
656- case (RANK_6): black_queen_wing_safety -= 25 ; break ;
657- case (RANK_5): black_queen_wing_safety -= 15 ; break ;
658- case (RANK_4): black_queen_wing_safety -= 5 ; break ;
681+ case (RANK_6): black_queen_wing_safety -= pawn_storm_close_range ; break ;
682+ case (RANK_5): black_queen_wing_safety -= pawn_storm_medium_range ; break ;
683+ case (RANK_4): black_queen_wing_safety -= pawn_storm_long_range ; break ;
659684 }
660685 white_queen_wing_pawn_storm &= white_queen_wing_pawn_storm - 1 ;
661686 }
662687
663688 while (black_king_wing_pawn_storm) {
664689 int pawn_index = Bitboards::bit_scan_forward (black_king_wing_pawn_storm);
665690 switch (pawn_index >> 3 ) {
666- case (RANK_3): white_king_wing_safety -= 25 ; break ;
667- case (RANK_4): white_king_wing_safety -= 15 ; break ;
668- case (RANK_5): white_king_wing_safety -= 5 ; break ;
691+ case (RANK_3): white_king_wing_safety -= pawn_storm_close_range ; break ;
692+ case (RANK_4): white_king_wing_safety -= pawn_storm_medium_range ; break ;
693+ case (RANK_5): white_king_wing_safety -= pawn_storm_long_range ; break ;
669694 }
670695 black_king_wing_pawn_storm &= black_king_wing_pawn_storm - 1 ;
671696 }
672697
673698 while (black_queen_wing_pawn_storm) {
674699 int pawn_index = Bitboards::bit_scan_forward (black_queen_wing_pawn_storm);
675700 switch (pawn_index >> 3 ) {
676- case (RANK_3): white_queen_wing_safety -= 25 ; break ;
677- case (RANK_4): white_queen_wing_safety -= 15 ; break ;
678- case (RANK_5): white_queen_wing_safety -= 5 ; break ;
701+ case (RANK_3): white_queen_wing_safety -= pawn_storm_close_range ; break ;
702+ case (RANK_4): white_queen_wing_safety -= pawn_storm_medium_range ; break ;
703+ case (RANK_5): white_queen_wing_safety -= pawn_storm_long_range ; break ;
679704 }
680705 black_queen_wing_pawn_storm &= black_queen_wing_pawn_storm - 1 ;
681706 }
@@ -684,53 +709,53 @@ namespace Evaluation {
684709 // Open files next to the king
685710 // ***********************************************************
686711 if (!(Bitboards::files_bb[FILE_F] & black_pawns)) {
687- white_king_wing_safety -= 30 ;
688- black_king_wing_safety -= 20 ;
712+ white_king_wing_safety -= enemy_semiopen_file_next_to_king ;
713+ black_king_wing_safety -= own_semiopen_file_next_to_king ;
689714 }
690715 if (!(Bitboards::files_bb[FILE_G] & black_pawns)) {
691- white_king_wing_safety -= 50 ;
692- black_king_wing_safety -= 60 ;
716+ white_king_wing_safety -= enemy_semiopen_king_file ;
717+ black_king_wing_safety -= own_semiopen_king_file ;
693718 }
694719 if (!(Bitboards::files_bb[FILE_H] & black_pawns)) {
695- white_king_wing_safety -= 30 ;
696- black_king_wing_safety -= 20 ;
720+ white_king_wing_safety -= enemy_semiopen_file_next_to_king ;
721+ black_king_wing_safety -= own_semiopen_file_next_to_king ;
697722 }
698723 if (!(Bitboards::files_bb[FILE_A] & black_pawns)) {
699- white_queen_wing_safety -= 30 ;
700- black_queen_wing_safety -= 20 ;
724+ white_queen_wing_safety -= enemy_semiopen_file_next_to_king ;
725+ black_queen_wing_safety -= own_semiopen_file_next_to_king ;
701726 }
702727 if (!(Bitboards::files_bb[FILE_B] & black_pawns)) {
703- white_queen_wing_safety -= 50 ;
704- black_queen_wing_safety -= 60 ;
728+ white_queen_wing_safety -= enemy_semiopen_king_file ;
729+ black_queen_wing_safety -= own_semiopen_king_file ;
705730 }
706731 if (!(Bitboards::files_bb[FILE_C] & black_pawns)) {
707- white_queen_wing_safety -= 30 ;
708- black_queen_wing_safety -= 20 ;
732+ white_queen_wing_safety -= enemy_semiopen_file_next_to_king ;
733+ black_queen_wing_safety -= own_semiopen_file_next_to_king ;
709734 }
710735 if (!(Bitboards::files_bb[FILE_F] & white_pawns)) {
711- black_king_wing_safety -= 30 ;
712- white_king_wing_safety -= 20 ;
736+ black_king_wing_safety -= enemy_semiopen_file_next_to_king ;
737+ white_king_wing_safety -= own_semiopen_file_next_to_king ;
713738 }
714739 if (!(Bitboards::files_bb[FILE_G] & white_pawns)) {
715- black_king_wing_safety -= 50 ;
716- white_king_wing_safety -= 60 ;
740+ black_king_wing_safety -= enemy_semiopen_king_file ;
741+ white_king_wing_safety -= own_semiopen_king_file ;
717742 }
718743 if (!(Bitboards::files_bb[FILE_H] & white_pawns)) {
719- black_king_wing_safety -= 30 ;
720- white_king_wing_safety -= 20 ;
744+ black_king_wing_safety -= enemy_semiopen_file_next_to_king ;
745+ white_king_wing_safety -= own_semiopen_file_next_to_king ;
721746 }
722747
723748 if (!(Bitboards::files_bb[FILE_A] & white_pawns)) {
724- black_queen_wing_safety -= 30 ;
725- white_queen_wing_safety -= 20 ;
749+ black_queen_wing_safety -= enemy_semiopen_file_next_to_king ;
750+ white_queen_wing_safety -= own_semiopen_file_next_to_king ;
726751 }
727752 if (!(Bitboards::files_bb[FILE_B] & white_pawns)) {
728- black_queen_wing_safety -= 50 ;
729- white_queen_wing_safety -= 60 ;
753+ black_queen_wing_safety -= enemy_semiopen_king_file ;
754+ white_queen_wing_safety -= own_semiopen_king_file ;
730755 }
731756 if (!(Bitboards::files_bb[FILE_C] & white_pawns)) {
732- black_queen_wing_safety -= 30 ;
733- white_queen_wing_safety -= 20 ;
757+ black_queen_wing_safety -= enemy_semiopen_file_next_to_king ;
758+ white_queen_wing_safety -= own_semiopen_file_next_to_king ;
734759 }
735760 // ***********************************************************
736761
0 commit comments