Esempio n. 1
0
void ConsoleGame::handleTestMoveGen() const
{
  std::string fileName("data/perftsuite.epd");
  std::ifstream inputStream(fileName.c_str());
  if (inputStream.fail()) {
    std::cout << "Could not locate perft test file " << fileName << "\n";
    return;
  }

  while (true) {
    std::string inputLine;
    std::getline(inputStream, inputLine);
    if (inputStream.fail())
      break;

    std::vector<std::string> tokens;
    util::split(tokens, inputLine, ';');
    if (tokens.size() < 1)
      continue;

    std::string fenString = tokens.at(0);
    if (tokens.size() > 1) {
      std::cout << "fen: " << fenString << "\n";
      mBoard->setPosition(fenString);
    }

    for (uint i = 1; i < tokens.size(); i++) {
      std::string perftDepthString = tokens.at(i);

      std::vector<std::string> perftTokens;
      util::split(perftTokens, perftDepthString, ' ');
      if (perftTokens.size() < 2)
        continue;

      std::string depthString = perftTokens.at(0);
      std::string nodesString = perftTokens.at(1);

      uint depthLevel = atoi(depthString.substr(1).c_str());
      uint numNodes = atoi(nodesString.c_str());

      Stopwatch stopWatch;
      Perft perft(mBoard.get());

      stopWatch.start();
      ulonglong totalNodes = perft.execute(depthLevel);
      std::string timeString = stopWatch.timeElapsedString();

      bool success = (totalNodes == numNodes);
      std::cout << "Perft (" << depthLevel << "): " << totalNodes << " nodes, ";
      std::cout << "Time: " << timeString << " s, [" << numNodes << "], ";
      std::cout << (success ? "OK" : "FAIL") << "\n";

      if (!success)
        return;
    }
  }
}