comment out card positions member

This commit is contained in:
Maximilian Keßler 2023-08-06 14:06:41 +02:00
parent 3b1ef55a5f
commit 34f8bf2444
Signed by: max
GPG key ID: BCC5A619923C0BA5
3 changed files with 30 additions and 9 deletions

View file

@ -180,7 +180,7 @@ public:
std::uint8_t _weighted_draw_pile_size{}; std::uint8_t _weighted_draw_pile_size{};
Stacks<num_suits> _stacks{}; Stacks<num_suits> _stacks{};
std::array<std::array<Card, hand_size>, num_players> _hands{}; std::array<std::array<Card, hand_size>, num_players> _hands{};
CardArray<num_suits, player_t> _card_positions{}; // CardArray<num_suits, player_t> _card_positions{};
std::list<CardMultiplicity> _draw_pile{}; std::list<CardMultiplicity> _draw_pile{};
std::uint8_t endgame_turns_left; std::uint8_t endgame_turns_left;
@ -193,6 +193,17 @@ public:
auto operator<=>(const HanabiState &) const = default; auto operator<=>(const HanabiState &) const = default;
}; };
template <std::size_t num_suits, player_t num_players, std::size_t hand_size>
bool same_up_to_discard_permutation(HanabiState<num_suits, num_players, hand_size> state1, HanabiState<num_suits, num_players, hand_size> state2) {
auto comp = [](CardMultiplicity &m1, CardMultiplicity &m2) -> bool {
return m1.card.suit < m2.card.suit || (m1.card.suit == m2.card.suit and m1.card.rank < m2.card.rank) ||
(m1.card.suit == m2.card.suit and m1.card.rank == m2.card.rank and m1.multiplicity < m2.multiplicity);
};
state1._draw_pile.sort(comp);
state2._draw_pile.sort(comp);
return state1 == state2;
}
template <std::size_t num_suits, player_t num_players, std::size_t hand_size> template <std::size_t num_suits, player_t num_players, std::size_t hand_size>
std::ostream & operator<<(std::ostream &os, HanabiState<num_suits, num_players, hand_size> hanabi_state); std::ostream & operator<<(std::ostream &os, HanabiState<num_suits, num_players, hand_size> hanabi_state);

View file

