60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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
 | 
						|
 | 
						|
env = gp.Env(empty=True)
 | 
						|
env.setParam("OutputFlag",0)
 | 
						|
env.start()
 | 
						|
 | 
						|
 | 
						|
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
 | 
						|
maxgap=0
 | 
						|
f = lambda g: g.is_connected()
 | 
						|
for N in range(4,10):
 | 
						|
    for g in filter(f, graphs(N)):
 | 
						|
        A=g.incidence_matrix()
 | 
						|
        n,m = A.dimensions()
 | 
						|
        # enumerate all vectors in F_2^n with even number of 1s
 | 
						|
        V = VectorSpace(GF(2), N)
 | 
						|
        for v in filter(lambda v: v.hamming_weight() % 2 == 0 and v!=0, V):
 | 
						|
            cnt=cnt+1
 | 
						|
            v_col=matrix(v).transpose()
 | 
						|
            A_t=A.augment(v_col)
 | 
						|
            # print(A_t)
 | 
						|
            M=Matroid(matrix=A_t,field=GF(2))/m     #contract the last element
 | 
						|
            # print(M)
 | 
						|
            bases=M.bases()
 | 
						|
            strength=cogirthip(bases,integral=false)
 | 
						|
            cogirth =cogirthip(bases,integral=true)
 | 
						|
            gap = cogirth/strength
 | 
						|
            # maxgap=max(gap,maxgap)
 | 
						|
            if gap > maxgap:
 | 
						|
                maxgap = gap
 | 
						|
                print(f"find a large gap: {gap}")
 | 
						|
                with open("projection.out", "a") as file:
 | 
						|
                    file.write("##################################\n"
 | 
						|
                               +str(gap)+"\n"+str(A_t)
 | 
						|
                               +"\n##################################\n")
 | 
						|
            if cnt%100==0:
 | 
						|
                print(f"#{cnt}, n={n}, max gap = {maxgap}") |