Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void single_thread_datagen(const string& output_file_path) {
- ThreadData tdata{};
- SearchData sdata{};
- SearchParameters sparams{};
- sdata.node_limit = sparams.node_limit = 5'000;
- i64 total_fens_collected = 0;
- std::ofstream output_fens;
- output_fens.open(output_file_path);
- auto start_time = std::chrono::high_resolution_clock::now();
- while (true) {
- Position board = datagen_random_game();
- usize legal_move_size;
- std::vector<DatagenGameInfo> collected_fens{};
- do {
- if (board.turn() == WHITE) {
- MoveList<WHITE, MoveGenerationType::ALL> move_list(board);
- legal_move_size = move_list.size();
- } else {
- MoveList<BLACK, MoveGenerationType::ALL> move_list(board);
- legal_move_size = move_list.size();
- }
- if (legal_move_size != 0) {
- search(sdata, tdata, board, sparams);
- if (!sdata.final_best_move.is_capture() && !board.in_check<WHITE>() && !board.in_check<BLACK>()) {
- if (board.turn() == BLACK) sdata.final_value *= -1;
- collected_fens.push_back({board.fen(), sdata.final_value});
- }
- if (board.turn() == WHITE) board.play<WHITE>(sdata.final_best_move);
- else board.play<BLACK>(sdata.final_best_move);
- }
- } while (legal_move_size != 0 && !board.has_repetition(Position::THREE_FOLD) && board.fifty_move_rule() < 100);
- DatagenGameResults game_result;
- if (!board.has_repetition(Position::THREE_FOLD) && board.fifty_move_rule() < 100) {
- if (board.in_check<WHITE>()) game_result = DatagenGameResults::BLACK_WON;
- else if (board.in_check<BLACK>()) game_result = DatagenGameResults::WHITE_WON;
- else game_result = DatagenGameResults::DRAW;
- } else game_result = DatagenGameResults::DRAW;
- for (const auto& game_info : collected_fens | std::views::drop(1)) {
- if (std::abs(game_info.value) >= MATE_BOUND) break;
- total_fens_collected += 1;
- if (game_result == DatagenGameResults::DRAW) {
- output_fens << game_info.fen << " | " << game_info.value << " | " << 0.5 << "\n";
- continue;
- }
- string game_score = "1.0";
- if (game_result == DatagenGameResults::BLACK_WON) game_score = "0.0";
- output_fens << game_info.fen << " | " << game_info.value << " | " << game_score << "\n";
- }
- auto current_time = std::chrono::high_resolution_clock::now();
- std::chrono::duration<double> diff = current_time - start_time;
- double seconds_elapsed = diff.count();
- double fps = total_fens_collected / seconds_elapsed;
- std::cout << "Total Fens Collected: " << total_fens_collected << " Fens / Second: " << fps << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement