Skip to content

Commit 8974aec

Browse files
committed
Move AppendMove to GameRep
1 parent b65426d commit 8974aec

7 files changed

Lines changed: 44 additions & 35 deletions

File tree

src/games/file.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ void ParseChanceNode(GameFileLexer &p_state, Game &p_game, GameNode &p_node, Tre
553553
p_state.GetNextToken();
554554

555555
if (!infoset) {
556-
infoset = p_node->AppendMove(p_game->GetChance(), action_labels.size());
556+
infoset = p_game->AppendMove(p_node, p_game->GetChance(), action_labels.size());
557557
p_treeData.m_infosetMap[0][infosetId] = infoset;
558558
infoset->SetLabel(label);
559559
auto action_label = action_labels.begin();
@@ -565,11 +565,11 @@ void ParseChanceNode(GameFileLexer &p_state, Game &p_game, GameNode &p_node, Tre
565565
}
566566
else {
567567
// TODO: Verify actions match up to any previous specifications
568-
p_node->AppendMove(infoset);
568+
p_game->AppendMove(p_node, infoset);
569569
}
570570
}
571571
else if (infoset) {
572-
p_node->AppendMove(infoset);
572+
p_game->AppendMove(p_node, infoset);
573573
}
574574
else {
575575
p_state.OnParseError("Referencing an undefined infoset");
@@ -609,7 +609,7 @@ void ParsePersonalNode(GameFileLexer &p_state, Game p_game, GameNode p_node, Tre
609609
p_state.GetNextToken();
610610

611611
if (!infoset) {
612-
infoset = p_node->AppendMove(player, action_labels.size());
612+
infoset = p_game->AppendMove(p_node, player, action_labels.size());
613613
p_treeData.m_infosetMap[playerId][infosetId] = infoset;
614614
infoset->SetLabel(label);
615615
auto action_label = action_labels.begin();
@@ -620,11 +620,11 @@ void ParsePersonalNode(GameFileLexer &p_state, Game p_game, GameNode p_node, Tre
620620
}
621621
else {
622622
// TODO: Verify actions match up to previous specifications
623-
p_node->AppendMove(infoset);
623+
p_game->AppendMove(p_node, infoset);
624624
}
625625
}
626626
else if (infoset) {
627-
p_node->AppendMove(infoset);
627+
p_game->AppendMove(p_node, infoset);
628628
}
629629
else {
630630
p_state.OnParseError("Referencing an undefined infoset");

src/games/game.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,6 @@ class GameNodeRep : public GameObject {
382382
/// Create a separate Game object containing the subgame rooted at the node
383383
virtual Game CopySubgame() const = 0;
384384

385-
virtual GameInfoset AppendMove(GamePlayer p_player, int p_actions) = 0;
386-
virtual GameInfoset AppendMove(GameInfoset p_infoset) = 0;
387385
virtual GameInfoset InsertMove(GamePlayer p_player, int p_actions) = 0;
388386
virtual GameInfoset InsertMove(GameInfoset p_infoset) = 0;
389387
};
@@ -488,6 +486,14 @@ class GameRep : public BaseGameRep {
488486
{
489487
throw UndefinedException();
490488
}
489+
virtual GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
490+
{
491+
throw UndefinedException();
492+
}
493+
virtual GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset)
494+
{
495+
throw UndefinedException();
496+
}
491497
virtual void Reveal(GameInfoset, GamePlayer) { throw UndefinedException(); }
492498
virtual GameInfoset LeaveInfoset(GameNode) { throw UndefinedException(); }
493499
virtual void DeleteAction(GameAction) { throw UndefinedException(); }

src/games/gametree.cc

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ void GameTreeNodeRep::CopySubtree(GameTreeNodeRep *src, GameTreeNodeRep *stop)
464464
}
465465

466466
if (src->m_children.size()) {
467-
AppendMove(src->m_infoset);
467+
m_efg->AppendMove(this, src->m_infoset);
468468
for (auto dest_child = m_children.begin(), src_child = src->m_children.begin();
469469
src_child != src->m_children.end(); src_child++, dest_child++) {
470470
(*dest_child)->CopySubtree(*src_child, stop);
@@ -488,7 +488,7 @@ void GameTreeNodeRep::CopyTree(GameNode p_src)
488488
auto *src = dynamic_cast<GameTreeNodeRep *>(p_src.operator->());
489489

490490
if (!src->m_children.empty()) {
491-
AppendMove(src->m_infoset);
491+
m_efg->AppendMove(this, src->m_infoset);
492492
for (auto dest_child = m_children.begin(), src_child = src->m_children.begin();
493493
src_child != src->m_children.end(); src_child++, dest_child++) {
494494
(*dest_child)->CopySubtree(*src_child, this);
@@ -577,38 +577,41 @@ GameInfoset GameTreeRep::LeaveInfoset(GameNode p_node)
577577
return node->m_infoset;
578578
}
579579

580-
GameInfoset GameTreeNodeRep::AppendMove(GamePlayer p_player, int p_actions)
580+
GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
581581
{
582-
if (p_actions <= 0 || !m_children.empty()) {
582+
auto *node = dynamic_cast<GameTreeNodeRep *>(p_node.operator->());
583+
if (p_actions <= 0 || !node->m_children.empty()) {
583584
throw UndefinedException();
584585
}
585-
if (p_player->GetGame() != m_efg) {
586+
if (p_node->GetGame() != this || p_player->GetGame() != this) {
586587
throw MismatchException();
587588
}
588589

589-
m_efg->IncrementVersion();
590+
IncrementVersion();
590591
return AppendMove(
591-
new GameTreeInfosetRep(m_efg, p_player->m_infosets.size() + 1, p_player, p_actions));
592+
p_node, new GameTreeInfosetRep(this, p_player->m_infosets.size() + 1, p_player, p_actions));
592593
}
593594

594-
GameInfoset GameTreeNodeRep::AppendMove(GameInfoset p_infoset)
595+
GameInfoset GameTreeRep::AppendMove(GameNode p_node, GameInfoset p_infoset)
595596
{
596-
if (!m_children.empty()) {
597+
auto *node = dynamic_cast<GameTreeNodeRep *>(p_node.operator->());
598+
if (!node->m_children.empty()) {
597599
throw UndefinedException();
598600
}
599-
if (p_infoset->GetGame() != m_efg) {
601+
if (p_node->GetGame() != this || p_infoset->GetGame() != this) {
600602
throw MismatchException();
601603
}
602604

603-
m_efg->IncrementVersion();
604-
m_infoset = dynamic_cast<GameTreeInfosetRep *>(p_infoset.operator->());
605-
m_infoset->AddMember(this);
606-
std::for_each(
607-
m_infoset->m_actions.begin(), m_infoset->m_actions.end(),
608-
[this](const GameActionRep *) { m_children.push_back(new GameTreeNodeRep(m_efg, this)); });
609-
m_efg->ClearComputedValues();
610-
m_efg->Canonicalize();
611-
return m_infoset;
605+
IncrementVersion();
606+
node->m_infoset = dynamic_cast<GameTreeInfosetRep *>(p_infoset.operator->());
607+
node->m_infoset->AddMember(node);
608+
std::for_each(node->m_infoset->m_actions.begin(), node->m_infoset->m_actions.end(),
609+
[this, node](const GameActionRep *) {
610+
node->m_children.push_back(new GameTreeNodeRep(this, node));
611+
});
612+
ClearComputedValues();
613+
Canonicalize();
614+
return node->m_infoset;
612615
}
613616

614617
GameInfoset GameTreeNodeRep::InsertMove(GamePlayer p_player, int p_actions)

src/games/gametree.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,6 @@ class GameTreeNodeRep : public GameNodeRep {
165165

166166
Game CopySubgame() const override;
167167

168-
GameInfoset AppendMove(GamePlayer p_player, int p_actions) override;
169-
GameInfoset AppendMove(GameInfoset p_infoset) override;
170168
GameInfoset InsertMove(GamePlayer p_player, int p_actions) override;
171169
GameInfoset InsertMove(GameInfoset p_infoset) override;
172170
};
@@ -261,6 +259,8 @@ class GameTreeRep : public GameExplicitRep {
261259

262260
/// @name Modification
263261
//@{
262+
GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions) override;
263+
GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset) override;
264264
void SetPlayer(GameInfoset, GamePlayer) override;
265265
void Reveal(GameInfoset, GamePlayer) override;
266266
GameInfoset LeaveInfoset(GameNode) override;

src/gui/gamedoc.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ void gbtGameDocument::DoSetNodeLabel(GameNode p_node, const wxString &p_label)
684684

685685
void gbtGameDocument::DoAppendMove(GameNode p_node, GameInfoset p_infoset)
686686
{
687-
p_node->AppendMove(p_infoset);
687+
m_game->AppendMove(p_node, p_infoset);
688688
UpdateViews(GBT_DOC_MODIFIED_GAME);
689689
}
690690

src/pygambit/gambit.pxd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,6 @@ cdef extern from "games/game.h":
170170
bint IsSubgameRoot() except +
171171
c_GameAction GetPriorAction() except +
172172

173-
c_GameInfoset AppendMove(c_GamePlayer, int) except +ValueError
174-
c_GameInfoset AppendMove(c_GameInfoset) except +ValueError
175173
c_GameInfoset InsertMove(c_GamePlayer, int) except +ValueError
176174
c_GameInfoset InsertMove(c_GameInfoset) except +ValueError
177175
void DeleteParent() except +
@@ -220,6 +218,8 @@ cdef extern from "games/game.h":
220218
c_Rational GetMaxPayoff(c_GamePlayer) except +
221219
bool IsPerfectRecall() except +
222220

221+
c_GameInfoset AppendMove(c_GameNode, c_GamePlayer, int) except +ValueError
222+
c_GameInfoset AppendMove(c_GameNode, c_GameInfoset) except +ValueError
223223
void SetPlayer(c_GameInfoset, c_GamePlayer) except +
224224
void Reveal(c_GameInfoset, c_GamePlayer) except +
225225
c_GameInfoset LeaveInfoset(c_GameNode) except +

src/pygambit/game.pxi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,12 +1502,12 @@ class Game:
15021502
raise UndefinedOperationError("append_move(): `nodes` must be terminal nodes")
15031503

15041504
resolved_node = cython.cast(Node, resolved_nodes[0])
1505-
resolved_node.node.deref().AppendMove(resolved_player.player, len(actions))
1505+
self.game.deref().AppendMove(resolved_node.node, resolved_player.player, len(actions))
15061506
for label, action in zip(actions, resolved_node.infoset.actions):
15071507
action.label = label
15081508
resolved_infoset = cython.cast(Infoset, resolved_node.infoset)
15091509
for n in resolved_nodes[1:]:
1510-
cython.cast(Node, n).node.deref().AppendMove(resolved_infoset.infoset)
1510+
self.game.deref().AppendMove(cython.cast(Node, n).node, resolved_infoset.infoset)
15111511

15121512
def append_infoset(self, nodes: typing.Union[NodeReference, NodeReferenceSet],
15131513
infoset: typing.Union[Infoset, str]) -> None:
@@ -1528,7 +1528,7 @@ class Game:
15281528
if any(len(n.children) > 0 for n in resolved_nodes):
15291529
raise UndefinedOperationError("append_infoset(): `nodes` must be terminal nodes")
15301530
for n in resolved_nodes:
1531-
cython.cast(Node, n).node.deref().AppendMove(resolved_infoset.infoset)
1531+
self.game.deref().AppendMove(cython.cast(Node, n).node, resolved_infoset.infoset)
15321532

15331533
def insert_move(self, node: typing.Union[Node, str],
15341534
player: typing.Union[Player, str], actions: int) -> None:

0 commit comments

Comments
 (0)