The Battle for Wesnoth  1.15.0-dev
testing.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2018 by Yurii Chernyi <terraninfo@terraninfo.net>
3  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 /**
16  * Gather statistics important for AI testing and output them
17  * @file
18  */
19 #include "ai/manager.hpp"
20 #include "ai/testing.hpp"
21 #include "log.hpp"
22 #include "game_board.hpp"
23 #include "replay.hpp"
24 #include "resources.hpp"
25 #include "team.hpp"
26 #include "units/unit.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 << std::endl;
58  DBG_AI_TESTING << msg << "_UNITS " << side << ": " << _units << std::endl;
59  DBG_AI_TESTING << msg << "_UNITS_COST " << side << ": " << _units_cost << std::endl;
60  DBG_AI_TESTING << msg << "_GOLD " << side << ": " << _gold << std::endl;
61  DBG_AI_TESTING << msg << "_VILLAGES " << side << ": " << _villages << std::endl;
62  DBG_AI_TESTING << msg << "_INCOME " << side << ": " << _income << std::endl;
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:" << std::endl;
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 <<std::endl;
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) << std::endl;
95  LOG_AI_TESTING << "TEAM " << side << ": " << tm->side() << std::endl;
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  ///@todo 1.9: add information about ai_config
98  }
99  LOG_AI_TESTING << "VERSION: " << game_config::revision << std::endl;
101 }
102 
104 {
105  LOG_AI_TESTING << "GAME_END_TURN: "<< resources::tod_manager->turn() <<std::endl;
106  resources::recorder->add_log_data("ai_log","end_turn",
107  std::to_string(resources::tod_manager->turn()));
108  for (std::vector<team>::const_iterator tm = resources::gameboard->teams().begin(); tm != resources::gameboard->teams().end(); ++tm) {
109  int side = tm-resources::gameboard->teams().begin()+1;
110  resources::recorder->add_log_data("ai_log","end_gold"+std::to_string(side),std::to_string(tm->gold()));
111  resources::recorder->add_log_data("ai_log","end_units"+std::to_string(side),std::to_string(resources::gameboard->side_units(side)));
112  }
113 }
static void log_turn_start(unsigned int side)
Definition: testing.cpp:35
static void log_turn_end(unsigned int side)
Definition: testing.cpp:40
::tod_manager * tod_manager
Definition: resources.cpp:29
static void log_turn(const char *msg, unsigned int side)
Definition: testing.cpp:45
virtual const std::vector< team > & teams() const override
Definition: game_board.hpp:92
Interfaces for manipulating version numbers of engine, add-ons, etc.
static manager & get_singleton()
Definition: manager.hpp:152
void add_log_data(const std::string &key, const std::string &var)
Definition: replay.cpp:310
static void log_victory(std::set< unsigned int > teams)
Definition: testing.cpp:81
Gather statistics important for AI testing and output them.
Replay control code.
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
Definition: debugger.cpp:108
static void log_game_end()
Definition: testing.cpp:103
static void log_draw()
Definition: testing.cpp:75
-file sdl_utils.hpp
int gold() const
Definition: team.hpp:189
This class stores all the data for a single &#39;side&#39; (in game nomenclature).
Definition: team.hpp:44
team & get_team(int i)
Definition: game_board.hpp:104
#define DBG_AI_TESTING
Definition: testing.cpp:31
game_board * gameboard
Definition: resources.cpp:20
Managing the AIs lifecycle - headers.
replay * recorder
Definition: resources.cpp:28
static void log_game_start()
Definition: testing.cpp:90
int side_units_cost(int side_num) const
Returns the total cost of units of side side_num.
#define LOG_AI_TESTING
Definition: testing.cpp:32
const std::string revision
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:712
int w
static lg::log_domain log_ai_testing("ai/testing")
Standard logging facilities (interface).
int turn() const
int side_units(int side_num) const
Returns the number of units of the side side_num.
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:68
mock_char c
int total_income() const
Definition: team.hpp:196
const std::set< map_location > & villages() const
Definition: team.hpp:184