Skip to content

Commit 73866b3

Browse files
committed
New version
- Refactoring - Bugs fixed. - Support for UCI setoption command (hash size option available)
1 parent 9930180 commit 73866b3

24 files changed

+613
-384
lines changed

Linux/src/evaluation.cpp

Lines changed: 94 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Linux/src/main.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "bitboards.h"
2727
#include "attacks.h"
2828
#include "uci.h"
29+
#include "transpositiontable.h"
30+
#include "pawnhashtable.h"
2931

3032
using namespace std;
3133

@@ -35,6 +37,8 @@ int main() {
3537
Position::init();
3638
Bitboards::init();
3739
Attacks::init();
40+
Search::init();
41+
Evaluation::init();
3842

3943
// LICENSE
4044
cout << "**************************************************************" << endl;

Linux/src/move.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,6 @@
2525

2626
#include <string>
2727

28-
/*
29-
0000 quiet move
30-
0001 castling
31-
0010 double push
32-
0100 capture
33-
0101 enpassant
34-
1000 knight promoted
35-
1001 bishop promoted
36-
1010 rook promoted
37-
1011 queen promoted
38-
*/
39-
enum Move_type {
40-
QuietMove = 0,
41-
Castling = 1,
42-
DoublePawnPush = 2,
43-
Capture = 4,
44-
Enpassant = 5,
45-
Promotion = 8,
46-
PromotedKnight = 8,
47-
PromotedBishop = 9,
48-
PromotedRook = 10,
49-
PromotedQueen = 11
50-
};
51-
5228
/*
5329
* Class that represents a move.
5430
* This structures uses an int to store in the first half the move code
@@ -61,6 +37,30 @@ enum Move_type {
6137
class Move {
6238

6339
public:
40+
/*
41+
0000 quiet move
42+
0001 castling
43+
0010 double push
44+
0100 capture
45+
0101 enpassant
46+
1000 knight promoted
47+
1001 bishop promoted
48+
1010 rook promoted
49+
1011 queen promoted
50+
*/
51+
enum Move_type {
52+
QuietMove = 0,
53+
Castling = 1,
54+
DoublePawnPush = 2,
55+
Capture = 4,
56+
Enpassant = 5,
57+
Promotion = 8,
58+
PromotedKnight = 8,
59+
PromotedBishop = 9,
60+
PromotedRook = 10,
61+
PromotedQueen = 11
62+
};
63+
6464
// Default = 0 (invalid move)
6565
Move() {
6666
move = 0;

0 commit comments

Comments
 (0)