A resolution of singularities of the toric variety X together with the natural morphism from the resolution to X. The resolution is not necessarily minimal.
A Q-factorialisation of X together with the natural morphism.
A Q-factorial terminal blowup of the toric variety X and the natural morphism.
A Q-factorial canonical blowup of the toric variety X and the natural morphism.
The toric variety Y whose fan lives in the same lattice as the fan of the toric variety X on which the divisor D is defined, such that Y resolves the map given by the linear system of D.
The Mori Cone of toric variety X (as an abstract cone), that is, the cone generated by numerical classes of torus invariant curves on X.
The nef Cone of toric variety X (as an abstract cone).
The images of extremal contractions of rays in the nef-cone of the toric variety X.
The toric variety that is the image of the ith extremal contraction of the toric variety X; the contraction morphism is returned as a second value.
The toric divisor that gives the ith extremal contraction of the toric variety X (that is, the divisor is the pullback of an ample divisor on the image).
A string describing the ith extremal contraction of the toric variety X (or all together in a sequence if i is not specified).
True iff the contraction of the ith extremal ray of the toric variety X is a divisorial contraction.
Return true if and only if the ith extremal ray of the toric variety X gives an extremal contraction to a variety of lower dimension than X.
Return true if and only if the ith extremal ray of the toric variety X gives a small contraction of X; in this case the intrinsic Flip(X,i) provides the flipped toric variety.
The flipped variety of the ith extremal contraction of the toric variety X, assuming that this extremal contraction is of flipping type.
The (generalised) flip of the morphism given by the Q-Cartier divisor, assuming that this morphism is small.
The weights of a Gm action whose variation would give the flip of the ith extremal contraction of the toric variety X, assuming that this extremal contraction is of flipping type.
> F0 := FanOfWPS([1,1,1,1]); > L3 := Ambient(F0); > F := Blowup(F0,L3 ! [2,-5,3]); > X := ToricVariety(Rationals(),F); > ExtremalRays(X); [ (0, -1), (1, 56) ] > TypeOfContraction(X,1); divisorial (K.C<0) > TypeOfContraction(X,2); flip > WeightsOfFlip(X,2); [ [ 3, 2, -5, -1 ] ]
> X<[x]> := RationalScroll(Rationals(),1,[0,0,0,1,1,1,1,2]); > X; Toric variety of dimension 8 Variables: x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10] The components of the irrelevant ideal are: (x[10], x[9], x[8], x[7], x[6], x[5], x[4], x[3]), (x[2], x[1]) The 2 gradings are: 1, 1, 0, 0, 0, -1, -1, -1, -1, -2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1We compute its nef cone simply to initiate all its Mori theoretic data.
> _ := NefCone(X);We can consider various extreme rays of the Mori cone of X. (Our choice of parameters mean we consider rays [C] for which DC≤0, where D is the zero divisor: that is, we consider all rays.)
> IsFlipping(X,1: divisor:=ZeroDivisor(X), inequality:="weak"); false > IsFlipping(X,2: divisor:=ZeroDivisor(X), inequality:="weak"); trueOne of the rays corresponds to the fibration of X onto P1. The other is a ray of (anti-)flipping type. We can make the antiflip.
> Y<[y]> := Flip(X,2: divisor:=ZeroDivisor(X), inequality:="weak"); > Y; Toric variety of dimension 8 Variables: y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8], y[9], y[10] The components of the irrelevant ideal are: (y[10], y[9], y[8], y[7], y[6]), (y[5], y[4], y[3], y[2], y[1]) The 2 gradings are: 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 0 > IsNonsingular(Y); false > IsTerminal(Y); trueThis antiflip can be regarded as coming from a change in the linearisation of a geometric invariant theory quotient: from a linearisation like (1, 1) (between variables 2 and 3 in the given order) to one like (2, 3) (between variables 5 and 6). To understand the antiflip better, sometimes it helps to consider its weights (the relation between vertices on the star of the flipping locus, or, in geometric invariant theory terms, the weights of the local Gm action that determine the flip).
> WeightsOfFlip(X,2: divisor:=ZeroDivisor(X), inequality:="weak"); [ [ 1, 1, 0, 0, 0, -1, -1, -1, -1, -2 ], [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ] ]Here we see that a P1 has been antiflipped in favour of a weighted P4(1, 1, 1, 1, 2), which is the source of the singularity on Y.
type: MonStgElt Default: "terminal"
A sequence of toric varieties that are all the varieties visited by making any sequence of extremal contractions from the toric variety X (and, if necessary, making the corresponding flip). A second sequence records the maps, in each case first by a sequence of the indices of the domain and codomain, and second by a string that describes the map.The parameter type indicates which extremal rays are considered. It can be terminal, canonical or all. In each case, only toric varieties having these singularities will be allowed as images of the maps. (In particular, if the default value terminal is chosen, then only true KX-negative extremal contractions will be followed.)
> F := FanOfWPS([1,1,1,1]); > G := Blowup(F, Ambient(F) ! [1,-1,1]); > X := ToricVariety(Rationals(),G);We compute all minimal model programs from X. There are two outputs: first a sequence containing those toric varieties encountered during these processes, and second a sequence containing all the maps encountered.
> models,mmp := MMP(X); > #models; 3 > mmp; [ [* [ 1, 2 ], divisorial (K.C<0) *], [* [ 2, 3 ], map to point *] ]In this case there are three varieties. We could check that they are: (1) X itself, (2) P3, and (3) a point. We also see two maps: the first, labelled [1, 2], is the contraction of X back down to P3, and the second is the extremal contraction of P3 to a point.
The intrinsic call MMP(X) has a parameter, and the default is to search only for true absolute minimal model programs: those which proceed only by contracting extremal rays that are negative against the canonical class (and flipping them if necessary). To allow contractions of other extremal rays (and the possibility of requiring antiflips), we can set the parameter to type:="all".
> models,mmp := MMP(X : type:="all"); > models; [ Toric variety of dimension 3 Variables: $.1, $.2, $.3, $.4, $.5 The components of the irrelevant ideal are: ($.5, $.4), ($.3, $.2, $.1) The 2 gradings are: 1, 0, 0, 2, 1, 1, 1, 1, 1, 0, Toric variety of dimension 3 Variables: $.1, $.2, $.3, $.4 The irrelevant ideal is: ($.4, $.3, $.2, $.1) The grading is: 1, 1, 1, 1, Toric variety of dimension 3 Variables: $.1, $.2, $.3, $.4, $.5 The components of the irrelevant ideal are: ($.3, $.2), ($.5, $.4, $.1) The 2 gradings are: 1, 0, 0, 2, 1, 1, 1, 1, 1, 0, Toric variety of dimension 0, Toric variety of dimension 1 Variables: $.1, $.2 The irrelevant ideal is: ($.2, $.1) The grading is: 1, 1 ] > mmp; [ [* [ 1, 2 ], divisorial (K.C<0) *], [* [ 1, 3 ], flop *], [* [ 2, 4 ], map to point *], [* [ 3, 1 ], flop *], [* [ 3, 5 ], fibration (K.C<0) *] ]Now we also see a flop from X to a new toric variety Y (model number 3), and then Y admits Mori fibration to P1 (which we could check is model number 5).
The title of this section is that of a well-known paper of Reid [Rei83]. It applies Mori theory to toric varieties relatively over a base to compute a relative minimal model and the relative canonical model of a toric variety. Rather than wrap this up in intrinsics, we show how to apply the various components of this package to realise Reid's result.
> A := ProjectiveSpace(Rationals(),[1,2,5,6]); > IsCanonical(A); falseWe find the relative models by running a minimal model program on a resolution of A relative to A itself (that is, we only allow morphisms V -> W if they factor the given morphism V -> A). So we start by constructing a resolution.
> V0,f0 := Resolution(A); > V0; Toric variety of dimension 3 Variables: $.1, $.2, $.3, $.4, $.5, $.6, $.7, $.8, $.9, $.10, $.11, $.12 The irrelevant ideal is: [... omitted... ] The 9 gradings are: 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 5, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0We see that the resolution made 8=9 - 1 blowups. To compute everything, we would keep track of the morphisms (as we have started with f0 above); for brevity, we forego that.
We build a function which detects which of the extremal contractions from a given V (starting with V0) that factor V -> A. This code also reports whether the contraction is divisorial or of flipping type so that we can make the next step accordingly.
> raysOverA := func< W | > [ <i,TypeOfContraction(W,i)> : > i in [1..#ExtremalRays(W)] | > IsRegular(ToricVarietyMap(ExtremalRayContraction(W,i),A)) ] >;And so we look for extremal rays over A that we can contract.
> raysOverA(V0); [ <1, "divisorial (K.C<0)">, <2, "divisorial (K.C<0)">, <3, "divisorial (K.C<0)"> ]In other words, the extremal rays 1, 2 and 3 all determine extremal divisorial contractions. (If we were writing a faster routine, we would probably stop as soon as we'd found that ray 1 worked.) We can pick any of these: we choose ray 1 and repeat the process.
> V1 := ExtremalRayContraction(V0,1); > raysOverA(V1); [ <1, "divisorial (K.C<0)">, <2, "divisorial (K.C<0)">, <4, "divisorial (K.C<0)"> ]This time rays 1, 2, and 4 work; again these lead to divisorial contractions. We follow ray 1.
> V2 := ExtremalRayContraction(V1,1); > raysOverA(V2); [ <2, "divisorial (K.C<0)">, <3, "divisorial (K.C<0)"> ] > V3 := ExtremalRayContraction(V2,2); > raysOverA(V3); [ <2, "divisorial (K.C<0)"> ] > V4 := ExtremalRayContraction(V3,2); > raysOverA(V4); [ <2, "divisorial (K.C<0)"> ] > V5<[w]> := ExtremalRayContraction(V4,2); > assert #raysOverA(V5) eq 0;There are no extremal rays over A to contract. We have reached a relatively minimal model, V5; we check its singularities, although there is no need.
> V5; Toric variety of dimension 3 Variables: w[1], w[2], w[3], w[4], w[5], w[6] The components of the irrelevant ideal are: (w[6], w[5]), (w[6], w[3]), (w[5], w[4], w[2]), (w[3], w[1]), (w[4], w[2], w[1]) The 3 gradings are: 0, 0, 1, 1, 0, 1, 0, 1, 2, 3, 1, 0, 1, 2, 5, 6, 0, 0 > IsTerminal(V5); trueTo continue on to a relatively canonical model we must consider rays that are trivial against the canonical class, not negative as we have so far. We need to modify the relative rays function; we simply weaken the inequality used when evaluating against the canonical class.
> weakraysOverA := func< W | > [ <i,TypeOfContraction(W,i : inequality:="weak")> : > i in [1..#ExtremalRays(W:inequality:="weak")] | > IsRegular(ToricVarietyMap(ExtremalRayContraction(W,i:inequality:="weak"),A))]>;And so we continue.
> weakraysOverA(V5); [ <2, "divisorial (K.C=0)"> ] > V6<[u]> := ExtremalRayContraction(V5,2 : inequality:="weak"); > assert #weakraysOverA(V6) eq 0;After one canonically-trivial divisorial contraction there are no rays left to contract. We have reached the relative canonical model.
> V6; Toric variety of dimension 3 Variables: u[1], u[2], u[3], u[4], u[5] The components of the irrelevant ideal are: (u[5], u[3]), (u[4], u[2], u[1]) The 2 gradings are: 0, 0, 1, 1, 1, 1, 2, 5, 6, 0 > IsTerminal(V6); false > IsCanonical(V6); trueOf course, in this toric setting, it would have been simpler to find the single short vector in the fan of A that was causing all the trouble and blow that up.