]> gitweb.michael.orlitzky.com - dunshire.git/commitdiff
Add an epsilon_scale() method for games.
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 12 Nov 2016 12:35:12 +0000 (07:35 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Sun, 13 Nov 2016 20:19:27 +0000 (15:19 -0500)
When testing, we often need to know how lenient to be when making
comparisons. Trying to figure out just how lenient has been a huge
source of problems, and ultimately, the scaling factor (applied to
ABS_TOL) probably depends on properties of the solution.

This commit adds a new method, epsilon_scale(), that returns a safe
(very lenient) scaling factor. If things are within epsilon_scale()
times ABS_TOL, we consider then equal, or optimal, or whatever.

dunshire/games.py

index a1ac0f54c2982cd59b25cc479293c4e3dc558e44..ae1426a2c611f7e315f94fc5fea0e98f1da0905b 100644 (file)
@@ -853,6 +853,15 @@ class SymmetricLinearGame:
             self._L_specnorm_value = specnorm(self.L())
         return self._L_specnorm_value
 
+    def epsilon_scale(self, solution):
+        # Don't return anything smaller than 1... we can't go below
+        # out "minimum tolerance."
+        norm_p1_opt = norm(solution.player1_optimal())
+        norm_p2_opt = norm(solution.player2_optimal())
+        scale = self._L_specnorm()*(norm_p1_opt + norm_p2_opt)
+        return max(1, scale)
+
+
     def solution(self):
         """
         Solve this linear game and return a :class:`Solution`.