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

            Line data    Source code
       1              : #include "definition.hpp"
       2              : #include "position.hpp"
       3              : #include "positionTools.hpp"
       4              : #include "searcher.hpp"
       5              : #include "threading.hpp"
       6              : 
       7           48 : struct SEETest {
       8              :    const std::string fen;
       9              :    const Move        m;
      10              :    const ScoreType   threshold;
      11              : };
      12              : 
      13            1 : bool TestSEE() {
      14              :    const ScoreType P = valueSEE(P_wp);
      15              :    const ScoreType N = valueSEE(P_wn);
      16              :    const ScoreType B = valueSEE(P_wb);
      17              :    const ScoreType R = valueSEE(P_wr);
      18              :    const ScoreType Q = valueSEE(P_wq);
      19              : 
      20              :    int errors = 0;
      21              : 
      22            5 :    std::cout << "Piece values " << P << "\t" << N << "\t" << B << "\t" << R << "\t" << Q << "\t" << std::endl;
      23              : 
      24              :    // from Vajolet
      25              :    std::list<SEETest> posList;
      26              :    /* capture initial move */
      27            1 :    posList.emplace_back("3r3k/3r4/2n1n3/8/3p4/2PR4/1B1Q4/3R3K w - - 0 1", ToMove(Sq_d3, Sq_d4, T_capture), ScoreType(P - P + N - B + N - R + R - Q + R));
      28            1 :    posList.emplace_back("1k1r4/1ppn3p/p4b2/4n3/8/P2N2P1/1PP1R1BP/2K1Q3 w - - 0 1", ToMove(Sq_d3, Sq_e5, T_capture), ScoreType(N - N)); // R > B + N here so we stop here
      29            1 :    posList.emplace_back("1k1r3q/1ppn3p/p4b2/4p3/8/P2N2P1/1PP1R1BP/2K1Q3 w - - 0 1", ToMove(Sq_d3, Sq_e5, T_capture), ScoreType(P - N));
      30            1 :    posList.emplace_back("rnb2b1r/ppp2kpp/5n2/4P3/q2P3B/5R2/PPP2PPP/RN1QKB2 w Q - 1 1", ToMove(Sq_h4, Sq_f6, T_capture), ScoreType(N - B + P));
      31            1 :    posList.emplace_back("r2q1rk1/2p1bppp/p2p1n2/1p2P3/4P1b1/1nP1BN2/PP3PPP/RN1QR1K1 b - - 1 1", ToMove(Sq_g4, Sq_f3, T_capture), ScoreType(N - B));
      32            1 :    posList.emplace_back("r1bqkb1r/2pp1ppp/p1n5/1p2p3/3Pn3/1B3N2/PPP2PPP/RNBQ1RK1 b kq - 2 1", ToMove(Sq_c6, Sq_d4, T_capture), ScoreType(P - N + N - P));
      33            1 :    posList.emplace_back("r1bq1r2/pp1ppkbp/4N1p1/n3P1B1/8/2N5/PPP2PPP/R2QK2R w KQ - 2 1", ToMove(Sq_e6, Sq_g7, T_capture), ScoreType(B - N));
      34            1 :    posList.emplace_back("r1bq1r2/pp1ppkbp/4N1pB/n3P3/8/2N5/PPP2PPP/R2QK2R w KQ - 2 1", ToMove(Sq_e6, Sq_g7, T_capture), ScoreType(B));
      35            1 :    posList.emplace_back("rnq1k2r/1b3ppp/p2bpn2/1p1p4/3N4/1BN1P3/PPP2PPP/R1BQR1K1 b kq - 0 1", ToMove(Sq_d6, Sq_h2, T_capture), ScoreType(P - B));
      36            1 :    posList.emplace_back("rn2k2r/1bq2ppp/p2bpn2/1p1p4/3N4/1BN1P3/PPP2PPP/R1BQR1K1 b kq - 5 1", ToMove(Sq_d6, Sq_h2, T_capture), ScoreType(P));
      37            1 :    posList.emplace_back("r2qkbn1/ppp1pp1p/3p1rp1/3Pn3/4P1b1/2N2N2/PPP2PPP/R1BQKB1R b KQq - 2 1", ToMove(Sq_g4, Sq_f3, T_capture), ScoreType(N - B + P));
      38            1 :    posList.emplace_back("rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/P1N5/1PQ1PPPP/R1B1KBNR b KQ - 1 1", ToMove(Sq_b4, Sq_c3, T_capture), ScoreType(N - B));
      39            1 :    posList.emplace_back("r4rk1/3nppbp/bq1p1np1/2pP4/8/2N2NPP/PP2PPB1/R1BQR1K1 b - - 1 1", ToMove(Sq_b6, Sq_b2, T_capture), ScoreType(P - Q));
      40            1 :    posList.emplace_back("r4rk1/1q1nppbp/b2p1np1/2pP4/8/2N2NPP/PP2PPB1/R1BQR1K1 b - - 1 1", ToMove(Sq_f6, Sq_d5, T_capture), ScoreType(P - N));
      41            1 :    posList.emplace_back("1r3r2/5p2/4p2p/2k1n1P1/2PN1nP1/1P3P2/8/2KR1B1R b - - 0 29", ToMove(Sq_b8, Sq_b3, T_capture), ScoreType(P - R));
      42            1 :    posList.emplace_back("1r3r2/5p2/4p2p/4n1P1/kPPN1nP1/5P2/8/2KR1B1R b - - 0 1", ToMove(Sq_b8, Sq_b4, T_capture), ScoreType(P));
      43            1 :    posList.emplace_back("2r2rk1/5pp1/pp5p/q2p4/P3n3/1Q3NP1/1P2PP1P/2RR2K1 b - - 1 22", ToMove(Sq_c8, Sq_c1, T_capture), ScoreType(R - R));
      44            1 :    posList.emplace_back("1r3r1k/p4pp1/2p1p2p/qpQP3P/2P5/3R4/PP3PP1/1K1R4 b - - 0 1", ToMove(Sq_a5, Sq_a2, T_capture), ScoreType(P - Q));
      45            1 :    posList.emplace_back("1r5k/p4pp1/2p1p2p/qpQP3P/2P2P2/1P1R4/P4rP1/1K1R4 b - - 0 1", ToMove(Sq_a5, Sq_a2, T_capture), ScoreType(P));
      46            1 :    posList.emplace_back("r2q1rk1/1b2bppp/p2p1n2/1ppNp3/3nP3/P2P1N1P/BPP2PP1/R1BQR1K1 w - - 4 14", ToMove(Sq_d5, Sq_e7, T_capture), ScoreType(B - N));
      47            1 :    posList.emplace_back("rnbqrbn1/pp3ppp/3p4/2p2k2/4p3/3B1K2/PPP2PPP/RNB1Q1NR w - - 0 1", ToMove(Sq_d3, Sq_e4, T_capture), ScoreType(P));
      48              :    /* non capture initial move */
      49            1 :    posList.emplace_back("rnb1k2r/p3p1pp/1p3p1b/7n/1N2N3/3P1PB1/PPP1P1PP/R2QKB1R w KQkq - 0 1", ToMove(Sq_e4, Sq_d6, T_std), ScoreType(-N + P));
      50            1 :    posList.emplace_back("r1b1k2r/p4npp/1pp2p1b/7n/1N2N3/3P1PB1/PPP1P1PP/R2QKB1R w KQkq - 0 1", ToMove(Sq_e4, Sq_d6, T_std), ScoreType(-N + N));
      51            1 :    posList.emplace_back("2r1k2r/pb4pp/5p1b/2KB3n/4N3/2NP1PB1/PPP1P1PP/R2Q3R w k - 0 1", ToMove(Sq_d5, Sq_c6, T_std), ScoreType(-B));
      52            1 :    posList.emplace_back("2r1k2r/pb4pp/5p1b/2KB3n/1N2N3/3P1PB1/PPP1P1PP/R2Q3R w k - 0 1", ToMove(Sq_d5, Sq_c6, T_std), ScoreType(-B + B));
      53            1 :    posList.emplace_back("2r1k3/pbr3pp/5p1b/2KB3n/1N2N3/3P1PB1/PPP1P1PP/R2Q3R w - - 0 1", ToMove(Sq_d5, Sq_c6, T_std), ScoreType(-B + B - N));
      54              :    /* initial move promotion */
      55            1 :    posList.emplace_back("5k2/p2P2pp/8/1pb5/1Nn1P1n1/6Q1/PPP4P/R3K1NR w KQ - 0 1", ToMove(Sq_d7, Sq_d8, T_promq), ScoreType(-P + Q));
      56            1 :    posList.emplace_back("r4k2/p2P2pp/8/1pb5/1Nn1P1n1/6Q1/PPP4P/R3K1NR w KQ - 0 1", ToMove(Sq_d7, Sq_d8, T_promq), ScoreType(-P + Q - Q));
      57            1 :    posList.emplace_back("5k2/p2P2pp/1b6/1p6/1Nn1P1n1/8/PPP4P/R2QK1NR w KQ - 0 1", ToMove(Sq_d7, Sq_d8, T_promq), ScoreType(-P + Q - Q + B));
      58            1 :    posList.emplace_back("4kbnr/p1P1pppp/b7/4q3/7n/8/PP1PPPPP/RNBQKBNR w KQk - 0 1", ToMove(Sq_c7, Sq_c8, T_promq), ScoreType(-P + Q - Q));
      59            1 :    posList.emplace_back("4kbnr/p1P1pppp/b7/4q3/7n/8/PPQPPPPP/RNB1KBNR w KQk - 0 1", ToMove(Sq_c7, Sq_c8, T_promq), ScoreType(-P + Q - Q + B));
      60            1 :    posList.emplace_back("4kbnr/p1P1pppp/b7/4q3/7n/8/PPQPPPPP/RNB1KBNR w KQk - 0 1", ToMove(Sq_c7, Sq_c8, T_promn), ScoreType(-P + N));
      61            1 :    posList.emplace_back("4kbnr/p1P1pppp/1b6/4q3/7n/8/PPQPPPPP/RNB1KBNR w KQk - 0 1", ToMove(Sq_c7, Sq_c8, T_promn), ScoreType(-P + N));
      62              :    /* initial move En Passant */
      63            1 :    posList.emplace_back("4kbnr/p1P4p/b1q5/5pP1/4n3/5Q2/PP1PPP1P/RNB1KBNR w KQk f6 0 2", ToMove(Sq_g5, Sq_f6, T_ep), ScoreType(P - P));
      64            1 :    posList.emplace_back("4kbnr/p1P4p/b1q5/5pP1/4n2Q/8/PP1PPP1P/RNB1KBNR w KQk f6 0 2", ToMove(Sq_g5, Sq_f6, T_ep), ScoreType(P - P));
      65              :    /* initial move capture promotion */
      66            1 :    posList.emplace_back("1n2kb1r/p1P4p/2qb4/5pP1/4n2Q/8/PP1PPP1P/RNB1KBNR w KQk - 0 1", ToMove(Sq_c7, Sq_b8, T_cappromq), ScoreType(N + (-P + Q) - Q));
      67            1 :    posList.emplace_back("rnbqk2r/pp3ppp/2p1pn2/3p4/3P4/N1P1BN2/PPB1PPPb/R2Q1RK1 w kq - 0 1", ToMove(Sq_g1, Sq_h2, T_capture), ScoreType(B));
      68            1 :    posList.emplace_back("3N4/2K5/2n1n3/1k6/8/8/8/8 b - - 0 1", ToMove(Sq_c6, Sq_d8, T_capture), ScoreType(N));
      69            1 :    posList.emplace_back("3N4/2K5/2n5/1k6/8/8/8/8 b - - 0 1", ToMove(Sq_c6, Sq_d8, T_capture), ScoreType(0));
      70              :    /* promotion inside the loop */
      71            1 :    posList.emplace_back("3N4/2P5/2n5/1k6/8/8/8/4K3 b - - 0 1", ToMove(Sq_c6, Sq_d8, T_capture), ScoreType(N - N - Q + P));
      72            1 :    posList.emplace_back("3N4/2P5/2n5/1k6/8/8/8/4K3 b - - 0 1", ToMove(Sq_c6, Sq_b8, T_capture), ScoreType(-N - Q + P));
      73            1 :    posList.emplace_back("3n3r/2P5/8/1k6/8/8/3Q4/4K3 w - - 0 1", ToMove(Sq_d2, Sq_d8, T_capture), ScoreType(N));
      74            1 :    posList.emplace_back("3n3r/2P5/8/1k6/8/8/3Q4/4K3 w - - 0 1", ToMove(Sq_c7, Sq_d8, T_promq), ScoreType((N - P + Q) - Q + R));
      75              :    /* double promotion inside the loop */
      76            1 :    posList.emplace_back("r2n3r/2P1P3/4N3/1k6/8/8/8/4K3 w - - 0 1", ToMove(Sq_e6, Sq_d8, T_capture), ScoreType(N));
      77            1 :    posList.emplace_back("8/8/8/1k6/6b1/4N3/2p3K1/3n4 w - - 0 1", ToMove(Sq_e3, Sq_d1, T_capture), ScoreType(0));
      78            1 :    posList.emplace_back("8/8/1k6/8/8/2N1N3/2p1p1K1/3n4 w - - 0 1", ToMove(Sq_c3, Sq_d1, T_capture), ScoreType(N - N - Q + P));
      79            1 :    posList.emplace_back("8/8/1k6/8/8/2N1N3/4p1K1/3n4 w - - 0 1", ToMove(Sq_c3, Sq_d1, T_capture), ScoreType(N - (N - P + Q) + Q));
      80            1 :    posList.emplace_back("r1bqk1nr/pppp1ppp/2n5/1B2p3/1b2P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 4 4", ToMove(Sq_e1, Sq_h1, T_wks), ScoreType(0));
      81              : 
      82              : #ifdef WITH_NNUE
      83            1 :    NNUEEvaluator evaluator;
      84              : #endif
      85              : 
      86           49 :    for (const auto& t : posList) {
      87           48 :       RootPosition p;
      88              : #ifdef WITH_NNUE
      89              :       p.associateEvaluator(evaluator);
      90              : #endif
      91           48 :       readFEN(t.fen, p, true);
      92           48 :       Logging::LogIt(Logging::logInfo) << "============================== " << t.fen << " ==";
      93           48 :       const ScoreType s = ThreadPool::instance().main().SEE(p, t.m);
      94           48 :       if (s != t.threshold){
      95            0 :          Logging::LogIt(Logging::logError) << "wrong SEE value == " << ToString(p) << "\n" << ToString(t.m) << " " << s << " " << t.threshold;
      96            0 :          ++errors;
      97              :       }
      98           48 :    }
      99            1 :    if (errors){
     100            0 :       Logging::LogIt(Logging::logError) << "Some errors in SEE testing " << posList.size()-errors << "/" << posList.size() << " success";
     101            0 :       return false;
     102              :    }
     103              :    return true;
     104              : }
        

Generated by: LCOV version 2.0-1