def __init__(self, g = None, weights = None, signs = None, edge_id = 0):
self.g = Graph(loops = True, multiedges = True)
weights = dict(self.weights),
signs = dict(self.signs),
for vertex in self.g.vertices(sort = False):
self.weights[vertex] = (1, 0)
def add_vertex(self, name = None):
v_name = self.g.add_vertex(name)
v_name = v_name if v_name != None else name
self.weights[v_name] = (1, 0)
def add_vertices(self, count):
v_name = self.g.add_vertex()
self.weights[v_name] = (1, 0)
def add_edge(self, edge, sign = 1, name = None):
e_name = "e" + str(self.edge_id)
self.g.add_edge(edge[0], edge[1], e_name)
self.signs[e_name] = sign
def get_edge_with_name(self, name):
for edge in self.g.edges():
def _contract_edge_unsigned(self, name):
edge = self.get_edge_with_name(name)
self.g.contract_edge(edge)
w0 = self.weights[edge[1]]
w1 = self.weights[edge[0]]
self.weights[edge[0]] = (w0[0] + w1[0], w0[1] + w1[1])
del self.weights[edge[1]]
def contract_edge(self, name):
if (self.signs[name] == -1):
edge = self.get_edge_with_name(name)
self.vertex_switch(edge[0])
self._contract_edge_unsigned(name)
def delete_edge(self, name):
edge = self.get_edge_with_name(name)
def vertex_switch(self, v):
self.weights[v] = (self.weights[v][1], self.weights[v][0])
for edge in self.g.edges_incident([v]):
self.signs[edge[2]] = -self.signs[edge[2]]
def getSubgraph(self, S):
g1 = Graph(loops = True, multiedges = True)
g1.add_vertices(self.g.vertices())
def sign_color_component(self, cc):
for v in cc.depth_first_search(cc.random_vertex()):
if (len(partition) == 0):
for v1 in cc.neighbors(v):
sign = self.signs[cc.edge_label(v, v1)[0]]
partition[v] = sign * partition[v1]
for v1 in cc.neighbors(v):
for edge in cc.edge_boundary([v], [v1]):
if(partition[v1] * self.signs[edge[2]] != partition[v]):
def __init__(self, n, roots = {}): self.r = RootSystem("B" + str(n)) self.roots = set({ self.r.ambient_space().from_vector(root) for root in roots }) self.extend_to_implied_set()
return SignedPoset(self.n, [root.to_vector() for root in self.roots.copy()])
def extend_to_implied_set(self):
return sum([abs(coord[1]) for coord in list(p)])
root_system_roots = set(self.r.ambient_space().roots())
self.roots = set(self.roots)
while (roots_original == None or roots_original != self.roots):
roots_original = set(self.roots)
for p1, p2 in Combinations(self.roots, 2):
p = len(list(p)) * p / get_size(p)
if (p in root_system_roots):
except ZeroDivisionError:
raise ValueError("Error! The poset violates antisymmetry/transitivity!") def get_jordan_holder_set(self):
positive_roots = set(self.r.ambient_space().positive_roots())
for w in WeylGroup(self.r):
if (all([inv_w.action(p) in positive_roots for p in self.roots])):
d = Graph(self.n, loops = True, multiedges = True)
label = str(coords[0][0]) + ("<" if coords[0][1] > 0 else ">") d.add_edge(coords[0][0], coords[0][0], label)
label = str(coords[0][0]) + ("<" if coords[0][1] > 0 else ">") + \ (">" if coords[1][1] > 0 else "<") + str(coords[1][0]) d.add_edge(coords[0][0], coords[1][0], label)
print("An error occurred") d.show(edge_labels = True, layout = "circular")
def list_acyclic_orientations(wg):
V._assign_names(["e" + str(i) for i in range(n)])
rs = SignedPoset(n).r.ambient_space()
for t in Tuples({-1, 1}, wg.g.num_edges()): tau * vector(e[edge[0]] - wg.signs[edge[2]] * e[edge[1]]) for edge,tau in zip(edges, t)])
p = matrix(n + 1, n + 1, [
var("p_{}_{}".format(i, j), latex_name="p_{{{},{}}}".format(i, j)) for i in [0 .. n] for j in [0 .. n]] )prefer_first_coord_subs = {} prefer_first_coord_subs[p[i][j]] = p[j][i]
def prefer_first_coord(f):
return f.subs(prefer_first_coord_subs).expand()
def BSymmetricChromaticFunction(wg1):
for loop in wg1.g.loops():
if (wg1.signs[loop[2]] == 1):
for S in powerset(wg.g.edges()):
ccs = wg.getSubgraph(S).connected_components_subgraphs()
if (wg.signs[loop[2]] == 1):
partition = wg.sign_color_component(cc)
for key, sign in partition.items():
w[(1 - sign)/2] += wg.weights[key][0] + wg.weights[key][1]
return prefer_first_coord(poly)
def create_path(n, signs = None):
wg.add_edge((i, i + 1), signs[i])
def create_cycle(n, signs = None):
wg.add_edge((i, (i + 1) % n), signs[i])
def create_star(n, signs = None):
wg.add_edge((0, i + 1), signs[i])