LCOV - code coverage report
Current view: top level - Source - searcherSee.cpp (source / functions) Coverage Total Hit
Test: coverage Lines: 100.0 % 46 46
Test Date: 2026-03-02 16:42:41 Functions: 100.0 % 2 2

            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; }
        

Generated by: LCOV version 2.0-1