Skip to content

Commit 4cc9076

Browse files
committed
Use a map to represent payoffs
1 parent 976a5ac commit 4cc9076

5 files changed

Lines changed: 18 additions & 16 deletions

File tree

src/games/game.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ namespace Gambit {
4141
// class GameOutcomeRep
4242
//========================================================================
4343

44-
GameOutcomeRep::GameOutcomeRep(GameRep *p_game, int p_number)
45-
: m_game(p_game), m_number(p_number), m_payoffs(m_game->NumPlayers())
44+
GameOutcomeRep::GameOutcomeRep(GameRep *p_game, int p_number) : m_game(p_game), m_number(p_number)
4645
{
46+
for (const auto &player : p_game->GetPlayers()) {
47+
m_payoffs[player] = Number();
48+
}
4749
}
4850

4951
//========================================================================

src/games/game.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ class GameOutcomeRep : public GameObject {
121121
GameRep *m_game;
122122
int m_number;
123123
std::string m_label;
124-
Array<Number> m_payoffs;
124+
std::map<GamePlayerRep *, Number> m_payoffs;
125125

126126
/// @name Lifecycle
127127
//@{
@@ -145,7 +145,6 @@ class GameOutcomeRep : public GameObject {
145145

146146
/// Gets the payoff associated with the outcome to the player
147147
template <class T> const T &GetPayoff(const GamePlayer &p_player) const;
148-
149148
/// Sets the payoff to the player
150149
void SetPayoff(const GamePlayer &p_player, const Number &p_value);
151150
//@}
@@ -586,27 +585,31 @@ inline Game GameOutcomeRep::GetGame() const { return m_game; }
586585

587586
template <class T> const T &GameOutcomeRep::GetPayoff(const GamePlayer &p_player) const
588587
{
589-
if (p_player->GetGame() != GetGame()) {
588+
try {
589+
return static_cast<const T &>(m_payoffs.at(p_player));
590+
}
591+
catch (const std::out_of_range &) {
590592
throw MismatchException();
591593
}
592-
return static_cast<const T &>(m_payoffs[p_player->GetNumber()]);
593594
}
594595

595596
template <> inline const Number &GameOutcomeRep::GetPayoff(const GamePlayer &p_player) const
596597
{
597-
if (p_player->GetGame() != GetGame()) {
598+
try {
599+
return m_payoffs.at(p_player);
600+
}
601+
catch (const std::out_of_range &) {
598602
throw MismatchException();
599603
}
600-
return m_payoffs[p_player->GetNumber()];
601604
}
602605

603606
inline void GameOutcomeRep::SetPayoff(const GamePlayer &p_player, const Number &p_value)
604607
{
605608
if (p_player->GetGame() != GetGame()) {
606609
throw MismatchException();
607610
}
611+
m_payoffs[p_player] = p_value;
608612
m_game->IncrementVersion();
609-
m_payoffs[p_player->GetNumber()] = p_value;
610613
}
611614

612615
inline GamePlayer GameStrategyRep::GetPlayer() const { return m_player; }

src/games/gametable.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ GamePlayer GameTableRep::NewPlayer()
392392
auto player = new GamePlayerRep(this, m_players.size() + 1, 1);
393393
m_players.push_back(player);
394394
for (auto outcome : m_outcomes) {
395-
outcome->m_payoffs.push_back(Number());
395+
outcome->m_payoffs[player] = Number();
396396
}
397397
return player;
398398
}

src/games/gametree.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -968,11 +968,10 @@ int GameTreeRep::BehavProfileLength() const
968968
GamePlayer GameTreeRep::NewPlayer()
969969
{
970970
IncrementVersion();
971-
GamePlayerRep *player = nullptr;
972-
player = new GamePlayerRep(this, m_players.size() + 1);
971+
auto player = new GamePlayerRep(this, m_players.size() + 1);
973972
m_players.push_back(player);
974973
for (auto &outcome : m_outcomes) {
975-
outcome->m_payoffs.push_back(Number());
974+
outcome->m_payoffs[player] = Number();
976975
}
977976
ClearComputedValues();
978977
return player;

src/pygambit/outcome.pxi

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,7 @@ class Outcome:
8585
resolved_player = cython.cast(Player,
8686
self.game._resolve_player(player, "Outcome.__getitem__"))
8787
payoff = (
88-
cython.cast(bytes,
89-
self.outcome.deref().GetPayoff[string](resolved_player.player))
90-
.decode("ascii")
88+
self.outcome.deref().GetPayoff[string](resolved_player.player).decode("ascii")
9189
)
9290
if "." in payoff:
9391
return decimal.Decimal(payoff)

0 commit comments

Comments
 (0)