1#############################################################################
2##
3##  AffineToricVarieties.gi         ToricVarieties package
4##
5##  Copyright 2011-2016, Sebastian Gutsche, TU Kaiserslautern
6##                       Martin Bies,       ITP Heidelberg
7##
8##  The category of affine toric varieties
9##
10#############################################################################
11
12#################################
13##
14## Representations
15##
16#################################
17
18DeclareRepresentation( "IsAffineSheafRep",
19                       IsAffineToricVariety and IsSheafRep,
20                       [ "Sheaf" ]
21                      );
22
23DeclareRepresentation( "IsAffineCombinatorialRep",
24                       IsAffineToricVariety and IsCombinatorialRep,
25                       [ ]
26                      );
27
28DeclareRepresentation( "IsConeRep",
29                       IsAffineCombinatorialRep and IsFanRep,
30                       [ ]
31                      );
32
33##################################
34##
35## Family and Type
36##
37##################################
38
39BindGlobal( "TheTypeConeToricVariety",
40        NewType( TheFamilyOfToricVarietes,
41                 IsConeRep ) );
42
43##################################
44##
45## Properties
46##
47##################################
48
49##
50InstallMethod( IsSmooth,
51               " for convex varieties",
52               [ IsConeRep ],
53
54  function( variety )
55
56    return IsSmooth( ConeOfVariety( variety ) );
57
58end );
59
60##
61InstallMethod( IsNormalVariety,
62               "IsConeRep",
63               [ IsConeRep ],
64
65  function( variety )
66
67    return IsPointed( ConeOfVariety( variety ) );
68
69end );
70
71##################################
72##
73## Attributes
74##
75##################################
76
77##
78InstallMethod( ConeOfVariety,
79               "for affine varieties",
80               [ IsToricVariety and IsAffine ],
81
82  function( variety )
83    local factors, cones_of_factors;
84
85    factors := IsProductOf( variety );
86
87    if Length( factors ) > 1 then
88
89        cones_of_factors := List( factors, ConeOfVariety );
90
91        return Product( cones_of_factors );
92
93    fi;
94
95    if HasFanOfVariety( variety ) then
96
97        return MaximalCones( FanOfVariety( variety ) )[ 1 ];
98
99    fi;
100
101    TryNextMethod();
102
103end );
104
105InstallMethod( CoordinateRing,
106               " for affine convex varieties",
107               [ IsConeRep ],
108
109  function( variety )
110    local factors, coordinate_ring;
111
112    if Length( IsProductOf( variety ) ) > 1 then
113
114        factors := IsProductOf( variety );
115
116        if ForAll( factors, HasCoordinateRing ) then
117
118            coordinate_ring := Product( List( factors, CoordinateRing ) );
119
120            return coordinate_ring;
121
122        fi;
123
124    fi;
125
126    Error( "no indeterminates given\n");
127
128end );
129
130##
131InstallMethod( CoordinateRing,
132               " for affine convex varities",
133               [ IsConeRep, IsString ],
134
135  function( variety, str )
136
137    return CoordinateRing( variety, [ str ] );
138
139end );
140
141
142##This method requires the ToricIdeals package
143InstallMethod( CoordinateRing,
144              " for affine convex varieties",
145              [ IsToricVariety and IsAffine and HasConeOfVariety, IsList ],
146
147  function( variety, variables )
148    local factors, hilbert_basis, n, indeterminates, variables_string, coordinate_ring, relations, i, k, j, a, b;
149
150    if Length( IsProductOf( variety ) ) > 1 then
151
152        factors := IsProductOf( variety );
153
154        if ForAll( factors, HasCoordinateRing ) then
155
156            coordinate_ring := Product( List( factors, CoordinateRing ) );
157
158            SetCoordinateRing( variety, coordinate_ring );
159
160            return coordinate_ring;
161
162        fi;
163
164    fi;
165
166    hilbert_basis := HilbertBasis( DualCone( ConeOfVariety( variety ) ) );
167
168    n := Length( hilbert_basis );
169
170    if Length( variables ) = 1 then
171
172        variables := List( [ 1 .. n ], i -> JoinStringsWithSeparator( [ variables[ 1 ], i ], "_" ) );
173
174    fi;
175
176    if not Length( variables ) = n then
177
178        Error( "not the correct number of variables given\n" );
179
180    fi;
181
182    variables_string := JoinStringsWithSeparator( variables, "," );
183
184    coordinate_ring := DefaultFieldForToricVarieties() * variables_string;
185
186    relations := HomalgMatrix( hilbert_basis, HOMALG_MATRICES.ZZ );
187
188    relations := HomalgMap( relations, "free", "free" );
189
190    relations := GeneratingElements( KernelSubobject( relations ) );
191
192    Apply( relations, UnderlyingListOfRingElements );
193
194    if IsPackageMarkedForLoading( "4ti2Interface", ">=2013.03.19" ) and Length( relations ) > 0 then
195
196        relations := 4ti2Interface_groebner_basis( relations );
197
198    elif IsPackageMarkedForLoading( "ToricIdeals", ">=2011.01.01" ) and Length( relations ) > 0 then
199
200        relations := GensetForToricIdeal( relations );
201
202    else
203
204        relations := GeneratingSetOfToricIdealGivenByHilbertBasis( relations );
205
206    fi;
207
208    if Length( relations ) > 0 then
209
210        k := Length( relations );
211
212        for i in [ 1 .. k ] do
213
214            a := "1";
215
216            b := "1";
217
218            for j in [ 1 .. n ] do
219
220                if relations[ i ][ j ] < 0 then
221
222                    b := JoinStringsWithSeparator( [ b , JoinStringsWithSeparator( [ variables[ j ], String( - relations[ i ][ j ] ) ], "^" ) ], "*" );
223
224                elif relations[ i ][ j ] > 0 then
225
226                    a := JoinStringsWithSeparator( [ a, JoinStringsWithSeparator( [ variables[ j ], String( relations[ i ][ j ] ) ], "^" ) ], "*" );
227
228                fi;
229
230            od;
231
232            relations[ i ] := JoinStringsWithSeparator( [ a, b ], "-" );
233
234            relations[ i ] := HomalgRingElement( relations[ i ], coordinate_ring );
235
236        od;
237
238        coordinate_ring := coordinate_ring / relations;
239
240    fi;
241
242    SetCoordinateRing( variety, coordinate_ring );
243
244    return coordinate_ring;
245
246end );
247
248##
249InstallMethod( ListOfVariablesOfCoordinateRing,
250               "for toric varieties with cox rings",
251               [ IsAffineToricVariety ],
252
253  function( variety )
254    local coord_ring, variable_list, string_list, i;
255
256    if not HasCoordinateRing( variety ) then
257
258        Error( "no cox ring has no variables\n" );
259
260    fi;
261
262    coord_ring := CoordinateRing( variety );
263
264    variable_list := Indeterminates( coord_ring );
265
266    string_list := [ ];
267
268    for i in variable_list do
269
270        Add( string_list, String( i ) );
271
272    od;
273
274    return string_list;
275
276end );
277
278InstallMethod( MorphismFromCoordinateRingToCoordinateRingOfTorus,
279               " for affine varieties",
280               [ IsToricVariety and IsAffine and HasCoordinateRing and HasCoordinateRingOfTorus ],
281
282  function( variety )
283    local torus_coord_ring, coord_ring, ring_map, image_list;
284
285    torus_coord_ring := CoordinateRingOfTorus( variety );
286
287    coord_ring := CoordinateRing( variety );
288
289    image_list := HilbertBasis( DualCone( ConeOfVariety( variety ) ) );
290
291    image_list := List( image_list, i -> CharacterToRationalFunction( i, variety ) );
292
293    ring_map := RingMap( image_list, coord_ring, torus_coord_ring );
294
295    SetIsMorphism( ring_map, true );
296
297    SetIsMonomorphism( ring_map, true );
298
299    return ring_map;
300
301end );
302
303
304##
305InstallMethod( CartierTorusInvariantDivisorGroup,
306               "for affine toric varieties",
307               [ IsToricVariety and HasNoTorusfactor and IsAffine ],
308
309  function( variety )
310
311    return ImageSubobject( MapFromCharacterToPrincipalDivisor( variety ) );
312
313end );
314
315##
316InstallMethod( FanOfVariety,
317               "for affine toric varieties",
318               [ IsToricVariety and HasConeOfVariety ],
319
320  function( variety )
321
322    if IsNormalVariety( variety ) then
323
324        return ConeOfVariety( variety );
325
326    else
327
328        Error( "variety is not normal\n" );
329
330    fi;
331
332    TryNextMethod();
333
334end );
335
336##
337InstallMethod( CartierTorusInvariantDivisorGroup,
338               "for affine varieties",
339               [ IsToricVariety and IsAffine ], 1,
340
341  function( variety )
342
343    return ImageSubobject( MapFromCharacterToPrincipalDivisor( variety ) );
344
345end );
346
347
348##################################
349##
350## Methods
351##
352##################################
353
354##
355InstallMethod( \*,
356               " for affine varieties",
357               [ IsConeRep, IsConeRep ],
358
359  function( variety1, variety2 )
360    local variety;
361
362    variety := ToricVariety( ConeOfVariety( variety1 ) * ConeOfVariety( variety2 ) );
363
364    SetIsProductOf( variety, Flat( [ IsProductOf( variety1 ), IsProductOf( variety2 ) ] ) );
365
366    return variety;
367
368end );
369
370##
371InstallMethod( Cone,
372               "for affine varieties",
373               [ IsToricVariety and IsAffine ],
374
375  function( variety )
376
377    return ConeOfVariety( variety );
378
379end );
380
381##################################
382##
383## Constructors
384##
385##################################
386
387##
388InstallMethod( ToricVariety,
389               " for cones",
390               [ IsCone ],
391
392  function( cone )
393    local variety, cover;
394
395    variety := rec( WeilDivisors := WeakPointerObj( [ ] ) );
396
397    ObjectifyWithAttributes(
398                            variety, TheTypeConeToricVariety,
399                            IsAffine, true,
400                            IsProjective, false,
401                            IsComplete, false,
402##                            IsNormalVariety, true,
403                            ConeOfVariety, cone
404##                            FanOfVariety, cone
405                            );
406
407    cover := ToricSubvariety( variety, variety );
408
409    SetAffineOpenCovering( variety, [ cover ] );
410
411    return variety;
412
413end );
414
415