Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2188 views
1
def dominationNumber(g):
2
return len(g.dominating_set())
3
4
def min_degree(g):
5
return min(g.degree())
6
7
def max_degree(g):
8
return max(g.degree())
9
10
def matching_number(g):
11
return int(g.matching(value_only=True, use_edge_labels=False))
12
13
def residue(g):
14
seq = g.degree_sequence()
15
16
while seq[0] > 0:
17
d = seq.pop(0)
18
seq[:d] = [k-1 for k in seq[:d]]
19
seq.sort(reverse=True)
20
21
return len(seq)
22
23
def annihilation_number(g):
24
seq = sorted(g.degree())
25
26
a = 0
27
while sum(seq[:a+1]) <= sum(seq[a+1:]):
28
a += 1
29
30
return a
31
32
def fractional_alpha(g):
33
p = MixedIntegerLinearProgram(maximization=True)
34
x = p.new_variable()
35
p.set_objective(sum(x[v] for v in g.vertices()))
36
37
for v in g.vertices():
38
p.add_constraint(x[v], max=1)
39
40
for (u,v) in g.edge_iterator(labels=False):
41
p.add_constraint(x[u] + x[v], max=1)
42
43
return p.solve()
44
45
def lovasz_theta(g):
46
import cvxopt.base
47
import cvxopt.solvers
48
49
cvxopt.solvers.options['show_progress'] = False
50
cvxopt.solvers.options['abstol'] = float(1e-10)
51
cvxopt.solvers.options['reltol'] = float(1e-10)
52
53
gc = g.complement()
54
n = gc.order()
55
m = gc.size()
56
57
if n == 1:
58
return 1.0
59
60
d = m + n
61
c = -1 * cvxopt.base.matrix([0.0]*(n-1) + [2.0]*(d-n))
62
Xrow = [i*(1+n) for i in xrange(n-1)] + [b+a*n for (a, b) in gc.edge_iterator(labels=False)]
63
Xcol = range(n-1) + range(d-1)[n-1:]
64
X = cvxopt.base.spmatrix(1.0, Xrow, Xcol, (n*n, d-1))
65
66
for i in xrange(n-1):
67
X[n*n-1, i] = -1.0
68
69
sol = cvxopt.solvers.sdp(c, Gs=[-X], hs=[-cvxopt.base.matrix([0.0]*(n*n-1) + [-1.0], (n,n))])
70
v = 1.0 + cvxopt.base.matrix(-c, (1, d-1)) * sol['x']
71
72
# TODO: Rounding here is a total hack, sometimes it can come in slightly
73
# under the analytical answer, for example, 2.999998 instead of 3, which
74
# screws up the floor() call when checking difficult graphs.
75
return round(v[0], 3)
76
77
def cvetkovic(g):
78
eigenvalues = g.spectrum()
79
positive = 0
80
negative = 0
81
zero = 0
82
for e in eigenvalues:
83
if e > 0:
84
positive += 1
85
elif e < 0:
86
negative += 1
87
else:
88
zero += 1
89
90
return zero + min([positive, negative])
91
92
invariants = [dominationNumber, Graph.average_distance, Graph.diameter, Graph.radius, Graph.girth,Graph.order, Graph.size, Graph.szeged_index, Graph.wiener_index, min_degree, max_degree, Graph.average_degree, matching_number, residue, annihilation_number, fractional_alpha, lovasz_theta, cvetkovic]
93
94