# isWellDefined(NormalToricVariety) -- whether a toric variety is well-defined

## Synopsis

• Function: isWellDefined
• Usage:
isWellDefined X
• Inputs:
• X, ,
• Outputs:
• , that is true if the lists of rays and maximal cones associated to X determine a strongly convex rational polyhedral fan

## Description

A pair (rayList, coneList) of lists correspond to a well-defined normal toric variety if the following conditions hold:

• the union of the elements of coneList equals the set of indices of elements of rayList,
• no element of coneList is properly contained in another element of coneList,
• the rays indexed by an element of coneList generate a strongly convex cone,
• the rays indexed by an element of coneList are the unique minimal lattice points for the cone they generate,
• the intersection of the cones associated to two elements of coneList is a face of each cone.

The first examples illustrate that small projective spaces are well-defined.

 i1 : assert all (5, d -> isWellDefined toricProjectiveSpace (d+1))

The second examples show that a randomly selected Kleinschmidt toric variety and a weighted projective space are also well-defined.

 i2 : setRandomSeed (currentTime ()); i3 : a = sort apply (3, i -> random (7)) o3 = {0, 4, 6} o3 : List i4 : assert isWellDefined kleinschmidt (4,a)
 i5 : q = sort apply (5, j -> random (1,9)); i6 : while not all (subsets (q,#q-1), s -> gcd s === 1) do q = sort apply (5, j -> random (1,9)); i7 : q o7 = {2, 4, 7, 8, 9} o7 : List i8 : assert isWellDefined weightedProjectiveSpace q

The next ten examples illustrate various ways that two lists can fail to define a normal toric variety. By making the current debugging level greater than one, one gets some addition information about the nature of the failure.

 i9 : X = new MutableHashTable; i10 : coneList = max toricProjectiveSpace 2; i11 : X#1 = normalToricVariety ({{-1,-1},{1,0},{0,1},{-1,0}}, coneList); i12 : isWellDefined X#1 o12 = false i13 : debugLevel = 1; i14 : isWellDefined X#1 -- some ray does not appear in maximal cone o14 = false i15 : X#2 = normalToricVariety ({},{}); i16 : isWellDefined X#2 -- expected rays' to be a list of lists o16 = false i17 : X#3 = normalToricVariety ({{}},{}); i18 : isWellDefined X#3 -- expected max' to be a list of lists o18 = false i19 : X#4 = normalToricVariety ({{}},{{}}); i20 : isWellDefined X#4 -- some ray does not appear in maximal cone o20 = false i21 : coneList' = {{0,1},{0,3},{1,2},{2,3},{3}}; i22 : X#5 = normalToricVariety ({{-1,0},{0,-1},{1,-1},{0,1}}, coneList'); i23 : isWellDefined X#5 -- some cone is not maximal o23 = false i24 : X#6 = normalToricVariety ({{-1,-1},{1,0},{0,1,1}},coneList); i25 : isWellDefined X#6 -- expected rays' to be a list of equal length lists o25 = false i26 : X#7 = normalToricVariety ({{-1,-1/1},{1,0},{0,1}},coneList); i27 : isWellDefined X#7 -- expected rays' to be a list of lists of integers o27 = false i28 : X#8 = normalToricVariety ({{1,0},{0,1},{-1,0}},{{0,1,2}}); i29 : isWellDefined X#8 -- not all maximal cones are strongly convex o29 = false i30 : X#9 = normalToricVariety ({{1,0,0},{0,1,0},{0,0,2}},{{0,1,2}}); i31 : isWellDefined X#9 -- the rays are not the primitive generators o31 = false i32 : X#10 = normalToricVariety ({{1,0},{0,1},{1,1}},{{0,1},{1,2}}); i33 : isWellDefined X#10 -- intersection of cones is not a cone o33 = false i34 : debugLevel = 0; i35 : assert all (keys X, k -> not isWellDefined X#k)

This method also checks that the following aspects of the data structure:

• the underlying HashTable has the expected keys, namely rays, max, and cache,
• the value of the rays key is a List,
• each entry in the rays list is a List,
• each entry in an entry of the rays list is an ZZ,
• each entry in the rays list as the same number of entries,
• the value of the max key is a List,
• each entry in the max list is a List,
• each entry in an entry of the max list is an ZZ,
• each entry in an entry of the max list corresponds to a ray,
• the value of the cache key is a CacheTable.