The Battle for Wesnoth  1.19.1+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(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 (std::vector<team>::const_iterator tm = resources::gameboard->teams().begin(); tm != resources::gameboard->teams().end(); ++tm) {
93  int side = tm-resources::gameboard->teams().begin()+1;
94  LOG_AI_TESTING << "AI_IDENTIFIER " << side << ": " << ai::manager::get_singleton().get_active_ai_identifier_for_side(side);
95  LOG_AI_TESTING << "TEAM " << side << ": " << tm->side();
96  resources::recorder->add_log_data("ai_log", "ai_id" + std::to_string(side), ai::manager::get_singleton().get_active_ai_identifier_for_side(side));
97  }
98  LOG_AI_TESTING << "VERSION: " << game_config::revision;
100 }
101 
103 {
104  LOG_AI_TESTING << "GAME_END_TURN: "<< resources::tod_manager->turn();
105  resources::recorder->add_log_data("ai_log","end_turn",
106  std::to_string(resources::tod_manager->turn()));
107  for (std::vector<team>::const_iterator tm = resources::gameboard->teams().begin(); tm != resources::gameboard->teams().end(); ++tm) {
108  int side = tm-resources::gameboard->teams().begin()+1;
109  resources::recorder->add_log_data("ai_log","end_gold"+std::to_string(side),std::to_string(tm->gold()));
110  resources::recorder->add_log_data("ai_log","end_units"+std::to_string(side),std::to_string(resources::gameboard->side_units(side)));
111  }
112 }
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:685
static manager & get_singleton()
Definition: manager.hpp:142
static void log_turn_end(unsigned int side)
Definition: testing.cpp:40
static void log_victory(std::set< unsigned int > teams)
Definition: testing.cpp:81
static void log_game_end()
Definition: testing.cpp:102
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:159
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.
virtual const std::vector< team > & teams() const override
Definition: game_board.hpp:79
team & get_team(int i)
Definition: game_board.hpp:91
void add_log_data(const std::string &key, const std::string &var)
Definition: replay.cpp:314
This class stores all the data for a single 'side' (in game nomenclature).
Definition: team.hpp:74
const std::set< map_location > & villages() const
Definition: team.hpp:170
int gold() const
Definition: team.hpp:175
int total_income() const
Definition: team.hpp:182
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.