Ticket #8988: trac_8988_Kaehler_Mori_cones.patch

File trac_8988_Kaehler_Mori_cones.patch, 4.6 KB (added by novoselt, 12 years ago)

Code to be included later.

  • sage/schemes/generic/toric_variety.py

    # HG changeset patch
    # User Volker Braun <vbraun@stp.dias.ie>
    # Date 1277790432 21600
    # Node ID 8a188cb26b26dbd2699e64bdd82839c42dec3b29
    # Parent  093b476eeab8965d437fe4d60503975057df3f6a
    Trac 8988: introduce rational_divisor_class_group for Kaehler_cone, Mori_vectors
    
    diff -r 093b476eeab8 -r 8a188cb26b26 sage/schemes/generic/toric_variety.py
    a b  
    11931193        """
    11941194        return self.fan().is_smooth()
    11951195
     1196    def Kaehler_cone(self):
     1197        r"""
     1198        Return the closure of the Kähler cone of ``self``.
     1199
     1200        OUTPUT:
     1201
     1202        - :class:`cone <sage.geometry.cone.ConvexRationalPolyhedralCone>`.
     1203
     1204        .. NOTE::
     1205
     1206            This cone sits in the rational divisor class group of ``self`` and
     1207            the choice of coordinates agrees with
     1208            :meth:`rational_divisor_class_group`.
     1209
     1210        EXAMPLES::
     1211
     1212            sage: fan = FaceFan(lattice_polytope.octahedron(2))
     1213            sage: P1xP1 = ToricVariety(fan)
     1214            sage: Kc = P1xP1.Kaehler_cone()
     1215            sage: Kc
     1216            2-d cone in 2-d lattice
     1217            sage: Kc.rays()
     1218            ((0, 1), (1, 0))
     1219            sage: Kc.lattice()
     1220            Vector space of dimension 2 over Rational Field
     1221        """
     1222        if "_Kaehler_cone" not in self.__dict__:
     1223            fan = self.fan()
     1224            GT = fan.gale_transform().columns()
     1225            n = fan.nrays()
     1226            K = None
     1227            for cone in fan:
     1228                sigma = Cone([GT[i] for i in range(n)
     1229                                    if i not in cone.ambient_ray_indices()],
     1230                             lattice = self.rational_divisor_class_group())
     1231                K = K.intersection(sigma) if K is not None else sigma
     1232            self._Kaehler_cone = K
     1233        return self._Kaehler_cone
     1234
     1235    def Mori_vectors(self):
     1236        """
     1237        Returns the rays of the Mori cone.
     1238
     1239        OUTPUT:
     1240
     1241        - The rays of the Mori cone, that is, the dual of the Kähler cone.
     1242
     1243        - The points in the Mori cone are the effective curves in the variety.
     1244
     1245        - The first ``self.fan().nrays()`` integer entries in each
     1246          Mori vector are the intersection numbers of the curve
     1247          corresponding to the generator of the ray with the divisors
     1248          of the toric variety in the same order as :meth:`divisors`.
     1249
     1250        - The last entry is associated to the orgin of the N-lattice.
     1251
     1252        - The Mori vectors are also known as the gauged linear sigma
     1253          model charge vectors.
     1254
     1255        EXAMPLES::
     1256
     1257            sage: P4_11169 = toric_varieties.P4_11169_resolved()
     1258            sage: P4_11169.Mori_vectors()
     1259            [(3, 2, 0, 0, 0, 1, -6), (0, 0, 1, 1, 1, -3, 0)]
     1260        """
     1261        Mc = [ facet_normal * self._fan.gale_transform()
     1262               for facet_normal in self.Kaehler_cone().facet_normals() ]
     1263        return Mc;
     1264
     1265    def rational_divisor_class_group(self):
     1266        r"""
     1267        Return the rational divisor class group of ``self``.
     1268
     1269        Let `X` be a toric variety.
     1270
     1271        The **Weil divisor class group** `\mathop{Cl}(X)` is a finitely
     1272        generated abelian group and can contain torsion. Its rank equals the
     1273        number of rays in the fan of `X` minus the dimension of `X`.
     1274
     1275        The **rational divisor class group** is
     1276        `\mathop{Cl}(X) \otimes_\ZZ \QQ` and never includes torsion. If `X` is
     1277        *smooth*, this equals the **Picard group** of `X`, whose elements are
     1278        the isomorphism classes of line bundles on `X`. The group law (which
     1279        we write as addition) is the tensor product of the line bundles. The
     1280        Picard group of a toric variety is always torsion-free.
     1281
     1282        OUTPUT:
     1283
     1284        - rational divisor class group, represented as `\ZZ^n`.
     1285
     1286        .. NOTE::
     1287
     1288            * Coordinates correspond to the rows of
     1289              ``self.fan().gale_transform()``.
     1290
     1291            * :meth:`Kaehler_cone` yields a cone in this group.
     1292
     1293        EXAMPLES::
     1294
     1295            sage: fan = FaceFan(lattice_polytope.octahedron(2))
     1296            sage: P1xP1 = ToricVariety(fan)
     1297            sage: P1xP1.rational_divisor_class_group()
     1298            Vector space of dimension 2 over Rational Field
     1299        """
     1300        if "_rational_divisor_class_group" not in self.__dict__:
     1301            self._rational_divisor_class_group = \
     1302                        QQ**(self.fan().nrays() - self.fan().lattice_dim())
     1303        return self._rational_divisor_class_group
     1304
    11961305    def resolve(self, **kwds):
    11971306        r"""
    11981307        Construct a toric variety whose fan subdivides the fan of ``self``.