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