Disable integrity checks by default

This should speed up the program drastically
This commit is contained in:
Maximilian Keßler 2024-01-12 17:39:51 +01:00
parent 835bf3421b
commit 3c1fa0d0e4
Signed by: max
GPG key ID: BCC5A619923C0BA5

View file

@ -4,6 +4,16 @@
#include "myassert.h" #include "myassert.h"
#include "game_state.h" #include "game_state.h"
/**
* Compiling with -DINTEGRITY_CHECK_ON will enable exhaustive integrity check while backtracking.
* These significantly slow down performance, so they are deactivated by default.
*/
#ifdef INTEGRITY_CHECK_ON
#define CHECK_DRAW_PILE_INTEGRITY check_draw_pile_integrity()
#else
#define CHECK_DRAW_PILE_INTEGRITY
#endif
namespace Hanabi namespace Hanabi
{ {
@ -186,7 +196,7 @@ namespace Hanabi
unsigned long unsigned long
HanabiState<num_suits, num_players, hand_size>::play_and_potentially_update(hand_index_t index, bool cycle) HanabiState<num_suits, num_players, hand_size>::play_and_potentially_update(hand_index_t index, bool cycle)
{ {
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
ASSERT(index < _hands[_turn].size()); ASSERT(index < _hands[_turn].size());
const Card played_card = _hands[_turn][index]; const Card played_card = _hands[_turn][index];
@ -210,7 +220,7 @@ namespace Hanabi
const unsigned long multiplicity = draw(index, cycle, !strike); const unsigned long multiplicity = draw(index, cycle, !strike);
incr_turn(); incr_turn();
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
return multiplicity; return multiplicity;
} }
@ -224,7 +234,7 @@ namespace Hanabi
unsigned long unsigned long
HanabiState<num_suits, num_players, hand_size>::discard_and_potentially_update(hand_index_t index, bool cycle) HanabiState<num_suits, num_players, hand_size>::discard_and_potentially_update(hand_index_t index, bool cycle)
{ {
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
ASSERT(index < _hands[_turn].size()); ASSERT(index < _hands[_turn].size());
ASSERT(_num_clues != max_num_clues); ASSERT(_num_clues != max_num_clues);
@ -238,7 +248,7 @@ namespace Hanabi
_actions_log.emplace(ActionType::discard, discarded_card, index); _actions_log.emplace(ActionType::discard, discarded_card, index);
incr_turn(); incr_turn();
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
return multiplicity; return multiplicity;
} }
@ -589,7 +599,7 @@ namespace Hanabi
void void
HanabiState<num_suits, num_players, hand_size>::revert_play(bool cycle) HanabiState<num_suits, num_players, hand_size>::revert_play(bool cycle)
{ {
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
const BacktrackAction last_action = _actions_log.top(); const BacktrackAction last_action = _actions_log.top();
_actions_log.pop(); _actions_log.pop();
ASSERT(last_action.action_type == ActionType::play); ASSERT(last_action.action_type == ActionType::play);
@ -609,13 +619,13 @@ namespace Hanabi
// If we misplayed, then we lost the card and have to regain it now // If we misplayed, then we lost the card and have to regain it now
_num_copies_left[last_action.discarded]++; _num_copies_left[last_action.discarded]++;
} }
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
} }
template<suit_t num_suits, player_t num_players, hand_index_t hand_size> template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
void HanabiState<num_suits, num_players, hand_size>::revert_discard(bool cycle) void HanabiState<num_suits, num_players, hand_size>::revert_discard(bool cycle)
{ {
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
const BacktrackAction last_action = _actions_log.top(); const BacktrackAction last_action = _actions_log.top();
_actions_log.pop(); _actions_log.pop();
@ -631,7 +641,7 @@ namespace Hanabi
_num_copies_left[last_action.discarded]++; _num_copies_left[last_action.discarded]++;
revert_draw(last_action.index, last_action.discarded, cycle, false); revert_draw(last_action.index, last_action.discarded, cycle, false);
check_draw_pile_integrity(); CHECK_DRAW_PILE_INTEGRITY;
} }
template<suit_t num_suits, player_t num_players, hand_index_t hand_size> template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
@ -1190,7 +1200,7 @@ namespace Hanabi
// encode number of clues // encode number of clues
clue_t const scaled_clues = clue_t(2) * _num_clues; clue_t const scaled_clues = clue_t(2) * _num_clues;
assert(scaled_clues.denominator() == 1); assert(scaled_clues.denominator() == 1);
ret.push_back((clue_t(2) * _num_clues).numerator()); ret.push_back(scaled_clues.numerator());
// we can encode draw pile size and extra turn in one metric, since we only have extra turns if draw pile is empty // we can encode draw pile size and extra turn in one metric, since we only have extra turns if draw pile is empty
const std::uint8_t draw_pile_size_and_extra_turns = [this]() -> uint8_t { const std::uint8_t draw_pile_size_and_extra_turns = [this]() -> uint8_t {