Line data Source code
1 : #include "logging.hpp"
2 : #include "searcher.hpp"
3 :
4 5790404 : ScoreType Searcher::SEE(const Position& p, const Move& m) {
5 : if (!isValidMove(m)) return 0;
6 :
7 : START_TIMER
8 :
9 : const MType mtype = Move2Type(m);
10 : assert(isValidMoveType(mtype));
11 5790404 : Square from = Move2From(m);
12 5790404 : assert(isValidSquare(from));
13 : const Square to = correctedMove2ToKingDest(m);
14 5790404 : assert(isValidSquare(to));
15 :
16 5790404 : BitBoard attackers = BBTools::allAttackedBB(p, to);
17 : BitBoard occupationMask = 0xFFFFFFFFFFFFFFFF;
18 : ScoreType currentTargetVal = 0;
19 : const bool promPossible = PROMOTION_RANK(to);
20 5790404 : Color c = p.c;
21 :
22 : int nCapt = 0;
23 : array1d<ScoreType,64> swapList; // max 64 caps ... shall be ok (1B2R2B/2BnRnB1/2nBRBn1/RRRRBrrr/2NbrbN1/2bNrNb1/1b2r2b/b3r3 w - - 0 1)
24 :
25 : Piece pp = PieceTools::getPieceType(p, from);
26 5790404 : if (mtype == T_ep) {
27 11871 : swapList[nCapt] = valueSEE(P_wp);
28 : currentTargetVal = valueSEE(pp);
29 11871 : occupationMask &= ~SquareToBitboard(p.ep);
30 : }
31 : else {
32 : const Piece ppTo = PieceTools::getPieceType(p, to);
33 5778533 : swapList[nCapt] = valueSEE(ppTo);
34 5778533 : if (promPossible && pp == P_wp) {
35 4098 : swapList[nCapt] += valueSEE(promShift(mtype)) - valueSEE(P_wp);
36 4098 : currentTargetVal = valueSEE(promShift(mtype));
37 : }
38 : else
39 : currentTargetVal = valueSEE(pp);
40 : }
41 : ++nCapt;
42 : assert(nCapt < 64);
43 :
44 5790404 : attackers &= ~SquareToBitboard(from);
45 5790404 : occupationMask &= ~SquareToBitboard(from);
46 : const BitBoard occupancy = p.occupancy();
47 :
48 5790404 : attackers |= BBTools::attack<P_wr>(to, p.allQueen() | p.allRook(), occupancy & occupationMask, c) |
49 5790404 : BBTools::attack<P_wb>(to, p.allQueen() | p.allBishop(), occupancy & occupationMask, c);
50 5790404 : attackers &= occupationMask;
51 : c = ~c;
52 :
53 10633532 : while (attackers) {
54 13367650 : if (!promPossible && (attackers & p.pieces_const<P_wp>(c)))
55 1464251 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wp>(c)), pp = P_wp;
56 5540141 : else if (attackers & p.pieces_const<P_wn>(c))
57 17787 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wn>(c)), pp = P_wn;
58 5522354 : else if (attackers & p.pieces_const<P_wb>(c))
59 9349 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wb>(c)), pp = P_wb;
60 5513005 : else if (attackers & p.pieces_const<P_wr>(c))
61 1716674 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wr>(c)), pp = P_wr;
62 3796331 : else if (promPossible && (attackers & p.pieces_const<P_wp>(c)))
63 1990 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wp>(c)), pp = P_wp;
64 3794341 : else if (attackers & p.pieces_const<P_wq>(c))
65 1164049 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wq>(c)), pp = P_wq;
66 2630292 : else if ((attackers & p.pieces_const<P_wk>(c)) && !(attackers & p.allPieces[~c]))
67 469028 : from = BBTools::SquareFromBitBoard(attackers & p.pieces_const<P_wk>(c)), pp = P_wk;
68 : else
69 : break;
70 :
71 4843128 : swapList[nCapt] = -swapList[nCapt - 1] + currentTargetVal;
72 : //// pruning here does not influence the result
73 : //if (std::max(-swapList[nCapt-1], swapList[nCapt]) < 0) break; ///@todo ??
74 4843128 : if (promPossible && pp == P_wp) {
75 1990 : swapList[nCapt] += valueSEE(P_wq) - valueSEE(P_wp);
76 : currentTargetVal = valueSEE(P_wq);
77 : }
78 : else
79 : currentTargetVal = valueSEE(pp);
80 :
81 4843128 : ++nCapt;
82 4843128 : attackers &= ~SquareToBitboard(from);
83 4843128 : occupationMask &= ~SquareToBitboard(from);
84 :
85 4843128 : attackers |= BBTools::attack<P_wr>(to, p.allQueen() | p.allRook(), occupancy & occupationMask, c) |
86 4843128 : BBTools::attack<P_wb>(to, p.allQueen() | p.allBishop(), occupancy & occupationMask, c);
87 4843128 : attackers &= occupationMask;
88 :
89 : c = ~c;
90 : }
91 :
92 10633532 : while (--nCapt)
93 4843128 : if (swapList[nCapt] > -swapList[nCapt - 1]) swapList[nCapt - 1] = -swapList[nCapt];
94 : STOP_AND_SUM_TIMER(See)
95 : ///@todo assert fit in ScoreType
96 5790404 : return swapList[0];
97 : }
98 :
99 131877 : bool Searcher::SEE_GE(const Position& p, const Move& m, ScoreType threshold) { return SEE(p, m) >= threshold; }
|