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 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.