Skip to content

Commit fbda433

Browse files
committed
Remove automatic information set sorting from extensive form
The extensive form tree implementation no longer automatically sorts information sets after every operation. Exceptions: * Sorting is done automatically after reading an .efg file; * Sorting is done after every operation in the GUI.
1 parent c0ad8b8 commit fbda433

File tree

4 files changed

+16
-30
lines changed

4 files changed

+16
-30
lines changed

src/games/file.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
#include <algorithm>
2929

3030
#include "gambit.h"
31-
// for explicit access to turning off canonicalization
32-
#include "gametree.h"
3331

3432
namespace {
3533
// This anonymous namespace encapsulates the file-parsing code
@@ -732,7 +730,6 @@ Game ReadEfgFile(std::istream &p_stream)
732730

733731
TreeData treeData;
734732
Game game = NewTree();
735-
dynamic_cast<GameTreeRep &>(*game).SetCanonicalization(false);
736733
game->SetTitle(parser.GetLastText());
737734
ReadPlayers(parser, game, treeData);
738735
if (parser.GetNextToken() == TOKEN_TEXT) {
@@ -741,7 +738,7 @@ Game ReadEfgFile(std::istream &p_stream)
741738
parser.GetNextToken();
742739
}
743740
ParseNode(parser, game, game->GetRoot(), treeData);
744-
dynamic_cast<GameTreeRep &>(*game).SetCanonicalization(true);
741+
game->SortInfosets();
745742
return game;
746743
}
747744

src/games/gametree.cc

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ void GameTreeActionRep::DeleteAction()
144144
m_infoset->m_efg->NormalizeChanceProbs(m_infoset);
145145
}
146146
m_infoset->m_efg->ClearComputedValues();
147-
m_infoset->m_efg->SortInfosets();
148147
}
149148

150149
GameInfoset GameTreeActionRep::GetInfoset() const { return m_infoset; }
@@ -207,7 +206,6 @@ void GameTreeInfosetRep::SetPlayer(GamePlayer p_player)
207206
p_player->m_infosets.push_back(this);
208207

209208
m_efg->ClearComputedValues();
210-
m_efg->SortInfosets();
211209
}
212210

213211
bool GameTreeInfosetRep::Precedes(GameNode p_node) const
@@ -253,7 +251,6 @@ GameAction GameTreeInfosetRep::InsertAction(GameAction p_action /* =0 */)
253251
}
254252

255253
m_efg->ClearComputedValues();
256-
m_efg->SortInfosets();
257254
return action;
258255
}
259256

@@ -311,7 +308,6 @@ void GameTreeInfosetRep::Reveal(GamePlayer p_player)
311308
}
312309

313310
m_efg->ClearComputedValues();
314-
m_efg->SortInfosets();
315311
}
316312

317313
GameNode GameTreeInfosetRep::GetMember(int p_index) const { return m_members[p_index]; }
@@ -460,7 +456,6 @@ void GameTreeNodeRep::DeleteParent()
460456

461457
oldParent->Invalidate();
462458
m_efg->ClearComputedValues();
463-
m_efg->SortInfosets();
464459
}
465460

466461
void GameTreeNodeRep::DeleteTree()
@@ -480,7 +475,6 @@ void GameTreeNodeRep::DeleteTree()
480475
m_label = "";
481476

482477
m_efg->ClearComputedValues();
483-
m_efg->SortInfosets();
484478
}
485479

486480
void GameTreeNodeRep::CopySubtree(GameTreeNodeRep *src, GameTreeNodeRep *stop)
@@ -521,7 +515,6 @@ void GameTreeNodeRep::CopyTree(GameNode p_src)
521515
}
522516

523517
m_efg->ClearComputedValues();
524-
m_efg->SortInfosets();
525518
}
526519
}
527520

@@ -542,7 +535,6 @@ void GameTreeNodeRep::MoveTree(GameNode p_src)
542535
outcome = nullptr;
543536

544537
m_efg->ClearComputedValues();
545-
m_efg->SortInfosets();
546538
}
547539

