Quivers

Quivers and quivers with potentials

Define a Quiver class (with or without potental) as well as special subclasses ChainQuiver, CyclicQuiver, TranslationPQ (for translation potential quivers of quivers with automorphisms, see arXiv:1911.01788), and constructors KroneckerQuiver, JordanQuiver.

EXAMPLES:

sage: from msinvar.quivers import *
sage: Q=KroneckerQuiver(2); Q
Kronecker quiver: Quiver with 2 vertices and 2 arrows
sage: Q.vertices()
[1, 2]
sage: Q.arrows()
[(1, 2, 0), (1, 2, 1)]
sage: Q.prec([2,2]) # precision vector
sage: Q.simple().dict() # counting simple objects
{(0, 1): 1, (1, 0): 1}
sage: Q.Om([1,0]).dict() # integer DT invariants for stability (1,0)
{(0, 1): 1, (1, 0): 1, (1, 1): (-y^2 - 1)/y, (1, 2): 1, (2, 1): 1}
sage: Q.Om([0,1]).dict() # integer DT invariants for stability (0,1)
{(0, 1): 1, (1, 0): 1}
sage: Q=Quiver('1-2-3', prec=[2,2,2]); Q
Quiver with 3 vertices and 2 arrows
sage: Q.arrows()
[(1, 2, 1), (2, 3, 1)]
sage: Q.simple().dict() # counting simple objects
{(0, 0, 1): 1, (0, 1, 0): 1, (1, 0, 0): 1}
sage: Q=Quiver('1-2-3,1-3', prec=[2,2,2]); Q
Quiver with 3 vertices and 3 arrows
sage: Q.arrows()
[(1, 2, 1), (1, 3, 1), (2, 3, 1)]
sage: Q.simple().dict() # counting simple objects
{(0, 0, 1): 1, (0, 1, 0): 1, (1, 0, 0): 1}
sage: CQ=CyclicQuiver(3, prec=[2,2,2]); CQ
Cyclic quiver: Quiver with 3 vertices and 3 arrows
sage: CQ.arrows()
[(0, 1, 1), (1, 2, 1), (2, 0, 1)]
sage: CQ.simple().dict() # counting simple objects
{(0, 0, 1): 1, (0, 1, 0): 1, (1, 0, 0): 1, (1, 1, 1): y^2 - 1}
sage: CQ.intAtt().dict() # integer attractor invariants
{(0, 0, 1): 1, (0, 1, 0): 1, (1, 0, 0): 1, (1, 1, 1): -y}
sage: PQ=CQ.translation_PQ(1); PQ
Translation PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
sage: PQ.arrows()
[(0, 1, 'a0'),
 (0, 1, 'a1*'),
 (0, 1, 'l0'),
 (1, 2, 'a1'),
 (1, 2, 'a2*'),
 (1, 2, 'l1'),
 (2, 0, 'a0*'),
 (2, 0, 'a2'),
 (2, 0, 'l2')]
sage: PQ.potential()
[[(0, 1, 'a0'), (1, 2, 'l1'), (2, 0, 'a0*')],
 [(0, 1, 'l0'), (1, 2, 'a1'), (2, 0, 'a0*')],
 [(1, 2, 'a1'), (2, 0, 'l2'), (0, 1, 'a1*')],
 [(1, 2, 'l1'), (2, 0, 'a2'), (0, 1, 'a1*')],
 [(2, 0, 'a2'), (0, 1, 'l0'), (1, 2, 'a2*')],
 [(2, 0, 'l2'), (0, 1, 'a0'), (1, 2, 'a2*')]]
sage: PQ.intAtt().simp().dict() # integer attractor invariants
{(0, 0, 1): 1,
 (0, 1, 0): 1,
 (1, 0, 0): 1,
 (1, 1, 1): (-2*y^2 - 1)/y,
 (2, 2, 2): (-2*y^2 - 1)/y}
sage: PQ=CQ.translation_PQ(0, prec=[1,1,1]); PQ
Ginzburg PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
sage: PQ.arrows()
[(0, 0, 'l0'),
 (0, 1, 'a0'),
 (0, 2, 'a2*'),
 (1, 0, 'a0*'),
 (1, 1, 'l1'),
 (1, 2, 'a1'),
 (2, 0, 'a2'),
 (2, 1, 'a1*'),
 (2, 2, 'l2')]
sage: PQ.intAtt().dict() # integer attractor invariants
{(0, 0, 1): -y,
 (0, 1, 0): -y,
 (0, 1, 1): -y,
 (1, 0, 0): -y,
 (1, 0, 1): -y,
 (1, 1, 0): -y,
 (1, 1, 1): -3*y}
