1. Make it work on a cartesian product of cones in the correct order. 2. Make it work on a cartesian product of cones in the wrong order (apply a perm utation before/after). 3. Make sure we have the dimensions of the PSD cone correct. 4. Come up with a fast heuristic (like making nu huge and taking e1 as our point) that finds a primal feasible point. 5. Fix the solve failures that we get in the translation tests. For example, ERROR: test_translation_orthant (test.symmetric_linear_game_test. SymmetricLinearGameTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 374, in test_translation_orthant self.assert_translation_works(L, K, e1, e2) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 361, in assert_translation_works value2 = game2.solution().game_value() File "/home/mjo/src/dunshire/dunshire/games.py", line 458, in solution raise GameUnsolvableException(self, soln_dict) dunshire.errors.GameUnsolvableException: Solution failed with result "unknown." The linear game (L, K, e1, e2) where L = [352.0763359 267.0812248 300.8004888 307.8135853] [429.8303135 324.8322824 361.6866231 372.1748983] [390.6592961 286.8039007 320.7409227 330.1854235] [316.0538913 247.7440818 276.9063990 274.9871772], K = Nonnegative orthant in the real 4-space, e1 = [7.7040001] [9.4324457] [8.3882819] [6.8908420], e2 = [8.5054325] [6.4738132] [7.2452437] [7.3307357]. CVXOPT returned: dual infeasibility: 0.053819211766446585 dual objective: -5.369636805607942 dual slack: 2.105806354638527e-17 gap: 2.6823510532777825e-16 iterations: 11 primal infeasibility: 4.71536776301359e-15 primal objective: -5.3799616179161 primal slack: 1.0328930392495263e-17 relative gap: 4.985818196816016e-17 residual as dual infeasibility certificate: 0.18587493201993227 residual as primal infeasibility certificate: None s: [0.0115539] [0.0000000] [0.0000000] [0.1230066] [0.4837410] [0.0000000] [0.0000000] [0.4044349] status: unknown x: [ 5.3799616] [ 0.0115539] [-0.0000000] [-0.0000000] [ 0.1230066] y: [5.3696368] z: [0.0000000] [0.4176330] [0.6007564] [0.0000000] [0.0000000] [0.0889310] [0.0191076] [0.0000000] 6. Fix the math domain errors that sometimes pop up: ERROR: test_scaling_icecream (test.symmetric_linear_game_test .SymmetricLinearGameTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 336, in test_scaling_icecream self.assert_scaling_works(L, K, e1, e2) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 317, in assert_scaling_works value2 = game2.solution().game_value() File "/home/mjo/src/dunshire/dunshire/games.py", line 428, in solution soln_dict = solvers.conelp(c, G, h, C.cvxopt_dims(), A, b) File "/usr/lib64/python3.4/site-packages/cvxopt/coneprog.py", line 1395, in conelp misc.update_scaling(W, lmbda, ds, dz) File "/usr/lib64/python3.4/site-packages/cvxopt/misc.py", line 510, in update_scaling ln = jnrm2(lmbda, n = m, offset = ind) File "/usr/lib64/python3.4/site-packages/cvxopt/misc.py", line 856, in jnrm2 return math.sqrt(x[offset] - a) * math.sqrt(x[offset] + a) ValueError: math domain error 7. Figure out why this happens, too: FAIL: test_scaling_icecream (test.symmetric_linear_game_test .SymmetricLinearGameTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 336, in test_scaling_icecream self.assert_scaling_works(L, K, e1, e2) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 318, in assert_scaling_works self.assert_within_tol(alpha*value1, value2) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 254, in assert_within_tol self.assertTrue(abs(first - second) < options.ABS_TOL) AssertionError: False is not true FAIL: test_translation_orthant (test.symmetric_linear_game_test SymmetricLinearGameTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 374, in test_translation_orthant self.assert_translation_works(L, K, e1, e2) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 366, in assert_translation_works self.assert_within_tol(value2, inner_product(M*x_bar, y_bar)) File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 254, in assert_within_tol self.assertTrue(abs(first - second) < options.ABS_TOL) AssertionError: False is not true 8. Fix floating point comparisons in the doctest output. 12. Investigate this test failure too. It looks like it was really close to being solved, but we would have needed a fudge factor of three instead of two. ERROR: test_positive_operator_value (test.symmetric_linear_game_test .SymmetricLinearGameTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/mjo/src/dunshire/test/symmetric_linear_game_test.py", line 550, in test_positive_operator_value self.assertTrue(G.solution().game_value() >= -options.ABS_TOL) File "/home/mjo/src/dunshire/dunshire/games.py", line 515, in solution raise GameUnsolvableException(self, soln_dict) dunshire.errors.GameUnsolvableException: Solution failed with result "unknown." The linear game (L, K, e1, e2) where L = [8.0814704 3.5584693] [3.9986814 9.3381562], K = Nonnegative orthant in the real 2-space, e1 = [1.3288182] [0.7458942], e2 = [0.6814326] [3.3799082], Condition((L, K, e1, e2)) = 41.093597. CVXOPT returned: dual infeasibility: 2.368640021750079e-06 dual objective: -7.867137172157051 dual slack: 1.1314089173606103e-07 gap: 1.1404410161224882e-06 iterations: 6 primal infeasibility: 1.379959981010593e-07 primal objective: -7.867137449574777 primal slack: 1.0550559882036034e-08 relative gap: 1.4496264027827932e-07 residual as dual infeasibility certificate: 0.12711103707156543 residual as primal infeasibility certificate: None s: [1.4674968] [0.0000000] [1.4055364] [0.0000000] status: unknown x: [ 7.8671374] [ 1.4674968] [-0.0000000] y: [7.8671372] z: [ 0.0000001] [14.0707905] [ 0.0000002] [ 1.3406728] 13. Add game payoff(x,y) method to check solutions.