@@ -819,7 +819,7 @@ class MixedBehaviorProfile:
819819 def agent_max_regret(self ) -> ProfileDType:
820820 """Returns the maximum regret at any information set.
821821
822- A profile is an agent Nash equilibrium if and only if `max_regret ()` is 0.
822+ A profile is an agent Nash equilibrium if and only if `agent_max_regret ()` is 0.
823823
824824 .. versionchanged:: 16.5.0
825825
@@ -830,6 +830,7 @@ class MixedBehaviorProfile:
830830 --------
831831 action_regret
832832 infoset_regret
833+ max_regret
833834 agent_liap_value
834835 """
835836 self._check_validity()
@@ -838,7 +839,7 @@ class MixedBehaviorProfile:
838839 def agent_liap_value(self ) -> ProfileDType:
839840 """Returns the Lyapunov value (see [McK91]_ ) of the strategy profile.
840841
841- The Lyapunov value is a non-negative number which is zero exactly at
842+ The agent Lyapunov value is a non-negative number which is zero exactly at
842843 agent Nash equilibria.
843844
844845 .. versionchanged:: 16.5.0
@@ -849,6 +850,44 @@ class MixedBehaviorProfile:
849850 See Also
850851 --------
851852 agent_max_regret
853+ liap_value
854+ """
855+ self._check_validity()
856+ return self._agent_liap_value()
857+
858+ def max_regret(self ) -> ProfileDType:
859+ """Returns the maximum regret at any information set.
860+
861+ A profile is a Nash equilibrium if and only if `max_regret()` is 0.
862+
863+ .. versionchanged:: 16.5.0
864+
865+ New implementation of `max_regret` to clarify the distinction between
866+ per-player and per-agent concepts.
867+
868+ See Also
869+ --------
870+ liap_value
871+ agent_max_regret
872+ """
873+ self._check_validity()
874+ return self.__max_regret()
875+
876+ def liap_value(self ) -> ProfileDType:
877+ """Returns the Lyapunov value (see [McK91]_ ) of the strategy profile.
878+
879+ The Lyapunov value is a non-negative number which is zero exactly at
880+ Nash equilibria.
881+
882+ .. versionchanged:: 16.5.0
883+
884+ New implementation of `liap_value` to clarify the distinction between
885+ per-player and per-agent concepts.
886+
887+ See Also
888+ --------
889+ max_regret
890+ agent_liap_value
852891 """
853892 self._check_validity()
854893 return self._agent_liap_value()
@@ -932,6 +971,9 @@ class MixedBehaviorProfileDouble(MixedBehaviorProfile):
932971 def _agent_max_regret(self ) -> float:
933972 return deref(self.profile ).GetAgentMaxRegret()
934973
974+ def _max_regret(self ) -> float:
975+ return deref(self.profile ).GetMaxRegret()
976+
935977 def __eq__(self , other: typing.Any ) -> bool:
936978 return (
937979 isinstance(other , MixedBehaviorProfileDouble ) and
@@ -951,6 +993,9 @@ class MixedBehaviorProfileDouble(MixedBehaviorProfile):
951993 def _agent_liap_value(self ) -> float:
952994 return deref(self.profile ).GetAgentLiapValue()
953995
996+ def _liap_value(self ) -> float:
997+ return deref(self.profile ).GetLiapValue()
998+
954999 def _normalize(self ) -> MixedBehaviorProfileDouble:
9551000 return MixedBehaviorProfileDouble.wrap(
9561001 make_shared[c_MixedBehaviorProfile[double]](deref(self.profile ).Normalize())
@@ -1028,6 +1073,9 @@ class MixedBehaviorProfileRational(MixedBehaviorProfile):
10281073 def _agent_max_regret(self ) -> Rational:
10291074 return rat_to_py(deref(self.profile ).GetAgentMaxRegret())
10301075
1076+ def _max_regret(self ) -> Rational:
1077+ return rat_to_py(deref(self.profile ).GetMaxRegret())
1078+
10311079 def __eq__(self , other: typing.Any ) -> bool:
10321080 return (
10331081 isinstance(other , MixedBehaviorProfileRational ) and
@@ -1047,6 +1095,9 @@ class MixedBehaviorProfileRational(MixedBehaviorProfile):
10471095 def _agent_liap_value(self ) -> Rational:
10481096 return rat_to_py(deref(self.profile ).GetAgentLiapValue())
10491097
1098+ def _liap_value(self ) -> Rational:
1099+ return rat_to_py(deref(self.profile ).GetLiapValue())
1100+
10501101 def _normalize(self ) -> MixedBehaviorProfileRational:
10511102 return MixedBehaviorProfileRational.wrap(
10521103 make_shared[c_MixedBehaviorProfile[c_Rational]](deref(self.profile ).Normalize())
0 commit comments