class msinvar.quivers.Quiver(data=None, potential=None, prec=None, loops=True, multiedges=True, name=None, pos=None, format=None, weighted=None, data_structure=None)[source]

Bases: sage.graphs.digraph.DiGraph, msinvar.wall_crossing.WallCrossingStructure

Create a quiver from a list of arrows or from a potential.

EXAMPLES:

sage: from msinvar.quivers import *
sage: Q=Quiver('1-2-3,3-4'); Q
Quiver with 4 vertices and 3 arrows
sage: Q.arrows()
[(1, 2, 1), (2, 3, 1), (3, 4, 1)]
sage: Q=Quiver(potential='a[1,2]a[2,3]a[3,1]'); Q.arrows()
[(1, 2, 1), (2, 3, 1), (3, 1, 1)]
sage: Q.potential()
[[(1, 2, 1), (2, 3, 1), (3, 1, 1)]]
sage: Q=Quiver(potential=['1-2-3-1',[[1,2,2],[2,1]]]); Q.arrows()
[(1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 3, 1), (3, 1, 1)]
sage: Q.potential()
[[(1, 2, 1), (2, 3, 1), (3, 1, 1)], [(1, 2, 2), (2, 1, 1)]]
arrows(n=None)[source]

Return the n-th arrow or the list of arrows if n is None.

potential()[source]
arrow_num(a=None)[source]

Return the index of an arrow a or the number of all arrows if a is None.

vertex_num(i=None)[source]

Return the index of a vertex i or the number of all vertices if i is None.

s(a)[source]

Source of an arrow a, which can be an arrow or an index in the list self.arrows().

EXAMPLES:

sage: from msinvar import *
sage: Q=Quiver('1-2-3'); Q.arrows()
[(1, 2, 1), (2, 3, 1)]
sage: Q.s([1,2,1])
1
sage: Q.s(0)
1
t(a)[source]

Target of an arrow a, which can be an arrow or an index in the list self.arrows().

EXAMPLES:

sage: from msinvar import *
sage: Q=Quiver('1-2-3'); Q.arrows()
[(1, 2, 1), (2, 3, 1)]
sage: Q.t([1,2,1])
2
sage: Q.t(0)
2
eform(a, b)[source]

Euler form of the quiver.

EXAMPLES:

sage: from msinvar import *
sage: Q=KroneckerQuiver(2); Q.arrows()
[(1, 2, 0), (1, 2, 1)]
sage: Q.eform([1,0],[0,1])
-2
sage: Q.eform([0,1],[1,0])
0
sform(a, b)[source]

Skew-symmetrized Euler form of the quiver.

EXAMPLES:

sage: from msinvar import *
sage: Q=KroneckerQuiver(2); Q.arrows()
[(1, 2, 0), (1, 2, 1)]
sage: Q.sform([1,0],[0,1])
-2
sage: Q.sform([0,1],[1,0])
2
total_default()[source]

Total invariant of the quiver (stacky invariant for the trivial stability).

get_eform_matrix()[source]

Matrix of the eform.

get_sform_matrix()[source]

Matrix of the sform.

translation_PQ(tau=None, ind_tau=None, prec=None)[source]

See translation_PQ()

Ginzburg_PQ(prec=None)[source]

Return the Ginzburg quiver (with potential) for the original quiver.

This construction corresponds to translation_PQ() for the trivial automorphism.

ind_list(*args)[source]

The list of indecomposable representations.

ind_dim(a)[source]

Dimension vector of an indecomposable representation a.

ind_hom(a, b)[source]

Dimension of the Hom-space between indecomposable representations a and b.

msinvar.quivers.KroneckerQuiver(m=2, prec=None)[source]

Return the Kronecker quiver with m arrows.

msinvar.quivers.JordanQuiver(m=1, prec=None)[source]

Return the quiver with 1 vertex and m loops.

class msinvar.quivers.ChainQuiver(n, prec=None)[source]

Bases: msinvar.quivers.Quiver

Chain quiver with n vertices.

PARAMETERS:

  • n – number of vertices.

  • prec – truncation vector for the quantum affine plane.

EXAMPLES:

