# cogirth-packing gap of projections of graphic matroids from sage.all import * from sage.matroids.all import * from sage.graphs.all import * import gurobipy as gp from gurobipy import GRB from fractions import Fraction env = gp.Env(empty=True) env.setParam("OutputFlag",0) env.start() def representative_vectors(m, n): for w1 in range(m+1): for w2 in range(n+1): v = [0]*(m+n) v[:w1] = [1]*w1 v[m:m+w2] = [1]*w2 yield tuple(v) def cogirthip(bases, integral=true): model = gp.Model("mip1",env=env) # model.Params.LogToConsole = 0 groundset=frozenset() for B in bases: groundset=groundset|frozenset(B) x = dict() if integral: for e in groundset: x[e]=model.addVar(vtype=GRB.BINARY) else: for e in groundset: x[e]=model.addVar(vtype=GRB.CONTINUOUS,lb=0) model.setObjective(gp.quicksum([x[e] for e in groundset]), GRB.MINIMIZE) for B in bases: model.addConstr(gp.quicksum([x[e] for e in B])>=1) model.optimize() return model.ObjVal # cnt=0 # actual number of instances tested # f = lambda g: g.is_connected() for N in range(2,10): for M in range(N,10): g=graphs.CompleteBipartiteGraph(N,M) A=g.incidence_matrix() n,m = A.dimensions() maxgap = 0 for v in representative_vectors(N,M): # cnt=cnt+1 v_col=matrix(v).transpose() A_t=A.augment(v_col) # print(A_t) MM=Matroid(matrix=A_t,field=GF(2))/m #contract the last element # print(M) bases=MM.bases() strength=cogirthip(bases,integral=false) cogirth =cogirthip(bases,integral=true) gap = cogirth/strength if gap > maxgap: maxgap = gap maxcol = v frac=str(Fraction(maxgap).limit_denominator(m)) print(f"K_{{{N},{M}}} gap ≈ {frac:<8} column = {maxcol}")