Gambit v17.0.0-beta.1
Pre-release
Pre-release
·
8 commits
to master
since this release
Added
- Added
HistoryandHistoryTransition, formalizing a node's identity as the sequence of
actions taken from the root to reach it, with each step's acting player and
information-set/event context; aHistoryidentifies an information set or event via its
canonical (first-encountered) member. - Added
Selector,GroupedSelector, andH, a small expression language (H.path(...),
.by(...),.after(...),.plays,.filter(...),.with_recall(...), and similar) for
selecting histories/nodes in an extensive game; this is now how everyGamemethod that
queries or mutates the tree identifies its target(s). - Added
HistoryView, the read-only view of a history passed to filter callables (an
H-expression's own.filter/.bypredicate, orGame.behavior_support_profile's
actionscallback), exposing.actions,.members, and.last_action(player)without
exposing the underlying game or node. - Added the Herings-Peeters homotopy method to compute equilibria, as
hp_solveinpygambit
andgambit-hpas a command line tool; also available as a user-selectable method in
the graphical interface. - Added
Game.has_perfect_recall(player), andGameRep::HasPerfectRecall(const GamePlayer &)
in C++, reporting whether an individual player has perfect recall. (#1107) - Added
MixedBehaviorProfile.event_probs, returning the probability with which each of
the chance player's events is reached, as anEventProbVector. (#1109) - Added
Game.get_outcomes(), returning a materialized list of outcome labels, replacing
Game.outcomes. - Added
Game.get_outcome_payoffs(label), returning the payoff to each player at the outcome
labeledlabel. - Added
Game.set_outcome_payoffs(label, payoffs), setting the payoffs at the outcome labeled
label;payoffsmust be a complete mapping over the game's players, as with
Game.make_outcome. - Added
Game.relabel_outcomes(labels, strict=True), simultaneously reassigning the labels of
the game's outcomes, following the same pattern asGame.relabel_players/
Game.relabel_strategies. AddedGameRep::RelabelOutcomesin C++.
Changed
MixedBehaviorProfile.node_valuesis renamedhistory_values, andNodeValueVector/
NodeValuesVector/NodeIndexedVectorare renamedHistoryValueVector/HistoryValuesVector/
HistoryIndexedVector, matchingRealizProbVector/BeliefVector, its other
HistoryIndexedVectorsubclasses, which were always keyed byHistory.MixedBehaviorProfile.infoset_probsnow covers only the personal players' information sets,
asinfoset_valuesandinfoset_regrets; the chance player's events moved toevent_probs. (#1109)Game.make_outcomenow returnsNoneinstead of theOutcomecreated; use thelabel
already passed in, together withGame.get_outcome_payoffs/Game.relabel_outcomes, to refer
to it afterward.
Removed
Outcomehas been removed as a public-facing class in pygambit, followingAction,
Infoset,Player, andStrategy: no public method holds or returns a live handle
into a game's internal outcome list any longer.Game.outcomeshas been removed; use
Game.get_outcomes(),Game.get_outcome_payoffs(),Game.set_outcome_payoffs(), and
Game.relabel_outcomes()instead.- Removed
Nodeas a public-facing class. Every method that returned or accepted aNode
in earlier 17.0.0 pre-releases --Game.get_infosets,Game.get_events, and the
tree-querying/-mutation methods added since alpha.1 -- now returns/accepts aHistoryor
Selector/GroupedSelectorinstead (see Added, above). - Removed
InfosetandEvent, which alpha.3 (below) had turned into lazy, node-anchored
views; an information set or event is now identified purely by theHistoryof one of its
members. - Removed
Branch, added in alpha.3 (below) as a(node, label)pair replacingAction;
the equivalent is now aHistoryTransitionwithin aHistory. - Removed
Subgame.Game.subgamesandGame.minimal_subgameare renamed
Game.get_subgame_rootsandGame.get_minimal_subgame, and now return theHistoryof a
subgame's root rather than aSubgameobject. - Removed
Sequence. A player's sequence at an information set is now identified by the
Historyof one of the information set's members.
Fixed
GameTableRep's constructor (used byGame.from_arrays/Game.from_dict, which build a
non-sparse table with one outcome per contingency) gave every outcome the same empty label,
violating the invariant that every non-null outcome has a unique, nonempty label. Outcomes
are now labeled"1","2", and so on, following the existing convention for default
player/strategy labels.