sage: from msinvar import *
sage: Q=ChainQuiver(3); Q.arrows()
[(0, 1, 1), (1, 2, 1)]
sage: Q.ind_list()
[(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]
sage: Q.ind_dim([0,2])
[1, 1, 1]
sage: Q.ind_dim([2,2])
[0, 0, 1]
sage: Q.ind_hom([2,2],[0,2])
1
ind_list(*args)[source]

Return the list of all indecomposable representations, paramertized by pairs (i,j) with i<=j.

ind_dim(a)[source]

Dimension vector of an indecomposable representation a.

ind_hom(a, b)[source]

Dimension of the Hom-space between indecomposable representations a and b.

class msinvar.quivers.CyclicQuiver(n, prec=None)[source]

Bases: msinvar.quivers.Quiver

Cyclic quiver with n vertices.

PARAMETERS:

  • n – number of vertices.

  • prec – truncation vector for the quantum affine plane.

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3); Q.arrows()
[(0, 1, 1), (1, 2, 1), (2, 0, 1)]
ind_list(d)[source]

The list of nilpotent indecomposables up to dimension vector d, where indecomposables are parametrized by triples (i,j,n) with \(i, j\in Z_r\) and \(n\ge 0\).

ind_dim(a)[source]

Dimension vector of an indecomposable representation a.

ind_hom(a, b)[source]

Dimension of the Hom-space between indecomposable representations a and b.

ind_shift(k=1)[source]

k-cyclic shift for indecomposable modules: \((SM)_i=M_{i-k}\).

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3)
sage: f=Q.ind_shift(1)
sage: f((0,1,0))
(1, 2, 0)
shift(k=1)[source]

Quiver automorphism given by the k-cyclic shift.

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3)
sage: f=Q.shift(2)
sage: {i:f(i) for i in Q.vertices()}
{0: 2, 1: 0, 2: 1}
sage: {i:f(i) for i in Q.arrows()}
{(0, 1, 1): (2, 0, 1), (1, 2, 1): (0, 1, 1), (2, 0, 1): (1, 2, 1)}
translation_PQ(k=1, prec=None)[source]

Return translation potential quiver associated with the cyclic quiver and its k-cyclic shift.

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3)
sage: Q2=Q.translation_PQ(1); Q2
Translation PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
class msinvar.quivers.TranslationPQ(Q, tau=None, ind_tau=None, prec=None)[source]

Bases: msinvar.quivers.Quiver

Construct a new quiver with potential based on a quiver Q and its automorphism tau. See arXiv:1911.01788.

If tau is None, we consider the trivial automorphism and return the Ginzburg quiver (with potential). The method ind_tau should be the induced bijection on indecomposables.

  1. For any arrow a:i->j we add an arrow tau(j)->i.

  2. For any vertex i we add an arrow i->tau(i).

  3. We consider potential consisting of 3-cycles (for every arrow i->j):

    1. i->j->tau(j)->i

    2. -i->tau(i)->tau(j)->i

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3, prec=[2,2,2]); Q
Cyclic quiver: Quiver with 3 vertices and 3 arrows
sage: PQ=Q.translation_PQ(1); PQ
Translation PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
sage: PQ.intAtt().simp().dict()
{(0, 0, 1): 1,
 (0, 1, 0): 1,
 (1, 0, 0): 1,
 (1, 1, 1): (-2*y^2 - 1)/y,
 (2, 2, 2): (-2*y^2 - 1)/y}

sage: PQ=Q.translation_PQ(0); PQ
Ginzburg PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
sage: PQ.intAtt().simp().dict()
{(0, 0, 1): -y,
 (0, 1, 0): -y,
 (0, 1, 1): -y,
 (1, 0, 0): -y,
 (1, 0, 1): -y,
 (1, 1, 0): -y,
 (1, 1, 1): -3*y,
 (1, 1, 2): -y,
 (1, 2, 1): -y,
 (1, 2, 2): -y,
 (2, 1, 1): -y,
 (2, 1, 2): -y,
 (2, 2, 1): -y,
 (2, 2, 2): -3*y}
total(I=None)[source]

Total invariant, meaning the stacky invariant for the trivial stability.

translation_PQ_total(prec=None)[source]

See msinvar.potential_quiver_invar.translation_PQ_total().

EXAMPLES:

sage: from msinvar import *
sage: Q=CyclicQuiver(3); Q
Cyclic quiver: Quiver with 3 vertices and 3 arrows
sage: PQ=Q.translation_PQ(1); PQ
Translation PQ: Quiver with 3 vertices, 9 arrows and potential with 6 terms
sage: I=PQ.translation_PQ_total([2,2,2])
sage: PQ.intAtt(I).simp().dict()
{(0, 0, 1): 1,
 (0, 1, 0): 1,
 (1, 0, 0): 1,
 (1, 1, 1): (-2*y^2 - 1)/y,
 (2, 2, 2): (-2*y^2 - 1)/y}