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().
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_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 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 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.
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]
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.reorient([(0,1),(1,2),(2,3),(3,4)])
sage: Q.reorient([0,1,2,3,4])
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