Quiver moduli
The main purpose of QuiverTools is to treat quiver moduli. This package implements methods to study stable and semistable loci, Harder–Narasimhan stratifications and quiver moduli spaces.
Types
The following types are exported by QuiverTools:
QuiverTools.QuiverModuli — Type
Summary
abstract type QuiverModuli
Abstract type for a moduli space or stack of quiver representations.
Supertype Hierarchy
QuiverModuliSpace <: QuiverModuli <: AnyQuiverModuliStack <: QuiverModuli <: Any
QuiverTools.QuiverModuliSpace — Type
Summary
struct QuiverModuliSpace
The moduli space of representations of a quiver Q of dimension vector d depends on a choice of stability parameter theta and on whether we consider stable or semistable representations.
Fields
Q :: Quiverd :: AbstractVector{Int64}theta :: AbstractVector{Int64}condition :: Stringdenom :: Function
Supertype Hierarchy
QuiverModuliSpace <: QuiverModuli <: Any
QuiverTools.QuiverModuliStack — Type
Summary
struct QuiverModuliStack
The moduli stack of representations of a quiver Q of dimension vector d depends on a choice of stability parameter theta and on whether we consider stable or semistable representations.
Fields
Q :: Quiverd :: AbstractVector{Int64}theta :: AbstractVector{Int64}condition :: Stringdenom :: Function
Supertype Hierarchy
QuiverModuliStack <: QuiverModuli <: Any
We also have some basic constructors for well-known quiver moduli:
QuiverTools.kronecker_moduli — Function
kronecker_moduli(m::Int, d::Int, e::Int)Construct the Kronecker moduli space with m vertices and dimension vector (d, e).
Examples
julia> kronecker_moduli(3, 2, 3)
Quiver moduli space defined as follows:
- quiver: 3-Kronecker quiver
- dimension vector: [2, 3]
- stability parameter: [9, -6]
- condition: semistablesourceQuiverTools.subspace_quiver_moduli — Function
subspace_quiver_moduli(m::Int, d::Int)Construct the subspace quiver moduli space for m points on $\mathbb{P}^{d-1}$
Examples
julia> subspace_quiver_moduli(5, 2)
Quiver moduli space defined as follows:
- quiver: 5-subspace quiver
- dimension vector: [1, 1, 1, 1, 1, 2]
- stability parameter: [2, 2, 2, 2, 2, -5]
- condition: semistablesourceBlack-box methods are provided to study some of their properties.
QuiverTools.is_nonempty — Function
is_nonempty(M::QuiverModuli)Checks if the quiver moduli is nonempty.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
- whether the moduli space is nonempty.
Examples
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> is_nonempty(M)
true
julia> M = QuiverModuliSpace(Q, [2, 3], [-3, 2]);
julia> is_nonempty(M)
falsesourceQuiverTools.dimension — Function
dimension(M::QuiverModuliStack)Returns the dimension of the moduli stack. This differs from the dimension of the moduli space by 1, as we do not quotient out the stabilizer $\mathbb{G}$.
Input
M::QuiverModuliStack: a moduli stack of representations of a quiver.
Output
- the dimension of the moduli stack.
Examples
The dimension of the moduli stack of the 3-Kronecker quiver
julia> Q = kronecker_quiver(3); M = QuiverModuliStack(Q, [2, 3]);
julia> dimension(M)
5sourcedimension(M::QuiverModuliSpace)Returns the dimension of the moduli space.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the dimension of the moduli space.
Examples
The dimension of the moduli space of the 3-Kronecker quiver:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> dimension(M)
6sourceQuiverTools.is_smooth — Function
is_smooth(M::QuiverModuliSpace)Checks if the moduli space is smooth.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- whether the moduli space is smooth.
Examples
Setups with d theta-coprime are smooth:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> is_smooth(M)
truesourceis_smooth(M::QuiverModuliStack)Checks if the moduli stack is smooth.
This is always trus, as the quotient stack of a smooth variety is smooth.
Input
M::QuiverModuliStack: a moduli stack of representations of a quiver.
Output
- true
Examples
julia> Q = kronecker_quiver(3); M = QuiverModuliStack(Q, [2, 3]);
julia> is_smooth(M)
truesourceQuiverTools.is_projective — Function
is_projective(M::QuiverModuli)Checks if the moduli space is projective.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
- whether the moduli space is projective.
Examples
The moduli space of the 3-Kronecker quiver is projective:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> is_projective(M)
truesourceQuiverTools.index — Function
index(M::QuiverModuliSpace)Compute the index of the moduli space M.
The index of a variety $X$ is the largest integer which divides the canonical divisor $K_X$ in $Pic(X)$.
This implementation currently only works for the canonical stability.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the index of the moduli space.
Examples
The 3-Kronecker quiver has index 3:
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> index(M)
3The subspace quiver moduli have index 1:
julia> Q = subspace_quiver(5);
julia> M = QuiverModuliSpace(Q, [1, 1, 1, 1, 1, 2]);
julia> index(M)
1sourceQuiverTools.motive — Function
motive(Q::Quiver, d, theta, denom=sum)Compute the motive of the moduli stack of theta-semistable representations.
Input
Q::Quiver: a quiver.d::AbstractVector{Int}: a dimension vector.theta::AbstractVector{Int}: a stability parameter. Default is the canonical stability.denom::Function: a function. Default is the sum.
Output
- The motive as an element in the function field \mathbb{Q}(L).
Examples
julia> Q = kronecker_quiver(3);
julia> motive(Q, [2, 3])
(-L^6 - L^5 - 3*L^4 - 3*L^3 - 3*L^2 - L - 1)//(L - 1)sourceQuiverTools.picard_rank — Function
picard_rank(M::QuiverModuliSpace)Compute the Picard rank of the moduli space M.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the Picard rank of the moduli space.
Examples
Kronecker quiver with dimension vector [2, 3]:
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> picard_rank(M)
1sourceQuiverTools.semistable_equals_stable — Function
semistable_equals_stable(M::QuiverModuli)Checks if stability and semistability are equivalent on the given moduli space. In other words, checks if there are no properly semistable points in the representation space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
- whether every semistable representation is stable.
Examples
If the dimension vector is coprime with the stability parameter, then semistability and stability are equivalent:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> semistable_equals_stable(M)
trueHowever, this is not necessarily the case:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [3, 3]);
julia> semistable_equals_stable(M)
falsesourceQuiverTools.codimension_unstable_locus — Function
codimension_unstable_locus(M::QuiverModuli)Computes the codimension of the unstable locus in the parameter space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
- the codimension of the unstable locus in the parameter space.
Examples
Codimensions for the 3-Kronecker quiver with dimension vector [2, 3]:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> codimension_unstable_locus(M)
3If the unstable locus is empty, the codimension is Inf:
julia> Q = kronecker_quiver(2); M = QuiverModuliSpace(Q, [1, 0]);
julia> all_hn_types(M; unstable=true)
HNType[]
julia> codimension_unstable_locus(M)
InfsourceStability
QuiverTools.has_semistables — Function
has_semistables(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}=canonical_stability(Q, d), denom::Function=sum)Check if Q admits a theta-semistable representation of dimension vector d.
A representation $V$ is said to be $\mu$-semistable if for all of its subrepresentations $W$ with $dim(W) < dim(V)$, we have
\[\mu(\dim(W)) \leq \mu\dim((V)).\]
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter. Default iscanonical_stability(Q, d).denom::Functiona function to compute the denominator. Default issum.
Output
trueif there is atheta-semistable representation of dimension vectord,falseotherwise.
Examples
julia> A2 = kronecker_quiver(1); theta = [1,-1];
julia> has_semistables(A2, [1,1], theta)
true
julia> has_semistables(A2, [2,2], theta)
true
julia> has_semistables(A2, [1,2], theta)
false
julia> has_semistables(A2, [0,0], theta)
trueThe 3-Kronecker quiver:
julia> K3 = kronecker_quiver(3); theta = [3,-2];
julia> has_semistables(K3, [2,3], theta)
true
julia> has_semistables(K3, [1,4], theta)
falsesourceQuiverTools.has_stables — Function
has_stables(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}=canonical_stability(Q, d), denom::Function=sum)Check if Q admits a theta-stable representation of dimension vector d.
A representation $V$ is said to be $mu$-stable if for all of its subrepresentations $W$ with $dim(W) < dim(V)$, we have
\[\mu(\dim(W)) < \mu\dim((V)).\]
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter. Default iscanonical_stability(Q, d).denom::Functiona function to compute the denominator. Default issum.
Output
trueif there is atheta-stable representation of dimension vectord,falseotherwise.
Examples
julia> Q = kronecker_quiver(3); d = [2, 3]; theta = [3, -2];
julia> has_stables(Q, d, theta)
true
julia> Q = kronecker_quiver(2); d = [2,2]; theta = [1,-1];
julia> has_stables(Q, d, theta)
false
julia> has_semistables(Q, d, theta)
trueThe zero dimension vector has no stables:
julia> Q = kronecker_quiver(3); d = [0,0];
julia> has_stables(Q, d)
falsesourceQuiverTools.canonical_stability — Function
canonical_stability(Q::Quiver, d::AbstractVector{Int})Compute the canonical stability parameter for Q and d.
This is defined to be $<d,-> - <-,d>$
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.
Output
- the canonical stability parameter for
Qandd.
Examples
julia> Q = kronecker_quiver(3); d = [2,3];
julia> canonical_stability(Q, d) == [9, -6]
truesourceQuiverTools.is_coprime — Function
is_coprime(d::AbstractVector{Int}, theta::AbstractVector{Int})Check if d is theta-coprime.
A dimension vector $d$ is said to be $\theta$-coprime for the stability parameter $\theta$ if all subdimension vectors $0 \neq e < d$ satisfy $\theta * e \neq 0$.
Input
d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter.
Output
trueifdistheta-coprime,falseotherwise.
Examples
julia> d = [2, 3]; theta = [3, -2];
julia> is_coprime(d, theta)
true
julia> is_coprime([3, 3], theta)
falsesourceis_coprime(d::AbstractVector{Int})Check if the gcd of all the entries of d is $1$.
Input
d::AbstractVector{Int}a vector.
Output
trueif the gcd of all the entries ofdis $1$,falseotherwise.
Examples
julia> is_coprime([2, 3])
true
julia> is_coprime([3, 3])
falsesourceis_coprime(M::QuiverModuli)Checks if the stability parameter is coprime with the dimension vector, i.e., if for all subdimension vectors $e$ of $d$, $\theta\cdot e \neq 0$.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
- whether the dimension vector
M.dis theta-coprime forM.theta.
Examples
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> is_coprime(M)
truesourceQuiverTools.slope — Function
slope(d::AbstractVector{Int}, theta::AbstractVector{Int}, denom::Function=sum)Return the slope of d with respect to the stability parameter theta and a choice of a denominator function denom.
The slope function for $\theta$ and $\alpha$ is defined as
\[\mu = \frac{\theta}{\alpha} := x \mapsto \frac{\theta \cdot x}{\alpha(x)}.\]
Input
d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter.denom::Functiona function to compute the denominator. Default issum.
Output
- the slope of
dwith respect tothetaanddenom.
Examples
julia> slope([2,3], [3,-2])
0//1sourceStratifications
QuiverTools implements methods to study the Harder–Narasimhan stratification of the unstable locus of quiver representations, as well as the Luna stratification of the properly semistable locus.
Harder–Narasimhan types
QuiverTools.HNType — Type
Summary
struct HNType{T}
A struct for a Harder-Narasimhan type.
Fields
hn :: Vector{SVector{T,Int}}
QuiverTools.all_hn_types — Function
all_hn_types(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}, denom::Function=sum; unstable::Bool=false, ordered::Bool=true)Return a list of all the Harder–Narasimhan types of representations of Q with dimension vector d, with respect to the slope function theta/denom.
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter.denom::Functiona function to compute the denominator. Default issum.
Keyword inputs:
unstable: iftrueexclude the trivial Harder–Narasimhan type (d),
which corresponds to stable representations. Default is false.
ordered: iftruereturn the list of all Harder–Narasimhan types in ascending order.
Default is true.
Output
- a list of all the Harder–Narasimhan types
of representations of Q with dimension vector d.
Examples
julia> Q = kronecker_quiver(3); d = [2,3]; theta = [3,-2];
julia> all_hn_types(Q, d, theta; ordered=true)
8-element Vector{HNType}:
[[2, 3]]
[[1, 1], [1, 2]]
[[2, 2], [0, 1]]
[[2, 1], [0, 2]]
[[1, 0], [1, 3]]
[[1, 0], [1, 2], [0, 1]]
[[1, 0], [1, 1], [0, 2]]
[[2, 0], [0, 3]]
julia> all_hn_types(Q, [3,0], [0,0]) == [[[3, 0]]]
true
julia> Q = three_vertex_quiver(1, 4, 1); d = [4, 1, 4];
julia> theta = canonical_stability(Q, d);
julia> all_hn_types(Q, d, theta; ordered=true)
106-element Vector{HNType}:
[[4, 1, 4]]
[[4, 1, 3], [0, 0, 1]]
[[4, 0, 3], [0, 1, 1]]
[[4, 0, 3], [0, 1, 0], [0, 0, 1]]
[[3, 1, 2], [1, 0, 2]]
[[3, 1, 2], [1, 0, 1], [0, 0, 1]]
[[3, 0, 2], [1, 1, 2]]
[[3, 0, 2], [0, 1, 0], [1, 0, 2]]
[[3, 0, 2], [1, 0, 1], [0, 1, 1]]
[[3, 0, 2], [1, 1, 1], [0, 0, 1]]
⋮
[[3, 0, 0], [1, 1, 2], [0, 0, 2]]
[[3, 0, 0], [0, 1, 0], [1, 0, 4]]
[[3, 0, 0], [0, 1, 0], [1, 0, 3], [0, 0, 1]]
[[3, 0, 0], [0, 1, 0], [1, 0, 2], [0, 0, 2]]
[[3, 0, 0], [1, 0, 1], [0, 1, 1], [0, 0, 2]]
[[3, 0, 0], [1, 1, 1], [0, 0, 3]]
[[3, 0, 0], [1, 1, 0], [0, 0, 4]]
[[4, 0, 0], [0, 1, 1], [0, 0, 3]]
[[4, 0, 0], [0, 1, 0], [0, 0, 4]]sourceall_hn_types(M::QuiverModuli; unstable::Bool=false, ordered::Bool=true)Returns all Harder-Narasimhan types of the moduli space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Keyword arguments:
unstable::Bool: iftrue, returns only Harder-Narasimhan types
corresponding to unstable representations. Default is false
ordered::Bool: iftrue, returns the Harder-Narasimhan types in
the order introduced by [MR1974891]. Default is true.
Output
- a list of Harder-Narasimhan types for the dimension vector and slope of
M.
Examples
The HN types for a 3-Kronecker quiver with dimension vector [2, 3]:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> all_hn_types(M)
8-element Vector{HNType}:
[[2, 3]]
[[1, 1], [1, 2]]
[[2, 2], [0, 1]]
[[2, 1], [0, 2]]
[[1, 0], [1, 3]]
[[1, 0], [1, 2], [0, 1]]
[[1, 0], [1, 1], [0, 2]]
[[2, 0], [0, 3]]
julia> all_hn_types(M; unstable = true)
7-element Vector{HNType}:
[[1, 1], [1, 2]]
[[2, 2], [0, 1]]
[[2, 1], [0, 2]]
[[1, 0], [1, 3]]
[[1, 0], [1, 2], [0, 1]]
[[1, 0], [1, 1], [0, 2]]
[[2, 0], [0, 3]]sourceQuiverTools.is_hn_type — Function
is_hn_type(Q::Quiver, d::AbstractVector{Int}, dstar::HNType, theta::AbstractVector{Int}=canonical_stability(Q, d), denom::Function=sum)Check if the given ordered list of subdimension vectors dstar is a Harder–Narasimhan type for the datum Q, d and the slope function theta/denom.
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.dstar::HNTypean Harder–Narasimhan type.theta::AbstractVector{Int}a stability parameter.denom::Functiona function to compute the denominator. Default issum.
Output
trueifdstaris a Harder–Narasimhan type forQ,dand the slopetheta/denom,falseotherwise.
Examples
julia> Q = kronecker_quiver(3);
julia> d = [2, 3]; dstar = [d];
julia> is_hn_type(Q, d, dstar)
truesourceis_hn_type(M::QuiverModuli, hn_type::HNType)Checks if the given sequence of dimension vectors is a valid HN type for the moduli space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.hn_type::HNType: a Harder–Narasimhan type.
Output
- whether the given sequence is a valid Harder-Narasimhan type for
M.
Examples
Some HN types for the 3-Kronecker quiver with dimension vector [2, 3]:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> is_hn_type(M, [[2, 3]])
true
julia> is_hn_type(M, [[1, 1], [1, 2]])
true
julia> is_hn_type(M, [[1, 2], [1, 1]])
falsesourceQuiverTools.codimension_hn_stratum — Function
codimension_hn_stratum(Q::Quiver, stratum::HNType)Compute the codimension of the given Harder–Narasimhan stratum.
Input
Q::Quivera quiver.stratum::HNType: a Harder–Narasimhan type.
Output
- the codimension of the Harder–Narasimhan stratum as an integer.
Examples
julia> Q = kronecker_quiver(3); d = [2,3]; theta = [3,-2];
julia> HN = all_hn_types(Q, d, theta; ordered=true);
julia> [codimension_hn_stratum(Q, stratum) for stratum in HN]
8-element Vector{Int64}:
0
3
4
10
8
9
12
18sourcecodimension_hn_stratum(M::QuiverModuli, hn_type::HNType)Computes the codimension of the Harder-Narasimhan stratum corresponding to the given HN type.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.hn_type::HNType: a Harder–Narasimhan type
Output
- the codimension of the Harder-Narasimhan stratum corresponding to the given HN type.
Examples
Codimensions for the 3-Kronecker quiver with dimension vector [2, 3]:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> codimension_hn_stratum(M, [[2, 3]])
0
julia> codimension_hn_stratum(M, [[1, 1], [1, 2]])
3sourceQuiverTools.is_amply_stable — Function
is_amply_stable(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}, denom::Function=sum)Check whether the dimension vector d is amply stable with respect to the slope function theta/denominator.
This means that the codimension of the unstable locus in the parameter space is at least $2$.
Input
Q::Quivera quiver.d::AbstractVector{Int}a dimension vector.theta::AbstractVector{Int}a stability parameter.denom::Functiona function to compute the denominator. Default issum.
Output
trueifdis amply stable,falseotherwise.
Examples
julia> Q = kronecker_quiver(3); d = [2, 3];
julia> is_amply_stable(Q, d, [3, -2])
true
julia> is_amply_stable(Q, d, [-3, 2])
false
julia> is_amply_stable(Q, [3, 0], [0, -3])
truesourceis_amply_stable(M::QuiverModuli)Checks whether the dimension vector $d$ is amply stable with respect to the slope function theta/denominator.
This means that the codimension of the unstable locus in the parameter space is at least $2$.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Output
trueif the codimension of the unstable locus is at least2,falseotherwise.
Examples
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> is_amply_stable(M)
truesourceLuna types
QuiverTools.LunaType — Type
Summary
struct LunaType{T}
A struct to encode Luna types.
Fields
data :: Dict{Vector{Int},Vector{Int}
QuiverTools.all_luna_types — Function
all_luna_types(M::QuiverModuli; stable::Bool = true)Returns all Luna types of the moduli space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.
Keyword arguments:
stable::Bool: iffalse, excludes the stable Luna type. Default istrue
Output
- a list of Luna types for the dimension vector and slope of
M.
Examples
Luna types for a 3-Kronecker quiver:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [3, 3]);
julia> all_luna_types(M)
5-element Vector{LunaType{2}}:
Dict([3, 3] => [1])
Dict([1, 1] => [1], [2, 2] => [1])
Dict([1, 1] => [3])
Dict([1, 1] => [2, 1])
Dict([1, 1] => [1, 1, 1])sourceall_luna_types(Q::Quiver, d, theta, denom; stable=true)Computes all the possible Luna types for the given data.
Input
Q::Quiver: a quiver.d::AbstractVector{Int}: a dimension vector.theta::AbstractVector{Int}: a stability parameter. Defaults tocanonical_stability(Q, d).denom::Function: a function defining the denominator of the slope. Defaults tosum.
Keyword arguments:
stable::Bool: iffalse, excludes the stable Luna type. Default istrue
Output
- a list of Luna types.
Examples
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [3, 3]);
julia> all_luna_types(M)
5-element Vector{LunaType{2}}:
Dict([3, 3] => [1])
Dict([1, 1] => [1], [2, 2] => [1])
Dict([1, 1] => [3])
Dict([1, 1] => [2, 1])
Dict([1, 1] => [1, 1, 1])
julia> X = QuiverModuliSpace(Q, [2, 3]);
julia> all_luna_types(X)
1-element Vector{LunaType{2}}:
Dict([2, 3] => [1])sourceQuiverTools.is_luna_type — Function
is_luna_type(M::QuiverModuli, tau)Checks if the given tau is a valid Luna type for M.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.tau::Dict{AbstractVector{Int}, Vector{Int}}: a Luna type forM.
Output
- whether the given tau is a valid Luna type for
M.
Examples
Nontrivial Luna types for the 3-Kronecker quiver:
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [3, 3]);
julia> l = Dict([1, 1] => [1], [2, 2] => [1]);
julia> is_luna_type(M, l)
trueThe zero dimensional case:
julia> Q = kronecker_quiver(3); X = QuiverModuliSpace(Q, [0, 0]);
julia> is_luna_type(X, Dict([0, 0] => [1]))
truesourceQuiverTools.dimension_of_luna_stratum — Function
dimension_of_luna_stratum(M::QuiverModuli, tau)Computes the dimension of the Luna stratum corresponding to the given Luna type in the moduli space.
Input
M::QuiverModuli: a moduli space or stack of representations of a quiver.tau::Dict{AbstractVector{Int}, Vector{Int}}: a Luna type forM.
Output
- the dimension of the Luna stratum corresponding to the given Luna type.
Examples
julia> Q = kronecker_quiver(2); M = QuiverModuliSpace(Q, [2, 2], [1, -1]);
julia> luna = all_luna_types(M)
2-element Vector{LunaType{2}}:
Dict([1, 1] => [2])
Dict([1, 1] => [1, 1])
julia> [dimension_of_luna_stratum(M, tau) for tau in luna]
2-element Vector{Int64}:
1
2sourceQuiverTools.semisimple_moduli_space — Function
semisimple_moduli_space(M::QuiverModuli)Returns the moduli space with the zero stability parameter.
Any quiver moduli space is (quasi)projective-over-affine; this is the affine base.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the moduli space with the zero stability parameter.
Examples
julia> Q = kronecker_quiver(3); M = QuiverModuliSpace(Q, [2, 3]);
julia> dimension(semisimple_moduli_space(M))
0sourceHodge diamonds
QuiverTools.hodge_diamond — Function
hodge_diamond(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}=canonical_stability(Q, d))Compute the Hodge diamond of the moduli space of theta-semistable representations of Q with dimension vector d.
Input
Q::Quiver: a quiver.d::AbstractVector{Int}: a dimension vector.theta::AbstractVector{Int}: a stability parameter. Default is the canonical stability.
Output
- the Hodge diamond of the moduli space.
Examples
The Hodge diamond of our favourite 6-fold:
julia> Q = kronecker_quiver(3);
julia> hodge_diamond(Q, [2, 3])
7×7 Matrix{Int64}:
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 3 0 0 0 0
0 0 0 3 0 0 0
0 0 0 0 3 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 1This method correctly handles the moduli spaces being empty or 0-dimensional:
julia> Q = kronecker_quiver(3);
julia> hodge_diamond(Q, [2, 3], [-3, 2])
0×0 Matrix{Int64}sourcehodge_diamond(M::QuiverModuliSpace)Compute the Hodge diamond of the moduli space M.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the Hodge diamond of the moduli space.
Examples
The Hodge diamond of our favourite 6-fold:
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> hodge_diamond(M)
7×7 Matrix{Int64}:
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 3 0 0 0 0
0 0 0 3 0 0 0
0 0 0 0 3 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 1sourceQuiverTools.hodge_polynomial — Function
hodge_polynomial(Q::Quiver, d::AbstractVector{Int}, theta::AbstractVector{Int}=canonical_stability(Q, d))Return the Hodge polynomial of the moduli space of theta-semistable representations of Q with dimension vector d.
The algorithm is based on []MR1974891], and the current implementation is translated from the Hodge diamond cutter.
Input
Q::Quiver: a quiver.d::AbstractVector{Int}: a dimension vector.theta::AbstractVector{Int}: a stability parameter. Default iscanonical_stability(Q, d).
Output
- the Hodge polynomial of the moduli space.
Examples
The Hodge polynomial of our favourite 6-fold:
julia> Q = kronecker_quiver(3);
julia> d = [2, 3];
julia> theta = [3, -2];
julia> hodge_polynomial(Q, d, theta)
x^6*y^6 + x^5*y^5 + 3*x^4*y^4 + 3*x^3*y^3 + 3*x^2*y^2 + x*y + 1sourcehodge_polynomial(M::QuiverModuliSpace)Compute the Hodge polynomial of the moduli space M.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- the Hodge polynomial of the moduli space.
Examples
The Hodge polynomial of our favourite 6-fold:
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> hodge_polynomial(M)
x^6*y^6 + x^5*y^5 + 3*x^4*y^4 + 3*x^3*y^3 + 3*x^2*y^2 + x*y + 1sourceQuiverTools.betti_numbers — Function
betti_numbers(M::QuiverModuliSpace)Compute the Betti numbers of the moduli space M.
Input
M::QuiverModuliSpace: a moduli space of representations of a quiver.
Output
- a list of Betti numbers of the moduli space.
Examples
julia> Q = kronecker_quiver(2);
julia> M = QuiverModuliSpace(Q, [1, 1]);
julia> betti_numbers(M)
3-element Vector{Int64}:
1
0
1Our favourite 6-fold:
julia> Q = kronecker_quiver(3);
julia> M = QuiverModuliSpace(Q, [2, 3]);
julia> betti_numbers(M)
13-element Vector{Int64}:
1
0
1
0
3
0
3
0
3
0
1
0
1source