548540
Game GameTreeNodeRep::CopySubgame() const
@@ -570,7 +562,6 @@ void GameTreeNodeRep::SetInfoset(GameInfoset p_infoset)
570562
infoset = dynamic_cast<GameTreeInfosetRep *>(p_infoset.operator->());
571563

572564
m_efg->ClearComputedValues();
573-
m_efg->SortInfosets();
574565
}
575566

576567
GameInfoset GameTreeNodeRep::LeaveInfoset()
@@ -594,7 +585,6 @@ GameInfoset GameTreeNodeRep::LeaveInfoset()
594585
}
595586

596587
m_efg->ClearComputedValues();
597-
m_efg->SortInfosets();
598588
return infoset;
599589
}
600590

@@ -629,7 +619,6 @@ GameInfoset GameTreeNodeRep::AppendMove(GameInfoset p_infoset)
629619
}
630620

631621
m_efg->ClearComputedValues();
632-
m_efg->SortInfosets();
633622
return infoset;
634623
}
635624

@@ -673,7 +662,6 @@ GameInfoset GameTreeNodeRep::InsertMove(GameInfoset p_infoset)
673662
}
674663

675664
m_efg->ClearComputedValues();
676-
m_efg->SortInfosets();
677665
return p_infoset;
678666
}
679667

@@ -686,7 +674,7 @@ GameInfoset GameTreeNodeRep::InsertMove(GameInfoset p_infoset)
686674
//------------------------------------------------------------------------
687675

688676
GameTreeRep::GameTreeRep()
689-
: m_computedValues(false), m_doCanon(true), m_root(new GameTreeNodeRep(this, nullptr)),
677+
: m_computedValues(false), m_root(new GameTreeNodeRep(this, nullptr)),
690678
m_chance(new GamePlayerRep(this, 0))
691679
{
692680
}
@@ -816,9 +804,6 @@ void GameTreeRep::NumberNodes(GameTreeNodeRep *n, int &index)
816804