@ -64,7 +64,7 @@ namespace Hanabi {
_weighted_draw_pile_size(deck.size()), _weighted_draw_pile_size(deck.size()),
_stacks(), _stacks(),
_hands(), _hands(),
_card_positions(draw_pile), // _card_positions(draw_pile),
_draw_pile(), _draw_pile(),
_pace(deck.size() - 5 * num_suits - num_players * (hand_size - 1)), _pace(deck.size() - 5 * num_suits - num_players * (hand_size - 1)),
_score(0) { _score(0) {
@ -199,7 +199,7 @@ namespace Hanabi {
const Card& discarded = _hands[_turn][index]; const Card& discarded = _hands[_turn][index];
if (_stacks[discarded.suit] > discarded.rank) { if (_stacks[discarded.suit] > discarded.rank) {
_card_positions[_hands[_turn][index]] = trash_or_play_stack; // _card_positions[_hands[_turn][index]] = trash_or_play_stack;
} }
// draw a new card if the draw pile is not empty // draw a new card if the draw pile is not empty
@ -220,7 +220,7 @@ namespace Hanabi {
card_in_hand.copy = draw.multiplicity - 1; card_in_hand.copy = draw.multiplicity - 1;
if (_stacks[draw.card.suit] > draw.card.rank) { if (_stacks[draw.card.suit] > draw.card.rank) {
_card_positions[card_in_hand] = _turn; // _card_positions[card_in_hand] = _turn;
} }
if(_draw_pile.empty()) { if(_draw_pile.empty()) {
@ -238,7 +238,7 @@ namespace Hanabi {
assert(index < _hands[_turn].size()); assert(index < _hands[_turn].size());
const Card &drawn = _hands[_turn][index]; const Card &drawn = _hands[_turn][index];
if (_stacks[drawn.suit] > drawn.rank) { if (_stacks[drawn.suit] > drawn.rank) {
_card_positions[drawn] = draw_pile; // _card_positions[drawn] = draw_pile;
} }
// put discarded_card back into draw pile (at the back) // put discarded_card back into draw pile (at the back)
@ -253,7 +253,7 @@ namespace Hanabi {
endgame_turns_left = no_endgame; endgame_turns_left = no_endgame;
_hands[_turn][index] = discarded_card; _hands[_turn][index] = discarded_card;
if (_stacks[discarded_card.suit] > discarded_card.rank) { if (_stacks[discarded_card.suit] > discarded_card.rank) {
_card_positions[discarded_card] = _turn; // _card_positions[discarded_card] = _turn;
} }
} }
@ -286,7 +286,7 @@ namespace Hanabi {
_draw_pile.push_back({card, nums_in_draw_pile[card]}); _draw_pile.push_back({card, nums_in_draw_pile[card]});
for (std::uint8_t copy = 0; copy < nums_in_draw_pile[card]; copy++) { for (std::uint8_t copy = 0; copy < nums_in_draw_pile[card]; copy++) {
card.copy = copy; card.copy = copy;
_card_positions[card] = draw_pile; // _card_positions[card] = draw_pile;
} }
} }
} }
@ -357,18 +357,22 @@ namespace Hanabi {
if(is_playable(hand[index])) { if(is_playable(hand[index])) {
std::cout << std::string("---------------------", depth) << "playing " << hand[index] << std::endl; std::cout << std::string("---------------------", depth) << "playing " << hand[index] << std::endl;
if (_draw_pile.empty()) { if (_draw_pile.empty()) {
auto copy = *this;
BacktrackAction action = play(index); BacktrackAction action = play(index);
const double probability_for_this_play = backtrack(depth + 1); const double probability_for_this_play = backtrack(depth + 1);
revert(action); revert(action);
assert(same_up_to_discard_permutation(*this, copy));
UPDATE_PROBABILITY(probability_for_this_play); UPDATE_PROBABILITY(probability_for_this_play);
} else { } else {
double sum_of_probabilities = 0; double sum_of_probabilities = 0;
uint8_t sum_of_mults = 0; uint8_t sum_of_mults = 0;
for (size_t i = 0; i < _draw_pile.size(); i++) { for (size_t i = 0; i < _draw_pile.size(); i++) {
auto copy = *this;
BacktrackAction action = play(index); BacktrackAction action = play(index);
sum_of_probabilities += backtrack(depth + 1) * action.multiplicity; sum_of_probabilities += backtrack(depth + 1) * action.multiplicity;
sum_of_mults += action.multiplicity; sum_of_mults += action.multiplicity;
revert(action); revert(action);
assert(same_up_to_discard_permutation(*this, copy));
assert(sum_of_mults <= _weighted_draw_pile_size); assert(sum_of_mults <= _weighted_draw_pile_size);
} }
assert(sum_of_mults == _weighted_draw_pile_size); assert(sum_of_mults == _weighted_draw_pile_size);
@ -385,17 +389,21 @@ namespace Hanabi {
std::cout << std::string("---------------------------", depth) << "discarding " << hand[index] << std::endl; std::cout << std::string("---------------------------", depth) << "discarding " << hand[index] << std::endl;
double sum_of_probabilities = 0; double sum_of_probabilities = 0;
if (_draw_pile.empty()) { if (_draw_pile.empty()) {
auto copy = *this;
BacktrackAction action = discard(index); BacktrackAction action = discard(index);
const double probability_for_this_discard = backtrack(depth + 1); const double probability_for_this_discard = backtrack(depth + 1);
revert(action); revert(action);
assert(same_up_to_discard_permutation(*this, copy));
UPDATE_PROBABILITY(probability_for_this_discard); UPDATE_PROBABILITY(probability_for_this_discard);
} else { } else {
uint8_t sum_of_mults = 0; uint8_t sum_of_mults = 0;
for (size_t i = 0; i < _draw_pile.size(); i++) { for (size_t i = 0; i < _draw_pile.size(); i++) {
auto copy = *this;
BacktrackAction action = discard(index); BacktrackAction action = discard(index);
sum_of_probabilities += backtrack(depth + 1) * action.multiplicity; sum_of_probabilities += backtrack(depth + 1) * action.multiplicity;
sum_of_mults += action.multiplicity; sum_of_mults += action.multiplicity;
revert(action); revert(action);
assert(same_up_to_discard_permutation(*this, copy));
} }
assert(sum_of_mults == _weighted_draw_pile_size); assert(sum_of_mults == _weighted_draw_pile_size);
const double probability_discard = sum_of_probabilities / _weighted_draw_pile_size; const double probability_discard = sum_of_probabilities / _weighted_draw_pile_size;
@ -411,9 +419,11 @@ namespace Hanabi {
// Last option is to stall // Last option is to stall
if(_num_clues > 0) { if(_num_clues > 0) {
std::cout << std::string("--------------------", depth) << "stalling " << std::endl; std::cout << std::string("--------------------", depth) << "stalling " << std::endl;
auto copy = *this;
BacktrackAction action = clue(); BacktrackAction action = clue();
const double probability_stall = backtrack(depth + 1); const double probability_stall = backtrack(depth + 1);
revert(action); revert(action);
assert(same_up_to_discard_permutation(*this, copy));
UPDATE_PROBABILITY(probability_stall); UPDATE_PROBABILITY(probability_stall);
} }

View file

@ -21,7 +21,7 @@ void test_game() {
state._draw_pile.push_back({r41, 1}); state._draw_pile.push_back({r41, 1});
state._hands[0] = {y0, y1, y2, r0, r1}; state._hands[0] = {y0, y1, y2, r0, r1};
state._hands[1] = {r1, r1, y1, r3, r2}; state._hands[1] = {r1, r1, y1, r3, r2};
state._card_positions[r1] = 0; // state._card_positions[r1] = 0;
state._weighted_draw_pile_size = 1; state._weighted_draw_pile_size = 1;
auto state2 = state; auto state2 = state;
@ -34,7 +34,7 @@ void test_game() {
std::cout << state2 << std::endl; std::cout << state2 << std::endl;
assert(state._hands == state2._hands); assert(state._hands == state2._hands);
assert(state._draw_pile == state2._draw_pile); assert(state._draw_pile == state2._draw_pile);
assert(state._card_positions == state2._card_positions); // assert(state._card_positions == state2._card_positions);
assert(state == state2); assert(state == state2);
} }