A quiver is an oriented graphs without loops, two-cycles, or multiple edges. The edges are labelled by pairs
such that the matrix
with
for an edge
between vertices
and
is skew-symmetrizable.
For the compendium on the cluster algebra and quiver package see
AUTHORS:
See also
For mutation types of combinatorial quivers, see QuiverMutationType(). Cluster seeds are closely related to ClusterSeed().
Bases: sage.structure.sage_object.SageObject
The quiver associated to an exchange matrix.
INPUT:
data – can be any of the following:
* QuiverMutationType
* str - a string representing a QuiverMutationType or a common quiver type (see Examples)
* ClusterQuiver
* Matrix - a skew-symmetrizable matrix
* DiGraph - must be the input data for a quiver
* List of edges - must be the edge list of a digraph for a quiver
frozen – (default:None) sets the number of frozen variables if the input type is a DiGraph, it is ignored otherwise.
EXAMPLES:
from a QuiverMutationType:
sage: Q = ClusterQuiver(['A',5]); Q Quiver on 5 vertices of type ['A', 5] sage: Q = ClusterQuiver(['B',2]); Q Quiver on 2 vertices of type ['B', 2] sage: Q2 = ClusterQuiver(['C',2]); Q2 Quiver on 2 vertices of type ['B', 2] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q True sage: MT = Q2.mutation_type(); MT.standard_quiver() == Q2 False sage: Q = ClusterQuiver(['A',[2,5],1]); Q Quiver on 7 vertices of type ['A', [2, 5], 1] sage: Q = ClusterQuiver(['A', [5,0],1]); Q Quiver on 5 vertices of type ['D', 5] sage: Q.is_finite() True sage: Q.is_acyclic() False sage: Q = ClusterQuiver(['F', 4, [2,1]]); Q Quiver on 6 vertices of type ['F', 4, [1, 2]] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q False sage: dg = Q.digraph(); Q.mutate([2,1,4,0,5,3]) sage: dg2 = Q.digraph(); dg2.is_isomorphic(dg,edge_labels=True) False sage: dg2.is_isomorphic(MT.standard_quiver().digraph(),edge_labels=True) True sage: Q = ClusterQuiver(['G',2, (3,1)]); Q Quiver on 4 vertices of type ['G', 2, [1, 3]] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q False sage: Q = ClusterQuiver(['GR',[3,6]]); Q Quiver on 4 vertices of type ['D', 4] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q False sage: Q = ClusterQuiver(['GR',[3,7]]); Q Quiver on 6 vertices of type ['E', 6] sage: Q = ClusterQuiver(['TR',2]); Q Quiver on 3 vertices of type ['A', 3] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q False sage: Q.mutate([1,0]); MT.standard_quiver() == Q True sage: Q = ClusterQuiver(['TR',3]); Q Quiver on 6 vertices of type ['D', 6] sage: MT = Q.mutation_type(); MT.standard_quiver() == Q Falsefrom a ClusterQuiver:
sage: Q = ClusterQuiver(['A',[2,5],1]); Q Quiver on 7 vertices of type ['A', [2, 5], 1] sage: T = ClusterQuiver( Q ); T Quiver on 7 vertices of type ['A', [2, 5], 1]from a Matrix:
sage: Q = ClusterQuiver(['A',[2,5],1]); Q Quiver on 7 vertices of type ['A', [2, 5], 1] sage: T = ClusterQuiver( Q._M ); T Quiver on 7 vertices sage: Q = ClusterQuiver( matrix([[0,1,-1],[-1,0,1],[1,-1,0],[1,2,3]]) ); Q Quiver on 4 vertices with 1 frozen vertex sage: Q = ClusterQuiver( matrix([]) ); Q Quiver without verticesfrom a DiGraph:
sage: Q = ClusterQuiver(['A',[2,5],1]); Q Quiver on 7 vertices of type ['A', [2, 5], 1] sage: T = ClusterQuiver( Q._digraph ); T Quiver on 7 vertices sage: Q = ClusterQuiver( DiGraph([[1,2],[2,3],[3,4],[4,1]]) ); Q Quiver on 4 verticesfrom a List of edges:
sage: Q = ClusterQuiver(['A',[2,5],1]); Q Quiver on 7 vertices of type ['A', [2, 5], 1] sage: T = ClusterQuiver( Q._digraph.edges() ); T Quiver on 7 vertices sage: Q = ClusterQuiver( [[1,2],[2,3],[3,4],[4,1]] ); Q Quiver on 4 vertices
TESTS:
sage: Q = ClusterQuiver(DiGraph([[1,1]]))
Traceback (most recent call last):
...
ValueError: The input DiGraph contains a loop
sage: Q = ClusterQuiver([[1,1]])
Traceback (most recent call last):
...
ValueError: The input DiGraph contains a loop
sage: Q = ClusterQuiver(DiGraph([[1, 0],[0,1]]))
Traceback (most recent call last):
...
ValueError: The input DiGraph contains two-cycles
sage: Q = ClusterQuiver('whatever')
Traceback (most recent call last):
...
ValueError: The input data was not recognized.
Returns the b-matrix of self.
EXAMPLES:
sage: ClusterQuiver(['A',4]).b_matrix()
[ 0 1 0 0]
[-1 0 -1 0]
[ 0 1 0 1]
[ 0 0 -1 0]
sage: ClusterQuiver(['B',4]).b_matrix()
[ 0 1 0 0]
[-1 0 -1 0]
[ 0 1 0 1]
[ 0 0 -2 0]
sage: ClusterQuiver(['D',4]).b_matrix()
[ 0 1 0 0]
[-1 0 -1 -1]
[ 0 1 0 0]
[ 0 1 0 0]
sage: ClusterQuiver(QuiverMutationType([['A',2],['B',2]])).b_matrix()
[ 0 1 0 0]
[-1 0 0 0]
[ 0 0 0 1]
[ 0 0 -2 0]
Returns the canonical labelling of self, see sage.graphs.graph.GenericGraph.canonical_label.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['A',4]); Q.digraph().edges()
[(0, 1, (1, -1)), (2, 1, (1, -1)), (2, 3, (1, -1))]
sage: T = Q.canonical_label(); T.digraph().edges()
[(0, 3, (1, -1)), (1, 2, (1, -1)), (1, 3, (1, -1))]
sage: T,iso = Q.canonical_label(certify=True); T.digraph().edges(); iso
[(0, 3, (1, -1)), (1, 2, (1, -1)), (1, 3, (1, -1))]
{0: 0, 1: 3, 2: 1, 3: 2}
sage: Q = ClusterQuiver(QuiverMutationType([['B',2],['A',1]])); Q
Quiver on 3 vertices of type [ ['B', 2], ['A', 1] ]
sage: Q.canonical_label()
Quiver on 3 vertices of type [ ['A', 1], ['B', 2] ]
sage: Q.canonical_label(certify=True)
(Quiver on 3 vertices of type [ ['A', 1], ['B', 2] ], {0: 1, 1: 2, 2: 0})
Returns the underlying digraph of self.
EXAMPLES:
sage: ClusterQuiver(['A',1]).digraph()
Digraph on 1 vertex
sage: ClusterQuiver(['A',1]).digraph().vertices()
[0]
sage: ClusterQuiver(['A',1]).digraph().edges()
[]
sage: ClusterQuiver(['A',4]).digraph()
Digraph on 4 vertices
sage: ClusterQuiver(['A',4]).digraph().edges()
[(0, 1, (1, -1)), (2, 1, (1, -1)), (2, 3, (1, -1))]
sage: ClusterQuiver(['B',4]).digraph()
Digraph on 4 vertices
sage: ClusterQuiver(['A',4]).digraph().edges()
[(0, 1, (1, -1)), (2, 1, (1, -1)), (2, 3, (1, -1))]
sage: ClusterQuiver(QuiverMutationType([['A',2],['B',2]])).digraph()
Digraph on 4 vertices
sage: ClusterQuiver(QuiverMutationType([['A',2],['B',2]])).digraph().edges()
[(0, 1, (1, -1)), (2, 3, (1, -2))]
Returns the restriction to the principal part (i.e. exchangeable part) of self, the subquiver obtained by deleting the frozen vertices of self.
EXAMPLES:
sage: Q = ClusterQuiver(['A',4])
sage: T = ClusterQuiver( Q.digraph().edges(), frozen=1 )
sage: T.digraph().edges()
[(0, 1, (1, -1)), (2, 1, (1, -1)), (2, 3, (1, -1))]
sage: T.exchangeable_part().digraph().edges()
[(0, 1, (1, -1)), (2, 1, (1, -1))]
sage: Q2 = Q.principal_extension()
sage: Q3 = Q2.principal_extension()
sage: Q2.exchangeable_part() == Q3.exchangeable_part()
True
Only in notebook mode. Starts an interactive window for cluster seed mutations.
INPUT:
TESTS:
sage: Q = ClusterQuiver(['A',4])
sage: Q.interact() # long time
'The interactive mode only runs in the Sage notebook.'
Returns true if self is acyclic.
EXAMPLES:
sage: ClusterQuiver(['A',4]).is_acyclic()
True
sage: ClusterQuiver(['A',[2,1],1]).is_acyclic()
True
sage: ClusterQuiver([[0,1],[1,2],[2,0]]).is_acyclic()
False
Returns true if self is bipartite.
EXAMPLES:
sage: ClusterQuiver(['A',[3,3],1]).is_bipartite()
True
sage: ClusterQuiver(['A',[4,3],1]).is_bipartite()
False
Returns True if self is of finite type.
EXAMPLES:
sage: Q = ClusterQuiver(['A',3])
sage: Q.is_finite()
True
sage: Q = ClusterQuiver(['A',[2,2],1])
sage: Q.is_finite()
False
sage: Q = ClusterQuiver([['A',3],['B',3]])
sage: Q.is_finite()
True
sage: Q = ClusterQuiver(['T',[4,4,4]])
sage: Q.is_finite()
False
sage: Q = ClusterQuiver([['A',3],['T',[4,4,4]]])
sage: Q.is_finite()
False
sage: Q = ClusterQuiver([['A',3],['T',[2,2,3]]])
sage: Q.is_finite()
True
sage: Q = ClusterQuiver([['A',3],['D',5]])
sage: Q.is_finite()
True
sage: Q = ClusterQuiver([['A',3],['D',5,1]])
sage: Q.is_finite()
False
sage: Q = ClusterQuiver([[0,1,2],[1,2,2],[2,0,2]])
sage: Q.is_finite()
False
sage: Q = ClusterQuiver([[0,1,2],[1,2,2],[2,0,2],[3,4,1],[4,5,1]])
sage: Q.is_finite()
False
Uses a non-deterministic method by random mutations in various directions. Can result in a wrong answer.
INPUT:
ALGORITHM:
A quiver is mutation infinite if and only if every edge label (a,-b) satisfy a*b > 4. Thus, we apply random mutations in random directions
EXAMPLES:
sage: Q = ClusterQuiver(['A',10])
sage: Q._mutation_type = None
sage: Q.is_mutation_finite()
True
sage: Q = ClusterQuiver([(0,1),(1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(2,9)])
sage: Q.is_mutation_finite()
False
Returns the number of frozen vertices of self.
EXAMPLES:
sage: Q = ClusterQuiver(['A',4])
sage: Q.m()
0
sage: T = ClusterQuiver( Q.digraph().edges(), frozen=1 )
sage: T.n()
3
sage: T.m()
1
Mutates self at a sequence of vertices.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['A',4]); Q.b_matrix()
[ 0 1 0 0]
[-1 0 -1 0]
[ 0 1 0 1]
[ 0 0 -1 0]
sage: Q.mutate(0); Q.b_matrix()
[ 0 -1 0 0]
[ 1 0 -1 0]
[ 0 1 0 1]
[ 0 0 -1 0]
sage: T = Q.mutate(0, inplace=False); T
Quiver on 4 vertices of type ['A', 4]
sage: Q.mutate(0)
sage: Q == T
True
sage: Q.mutate([0,1,0])
sage: Q.b_matrix()
[ 0 -1 1 0]
[ 1 0 0 0]
[-1 0 0 1]
[ 0 0 -1 0]
sage: Q = ClusterQuiver(QuiverMutationType([['A',1],['A',3]]))
sage: Q.b_matrix()
[ 0 0 0 0]
[ 0 0 1 0]
[ 0 -1 0 -1]
[ 0 0 1 0]
sage: T = Q.mutate(0,inplace=False)
sage: Q == T
True
TESTS:
sage: Q = ClusterQuiver(['A',4]); Q.mutate(0,1)
Traceback (most recent call last):
...
ValueError: The second parameter must be boolean. To mutate at a sequence of length 2, input it as a list.
sage: Q = ClusterQuiver(['A',4]); Q.mutate(0,0)
Traceback (most recent call last):
...
ValueError: The second parameter must be boolean. To mutate at a sequence of length 2, input it as a list.
Returns the mutation class of self together with certain constrains.
INPUT:
depth – (default: infinity) integer, only seeds with distance at most depth from self are returned.
show_depth – (default: False) if True, the actual depth of the mutation is shown.
return_paths – (default: False) if True, a shortest path of mutation sequences from self to the given quiver is returned as well.
data_type – (default: “quiver”) can be one of the following:
* "quiver" -- the quiver is returned
* "dig6" -- the dig6-data is returned
* "path" -- shortest paths of mutation sequences from self are returned
sink_source – (default: False) if True, only mutations at sinks and sources are applied.
EXAMPLES:
sage: Q = ClusterQuiver(['A',3])
sage: Ts = Q.mutation_class()
sage: for T in Ts: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: Ts = Q.mutation_class(depth=1)
sage: for T in Ts: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: Ts = Q.mutation_class(show_depth=True)
Depth: 0 found: 1 Time: ... s
Depth: 1 found: 3 Time: ... s
Depth: 2 found: 4 Time: ... s
sage: Ts = Q.mutation_class(return_paths=True)
sage: for T in Ts: print T
(Quiver on 3 vertices of type ['A', 3], [])
(Quiver on 3 vertices of type ['A', 3], [1])
(Quiver on 3 vertices of type ['A', 3], [0])
(Quiver on 3 vertices of type ['A', 3], [0, 1])
sage: Ts = Q.mutation_class(up_to_equivalence=False)
sage: for T in Ts: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: Ts = Q.mutation_class(return_paths=True,up_to_equivalence=False)
sage: for T in Ts: print T
(Quiver on 3 vertices of type ['A', 3], [])
(Quiver on 3 vertices of type ['A', 3], [2])
(Quiver on 3 vertices of type ['A', 3], [1])
(Quiver on 3 vertices of type ['A', 3], [0])
(Quiver on 3 vertices of type ['A', 3], [2, 1])
(Quiver on 3 vertices of type ['A', 3], [0, 1])
(Quiver on 3 vertices of type ['A', 3], [0, 1, 2])
(Quiver on 3 vertices of type ['A', 3], [0, 1, 0])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0, 2])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0, 1])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2, 1])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2, 0])
sage: Ts = Q.mutation_class(show_depth=True)
Depth: 0 found: 1 Time: ... s
Depth: 1 found: 3 Time: ... s
Depth: 2 found: 4 Time: ... s
sage: Ts = Q.mutation_class(show_depth=True, up_to_equivalence=False)
Depth: 0 found: 1 Time: ... s
Depth: 1 found: 4 Time: ... s
Depth: 2 found: 6 Time: ... s
Depth: 3 found: 10 Time: ... s
Depth: 4 found: 14 Time: ... s
TESTS:
sage: all( len(ClusterQuiver(['A',n]).mutation_class()) == ClusterQuiver(['A',n]).mutation_type().class_size() for n in [2..6])
True
sage: all( len(ClusterQuiver(['B',n]).mutation_class()) == ClusterQuiver(['B',n]).mutation_type().class_size() for n in [2..6])
True
Returns an iterator for the mutation class of self together with certain constrains.
INPUT:
depth – (default: infinity) integer, only quivers with distance at most depth from self are returned.
show_depth – (default: False) if True, the actual depth of the mutation is shown.
return_paths – (default: False) if True, a shortest path of mutation sequences from self to the given quiver is returned as well.
data_type – (default: “quiver”) can be one of the following:
* "quiver"
* "matrix"
* "digraph"
* "dig6"
* "path"
up_to_equivalence – (default: True) if True, only one quiver for each graph-isomorphism class is recorded.
sink_source – (default: False) if True, only mutations at sinks and sources are applied.
EXAMPLES:
sage: Q = ClusterQuiver(['A',3])
sage: it = Q.mutation_class_iter()
sage: for T in it: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: it = Q.mutation_class_iter(depth=1)
sage: for T in it: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: it = Q.mutation_class_iter(show_depth=True)
sage: for T in it: pass
Depth: 0 found: 1 Time: ... s
Depth: 1 found: 3 Time: ... s
Depth: 2 found: 4 Time: ... s
sage: it = Q.mutation_class_iter(return_paths=True)
sage: for T in it: print T
(Quiver on 3 vertices of type ['A', 3], [])
(Quiver on 3 vertices of type ['A', 3], [1])
(Quiver on 3 vertices of type ['A', 3], [0])
(Quiver on 3 vertices of type ['A', 3], [0, 1])
sage: it = Q.mutation_class_iter(up_to_equivalence=False)
sage: for T in it: print T
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
Quiver on 3 vertices of type ['A', 3]
sage: it = Q.mutation_class_iter(return_paths=True,up_to_equivalence=False)
sage: for T in it: print T
(Quiver on 3 vertices of type ['A', 3], [])
(Quiver on 3 vertices of type ['A', 3], [2])
(Quiver on 3 vertices of type ['A', 3], [1])
(Quiver on 3 vertices of type ['A', 3], [0])
(Quiver on 3 vertices of type ['A', 3], [2, 1])
(Quiver on 3 vertices of type ['A', 3], [0, 1])
(Quiver on 3 vertices of type ['A', 3], [0, 1, 2])
(Quiver on 3 vertices of type ['A', 3], [0, 1, 0])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0, 2])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 0, 1])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2, 1])
(Quiver on 3 vertices of type ['A', 3], [2, 1, 2, 0])
sage: Q = ClusterQuiver(['A',3])
sage: it = Q.mutation_class_iter(data_type='path')
sage: for T in it: print T
[]
[1]
[0]
[0, 1]
sage: Q = ClusterQuiver(['A',3])
sage: it = Q.mutation_class_iter(return_paths=True,data_type='matrix')
sage: it.next()
(
[ 0 0 1]
[ 0 0 1]
[-1 -1 0], []
)
Returns a list containing the sequence of quivers obtained from self by a sequence of mutations on vertices.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['A',4])
sage: seq = Q.mutation_sequence([0,1]); seq
[Quiver on 4 vertices of type ['A', 4], Quiver on 4 vertices of type ['A', 4], Quiver on 4 vertices of type ['A', 4]]
sage: [T.b_matrix() for T in seq]
[
[ 0 1 0 0] [ 0 -1 0 0] [ 0 1 -1 0]
[-1 0 -1 0] [ 1 0 -1 0] [-1 0 1 0]
[ 0 1 0 1] [ 0 1 0 1] [ 1 -1 0 1]
[ 0 0 -1 0], [ 0 0 -1 0], [ 0 0 -1 0]
]
Returns the mutation type of self.
Returns the mutation_type of each connected component of self if it can be determined, otherwise, the mutation type of this component is set to be unknown.
The mutation types of the components are ordered by vertex labels.
If you do many type recognitions, you should consider to save
exceptional mutation types using
:sage.combinat.cluster_algebra_quiver.quiver_mutation_type.save_exceptional_data
WARNING:
EXAMPLES:
sage: ClusterQuiver(['A',4]).mutation_type()
['A', 4]
sage: ClusterQuiver(['A',(3,1),1]).mutation_type()
['A', [1, 3], 1]
sage: ClusterQuiver(['C',2]).mutation_type()
['B', 2]
sage: ClusterQuiver(['B',4,1]).mutation_type()
['BD', 4, 1]
finite types:
sage: Q = ClusterQuiver(['A',5])
sage: Q._mutation_type = None
sage: Q.mutation_type()
['A', 5]
sage: Q = ClusterQuiver([(0,1),(1,2),(2,3),(3,4)])
sage: Q.mutation_type()
['A', 5]
affine types:
sage: Q = ClusterQuiver(['E',8,[1,1]]); Q
Quiver on 10 vertices of type ['E', 8, [1, 1]]
sage: Q._mutation_type = None; Q
Quiver on 10 vertices
sage: Q.mutation_type() # long time
['E', 8, [1, 1]]
the not yet working affine type D (unless user has saved small classical quiver data):
sage: Q = ClusterQuiver(['D',4,1])
sage: Q._mutation_type = None
sage: Q.mutation_type() # todo: not implemented
['D', 4, 1]
the exceptional types:
sage: Q = ClusterQuiver(['X',6])
sage: Q._mutation_type = None
sage: Q.mutation_type() # long time
['X', 6]
examples from page 8 of Keller’s article “Cluster algebras, quiver representations and triangulated categories” (arXiv:0807.1960):
sage: dg = DiGraph(); dg.add_edges([(9,0),(9,4),(4,6),(6,7),(7,8),(8,3),(3,5),(5,6),(8,1),(2,3)])
sage: ClusterQuiver( dg ).mutation_type() # long time
['E', 8, [1, 1]]
sage: dg = DiGraph( { 0:[3], 1:[0,4], 2:[0,6], 3:[1,2,7], 4:[3,8], 5:[2], 6:[3,5], 7:[4,6], 8:[7] } )
sage: ClusterQuiver( dg ).mutation_type() # long time
['E', 8, 1]
sage: dg = DiGraph( { 0:[3,9], 1:[0,4], 2:[0,6], 3:[1,2,7], 4:[3,8], 5:[2], 6:[3,5], 7:[4,6], 8:[7], 9:[1] } )
sage: ClusterQuiver( dg ).mutation_type() # long time
['E', 8, [1, 1]]
infinite types:
sage: Q = ClusterQuiver(['GR',[4,9]])
sage: Q._mutation_type = None
sage: Q.mutation_type()
'undetermined infinite mutation type'
reducible types:
sage: Q = ClusterQuiver([['A', 3], ['B', 3]])
sage: Q._mutation_type = None
sage: Q.mutation_type()
[ ['A', 3], ['B', 3] ]
sage: Q = ClusterQuiver([['A', 3], ['T', [4,4,4]]])
sage: Q._mutation_type = None
sage: Q.mutation_type()
[['A', 3], 'undetermined infinite mutation type']
sage: Q = ClusterQuiver([['A', 3], ['B', 3], ['T', [4,4,4]]])
sage: Q._mutation_type = None
sage: Q.mutation_type()
[['A', 3], ['B', 3], 'undetermined infinite mutation type']
sage: Q = ClusterQuiver([[0,1,2],[1,2,2],[2,0,2],[3,4,1],[4,5,1]])
sage: Q.mutation_type()
['undetermined finite mutation type', ['A', 3]]
TESTS:
sage: Q = ClusterQuiver(matrix([[0, 3], [-1, 0], [1, 0], [0, 1]]))
sage: Q.mutation_type()
['G', 2]
sage: Q = ClusterQuiver(matrix([[0, -1, -1, 1, 0], [1, 0, 1, 0, 1], [1, -1, 0, -1, 0], [-1, 0, 1, 0, 1], [0, -1, 0, -1, 0], [0, 1, 0, -1, -1], [0, 1, -1, 0, 0]]))
sage: Q.mutation_type()
'undetermined infinite mutation type'
Returns the number of free vertices of self.
EXAMPLES:
sage: ClusterQuiver(['A',4]).n()
4
sage: ClusterQuiver(['A',(3,1),1]).n()
4
sage: ClusterQuiver(['B',4]).n()
4
sage: ClusterQuiver(['B',4,1]).n()
5
Returns the plot of the underlying digraph of self.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['A',5])
sage: pl = Q.plot()
sage: pl = Q.plot(circular=True)
Returns the principal extension of self, adding n frozen vertices to any previously frozen vertices. I.e., the quiver obtained by adding an outgoing edge to every mutable vertex of self.
EXAMPLES:
sage: Q = ClusterQuiver(['A',2]); Q
Quiver on 2 vertices of type ['A', 2]
sage: T = Q.principal_extension(); T
Quiver on 4 vertices of type ['A', 2] with 2 frozen vertices
sage: T2 = T.principal_extension(); T2
Quiver on 6 vertices of type ['A', 2] with 4 frozen vertices
sage: Q.digraph().edges()
[(0, 1, (1, -1))]
sage: T.digraph().edges()
[(0, 1, (1, -1)), (2, 0, (1, -1)), (3, 1, (1, -1))]
sage: T2.digraph().edges()
[(0, 1, (1, -1)), (2, 0, (1, -1)), (3, 1, (1, -1)), (4, 0, (1, -1)), (5, 1, (1, -1))]
Saves a .qmu file of self that can then be opened in Bernhard Keller’s Quiver Applet.
INPUT:
If a filename is not specified, the default name is from_sage.qmu in the current sage directory.
EXAMPLES:
sage: Q = ClusterQuiver(['F',4,[1,2]])
sage: Q.qmu_save(os.path.join(SAGE_TMP, 'sage.qmu'))
Reorients self with respect to the given total order, or with respect to an iterator of edges in self to be reverted.
WARNING:
This operation might change the mutation type of ``self``.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['A',(2,3),1])
sage: Q.mutation_type()
['A', [2, 3], 1]
sage: Q.reorient([(0,1),(1,2),(2,3),(3,4)])
sage: Q.mutation_type()
['D', 5]
sage: Q.reorient([0,1,2,3,4])
sage: Q.mutation_type()
['A', [1, 4], 1]
Saves the plot of the underlying digraph of self.
INPUT:
EXAMPLES:
sage: Q = ClusterQuiver(['F',4,[1,2]])
sage: Q.save_image(os.path.join(SAGE_TMP, 'sage.png'))
Shows the plot of the underlying digraph of self.
INPUT:
TESTS:
sage: Q = ClusterQuiver(['A',5])
sage: Q.show() # long time