Skip to content

Commit b68e372

Browse files
committed
Implement Infosets as collection for player
1 parent f748a34 commit b68e372

10 files changed

Lines changed: 19 additions & 50 deletions

File tree

src/games/game.cc

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ Array<GameStrategy> GamePlayerRep::GetStrategies() const
7979

8080
void GamePlayerRep::MakeStrategy()
8181
{
82-
Array<int> c(NumInfosets());
82+
Array<int> c(m_infosets.size());
8383

84-
for (size_t i = 1; i <= NumInfosets(); i++) {
84+
for (size_t i = 1; i <= m_infosets.size(); i++) {
8585
if (m_infosets[i - 1]->flag == 1) {
8686
c[i] = m_infosets[i - 1]->whichbranch;
8787
}
@@ -175,16 +175,6 @@ void GamePlayerRep::MakeReducedStrats(GameNodeRep *n, GameNodeRep *nn)
175175
}
176176
}
177177

178-
GameInfoset GamePlayerRep::GetInfoset(int p_index) const { return m_infosets[p_index - 1]; }
179-
180-
Array<GameInfoset> GamePlayerRep::GetInfosets() const
181-
{
182-
Array<GameInfoset> ret(m_infosets.size());
183-
std::transform(m_infosets.cbegin(), m_infosets.cend(), ret.begin(),
184-
[](const GameInfosetRep *s) -> GameInfoset { return s; });
185-
return ret;
186-
}
187-
188178
size_t GamePlayerRep::NumSequences() const
189179
{
190180
if (!m_game->IsTree()) {

src/games/game.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ class GameInfosetRep : public GameObject {
289289
Actions GetActions() const { return Actions(this, &m_actions); }
290290
//@}
291291

292-
size_t NumMembers() const { return m_members.size(); }
293292
GameNode GetMember(int p_index) const { return m_members.at(p_index - 1); }
294293
Members GetMembers() const { return Members(this, &m_members); }
295294

@@ -388,6 +387,8 @@ class GamePlayerRep : public GameObject {
388387
~GamePlayerRep() override;
389388

390389
public:
390+
using Infosets = ElementCollection<GamePlayer, GameInfosetRep>;
391+
391392
int GetNumber() const { return m_number; }
392393
Game GetGame() const;
393394

@@ -398,12 +399,10 @@ class GamePlayerRep : public GameObject {
398399

399400
/// @name Information sets
400401
//@{
401-
/// Returns the number of information sets at which the player makes a choice
402-
size_t NumInfosets() const { return m_infosets.size(); }
403402
/// Returns the p_index'th information set
404-
GameInfoset GetInfoset(int p_index) const;
405-
/// Returns the information sets for the players
406-
Array<GameInfoset> GetInfosets() const;
403+
GameInfoset GetInfoset(int p_index) const { return m_infosets.at(p_index - 1); }
404+
/// Returns the information sets for the player
405+
Infosets GetInfosets() const { return Infosets(this, &m_infosets); }
407406

408407
/// @name Strategies
409408
//@{
@@ -685,14 +684,10 @@ class GameRep : public BaseGameRep {
685684
virtual GameInfoset GetInfoset(int iset) const = 0;
686685
/// Returns the set of information sets in the game
687686
virtual Array<GameInfoset> GetInfosets() const = 0;
688-
/// Returns an array with the number of information sets per personal player
689-
virtual Array<int> NumInfosets() const = 0;
690687
//@}
691688

692689
/// @name Outcomes
693690
//@{
694-
/// Returns the number of outcomes defined in the game
695-
size_t NumOutcomes() const { return m_outcomes.size(); }
696691
/// Returns the index'th outcome defined in the game
697692
GameOutcome GetOutcome(int index) const { return m_outcomes.at(index - 1); }
698693
/// Returns the set of outcomes in the game

src/games/gameagg.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ class GameAGGRep : public GameRep {
7979
GameInfoset GetInfoset(int iset) const override { throw UndefinedException(); }
8080
/// Returns the set of information sets in the game
8181
Array<GameInfoset> GetInfosets() const override { throw UndefinedException(); }
82-
/// Returns an array with the number of information sets per personal player
83-
Array<int> NumInfosets() const override { throw UndefinedException(); }
8482
//@}
8583

8684
/// @name Nodes

src/games/gamebagg.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,6 @@ class GameBAGGRep : public GameRep {
8787
GameInfoset GetInfoset(int iset) const override { throw UndefinedException(); }
8888
/// Returns the set of information sets in the game
8989
Array<GameInfoset> GetInfosets() const override { throw UndefinedException(); }
90-
/// Returns an array with the number of information sets per personal player
91-
Array<int> NumInfosets() const override { throw UndefinedException(); }
9290
//@}
9391

9492
/// @name Nodes

src/games/gametable.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ class GameTableRep : public GameExplicitRep {
8080
GameInfoset GetInfoset(int iset) const override { throw UndefinedException(); }
8181
/// Returns the set of information sets in the game
8282
Array<GameInfoset> GetInfosets() const override { throw UndefinedException(); }
83-
/// Returns an array with the number of information sets per personal player
84-
Array<int> NumInfosets() const override { throw UndefinedException(); }
8583
//@}
8684

8785
/// @name Nodes

src/games/gametree.cc

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -735,9 +735,9 @@ bool GameTreeRep::IsConstSum() const
735735
bool GameTreeRep::IsPerfectRecall(GameInfoset &s1, GameInfoset &s2) const
736736
{
737737
for (auto player : m_players) {
738-
for (size_t i = 1; i <= player->NumInfosets(); i++) {
738+
for (size_t i = 1; i <= player->m_infosets.size(); i++) {
739739
auto *iset1 = player->m_infosets[i - 1];
740-
for (size_t j = 1; j <= player->NumInfosets(); j++) {
740+
for (size_t j = 1; j <= player->m_infosets.size(); j++) {
741741
auto *iset2 = player->m_infosets[j - 1];
742742

743743
bool precedes = false;
@@ -995,15 +995,6 @@ Array<GameInfoset> GameTreeRep::GetInfosets() const
995995
return infosets;
996996
}
997997

998-
Array<int> GameTreeRep::NumInfosets() const
999-
{
1000-
Array<int> foo;
1001-
for (const auto &player : m_players) {
1002-
foo.push_back(player->NumInfosets());
1003-
}
1004-
return foo;
1005-
}
1006-
1007998
//------------------------------------------------------------------------
1008999
// GameTreeRep: Outcomes
10091000
//------------------------------------------------------------------------
@@ -1152,7 +1143,7 @@ Rational TreePureStrategyProfileRep::GetPayoff(const GamePlayer &p_player) const
11521143
{
11531144
PureBehaviorProfile behav(m_nfg);
11541145
for (const auto &player : m_nfg->GetPlayers()) {
1155-
for (size_t iset = 1; iset <= player->NumInfosets(); iset++) {
1146+
for (size_t iset = 1; iset <= player->GetInfosets().size(); iset++) {
11561147
if (const int act = m_profile.at(player)->m_behav[iset]) {
11571148
behav.SetAction(player->GetInfoset(iset)->GetAction(act));
11581149
}

src/games/gametree.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,6 @@ class GameTreeRep : public GameExplicitRep {
120120
GameInfoset GetInfoset(int iset) const override;
121121
/// Returns the set of information sets in the game
122122
Array<GameInfoset> GetInfosets() const override;
123-
/// Returns an array with the number of information sets per personal player
124-
Array<int> NumInfosets() const override;
125123
//@}
126124

127125
/// @name Modification

src/pygambit/game.pxi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ class GameOutcomes:
249249

250250
def __len__(self) -> int:
251251
"""The number of outcomes in the game."""
252-
return self.game.deref().NumOutcomes()
252+
return self.game.deref().GetOutcomes().size()
253253

254254
def __iter__(self) -> typing.Iterator[Outcome]:
255255
for outcome in self.game.deref().GetOutcomes():
@@ -420,7 +420,7 @@ class GameStrategies:
420420
return obj
421421

422422
def __repr__(self) -> str:
423-
return f"GameOutcomes(game={self.game})"
423+
return f"GameStrategies(game={self.game})"
424424

425425
def __len__(self) -> int:
426426
return sum(len(p.strategies) for p in self.game.players)

src/solvers/lcp/efglcp.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ template <class T> class NashLcpBehaviorSolver<T>::Solution {
7070
template <class T>
7171
NashLcpBehaviorSolver<T>::Solution::Solution(const Game &p_game)
7272
: ns1(p_game->GetPlayer(1)->NumSequences()), ns2(p_game->GetPlayer(2)->NumSequences()),
73-
ni1(p_game->GetPlayer(1)->NumInfosets() + 1), ni2(p_game->GetPlayer(2)->NumInfosets() + 1),
73+
ni1(p_game->GetPlayer(1)->GetInfosets().size() + 1),
74+
ni2(p_game->GetPlayer(2)->GetInfosets().size() + 1),
7475
maxpay(p_game->GetMaxPayoff() + Rational(1))
7576
{
7677
for (const auto &player : p_game->GetPlayers()) {

src/solvers/lp/lp.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,10 @@ List<MixedBehaviorProfile<T>> LpBehaviorSolve(const Game &p_game,
178178

179179
GameData<T> data(p_game);
180180

181-
Matrix<T> A(1, data.ns1 + p_game->GetPlayer(2)->NumInfosets() + 1, 1,
182-
data.ns2 + p_game->GetPlayer(1)->NumInfosets() + 1);
183-
Vector<T> b(1, data.ns1 + p_game->GetPlayer(2)->NumInfosets() + 1);
184-
Vector<T> c(1, data.ns2 + p_game->GetPlayer(1)->NumInfosets() + 1);
181+
Matrix<T> A(1, data.ns1 + p_game->GetPlayer(2)->GetInfosets().size() + 1, 1,
182+
data.ns2 + p_game->GetPlayer(1)->GetInfosets().size() + 1);
183+
Vector<T> b(1, data.ns1 + p_game->GetPlayer(2)->GetInfosets().size() + 1);
184+
Vector<T> c(1, data.ns2 + p_game->GetPlayer(1)->GetInfosets().size() + 1);
185185

186186
A = static_cast<T>(0);
187187
b = static_cast<T>(0);
@@ -196,7 +196,7 @@ List<MixedBehaviorProfile<T>> LpBehaviorSolve(const Game &p_game,
196196

197197
Array<T> primal(A.NumColumns()), dual(A.NumRows());
198198
List<MixedBehaviorProfile<T>> solution;
199-
SolveLP(A, b, c, p_game->GetPlayer(2)->NumInfosets() + 1, primal, dual);
199+
SolveLP(A, b, c, p_game->GetPlayer(2)->GetInfosets().size() + 1, primal, dual);
200200
MixedBehaviorProfile<T> profile(p_game);
201201
data.GetBehavior(profile, primal, dual, p_game->GetRoot(), 1, 1);
202202
profile.UndefinedToCentroid();

0 commit comments

Comments
 (0)