quivergraphalgorithms.gi
Interaktion und PortierbarkeitShell
# GAP Implementation # This contains various graph algorithms for testing quiver's properties # (created A. Mroz, 21.02.2013)
############################################################################# ## #P IsAcyclicQuiver(<Q>) ## ## This function returns true if a quiver <Q> does not ## contain an oriented cycle. ##
InstallMethod( IsAcyclicQuiver, "for quivers",
true,
[ IsQuiver ], 0, function ( Q )
local Visit, color, GRAY, BLACK, WHITE,
vert, vertex_list, res, tsorted;
WHITE := 0; GRAY := 1; BLACK := -1;
tsorted := [];
Visit := function(v)
local adj, uPos, result; # adjacent vertices
############################################################################# ## #P IsConnectedQuiver(<Q>) ## ## This function returns true if a quiver <Q> is a connected graph ## (i.e. each pair of vertices is connected by an unoriented path). ##
InstallMethod( IsConnectedQuiver, "for quivers",
true,
[ IsQuiver ], 0, function ( Q )
local Visit, color, GRAY, BLACK, WHITE,
vertex_list, res, vert;
WHITE := 0; GRAY := 1; BLACK := -1;
Visit := function(v)
local adj, uPos, result, vertex, arrow;
color[v] := GRAY;
adj := List(NeighborsOfVertex(vertex_list[v]),
x -> Position(vertex_list, x)); for arrow in IncomingArrowsOfVertex(vertex_list[v]) do
vertex := Position(vertex_list, SourceOfPath(arrow)); if not (vertex in adj) then
Add(adj, vertex); fi;
od; # Now adj contains all vertices adjacent to v (by arrows outgoing from and incoming to v)
for vertex in adj do if color[vertex] = WHITE then
Visit(vertex); fi;
od;
color[v] := BLACK;
return true; end;
color := [];
vertex_list := VerticesOfQuiver(Q);
if Length(vertex_list) = 0then
return true; fi;
for vert in [1 .. Length(vertex_list) ] do
color[vert] := WHITE;
od;
Visit(1);
return not (WHITE in color);
end
); #IsConnectedQuiver
############################################################################# ## #P IsUAcyclicQuiver(<Q>) ## ## This function returns true if a quiver <Q> does not ## contain an unoriented cycle. ## Note: an oriented cycle is also an unoriented cycle ##
InstallMethod( IsUAcyclicQuiver, "for quivers",
true,
[ IsQuiver ], 0, function ( Q )
local Visit, color, GRAY, BLACK, WHITE,
vertex_list, res, vert, i;
WHITE := 0; GRAY := 1; BLACK := -1;
Visit := function(v, predecessor)
local adj, result, vertex, arrow;
color[v] := GRAY;
adj := []; for arrow in IncomingArrowsOfVertex(vertex_list[v]) do
vertex := Position(vertex_list, SourceOfPath(arrow)); if vertex in adj then
return false; # (un)oriented cycle of length 1 or 2 detected! fi;
Add(adj, vertex);
od; for arrow in OutgoingArrowsOfVertex(vertex_list[v]) do
vertex := Position(vertex_list, TargetOfPath(arrow)); if vertex in adj then
return false; # (un)oriented cycle of length 1 or 2 detected! fi;
Add(adj, vertex);
od; # Now adj contains all vertices adjacent to v by arrows incoming to v and outgoing from v
for vertex in adj do if (color[vertex] = GRAY) and (predecessor <> vertex) then #cycle detected!
return false; fi; if color[vertex] = WHITE then if not Visit(vertex, v) then
return false; fi; fi;
od;
color[v] := BLACK;
return true; end;
color := [];
vertex_list := VerticesOfQuiver(Q);
for i in [1 .. Length(vertex_list) ] do
color[i] := WHITE;
od;
for vert in [1 .. Length(vertex_list) ] do if color[vert] = WHITE then if not Visit(vert, -1) then
return false; fi; fi;
od;
return true;
end
); #IsUAcyclicQuiver
############################################################################# ## #P IsTreeQuiver(<Q>) ## ## This function returns true if a quiver <Q> is a tree as a graph ## (i.e. it is connected and contains no unoriented cycles). ##
InstallMethod( IsTreeQuiver, "for quivers",
true,
[ IsQuiver ], 0, function ( Q )
return (NumberOfArrows(Q) = NumberOfVertices(Q) - 1) and IsConnectedQuiver(Q);
end
); #IsTreeQuiver
############################################################################# ## #P IsDynkinQuiver(<Q>) ## ## This function returns true if a quiver <Q> is a Dynkin quiver, ## i.e. an underlying graph is a Dynkin diagram. ## Note: function works only for connected quivers. ##
InstallMethod( IsDynkinQuiver, "for quivers",
true,
[ IsQuiver ], 0, function ( Q )
local arr, v, vertices, degrees, deg, fork_vertex,
fork_arrows, GoThrough, star_type;
# uaxiliary function computing the max. length of an unoriented path # starting from vertex s, going through the arrow # It makes sense only in this particular local situation of a "star" quiver
GoThrough := function(s, arrow)
local temp_s, temp_arr, can_go, counter, arrows;
if not IsConnectedQuiver(Q) then
Print("Quiver is not connected.\n");
return false; fi; if not (NumberOfArrows(Q) = NumberOfVertices(Q) - 1) then
Print("Quiver contains an (un)oriented cycle.\n");
return false; fi;
vertices := VerticesOfQuiver(Q);
degrees := [];
# collecting info on degrees of vertices for v in vertices do
deg := InDegreeOfVertex(v) + OutDegreeOfVertex(v); if deg > 2then
fork_vertex := v;
Add(degrees, deg); fi;
od;
if Length(degrees) = 0then # No vertex of degree > 2 and Q is tree => Q is A_n
Print("A_",Length(vertices),"\n");
return true; else# TESTING FOR REMAINING DYNKINS
if degrees = [3] then # necessary condition for being D_n, E_6,7,8 satisfied ( # (i.e. we have a "star" quiver with 3 arms)
fork_arrows := IncomingArrowsOfVertex(fork_vertex);
Append(fork_arrows, OutgoingArrowsOfVertex(fork_vertex));
star_type := []; for arr in fork_arrows do
Add(star_type, GoThrough(fork_vertex, arr));
od;
Sort(star_type); #Print(star_type,"\n");
if star_type{[1,2]} = [1,1] then
Print("D_",Length(vertices),"\n");
return true; fi; if star_type in [ [1,2,2], [1,2,3], [1,2,4] ] then
Print("E_",Length(vertices),"\n");
return true; fi;
fi;
fi;
return false;
end
); #IsDynkinQuiver
###################################################### ## #O FullSubquiver( <Q> , <L>) ## ## This function returns a quiver which is a fullsubquiver ## of a quiver <Q> induced by the list of vertices <L>. ## The names of vertices and arrows in resulting (sub)quiver ## remain the same as in original one. ##
InstallMethod( FullSubquiver,
[ IsQuiver, IsList ], function( Q, L )
local arr, vertices, arrows, result, src, trg;
if not ForAll(L, x -> (IsQuiverVertex(x) and (x in Q)) ) then
Error("L should be a list of vertices of Q!"); fi;
vertices := List(L, String);
arrows := []; for arr in ArrowsOfQuiver(Q) do
src := SourceOfPath(arr);
trg := TargetOfPath(arr); if (src in L) and (trg in L) then
Add(arrows, [ String(src),
String(trg),
String(arr) ] ); fi;
od;
result := Quiver(vertices, arrows);
return result;
end
); # FullSubquiver
###################################################### ## #O ConnectedComponentsOfQuiver( <Q> ) ## ## This function returns a list of quivers which are ## all connected components a quiver <Q>. ##
InstallMethod( ConnectedComponentsOfQuiver,
Visit := function(v)
local adj, result, vertex, arrow;
color[v] := GRAY;
adj := List(NeighborsOfVertex(vertex_list[v]),
x -> Position(vertex_list, x)); for arrow in IncomingArrowsOfVertex(vertex_list[v]) do
vertex := Position(vertex_list, SourceOfPath(arrow)); if not (vertex in adj) then
Add(adj, vertex); fi;
od; # Now adj contains all vertices adjacent to v (by arrows outgoing from and incoming to v)
for vertex in adj do if color[vertex] = WHITE then
Visit(vertex); fi;
od;
color[v] := BLACK;
Add(comp_verts, vertex_list[v]);
return true; end;
color := [];
vertex_list := VerticesOfQuiver(Q);
components := [];
for vert in [1 .. Length(vertex_list) ] do
color[vert] := WHITE;
od;
for vert in [1 .. Length(vertex_list) ] do if color[vert] = WHITE then
comp_verts := [];
Visit(vert);
comp_q := FullSubquiver(Q, comp_verts);
SetIsConnectedQuiver(comp_q, true);
Add(components, comp_q ); fi;
od;
return components; end
); # ConnectedComponentsOfQuiver
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.7Angebot
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.