Skip to content

Gambit v17.0.0-beta.1

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Sep 15:15
· 8 commits to master since this release

Added

  • Added History and HistoryTransition, 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; a History identifies an information set or event via its
    canonical (first-encountered) member.
  • Added Selector, GroupedSelector, and H, 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 every Game method 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/.by predicate, or Game.behavior_support_profile's
    actions callback), 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_solve in pygambit
    and gambit-hp as a command line tool; also available as a user-selectable method in
    the graphical interface.
  • Added Game.has_perfect_recall(player), and GameRep::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 an EventProbVector. (#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
    labeled label.
  • Added Game.set_outcome_payoffs(label, payoffs), setting the payoffs at the outcome labeled
    label; payoffs must 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 as Game.relabel_players/
    Game.relabel_strategies. Added GameRep::RelabelOutcomes in C++.

Changed

  • MixedBehaviorProfile.node_values is renamed history_values, and NodeValueVector/
    NodeValuesVector/NodeIndexedVector are renamed HistoryValueVector/HistoryValuesVector/
    HistoryIndexedVector, matching RealizProbVector/BeliefVector, its other
    HistoryIndexedVector subclasses, which were always keyed by History.
  • MixedBehaviorProfile.infoset_probs now covers only the personal players' information sets,
    as infoset_values and infoset_regrets; the chance player's events moved to event_probs. (#1109)
  • Game.make_outcome now returns None instead of the Outcome created; use the label
    already passed in, together with Game.get_outcome_payoffs/Game.relabel_outcomes, to refer
    to it afterward.

Removed

  • Outcome has been removed as a public-facing class in pygambit, following Action,
    Infoset, Player, and Strategy: no public method holds or returns a live handle
    into a game's internal outcome list any longer. Game.outcomes has been removed; use
    Game.get_outcomes(), Game.get_outcome_payoffs(), Game.set_outcome_payoffs(), and
    Game.relabel_outcomes() instead.
  • Removed Node as a public-facing class. Every method that returned or accepted a Node
    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 a History or
    Selector/GroupedSelector instead (see Added, above).
  • Removed Infoset and Event, which alpha.3 (below) had turned into lazy, node-anchored
    views; an information set or event is now identified purely by the History of one of its
    members.
  • Removed Branch, added in alpha.3 (below) as a (node, label) pair replacing Action;
    the equivalent is now a HistoryTransition within a History.
  • Removed Subgame. Game.subgames and Game.minimal_subgame are renamed
    Game.get_subgame_roots and Game.get_minimal_subgame, and now return the History of a
    subgame's root rather than a Subgame object.
  • Removed Sequence. A player's sequence at an information set is now identified by the
    History of one of the information set's members.

Fixed

  • GameTableRep's constructor (used by Game.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.