The Battle for Wesnoth  1.19.7+dev
testing.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2024
3  by Yurii Chernyi <terraninfo@terraninfo.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 /**
17  * Gather statistics important for AI testing and output them
18  * @file
19  */
20 #include "ai/manager.hpp"
21 #include "ai/testing.hpp"
22 #include "log.hpp"
23 #include "game_board.hpp"
24 #include "replay.hpp"
25 #include "resources.hpp"
26 #include "team.hpp"
27 #include "tod_manager.hpp"
28 #include "game_version.hpp"
29 
30 static lg::log_domain log_ai_testing("ai/testing");
31 #define DBG_AI_TESTING LOG_STREAM(debug, log_ai_testing)
32 #define LOG_AI_TESTING LOG_STREAM(info, log_ai_testing)
33 #define ERR_AI_TESTING LOG_STREAM(err, log_ai_testing)
34 
35 void ai_testing::log_turn_start(unsigned int side)
36 {
37  log_turn("TURN_START",side);
38 }
39 
40 void ai_testing::log_turn_end(unsigned int side)
41 {
42  log_turn("TURN_END",side);
43 }
44 
45 void ai_testing::log_turn(const char* msg, unsigned int side)
46 {
47  assert(side>=1);
48  team& current_team = resources::gameboard->get_team(side);
49 
50  int _turn_number = resources::tod_manager->turn();
51  int _units = resources::gameboard->side_units(side);
52  int _units_cost = resources::gameboard->side_units_cost(side);
53  int _gold = current_team.gold();
54  int _villages = current_team.villages().size();
55  int _income = current_team.total_income();
56 
57  DBG_AI_TESTING << msg << side << ": " << _turn_number;
58  DBG_AI_TESTING << msg << "_UNITS " << side << ": " << _units;
59  DBG_AI_TESTING << msg << "_UNITS_COST " << side << ": " << _units_cost;
60  DBG_AI_TESTING << msg << "_GOLD " << side << ": " << _gold;
61  DBG_AI_TESTING << msg << "_VILLAGES " << side << ": " << _villages;
62  DBG_AI_TESTING << msg << "_INCOME " << side << ": " << _income;
63 
64  config c;
65  c["side"] = static_cast<int>(side);
66  c["turn"] = _turn_number;
67  c["event"] = msg;
68  c["units"] = _units;
69  c["units_cost"] = _units_cost;
70  c["gold"] = _gold;
71  c["villages"] = _villages;
72  resources::recorder->add_log_data("ai_log","turn_info",c);
73 }
74 
76 {
77  LOG_AI_TESTING << "DRAW:";
78  resources::recorder->add_log_data("ai_log","result","draw");
79 }
80 
81 void ai_testing::log_victory(const std::set<unsigned int>& winners)
82 {
83  resources::recorder->add_log_data("ai_log","result","victory");
84  for(std::set<unsigned int>::const_iterator w = winners.begin(); w != winners.end(); ++w) {
85  LOG_AI_TESTING << "WINNER: "<< *w;
86  resources::recorder->add_log_data("ai_log","winner",std::to_string(*w));
87  }
88 }
89 
91 {
92  for(const team& tm : resources::gameboard->teams()) {
93  int side = tm.side();
94  LOG_AI_TESTING << "AI_IDENTIFIER " << side << ": " << ai::manager::get_singleton().get_active_ai_identifier_for_side(side);
95  resources::recorder->add_log_data("ai_log", "ai_id" + std::to_string(side), ai::manager::get_singleton().get_active_ai_identifier_for_side(side));
96  }
97  LOG_AI_TESTING << "VERSION: " << game_config::revision;
99 }
100 
102 {
103  LOG_AI_TESTING << "GAME_END_TURN: "<< resources::tod_manager->turn();
104  resources::recorder->add_log_data("ai_log","end_turn",
105  std::to_string(resources::tod_manager->turn()));
106  for(const team& tm : resources::gameboard->teams()) {
107  int side = tm.side();
108  resources::recorder->add_log_data("ai_log","end_gold"+std::to_string(side),std::to_string(tm.gold()));
109  resources::recorder->add_log_data("ai_log","end_units"+std::to_string(side),std::to_string(resources::gameboard->side_units(side)));
110  }
111 }
Managing the AIs lifecycle - headers TODO: Refactor history handling and internal commands.
std::string get_active_ai_identifier_for_side(side_number side)
Gets AI algorithm identifier for active AI of the given side.
Definition: manager.cpp:692
static manager & get_singleton()
Definition: manager.hpp:140
static void log_turn_end(unsigned int side)
Definition: testing.cpp:40
static void log_victory(const std::set< unsigned int > &teams)
Definition: testing.cpp:81
static void log_game_end()
Definition: testing.cpp:101
static void log_turn(const char *msg, unsigned int side)
Definition: testing.cpp:45
static void log_draw()
Definition: testing.cpp:75
static void log_game_start()
Definition: testing.cpp:90
static void log_turn_start(unsigned int side)
Definition: testing.cpp:35
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:172
int side_units(int side_num) const
Returns the number of units of the side side_num.
int side_units_cost(int side_num) const
Returns the total cost of units of side side_num.
team & get_team(int i)
Definition: game_board.hpp:92
void add_log_data(const std::string &key, const std::string &var)
Definition: replay.cpp:299
This class stores all the data for a single 'side' (in game nomenclature).
Definition: team.hpp:75
const std::set< map_location > & villages() const
Definition: team.hpp:171
int gold() const
Definition: team.hpp:176
int total_income() const
Definition: team.hpp:183
int turn() const
int w
Interfaces for manipulating version numbers of engine, add-ons, etc.
Standard logging facilities (interface).
const std::string revision
::tod_manager * tod_manager
Definition: resources.cpp:29
game_board * gameboard
Definition: resources.cpp:20
replay * recorder
Definition: resources.cpp:28
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
Definition: debugger.cpp:109
Replay control code.
mock_char c
#define DBG_AI_TESTING
Definition: testing.cpp:31
#define LOG_AI_TESTING
Definition: testing.cpp:32
static lg::log_domain log_ai_testing("ai/testing")
Gather statistics important for AI testing and output them.