diff --git a/bipartite.sage b/bipartite.sage index 2c0d582..33dd63c 100644 --- a/bipartite.sage +++ b/bipartite.sage @@ -5,6 +5,7 @@ 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) @@ -57,5 +58,5 @@ for N in range(2,10): if gap > maxgap: maxgap = gap maxcol = v - - print(f"K_{{{N},{M}}}, gap = {maxgap}, column = {maxcol}") + frac=str(Fraction(maxgap).limit_denominator(m)) + print(f"K_{{{N},{M}}} gap ≈ {frac:<8} column = {maxcol}") diff --git a/complete.sage b/complete.sage new file mode 100644 index 0000000..6e90a37 --- /dev/null +++ b/complete.sage @@ -0,0 +1,61 @@ +# 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(3,11): + g=graphs.CompleteGraph(N) + A=g.incidence_matrix() + n,m = A.dimensions() + maxgap = 0 + for v in representative_vectors(N,0): + # 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} gap ≈ {frac:<8} column = {maxcol}")