}
int Position::see(Move m) const {
+ return do_see<false>(m, 0);
+}
+
+int Position::see_asymm(Move m, int asymmThreshold) const
+{
+ return do_see<true>(m, asymmThreshold);
+}
+
+template <bool Asymmetric>
+int Position::do_see(Move m, int asymmThreshold) const {
Square from, to;
Bitboard occupied, attackers, stmAttackers;
} while (stmAttackers);
+ // FIXME: Document
+ if (Asymmetric)
+ {
+ for (int i = 0; i < slIndex ; slIndex += 2)
+ {
+ if (swapList[slIndex] < asymmThreshold)
+ swapList[slIndex] = - QueenValueMg * 16;
+ }
+ }
+
// Having built the swap list, we negamax through it to find the best
// achievable score from the point of view of the side to move.
while (--slIndex)
// Static exchange evaluation
int see(Move m) const;
int see_sign(Move m) const;
+ int see_asymm(Move m, int asymmThreshold) const;
+ template <bool Asymmetric> int do_see(Move m, int asymmThreshold) const; //FIXME: private!!
// Accessing hash keys
Key key() const;