817805
void GameTreeRep::SortInfosets()
818806
{
819-
if (!m_doCanon) {
820-
return;
821-
}
822807
int nodeindex = 1;
823808
NumberNodes(m_root, nodeindex);
824809

@@ -884,7 +869,6 @@ void GameTreeRep::BuildComputedValues()
884869
if (m_computedValues) {
885870
return;
886871
}
887-
SortInfosets();
888872
for (const auto &player : m_players) {
889873
player->MakeReducedStrats(m_root, nullptr);
890874
}

src/games/gametree.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ class GameTreeRep : public GameExplicitRep {
204204
friend class GameTreeActionRep;
205205

206206
protected:
207-
mutable bool m_computedValues, m_doCanon;
207+
mutable bool m_computedValues;
208208
GameTreeNodeRep *m_root;
209209
GamePlayerRep *m_chance;
210210

@@ -235,14 +235,6 @@ class GameTreeRep : public GameExplicitRep {
235235
bool IsConstSum() const override;
236236
using GameRep::IsPerfectRecall;
237237
bool IsPerfectRecall(GameInfoset &, GameInfoset &) const override;
238-
/// Turn on or off automatic canonicalization of the game
239-
void SetCanonicalization(bool p_doCanon) const
240-
{
241-
m_doCanon = p_doCanon;
242-
if (m_doCanon) {
243-
const_cast<GameTreeRep *>(this)->SortInfosets();
244-
}
245-
}
246238
//@}
247239

248240
/// @name Players

src/gui/gamedoc.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,18 +668,21 @@ void gbtGameDocument::DoSetActionProbs(GameInfoset p_infoset, const Array<Number
668668
void gbtGameDocument::DoSetInfoset(GameNode p_node, GameInfoset p_infoset)
669669
{
670670
p_node->SetInfoset(p_infoset);
671+
m_game->SortInfosets();
671672
UpdateViews(GBT_DOC_MODIFIED_GAME);
672673
}
673674

674675
void gbtGameDocument::DoLeaveInfoset(GameNode p_node)
675676
{
676677
p_node->LeaveInfoset();
678+
m_game->SortInfosets();
677679
UpdateViews(GBT_DOC_MODIFIED_GAME);
678680
}
679681

680682
void gbtGameDocument::DoRevealAction(GameInfoset p_infoset, GamePlayer p_player)
681683
{
682684
p_infoset->Reveal(p_player);
685+
m_game->SortInfosets();
683686
UpdateViews(GBT_DOC_MODIFIED_GAME);
684687
}
685688

@@ -690,6 +693,7 @@ void gbtGameDocument::DoInsertAction(GameNode p_node)
690693
}
691694
GameAction action = p_node->GetInfoset()->InsertAction();
692695
action->SetLabel(lexical_cast<std::string>(action->GetNumber()));
696+
m_game->SortInfosets();
693697
UpdateViews(GBT_DOC_MODIFIED_GAME);
694698
}
695699

@@ -702,6 +706,7 @@ void gbtGameDocument::DoSetNodeLabel(GameNode p_node, const wxString &p_label)
702706
void gbtGameDocument::DoAppendMove(GameNode p_node, GameInfoset p_infoset)
703707
{
704708
p_node->AppendMove(p_infoset);
709+
m_game->SortInfosets();
705710
UpdateViews(GBT_DOC_MODIFIED_GAME);
706711
}
707712

@@ -711,24 +716,28 @@ void gbtGameDocument::DoInsertMove(GameNode p_node, GamePlayer p_player, unsigne
711716
for (int act = 1; act <= infoset->NumActions(); act++) {
712717
infoset->GetAction(act)->SetLabel(lexical_cast<std::string>(act));
713718
}
719+
m_game->SortInfosets();
714720
UpdateViews(GBT_DOC_MODIFIED_GAME);
715721
}
716722

717723
void gbtGameDocument::DoInsertMove(GameNode p_node, GameInfoset p_infoset)
718724
{
719725
p_node->InsertMove(p_infoset);
726+
m_game->SortInfosets();
720727
UpdateViews(GBT_DOC_MODIFIED_GAME);
721728
}
722729

723730
void gbtGameDocument::DoCopyTree(GameNode p_destNode, GameNode p_srcNode)
724731
{
725732
p_destNode->CopyTree(p_srcNode);
733+
m_game->SortInfosets();
726734
UpdateViews(GBT_DOC_MODIFIED_GAME);
727735
}
728736

729737
void gbtGameDocument::DoMoveTree(GameNode p_destNode, GameNode p_srcNode)
730738
{
731739
p_destNode->MoveTree(p_srcNode);
740+
m_game->SortInfosets();
732741
UpdateViews(GBT_DOC_MODIFIED_GAME);
733742
}
734743

@@ -738,12 +747,14 @@ void gbtGameDocument::DoDeleteParent(GameNode p_node)
738747
return;
739748
}
740749
p_node->DeleteParent();
750+
m_game->SortInfosets();
741751
UpdateViews(GBT_DOC_MODIFIED_GAME);
742752
}
743753

744754
void gbtGameDocument::DoDeleteTree(GameNode p_node)
745755
{
746756
p_node->DeleteTree();
757+
m_game->SortInfosets();
747758
UpdateViews(GBT_DOC_MODIFIED_GAME);
748759
}
749760

@@ -752,6 +763,7 @@ void gbtGameDocument::DoSetPlayer(GameInfoset p_infoset, GamePlayer p_player)
752763
if (!p_player->IsChance() && !p_infoset->GetPlayer()->IsChance()) {
753764
// Currently don't support switching nodes to/from chance player
754765
p_infoset->SetPlayer(p_player);
766+
m_game->SortInfosets();
755767
UpdateViews(GBT_DOC_MODIFIED_GAME);
756768
}
757769
}
@@ -761,6 +773,7 @@ void gbtGameDocument::DoSetPlayer(GameNode p_node, GamePlayer p_player)
761773
if (!p_player->IsChance() && !p_node->GetPlayer()->IsChance()) {
762774
// Currently don't support switching nodes to/from chance player
763775
p_node->GetInfoset()->SetPlayer(p_player);
776+
m_game->SortInfosets();
764777
UpdateViews(GBT_DOC_MODIFIED_GAME);
765778
}
766779
}

0 commit comments

Comments
 (0)