Ticket #12544: trac_12544_switch_cones_to_PointCollection_folded.patch

File trac_12544_switch_cones_to_PointCollection_folded.patch, 118.0 KB (added by novoselt, 9 years ago)
  • sage/geometry/cone.py

    # HG changeset patch
    # User Andrey Novoseltsev <novoselt@gmail.com>
    # Date 1331053635 25200
    # Node ID 51ae5748ad8aac7144e1a35eedf028fe68bbf6e3
    # Parent  02b8ff6c587a012ac19d53adcfe0e3eceb640724
    Switch cones to using PointCollection for ray generators instead of tuples.
    * * *
    Adjust doctests to new cone.rays() output.
    * * *
    Add deprecation warnings to old-style ray handling methods, stop using them.
    * * *
    Transpose the matrix of PointCollection to make matrix(pc)==pc.matrix().
    
    diff --git a/sage/geometry/cone.py b/sage/geometry/cone.py
    a b  
    2424
    2525- Volker Braun (2010-12-28): Hilbert basis for cones.
    2626
     27- Andrey Novoseltsev (2012-02-23): switch to PointCollection container.
     28
    2729EXAMPLES:
    2830
    2931Use :func:`Cone` to construct cones::
     
    5052Once you have a cone, you can perform numerous operations on it. The most
    5153important ones are, probably, ray accessing methods::
    5254
    53     sage: halfspace.rays()
    54     (N(0, 0, 1), N(0, 1, 0), N(0, -1, 0), N(1, 0, 0), N(-1, 0, 0))
     55    sage: rays = halfspace.rays()
     56    sage: rays
     57    N( 0,  0, 1),
     58    N( 0,  1, 0),
     59    N( 0, -1, 0),
     60    N( 1,  0, 0),
     61    N(-1,  0, 0)
     62    in 3-d lattice N
     63    sage: rays.set()
     64    frozenset([N(1, 0, 0), N(-1, 0, 0), N(0, 1, 0), N(0, 0, 1), N(0, -1, 0)])
     65    sage: rays.matrix()
     66    [ 0  0  1]
     67    [ 0  1  0]
     68    [ 0 -1  0]
     69    [ 1  0  0]
     70    [-1  0  0]
     71    sage: rays.column_matrix()
     72    [ 0  0  0  1 -1]
     73    [ 0  1 -1  0  0]
     74    [ 1  0  0  0  0]   
     75    sage: rays(3)
     76    N(1, 0, 0)
     77    in 3-d lattice N
     78    sage: rays[3]
     79    N(1, 0, 0)
    5580    sage: halfspace.ray(3)
    5681    N(1, 0, 0)
    57     sage: halfspace.ray_matrix()
    58     [ 0  0  0  1 -1]
    59     [ 0  1 -1  0  0]
    60     [ 1  0  0  0  0]
    61     sage: halfspace.ray_set()
    62     frozenset([N(1, 0, 0), N(-1, 0, 0), N(0, 1, 0), N(0, 0, 1), N(0, -1, 0)])
     82
     83The method :meth:`~ConvexRationalPolyhedralCone.rays` returns
     84a :class:`~sage.geometry.point_collection.PointCollection` with the `i`-th
     85element being the primitive integral generator of the `i`-th ray. It is possible
     86to convert this collection to a matrix with either rows or columns corresponding
     87to these generators. You may also change the default
     88meth:`~sage.geometry.point_collection.PointCollection.output_format` of all
     89point collections such a matrix.
    6390
    6491If you want to do something with each ray of a cone, you can write ::
    6592
     
    6794    N(1, 0, 0)
    6895    N(0, 1, 0)
    6996
    70 You can also get an iterator over only some selected rays::
    71 
    72     sage: for ray in halfspace.ray_iterator([1,2,1]): print ray
    73     N(0, 1, 0)
    74     N(0, -1, 0)
    75     N(0, 1, 0)
    76 
    7797There are two dimensions associated to each cone - the dimension of the
    7898subspace spanned by the cone and the dimension of the space where it lives::
    7999
     
    111131    sage: face
    112132    2-d face of 3-d cone in 3-d lattice N
    113133    sage: face.rays()
    114     (N(1, 1, 1), N(1, -1, 1))
     134    N(1,  1, 1),
     135    N(1, -1, 1)
     136    in 3-d lattice N
    115137    sage: face.ambient_ray_indices()
    116138    (0, 1)
    117139    sage: four_rays.rays(face.ambient_ray_indices())
    118     (N(1, 1, 1), N(1, -1, 1))
     140    N(1,  1, 1),
     141    N(1, -1, 1)
     142    in 3-d lattice N
    119143
    120144If you need to know inclusion relations between faces, you can use ::
    121145
     
    124148    [1, 4, 4, 1]
    125149    sage: face = L.level_sets()[2][0]
    126150    sage: face.element.rays()
    127     (N(1, 1, 1), N(1, -1, 1))
     151    N(1,  1, 1),
     152    N(1, -1, 1)
     153    in 3-d lattice N
    128154    sage: L.hasse_diagram().neighbors_in(face)
    129155    [1-d face of 3-d cone in 3-d lattice N,
    130156     1-d face of 3-d cone in 3-d lattice N]
    131157
    132158.. WARNING::
    133159
    134     As you can see in the above example, the order of faces in level sets of
     160    The order of faces in level sets of
    135161    the face lattice may differ from the order of faces returned by
    136162    :meth:`~ConvexRationalPolyhedralCone.faces`. While the first order is
    137163    random, the latter one ensures that one-dimensional faces are listed in
     
    159185
    160186#*****************************************************************************
    161187#       Copyright (C) 2010 Volker Braun <vbraun.name@gmail.com>
    162 #       Copyright (C) 2010 Andrey Novoseltsev <novoselt@gmail.com>
     188#       Copyright (C) 2012 Andrey Novoseltsev <novoselt@gmail.com>
    163189#       Copyright (C) 2010 William Stein <wstein@gmail.com>
    164190#
    165 #
    166191#  Distributed under the terms of the GNU General Public License (GPL)
    167 #
     192#  as published by the Free Software Foundation; either version 2 of
     193#  the License, or (at your option) any later version.
    168194#                  http://www.gnu.org/licenses/
    169195#*****************************************************************************
    170196
     
    175201
    176202from sage.combinat.posets.posets import FinitePoset
    177203from sage.geometry.lattice_polytope import LatticePolytope, integral_length
     204from sage.geometry.point_collection import PointCollection
    178205from sage.geometry.polyhedron.constructor import Polyhedron
    179206from sage.geometry.polyhedron.base import is_Polyhedron
    180207from sage.geometry.hasse_diagram import Hasse_diagram_from_incidences
     
    183210from sage.geometry.toric_plotter import ToricPlotter, label_list
    184211from sage.graphs.all import DiGraph
    185212from sage.matrix.all import matrix, identity_matrix
    186 from sage.misc.all import flatten, latex, prod
     213from sage.misc.all import cached_method, flatten, latex, prod
     214from sage.misc.misc import deprecation
    187215from sage.modules.all import span, vector
    188216from sage.rings.all import QQ, RR, ZZ, gcd
    189217from sage.structure.all import SageObject
     
    264292        sage: quadrant
    265293        2-d cone in 2-d lattice N
    266294        sage: quadrant.rays()
    267         (N(1, 0), N(0, 1))
    268 
    269     You may prefer to use :meth:`~IntegralRayCollection.ray_matrix` when you
    270     want to take a look at rays, they will be given as columns::
    271 
    272         sage: quadrant.ray_matrix()
    273         [1 0]
    274         [0 1]
     295        N(1, 0),
     296        N(0, 1)
     297        in 2-d lattice N
    275298
    276299    If you give more rays than necessary, the extra ones will be discarded::
    277300
    278301        sage: Cone([(1,0), (0,1), (1,1), (0,1)]).rays()
    279         (N(0, 1), N(1, 0))
     302        N(0, 1),
     303        N(1, 0)
     304        in 2-d lattice N
    280305
    281306    However, this work is not done with ``check=False`` option, so use it
    282307    carefully! ::
    283308
    284309        sage: Cone([(1,0), (0,1), (1,1), (0,1)], check=False).rays()
    285         (N(1, 0), N(0, 1), N(1, 1), N(0, 1))
     310        N(1, 0),
     311        N(0, 1),
     312        N(1, 1),
     313        N(0, 1)
     314        in 2-d lattice N
    286315
    287316    Even worse things can happen with ``normalize=False`` option::
    288317
     
    299328        1
    300329        sage: half_plane = Cone([(1,0), (0,1), (-1,0)])
    301330        sage: half_plane.rays()
    302         (N(0, 1), N(1, 0), N(-1, 0))
     331        N( 0, 1),
     332        N( 1, 0),
     333        N(-1, 0)
     334        in 2-d lattice N
    303335        sage: half_plane.is_strictly_convex()
    304336        False
    305337        sage: origin = Cone([(0,0)])
    306338        sage: origin.rays()
    307         ()
     339        Empty collection
     340        in 2-d lattice N
    308341        sage: origin.dim()
    309342        0
    310343        sage: origin.lattice_dim()
    311344        2
    312345
    313346    You may construct the cone above without giving any rays, but in this case
    314     you must provide lattice explicitly::
     347    you must provide ``lattice`` explicitly::
    315348
    316349        sage: origin = Cone([])
    317350        Traceback (most recent call last):
     
    325358        sage: origin.lattice()
    326359        2-d lattice N
    327360
    328     Of course, you can also provide lattice in other cases::
     361    Of course, you can also provide ``lattice`` in other cases::
    329362
    330363        sage: L = ToricLattice(3, "L")
    331364        sage: c1 = Cone([(1,0,0),(1,1,1)], lattice=L)
    332365        sage: c1.rays()
    333         (L(1, 0, 0), L(1, 1, 1))
     366        L(1, 0, 0),
     367        L(1, 1, 1)
     368        in 3-d lattice L
    334369
    335370    Or you can construct cones from rays of a particular lattice::
    336371
     
    338373        sage: ray2 = L(1,1,1)
    339374        sage: c2 = Cone([ray1, ray2])
    340375        sage: c2.rays()
    341         (L(1, 0, 0), L(1, 1, 1))
     376        L(1, 0, 0),
     377        L(1, 1, 1)
     378        in 3-d lattice L
    342379        sage: c1 == c2
    343380        True
    344381
     
    347384    negatives", as in the following example::
    348385
    349386        sage: plane = Cone([(1,0), (0,1), (-1,-1)])
    350         sage: plane.ray_matrix()
    351         [ 0  0  1 -1]
    352         [ 1 -1  0  0]
     387        sage: plane.rays()
     388        N( 0,  1),
     389        N( 0, -1),
     390        N( 1,  0),
     391        N(-1,  0)
     392        in 2-d lattice N
    353393
    354394    The cone can also be specified by a
    355395    :class:`~sage.geometry.polyhedron.base.Polyhedron_base`::
     
    381421            raise ValueError("the apex of %s is not at the origin!"
    382422                             % polyhedron)
    383423        rays = normalize_rays(polyhedron.rays(), lattice)
    384         strict_rays = tuple(rays)
    385         lines = tuple(normalize_rays(polyhedron.lines(), lattice))
    386         for line in lines:
     424        for line in normalize_rays(polyhedron.lines(), lattice):
    387425            rays.append(line)
    388426            rays.append(-line)
    389427            rays[-1].set_immutable()
    390         cone = ConvexRationalPolyhedralCone(rays, lattice)
    391         # Save constructed stuff for later use
    392         cone._polyhedron = polyhedron
    393         cone._strict_rays = strict_rays
    394         cone._lines = lines
    395         return cone
     428        return ConvexRationalPolyhedralCone(rays, lattice)
    396429    # Cone from rays
    397430    if check or normalize:
    398431        rays = normalize_rays(rays, lattice)
     
    449482    TESTS::
    450483   
    451484        sage: Cone([(1,0), (0,1), (1,1), (0,1)]).rays()   # indirect doctest
    452         (N(0, 1), N(1, 0))
     485        N(0, 1),
     486        N(1, 0)
     487        in 2-d lattice N
    453488    """
    454489    rays = []
    455490    lines = []
     
    595630            Ambient free module of rank 2
    596631            over the principal ideal domain Integer Ring
    597632            sage: c.rays()
    598             ((1, 0),)
     633            (1, 0)
     634            in Ambient free module of rank 2
     635            over the principal ideal domain Integer Ring
    599636            sage: TestSuite(c).run()
    600637        """
    601         self._rays = tuple(rays)
     638        self._rays = PointCollection(rays, lattice)
    602639        self._lattice = self._rays[0].parent() if lattice is None else lattice
    603640
    604641    def __cmp__(self, right):
     
    673710            N(1, 0)
    674711            N(0, 1)
    675712        """
    676         return self.ray_iterator()
     713        return iter(self._rays)
    677714
    678715    def _ambient_space_point(self, data):
    679716        r"""
     
    757794            sage: c.cartesian_product(c)    # indirect doctest
    758795            2-d cone in 2-d lattice N+N
    759796            sage: _.rays()
    760             (N+N(1, 0), N+N(0, 1))
     797            N+N(1, 0),
     798            N+N(0, 1)
     799            in 2-d lattice N+N
    761800        """
    762801        assert isinstance(other, IntegralRayCollection)
    763802        if lattice is None:
     
    787826            1
    788827        """
    789828        if "_dim" not in self.__dict__:
    790             self._dim = self.ray_matrix().rank()
     829            self._dim = self.rays().matrix().rank()
    791830        return self._dim
    792831
    793832    def lattice(self):
     
    928967        EXAMPLES::
    929968
    930969            sage: c = Cone([(1,0), (0,1), (-1, 0)])
    931             sage: for ray in c.ray_iterator(): print ray
    932             N(0, 1)
    933             N(1, 0)
    934             N(-1, 0)
    935             sage: for ray in c.ray_iterator([2,1]): print ray
    936             N(-1, 0)
    937             N(1, 0)
     970            sage: [ray for ray in c.ray_iterator()]
     971            doctest:...: DeprecationWarning: (Since Sage Version 5.1)
     972            ray_iterator(...) is deprecated!
     973            [N(0, 1), N(1, 0), N(-1, 0)]
    938974        """
     975        # I couldn't move it to the new Cython class due to some issues with
     976        # generators (may be resolved in 0.16). However, this particular
     977        # iterator does not really save time or memory, so I think it can just
     978        # go. -- Andrey Novoseltsev, 2012-03-06.
     979        deprecation("ray_iterator(...) is deprecated!",
     980                    "Sage Version 5.1")
    939981        if ray_list is None:
    940982            for ray in self._rays:
    941983                yield ray
     
    9591001
    9601002            sage: c = Cone([(1,0), (0,1), (-1, 0)])
    9611003            sage: c.ray_matrix()
     1004            doctest:...: DeprecationWarning: (Since Sage Version 5.1)
     1005            ray_matrix(...) is deprecated,
     1006            please use rays().column_matrix() instead!
    9621007            [ 0  1 -1]
    9631008            [ 1  0  0]
    9641009        """
    965         if "_ray_matrix" not in self.__dict__:
    966             self._ray_matrix = matrix(ZZ, self.nrays(),
    967                             self.lattice().degree(), self._rays).transpose()
    968             self._ray_matrix.set_immutable()
    969         return self._ray_matrix
     1010        deprecation("ray_matrix(...) is deprecated, "
     1011                    "please use rays().column_matrix() instead!",
     1012                    "Sage Version 5.1")
     1013        return self.rays().column_matrix()
    9701014
    9711015    def ray_set(self):
    9721016        r"""
     
    9821026
    9831027            sage: c = Cone([(1,0), (0,1), (-1, 0)])
    9841028            sage: c.ray_set()
     1029            doctest:1: DeprecationWarning: (Since Sage Version 5.1)
     1030            ray_set(...) is deprecated, please use rays().set() instead!
    9851031            frozenset([N(0, 1), N(1, 0), N(-1, 0)])
    9861032        """
    987         if "_ray_set" not in self.__dict__:
    988             self._ray_set = frozenset(self._rays)
    989         return self._ray_set
    990 
    991     def rays(self, ray_list=None):
     1033        deprecation("ray_set(...) is deprecated, "
     1034                    "please use rays().set() instead!",
     1035                    "Sage Version 5.1")
     1036        return self.rays().set()
     1037
     1038    def rays(self, *args):
    9921039        r"""
    993         Return rays of ``self`` as a :class:`tuple`.
     1040        Return (some of the) rays of ``self``.
    9941041
    9951042        INPUT:
    9961043
    997         - ``ray_list`` -- list of integers, the indices of the requested rays.
    998           If not specified, all rays of ``self`` will be returned. You may
    999           want to use :meth:`ray_set` if you do not care about the order of
    1000           rays. See also :meth:`ray_iterator`.
     1044        - ``ray_list`` -- a list of integers, the indices of the requested
     1045          rays. If not specified, all rays of ``self`` will be returned.
    10011046
    10021047        OUTPUT:
    10031048
    1004         - :class:`tuple` of rays.
     1049        - a :class:`PointCollection` of primitive integral ray generators.
    10051050
    10061051        EXAMPLES::
    10071052
    10081053            sage: c = Cone([(1,0), (0,1), (-1, 0)])
    10091054            sage: c.rays()
    1010             (N(0, 1), N(1, 0), N(-1, 0))
     1055            N( 0, 1),
     1056            N( 1, 0),
     1057            N(-1, 0)
     1058            in 2-d lattice N
    10111059            sage: c.rays([0, 2])
    1012             (N(0, 1), N(-1, 0))
     1060            N( 0, 1),
     1061            N(-1, 0)
     1062            in 2-d lattice N
     1063           
     1064        You can also give ray indices directly, without packing them into a
     1065        list::
     1066       
     1067            sage: c.rays(0, 2)
     1068            N( 0, 1),
     1069            N(-1, 0)
     1070            in 2-d lattice N
    10131071        """
    1014         if ray_list is None:
    1015             return self._rays
    1016         else:
    1017             return tuple(self.ray_iterator(ray_list))
     1072        return self._rays if not args else self._rays(*args)
    10181073
    10191074    def ray_basis(self):
    10201075        r"""
     
    10341089
    10351090            sage: c = Cone([(1,1,1,1), (1,-1,1,1), (-1,-1,1,1), (-1,1,1,1), (0,0,0,1)])
    10361091            sage: c.ray_basis()
    1037             (N(1, 1, 1, 1), N(1, -1, 1, 1), N(-1, -1, 1, 1), N(0, 0, 0, 1))
     1092            doctest:...: DeprecationWarning: (Since Sage Version 5.1)
     1093            ray_basis(...) is deprecated,
     1094            please use rays().basis() instead!
     1095            N( 1,  1, 1, 1),
     1096            N( 1, -1, 1, 1),
     1097            N(-1, -1, 1, 1),
     1098            N( 0,  0, 0, 1)
     1099            in 4-d lattice N
    10381100        """
    1039         if "_ray_basis" not in self.__dict__:
    1040             indices = self.ray_matrix().pivots()
    1041             self._ray_basis = tuple(self.ray(i) for i in indices)
    1042         return self._ray_basis
     1101        deprecation("ray_basis(...) is deprecated, "
     1102                    "please use rays().basis() instead!",
     1103                    "Sage Version 5.1")
     1104        return self.rays().basis()
    10431105
    10441106    def ray_basis_matrix(self):
    10451107        r"""
     
    10631125
    10641126            sage: c = Cone([(1,1,1,1), (1,-1,1,1), (-1,-1,1,1), (-1,1,1,1), (0,0,0,1)])
    10651127            sage: c.ray_basis_matrix()
     1128            doctest:...: DeprecationWarning: (Since Sage Version 5.1)
     1129            ray_basis_matrix(...) is deprecated,
     1130            please use rays().basis().column_matrix() instead!
    10661131            [ 1  1 -1  0]
    10671132            [ 1 -1 -1  0]
    10681133            [ 1  1  1  0]
    10691134            [ 1  1  1  1]
    10701135        """
    1071         basis = self.ray_basis()
    1072         m = self._lattice.degree()
    1073         n = len(basis)
    1074         return matrix(ZZ, n, m, basis).transpose()
     1136        deprecation("ray_basis_matrix(...) is deprecated, "
     1137                    "please use rays().basis().column_matrix() instead!",
     1138                    "Sage Version 5.1")
     1139        return self.rays().basis().column_matrix()
    10751140
    10761141
    10771142# Derived classes MUST allow construction of their objects using ``ambient``
     
    11491214            Ambient free module of rank 2
    11501215            over the principal ideal domain Integer Ring
    11511216            sage: ac.rays()
    1152             ((1, 0), (0, 1))
     1217            (1, 0),
     1218            (0, 1)
     1219            in Ambient free module of rank 2
     1220            over the principal ideal domain Integer Ring
    11531221            sage: ac.ambient() is ac
    11541222            True
    11551223            sage: TestSuite(ac).run()
    11561224            sage: sc = ConvexRationalPolyhedralCone(ambient=ac,
    11571225            ...                         ambient_ray_indices=[1])
    11581226            sage: sc.rays()
    1159             ((0, 1),)
     1227            (0, 1)
     1228            in Ambient free module of rank 2
     1229            over the principal ideal domain Integer Ring
    11601230            sage: sc.ambient() is ac
    11611231            True
    11621232            sage: TestSuite(sc).run()
     
    14281498            sage: c.cartesian_product(c)
    14291499            2-d cone in 2-d lattice N+N
    14301500            sage: _.rays()
    1431             (N+N(1, 0), N+N(0, 1))
     1501            N+N(1, 0),
     1502            N+N(0, 1)
     1503            in 2-d lattice N+N
    14321504        """
    14331505        assert is_Cone(other)
    14341506        rc = super(ConvexRationalPolyhedralCone, self).cartesian_product(
     
    15541626                                     key=lambda f: f._ambient_ray_indices))
    15551627        return faces
    15561628
     1629    @cached_method
    15571630    def adjacent(self):
    15581631        r"""
    15591632        Return faces adjacent to ``self`` in the ambient face lattice.
     
    16191692        adjacent cones must be facets of a bigger one, but since ``cone``
    16201693        in this example is generating, it is not contained in any other.
    16211694        """
    1622         if "_adjacent" not in self.__dict__:
    1623             L = self._ambient._face_lattice_function()
    1624             adjacent = set()
    1625             facets = self.facets()
    1626             superfaces = self.facet_of()
    1627             if superfaces:
    1628                 for superface in superfaces:
    1629                     for facet in facets:
    1630                         adjacent.update(L.open_interval(facet,  superface))
    1631                 if adjacent:
    1632                     adjacent.remove(L(self))
    1633                 self._adjacent = self._sort_faces(face.element
    1634                                                   for face in adjacent)
    1635             elif self.dim() == self._ambient.dim():
    1636                 # Special treatment relevant for fans
     1695        L = self._ambient._face_lattice_function()
     1696        adjacent = set()
     1697        facets = self.facets()
     1698        superfaces = self.facet_of()
     1699        if superfaces:
     1700            for superface in superfaces:
    16371701                for facet in facets:
    1638                     adjacent.update(facet.facet_of())
    1639                 if adjacent:
    1640                     adjacent.remove(self)
    1641                 self._adjacent = self._sort_faces(adjacent)
    1642             else:
    1643                 self._adjacent = ()
    1644         return self._adjacent
     1702                    adjacent.update(L.open_interval(facet,  superface))
     1703            if adjacent:
     1704                adjacent.remove(L(self))
     1705            return self._sort_faces(face.element for face in adjacent)
     1706        elif self.dim() == self._ambient.dim():
     1707            # Special treatment relevant for fans
     1708            for facet in facets:
     1709                adjacent.update(facet.facet_of())
     1710            if adjacent:
     1711                adjacent.remove(self)
     1712            return self._sort_faces(adjacent)
     1713        else:
     1714            return ()
    16451715
    16461716    def ambient(self):
    16471717        r"""
     
    17421812       
    17431813            sage: cone = Cone([(1,0), (-1,3)])
    17441814            sage: cone.dual().rays()
    1745             (M(3, 1), M(0, 1))
     1815            M(3, 1),
     1816            M(0, 1)
     1817            in 2-d lattice M
    17461818           
    17471819        Now let's look at a more complicated case::
    17481820       
     
    17521824            sage: cone.dim()
    17531825            3
    17541826            sage: cone.dual().rays()
    1755             (M(7, -18, -2), M(1, -4, 0))
     1827            M(7, -18, -2),
     1828            M(1,  -4,  0)
     1829            in 3-d lattice M
    17561830            sage: cone.dual().dual() is cone
    17571831            True
    17581832
     
    17601834       
    17611835            sage: N = ToricLattice(2)
    17621836            sage: Cone([], lattice=N).dual().rays()  # empty cone
    1763             (M(1, 0), M(-1, 0), M(0, 1), M(0, -1))
     1837            M( 1,  0),
     1838            M(-1,  0),
     1839            M( 0,  1),
     1840            M( 0, -1)
     1841            in 2-d lattice M
    17641842            sage: Cone([(1,0)], lattice=N).dual().rays()  # ray in 2d
    1765             (M(1, 0), M(0, 1), M(0, -1))
     1843            M(1,  0),
     1844            M(0,  1),
     1845            M(0, -1)
     1846            in 2-d lattice M
    17661847            sage: Cone([(1,0),(-1,0)], lattice=N).dual().rays()  # line in 2d
    1767             (M(0, 1), M(0, -1))
     1848            M(0,  1),
     1849            M(0, -1)
     1850            in 2-d lattice M
    17681851            sage: Cone([(1,0),(0,1)], lattice=N).dual().rays()  # strictly convex cone
    1769             (M(1, 0), M(0, 1))
     1852            M(1, 0),
     1853            M(0, 1)
     1854            in 2-d lattice M
    17701855            sage: Cone([(1,0),(-1,0),(0,1)], lattice=N).dual().rays()  # half space
    1771             (M(0, 1),)
     1856            M(0, 1)
     1857            in 2-d lattice M
    17721858            sage: Cone([(1,0),(0,1),(-1,-1)], lattice=N).dual().rays()  # whole space
    1773             ()
     1859            Empty collection
     1860            in 2-d lattice M
    17741861        """
    17751862        if "_dual" not in self.__dict__:
    17761863            rays = list(self.facet_normals())
     
    18381925            sage: e_ray
    18391926            1-d face of 3-d cone in 3-d lattice N
    18401927            sage: e_ray.rays()
    1841             (N(0, -1, 1),)
     1928            N(0, -1, 1)
     1929            in 3-d lattice N
    18421930            sage: e_ray is ray
    18431931            False
    18441932            sage: e_ray.is_equivalent(ray)
     
    19242012            sage: face.rays()
    19252013            Traceback (most recent call last):
    19262014            ...
    1927             AttributeError: 'FinitePoset_with_category.element_class' object has no attribute 'rays'
     2015            AttributeError: 'FinitePoset_with_category.element_class' object
     2016            has no attribute 'rays'
    19282017
    19292018        To get the actual face you need one more step::
    19302019
     
    19332022        Now you can look at the actual rays of this face... ::
    19342023
    19352024            sage: face.rays()
    1936             (N(1, 0),)
     2025            N(1, 0)
     2026            in 2-d lattice N
    19372027
    19382028        ... or you can see indices of the rays of the orginal cone that
    19392029        correspond to the above ray::
     
    19652055            sage: face
    19662056            1-d face of 2-d cone in 2-d lattice N
    19672057            sage: face.rays()
    1968             (N(1, 0),)
     2058            N(1, 0)
     2059            in 2-d lattice N
    19692060            sage: face.facets()
    19702061            (0-d face of 2-d cone in 2-d lattice N,)
    19712062            sage: face.facet_of()
     
    19732064            sage: face.adjacent()
    19742065            (1-d face of 2-d cone in 2-d lattice N,)
    19752066            sage: face.adjacent()[0].rays()
    1976             (N(0, 1),)
     2067            N(0, 1)
     2068            in 2-d lattice N
    19772069
    19782070        Note that if ``cone`` is a face of ``supercone``, then the face
    19792071        lattice of ``cone`` consists of (appropriate) faces of ``supercone``::
     
    21522244        Now you can look at the actual rays of this face... ::
    21532245
    21542246            sage: face.rays()
    2155             (N(1, 0),)
     2247            N(1, 0)
     2248            in 2-d lattice N
    21562249
    21572250        ... or you can see indices of the rays of the orginal cone that
    21582251        correspond to the above ray::
     
    22012294             (3-d cone in 4-d lattice N,))
    22022295             
    22032296        We also ensure that a call to this function does not break
    2204         :meth:`facets` method (see Trac #9780)::
     2297        :meth:`facets` method (see :trac:`9780`)::
    22052298       
    22062299            sage: cone = toric_varieties.dP8().fan().generating_cone(0)
    22072300            sage: cone
    22082301            2-d cone of Rational polyhedral fan in 2-d lattice N
    2209             sage: [f.rays() for f in cone.facets()]
    2210             [(N(1, 1),), (N(0, 1),)]
     2302            sage: for f in cone.facets(): print f.rays()
     2303            N(1, 1)
     2304            in 2-d lattice N
     2305            N(0, 1)
     2306            in 2-d lattice N
    22112307            sage: len(cone.faces())
    22122308            3
    2213             sage: [f.rays() for f in cone.facets()]
    2214             [(N(1, 1),), (N(0, 1),)]       
     2309            sage: for f in cone.facets(): print f.rays()
     2310            N(1, 1)
     2311            in 2-d lattice N
     2312            N(0, 1)
     2313            in 2-d lattice N
    22152314        """
    22162315        if dim is not None and codim is not None:
    22172316            raise ValueError(
     
    22482347
    22492348        OUTPUT:
    22502349
    2251         - :class:`tuple` of vectors.
     2350        - a :class:`PointCollection`.
    22522351
    22532352        If the ambient :meth:`~IntegralRayCollection.lattice` of ``self`` is a
    22542353        :class:`toric lattice
     
    22612360
    22622361            sage: cone = Cone([(1,0), (-1,3)])
    22632362            sage: cone.facet_normals()
    2264             (M(3, 1), M(0, 1))
     2363            M(3, 1),
     2364            M(0, 1)
     2365            in 2-d lattice M
    22652366
    22662367        Now let's look at a more complicated case::
    22672368       
     
    22752376            sage: lsg = (QQ^3)(cone.linear_subspace().gen(0)); lsg
    22762377            (1, 1/4, 5/4)
    22772378            sage: cone.facet_normals()
    2278             (M(7, -18, -2), M(1, -4, 0))
     2379            M(7, -18, -2),
     2380            M(1,  -4,  0)
     2381            in 3-d lattice M
    22792382            sage: [lsg*normal for normal in cone.facet_normals()]
    22802383            [0, 0]
    22812384
    22822385        A lattice that does not have a ``dual()`` method::
    22832386       
    22842387            sage: Cone([(1,1),(0,1)], lattice=ZZ^2).facet_normals()
    2285             ((1, 0), (-1, 1))
     2388            ( 1, 0),
     2389            (-1, 1)
     2390            in Ambient free module of rank 2
     2391            over the principal ideal domain Integer Ring
    22862392
    22872393        We correctly handle the degenerate cases::
    22882394       
    22892395            sage: N = ToricLattice(2)
    22902396            sage: Cone([], lattice=N).facet_normals()  # empty cone
    2291             ()
     2397            Empty collection
     2398            in 2-d lattice M
    22922399            sage: Cone([(1,0)], lattice=N).facet_normals()  # ray in 2d
    2293             (M(1, 0),)
     2400            M(1, 0)
     2401            in 2-d lattice M
    22942402            sage: Cone([(1,0),(-1,0)], lattice=N).facet_normals()  # line in 2d
    2295             ()
     2403            Empty collection
     2404            in 2-d lattice M
    22962405            sage: Cone([(1,0),(0,1)], lattice=N).facet_normals()  # strictly convex cone
    2297             (M(1, 0), M(0, 1))
     2406            M(1, 0),
     2407            M(0, 1)
     2408            in 2-d lattice M
    22982409            sage: Cone([(1,0),(-1,0),(0,1)], lattice=N).facet_normals()  # half space
    2299             (M(0, 1),)
     2410            M(0, 1)
     2411            in 2-d lattice M
    23002412            sage: Cone([(1,0),(0,1),(-1,-1)], lattice=N).facet_normals()  # whole space
    2301             ()
     2413            Empty collection
     2414            in 2-d lattice M
    23022415        """
    23032416        if "_facet_normals" not in self.__dict__:
    23042417            cone = self._PPL_cone()
     
    23082421                if c.is_inequality():
    23092422                    normals.append(c.coefficients())
    23102423            M = self.dual_lattice()
    2311             normals = tuple(map(M,normals))
     2424            normals = tuple(map(M, normals))
    23122425            for n in normals:
    23132426                n.set_immutable()
    2314             self._facet_normals = normals
     2427            self._facet_normals = PointCollection(normals, M)
    23152428        return self._facet_normals
    23162429
    23172430    def facet_of(self):
     
    23952508            sage: cone1 = Cone([(1,0), (-1, 3)])
    23962509            sage: cone2 = Cone([(-1,0), (2, 5)])
    23972510            sage: cone1.intersection(cone2).rays()
    2398             (N(-1, 3), N(2, 5))
     2511            N(-1, 3),
     2512            N( 2, 5)
     2513            in 2-d lattice N
    23992514           
    24002515        It is OK to intersect cones living in sublattices of the same ambient
    24012516        lattice::
     
    24052520            sage: cone3 = Cone([(1,1)], lattice=Ns)
    24062521            sage: I = cone1.intersection(cone3)
    24072522            sage: I.rays()
    2408             (N(1, 1),)
     2523            N(1, 1)
     2524            in Sublattice <N(1, 1)>
    24092525            sage: I.lattice()
    24102526            Sublattice <N(1, 1)>
    24112527       
     
    24182534            ValueError: 2-d lattice N and 2-d lattice M
    24192535            have different ambient lattices!
    24202536            sage: cone1.intersection(Cone(cone1.dual().rays(), N)).rays()
    2421             (N(3, 1), N(0, 1))
     2537            N(3, 1),
     2538            N(0, 1)
     2539            in 2-d lattice N
    24222540        """
    24232541        if self._ambient is other._ambient:
    24242542            # Cones of the same ambient cone or fan intersect nicely/quickly.
     
    24642582            sage: cone1 = Cone([(1,0), (-1, 3)])
    24652583            sage: cone2 = Cone([(-1,3), (1, 0)])
    24662584            sage: cone1.rays()
    2467             (N(1, 0), N(-1, 3))
     2585            N( 1, 0),
     2586            N(-1, 3)
     2587            in 2-d lattice N
    24682588            sage: cone2.rays()
    2469             (N(-1, 3), N(1, 0))
     2589            N(-1, 3),
     2590            N( 1, 0)
     2591            in 2-d lattice N
    24702592            sage: cone1 == cone2
    24712593            False
    24722594            sage: cone1.is_equivalent(cone2)
     
    25172639            return False
    25182640        if self._ambient is cone._ambient:
    25192641            # Cones are always faces of their ambient structure, so
    2520             return self.ray_set().issubset(cone.ray_set())
     2642            return self.rays().set().issubset(cone.rays().set())
    25212643        if self.is_equivalent(cone):
    25222644            return True
    25232645        # Obviously False case
     
    26052727        """
    26062728        return self.nrays() == self.dim()
    26072729
     2730    @cached_method
    26082731    def is_smooth(self):
    26092732        r"""
    26102733        Check if ``self`` is smooth.
     
    26372760            sage: Cone([(1,0,0), (2,1,2)]).is_smooth()
    26382761            True
    26392762        """
    2640         if "_is_smooth" not in self.__dict__:
    2641             if not self.is_simplicial():
    2642                 self._is_smooth = False
    2643             else:
    2644                 elementary_divisors = self.ray_matrix().transpose().elementary_divisors()
    2645                 self._is_smooth = (elementary_divisors == [1]*self.nrays())
    2646         return self._is_smooth
     2763        if not self.is_simplicial():
     2764            return False
     2765        return self.rays().matrix().elementary_divisors() == [1] * self.nrays()
    26472766
    26482767    def is_trivial(self):
    26492768        """
     
    27262845            [ 0  0]
    27272846        """
    27282847        if "_lattice_polytope" not in self.__dict__:
    2729             m = self.ray_matrix()
    2730             if self.is_strictly_convex():
    2731                 m = m.augment(matrix(ZZ, self.lattice().degree(), 1)) # origin
    2732             self._lattice_polytope = LatticePolytope(m,
    2733                                 compute_vertices=False, copy_vertices=False)
     2848            self._lattice_polytope = LatticePolytope(
     2849                                tuple(self.rays()) + (self.lattice().zero(),),
     2850                                compute_vertices=not self.is_strictly_convex())
    27342851        return self._lattice_polytope
    27352852
    27362853    def line_set(self):
     
    27482865
    27492866            sage: halfplane = Cone([(1,0), (0,1), (-1,0)])
    27502867            sage: halfplane.line_set()
     2868            doctest:1: DeprecationWarning: (Since Sage Version 5.1)
     2869            line_set(...) is deprecated, please use lines().set() instead!
    27512870            frozenset([N(1, 0)])
    27522871            sage: fullplane = Cone([(1,0), (0,1), (-1,-1)])
    27532872            sage: fullplane.line_set()
    27542873            frozenset([N(0, 1), N(1, 0)])
    27552874        """
     2875        deprecation("line_set(...) is deprecated, "
     2876                    "please use lines().set() instead!",
     2877                    "Sage Version 5.1")
    27562878        if "_line_set" not in self.__dict__:
    27572879            self._line_set = frozenset(self.lines())
    27582880        return self._line_set
    27592881
     2882    @cached_method
    27602883    def linear_subspace(self):
    27612884        r"""
    27622885        Return the largest linear subspace contained inside of ``self``.
     
    27732896            Basis matrix:
    27742897            [1 0]
    27752898        """
    2776         if "_linear_subspace" not in self.__dict__:
    2777             if self.is_strictly_convex():
    2778                 self._linear_subspace = span(
    2779                                     [vector(QQ, self.lattice_dim())], QQ)
    2780             else:
    2781                 self._linear_subspace = span(self.lines(), QQ)
    2782         return self._linear_subspace
    2783 
     2899        if self.is_strictly_convex():
     2900            return span([vector(QQ, self.lattice_dim())], QQ)
     2901        return span(self.lines(), QQ)
     2902
     2903    @cached_method
    27842904    def lines(self):
    27852905        r"""
    27862906        Return lines generating the linear subspace of ``self``.
     
    27962916
    27972917            sage: halfplane = Cone([(1,0), (0,1), (-1,0)])
    27982918            sage: halfplane.lines()
    2799             (N(1, 0),)
     2919            N(1, 0)
     2920            in 2-d lattice N
    28002921            sage: fullplane = Cone([(1,0), (0,1), (-1,-1)])
    28012922            sage: fullplane.lines()
    2802             (N(0, 1), N(1, 0))
     2923            N(0, 1),
     2924            N(1, 0)
     2925            in 2-d lattice N
    28032926        """
    2804         if "_lines" not in self.__dict__:
    2805             lines = []
    2806             for g in self._PPL_cone().minimized_generators():
    2807                 if g.is_line():
    2808                     lines.append(g.coefficients())
    2809             N = self.lattice()
    2810             lines = tuple(map(N,lines))
    2811             for l in lines:
    2812                 l.set_immutable()
    2813             self._lines = lines
    2814         return self._lines
     2927        lines = []
     2928        for g in self._PPL_cone().minimized_generators():
     2929            if g.is_line():
     2930                lines.append(g.coefficients())
     2931        N = self.lattice()
     2932        lines = tuple(map(N, lines))
     2933        for l in lines:
     2934            l.set_immutable()
     2935        return PointCollection(lines, N)
    28152936
    28162937    def plot(self, **options):
    28172938        r"""
     
    29143035            sage: ssc
    29153036            1-d cone in 1-d lattice N
    29163037            sage: ssc.rays()
    2917             (N(1),)
     3038            N(1)
     3039            in 1-d lattice N
    29183040            sage: line = Cone([(1,0), (-1,0)])
    29193041            sage: ssc = line.strict_quotient()
    29203042            sage: ssc
    29213043            0-d cone in 1-d lattice N
    29223044            sage: ssc.rays()
    2923             ()
     3045            Empty collection
     3046            in 1-d lattice N
    29243047        """
    29253048        if "_strict_quotient" not in self.__dict__:
    29263049            if self.is_strictly_convex():
     
    29913114            sage: trivial_cone._orthogonal_sublattice_complement
    29923115            Sublattice <>
    29933116        """
    2994         Nsigma = self.ray_basis_matrix()
     3117        Nsigma = self.rays().basis().matrix().transpose()
    29953118        r = Nsigma.ncols()
    29963119        D, U, V = Nsigma.smith_form()  # D = U*N*V <=> N = Uinv*D*Vinv
    29973120        Uinv = U.inverse()
     
    30533176        EXAMPLES::
    30543177
    30553178            sage: cone = Cone([(1, 1, 1), (1, -1, 1), (-1, -1, 1), (-1, 1, 1)])
    3056             sage: cone.ray_basis_matrix()
    3057             [ 1  1 -1]
    3058             [ 1 -1 -1]
    3059             [ 1  1  1]
    3060             sage: cone.ray_basis_matrix().det()
     3179            sage: cone.rays().basis()
     3180            N( 1,  1, 1),
     3181            N( 1, -1, 1),
     3182            N(-1, -1, 1)
     3183            in 3-d lattice N
     3184            sage: cone.rays().basis().matrix().det()
    30613185            -4
    30623186            sage: cone.sublattice()
    30633187            Sublattice <N(1, 1, 1), N(0, 1, 0), N(1, 0, 0)>
     
    30703194            sage: c
    30713195            2-d cone in 3-d lattice N
    30723196            sage: c.rays()
    3073             (N(1, 2, 3), N(4, -5, 1))
     3197            N(1,  2, 3),
     3198            N(4, -5, 1)
     3199            in 3-d lattice N
    30743200            sage: c.sublattice()
    30753201            Sublattice <N(1, 2, 3), N(0, 13, 11)>
    30763202            sage: c.sublattice(5, -3, 4)
     
    33233449
    33243450        extra_ray = None
    33253451        if Ncone.dimension()-Nsubcone.dimension()==1:
    3326             extra_ray = set(self.ray_set() - subcone.ray_set()).pop()
     3452            extra_ray = set(self.rays().set() - subcone.rays().set()).pop()
    33273453
    33283454        Q = Ncone.quotient(Nsubcone, positive_point=extra_ray)
    33293455        assert Q.is_torsion_free()
     
    34183544
    34193545        extra_ray = None
    34203546        if Mcone.dimension()-Msupercone.dimension()==1:
    3421             extra_ray = set(supercone.ray_set() - self.ray_set()).pop()
     3547            extra_ray = set(supercone.rays().set() - self.rays().set()).pop()
    34223548
    34233549        Q = Mcone.quotient(Msupercone, positive_dual_point=extra_ray)
    34243550        assert Q.is_torsion_free()
     
    34313557
    34323558        OUTPUT:
    34333559
    3434         A tuple of lattice points generating the semigroup of lattice points
    3435         contained in this cone.
     3560        - a :class:`PointCollection` of lattice points generating the semigroup
     3561          of lattice points contained in ``self``.
    34363562       
    34373563        .. note:: No attempt is made to return a minimal set of generators, see
    34383564            :meth:`Hilbert_basis` for that.
     
    34473573        We start with a simple case of a non-smooth 2-dimensional cone::
    34483574       
    34493575            sage: Cone([ (1,0), (1,2) ]).semigroup_generators()
    3450             (N(1, 1), N(1, 0), N(1, 2))
     3576            N(1, 1),
     3577            N(1, 0),
     3578            N(1, 2)
     3579            in 2-d lattice N
    34513580
    34523581        A non-simplicial cone works, too::
    34533582
     
    34773606        http://trac.sagemath.org/sage_trac/ticket/11312)::
    34783607
    34793608            sage: Cone([(1,1,0), (-1,1,0)]).semigroup_generators()
    3480             (N(0, 1, 0), N(1, 1, 0), N(-1, 1, 0))
     3609            N( 0, 1, 0),
     3610            N( 1, 1, 0),
     3611            N(-1, 1, 0)
     3612            in 3-d lattice N
    34813613
    34823614        Neither full-dimensional nor simplicial::
    34833615
     
    34983630
    34993631            sage: trivial_cone = Cone([], lattice=ToricLattice(3))
    35003632            sage: trivial_cone.semigroup_generators()
    3501             ()
     3633            Empty collection
     3634            in 3-d lattice N
    35023635
    35033636        ALGORITHM:
    35043637       
     
    35353668        # recursively
    35363669        N = self.lattice()       
    35373670        if not self.is_simplicial():   
    3538             from sage.geometry.triangulation.point_configuration import PointConfiguration
     3671            from sage.geometry.triangulation.point_configuration \
     3672                    import PointConfiguration
    35393673            origin = self.nrays() # last one in pc
    3540             pc = PointConfiguration(self.rays() + (N(0),), star=origin)
     3674            pc = PointConfiguration(tuple(self.rays()) + (N(0),), star=origin)
    35413675            triangulation = pc.triangulate()
    35423676            subcones = [ Cone([self.ray(i) for i in simplex if i!=origin],
    35433677                              lattice=N, check=False)
     
    35483682            return tuple(gens)
    35493683
    35503684        gens = list(parallelotope_points(self.rays(), N)) + list(self.rays())
    3551         gens = filter(lambda v:gcd(v)==1, gens)
    3552         return tuple(gens)
    3553 
     3685        gens = filter(lambda v: gcd(v) == 1, gens)
     3686        return PointCollection(gens, N)
     3687
     3688    @cached_method
    35543689    def Hilbert_basis(self):
    35553690        r"""
    35563691        Return the Hilbert basis of the cone.
     
    35733708
    35743709        OUTPUT:
    35753710
    3576         A tuple of lattice points. The rays of the cone are the first
    3577         ``self.nrays()`` entries.
     3711        - a :class:`PointCollection`. The rays of ``self`` are the first
     3712          ``self.nrays()`` entries.
    35783713       
    35793714        EXAMPLES:
    35803715
     
    35863721        We start with a simple case of a non-smooth 2-dimensional cone::
    35873722       
    35883723            sage: Cone([ (1,0), (1,2) ]).Hilbert_basis()
    3589             (N(1, 0), N(1, 2), N(1, 1))
     3724            N(1, 0),
     3725            N(1, 2),
     3726            N(1, 1)
     3727            in 2-d lattice N
    35903728
    35913729        Two more complicated example from GAP/toric::
    35923730
    35933731            sage: Cone([[1,0],[3,4]]).dual().Hilbert_basis()
    3594             (M(0, 1), M(4, -3), M(3, -2), M(2, -1), M(1, 0))
     3732            M(0,  1),
     3733            M(4, -3),
     3734            M(3, -2),
     3735            M(2, -1),
     3736            M(1,  0)
     3737            in 2-d lattice M
    35953738            sage: cone = Cone([[1,2,3,4],[0,1,0,7],[3,1,0,2],[0,0,1,0]]).dual()
    35963739            sage: cone.Hilbert_basis()           # long time
    3597             (M(10, -7, 0, 1), M(-5, 21, 0, -3), M(0, -2, 0, 1), M(15, -63, 25, 9),
    3598              M(2, -3, 0, 1), M(1, -4, 1, 1), M(-1, 3, 0, 0), M(4, -4, 0, 1),
    3599              M(1, -5, 2, 1), M(3, -5, 1, 1), M(6, -5, 0, 1), M(3, -13, 5, 2),
    3600              M(2, -6, 2, 1), M(5, -6, 1, 1), M(0, 1, 0, 0), M(8, -6, 0, 1),
    3601              M(-2, 8, 0, -1), M(10, -42, 17, 6), M(7, -28, 11, 4), M(5, -21, 9, 3),
    3602              M(6, -21, 8, 3), M(5, -14, 5, 2), M(2, -7, 3, 1), M(4, -7, 2, 1),
    3603              M(7, -7, 1, 1), M(0, 0, 1, 0), M(-3, 14, 0, -2), M(-1, 7, 0, -1),
    3604              M(1, 0, 0, 0))
     3740            M(10,  -7,  0,  1),
     3741            M(-5,  21,  0, -3),
     3742            M( 0,  -2,  0,  1),
     3743            M(15, -63, 25,  9),
     3744            M( 2,  -3,  0,  1),
     3745            M( 1,  -4,  1,  1),
     3746            M(-1,   3,  0,  0),
     3747            M( 4,  -4,  0,  1),
     3748            M( 1,  -5,  2,  1),
     3749            M( 3,  -5,  1,  1),
     3750            M( 6,  -5,  0,  1),
     3751            M( 3, -13,  5,  2),
     3752            M( 2,  -6,  2,  1),
     3753            M( 5,  -6,  1,  1),
     3754            M( 0,   1,  0,  0),
     3755            M( 8,  -6,  0,  1),
     3756            M(-2,   8,  0, -1),
     3757            M(10, -42, 17,  6),
     3758            M( 7, -28, 11,  4),
     3759            M( 5, -21,  9,  3),
     3760            M( 6, -21,  8,  3),
     3761            M( 5, -14,  5,  2),
     3762            M( 2,  -7,  3,  1),
     3763            M( 4,  -7,  2,  1),
     3764            M( 7,  -7,  1,  1),
     3765            M( 0,   0,  1,  0),
     3766            M(-3,  14,  0, -2),
     3767            M(-1,   7,  0, -1),
     3768            M( 1,   0,  0,  0)
     3769            in 4-d lattice M
    36053770
    36063771        Not a strictly convex cone::
    36073772
     
    36093774            sage: wedge.semigroup_generators()
    36103775            (N(1, 0, 0), N(1, 1, 0), N(1, 2, 0), N(0, 0, 1), N(0, 0, -1))
    36113776            sage: wedge.Hilbert_basis()
    3612             (N(1, 2, 0), N(1, 0, 0), N(0, 0, 1), N(0, 0, -1), N(1, 1, 0))
     3777            N(1, 2,  0),
     3778            N(1, 0,  0),
     3779            N(0, 0,  1),
     3780            N(0, 0, -1),
     3781            N(1, 1,  0)
     3782            in 3-d lattice N
    36133783
    36143784        Not full-dimensional cones are ok, too (see
    36153785        http://trac.sagemath.org/sage_trac/ticket/11312)::
    36163786
    36173787            sage: Cone([(1,1,0), (-1,1,0)]).Hilbert_basis()
    3618             (N(1, 1, 0), N(-1, 1, 0), N(0, 1, 0))
     3788            N( 1, 1, 0),
     3789            N(-1, 1, 0),
     3790            N( 0, 1, 0)
     3791            in 3-d lattice N
    36193792
    36203793        ALGORITHM:
    36213794       
     
    36283801            Normaliz.
    36293802            http://www.mathematik.uni-osnabrueck.de/normaliz/
    36303803        """
    3631         if '_Hilbert_basis' in self.__dict__:
    3632             return self._Hilbert_basis
    3633 
    36343804        if self.is_strictly_convex():
    36353805            def not_in_linear_subspace(x): return True
    36363806        else:
     
    36513821                   for y in irreducible+gens):
    36523822                continue
    36533823            irreducible.append(x)
    3654            
    3655         Hilbert_basis = tuple(irreducible)
    3656         self._Hilbert_basis = Hilbert_basis
    3657         return Hilbert_basis
     3824        if len(irreducible) == self.nrays():
     3825            return self.rays()
     3826        else:
     3827            return PointCollection(irreducible, self.lattice())
    36583828
    36593829    def Hilbert_coefficients(self, point):
    36603830        r"""
     
    36833853       
    36843854            sage: cone = Cone([(1,0),(0,1)])
    36853855            sage: cone.rays()
    3686             (N(1, 0), N(0, 1))
     3856            N(1, 0),
     3857            N(0, 1)
     3858            in 2-d lattice N
    36873859            sage: cone.Hilbert_coefficients([3,2])
    36883860            (3, 2)
    36893861
     
    36923864            sage: N = ToricLattice(2)
    36933865            sage: cone = Cone([N(1,0),N(1,2)])
    36943866            sage: cone.Hilbert_basis()
    3695             (N(1, 0), N(1, 2), N(1, 1))
     3867            N(1, 0),
     3868            N(1, 2),
     3869            N(1, 1)
     3870            in 2-d lattice N
    36963871            sage: cone.Hilbert_coefficients( N(1,1) )
    36973872            (0, 0, 1)
    36983873
     
    37013876            sage: N = ToricLattice(3)
    37023877            sage: cone = Cone([N(1,0,0),N(1,2,0),N(0,0,1),N(0,0,-1)])
    37033878            sage: cone.Hilbert_basis()
    3704             (N(1, 2, 0), N(1, 0, 0), N(0, 0, 1), N(0, 0, -1), N(1, 1, 0))
     3879            N(1, 2,  0),
     3880            N(1, 0,  0),
     3881            N(0, 0,  1),
     3882            N(0, 0, -1),
     3883            N(1, 1,  0)
     3884            in 3-d lattice N
    37053885            sage: cone.Hilbert_coefficients( N(1,1,3) )
    37063886            (0, 0, 3, 0, 1)
    37073887        """
    3708         if self.is_strictly_convex():
    3709             def in_linear_subspace(x): return False
    3710         else:
    3711             linear_subspace = self.linear_subspace()
    3712             def in_linear_subspace(x): return x in linear_subspace
    3713            
    37143888        point = self.lattice()(point)
    3715         assert point in self, 'The given point is not in the cone!'
     3889        if point not in self:
     3890            raise ValueError('The given point is not in the cone!')
    37163891        basis = self.Hilbert_basis()
    37173892       
    37183893        from sage.numerical.mip import MixedIntegerLinearProgram
     
    37253900        p.solve()
    37263901
    37273902        return vector(ZZ, p.get_values(x))
    3728 
    3729 
  • sage/geometry/fan.py

    diff --git a/sage/geometry/fan.py b/sage/geometry/fan.py
    a b  
    4747Given such "automatic" fans, you may wonder what are their rays and cones::
    4848
    4949    sage: fan1.rays()
    50     (N(1, 0, 0), N(0, 1, 0), N(0, 0, 1),
    51      N(-1, 0, 0), N(0, -1, 0), N(0, 0, -1))
    52     sage: fan1.ray_matrix()
    53     [ 1  0  0 -1  0  0]
    54     [ 0  1  0  0 -1  0]
    55     [ 0  0  1  0  0 -1]
     50    N( 1,  0,  0),
     51    N( 0,  1,  0),
     52    N( 0,  0,  1),
     53    N(-1,  0,  0),
     54    N( 0, -1,  0),
     55    N( 0,  0, -1)
     56    in 3-d lattice N
    5657    sage: fan1.generating_cones()
    5758    (3-d cone of Rational polyhedral fan in 3-d lattice N,
    5859     3-d cone of Rational polyhedral fan in 3-d lattice N,
     
    6667The last output is not very illuminating. Let's try to improve it::
    6768
    6869    sage: for cone in fan1: print cone.rays()
    69     (N(1, 0, 0), N(0, 1, 0), N(0, 0, -1))
    70     (N(0, 1, 0), N(-1, 0, 0), N(0, 0, -1))
    71     (N(1, 0, 0), N(0, -1, 0), N(0, 0, -1))
    72     (N(-1, 0, 0), N(0, -1, 0), N(0, 0, -1))
    73     (N(1, 0, 0), N(0, 1, 0), N(0, 0, 1))
    74     (N(0, 1, 0), N(0, 0, 1), N(-1, 0, 0))
    75     (N(1, 0, 0), N(0, 0, 1), N(0, -1, 0))
    76     (N(0, 0, 1), N(-1, 0, 0), N(0, -1, 0))
     70    N(1, 0,  0),
     71    N(0, 1,  0),
     72    N(0, 0, -1)
     73    in 3-d lattice N
     74    N( 0, 1,  0),
     75    N(-1, 0,  0),
     76    N( 0, 0, -1)
     77    in 3-d lattice N
     78    N(1,  0,  0),
     79    N(0, -1,  0),
     80    N(0,  0, -1)
     81    in 3-d lattice N
     82    N(-1,  0,  0),
     83    N( 0, -1,  0),
     84    N( 0,  0, -1)
     85    in 3-d lattice N
     86    N(1, 0, 0),
     87    N(0, 1, 0),
     88    N(0, 0, 1)
     89    in 3-d lattice N
     90    N( 0, 1, 0),
     91    N( 0, 0, 1),
     92    N(-1, 0, 0)
     93    in 3-d lattice N
     94    N(1,  0, 0),
     95    N(0,  0, 1),
     96    N(0, -1, 0)
     97    in 3-d lattice N
     98    N( 0,  0, 1),
     99    N(-1,  0, 0),
     100    N( 0, -1, 0)
     101    in 3-d lattice N
    77102
    78103You can also do ::
    79104
     
    132157    sage: cone.rays()
    133158    Traceback (most recent call last):
    134159    ...
    135     AttributeError: 'FinitePoset_with_category.element_class' object has no attribute 'rays'
     160    AttributeError: 'FinitePoset_with_category.element_class' object
     161    has no attribute 'rays'
    136162
    137163To get your hands on the "real" cone, you need to do one more step::
    138164
    139165    sage: cone = cone.element
    140166    sage: cone.rays()
    141     (N(1, 0, 0), N(0, 1, 0))
     167    N(1, 0, 0),
     168    N(0, 1, 0)
     169    in 3-d lattice N
    142170
    143171You can check how "good" a fan is::
    144172
     
    570598
    571599        sage: diamond = lattice_polytope.octahedron(2)
    572600        sage: P1xP1 = FaceFan(diamond)
    573         sage: P1xP1.ray_matrix()
    574         [ 1  0 -1  0]
    575         [ 0  1  0 -1]
     601        sage: P1xP1.rays()
     602        N( 1,  0),
     603        N( 0,  1),
     604        N(-1,  0),
     605        N( 0, -1)
     606        in 2-d lattice N
    576607        sage: for cone in P1xP1: print cone.rays()
    577         (N(1, 0), N(0, -1))
    578         (N(-1, 0), N(0, -1))
    579         (N(1, 0), N(0, 1))
    580         (N(0, 1), N(-1, 0))
     608        N(1,  0),
     609        N(0, -1)
     610        in 2-d lattice N
     611        N(-1,  0),
     612        N( 0, -1)
     613        in 2-d lattice N
     614        N(1, 0),
     615        N(0, 1)
     616        in 2-d lattice N
     617        N( 0, 1),
     618        N(-1, 0)
     619        in 2-d lattice N
    581620    """
    582621    if any(d <= 0 for d in polytope.distances([0]*polytope.dim())):
    583622        raise ValueError("face fans are defined only for polytopes containing"
     
    616655
    617656        sage: square = lattice_polytope.octahedron(2).polar()
    618657        sage: P1xP1 = NormalFan(square)
    619         sage: P1xP1.ray_matrix()
    620         [ 1  0 -1  0]
    621         [ 0  1  0 -1]
     658        sage: P1xP1.rays()
     659        N( 1,  0),
     660        N( 0,  1),
     661        N(-1,  0),
     662        N( 0, -1)
     663        in 2-d lattice N
    622664        sage: for cone in P1xP1: print cone.rays()
    623         (N(1, 0), N(0, -1))
    624         (N(-1, 0), N(0, -1))
    625         (N(1, 0), N(0, 1))
    626         (N(0, 1), N(-1, 0))
     665        N(1,  0),
     666        N(0, -1)
     667        in 2-d lattice N
     668        N(-1,  0),
     669        N( 0, -1)
     670        in 2-d lattice N
     671        N(1, 0),
     672        N(0, 1)
     673        in 2-d lattice N
     674        N( 0, 1),
     675        N(-1, 0)
     676        in 2-d lattice N
    627677    """
    628678    rays = (polytope.facet_normal(i) for i in range(polytope.nfacets()))
    629679    cones = (vertex.facets() for vertex in polytope.faces(dim=0))
     
    834884            sage: f = sage.geometry.fan.RationalPolyhedralFan(
    835885            ...                         [(0,)], [v], None)
    836886            sage: f.rays()
    837             ((0, 1),)
     887            (0, 1)
     888            in Ambient free module of rank 2
     889            over the principal ideal domain Integer Ring
    838890            sage: TestSuite(f).run()
    839891            sage: f = Fan([(0,)], [(0,1)])
    840892            sage: TestSuite(f).run()
     
    9801032            ...           rays=[(1,0), (0,1), (-1, 0)],
    9811033            ...           check=False)
    9821034            sage: for cone in f: print cone.rays()
    983             (N(1, 0), N(0, 1))
    984             (N(0, 1), N(-1, 0))
     1035            N(1, 0),
     1036            N(0, 1)
     1037            in 2-d lattice N
     1038            N( 0, 1),
     1039            N(-1, 0)
     1040            in 2-d lattice N
    9851041         """
    9861042        return iter(self.generating_cones())
    9871043
     
    10181074            sage: cone1 = Cone([(1,0), (0,1)])
    10191075            sage: cone2 = Cone([(-1,0)])
    10201076            sage: fan = Fan([cone1, cone2])
    1021             sage: fan.ray_matrix()
    1022             [ 0  1 -1]
    1023             [ 1  0  0]
     1077            sage: fan.rays()
     1078            N( 0, 1),
     1079            N( 1, 0),
     1080            N(-1, 0)
     1081            in 2-d lattice N
    10241082            sage: for cone in fan: print cone.ambient_ray_indices()
    10251083            (0, 1)
    10261084            (2,)
     
    13991457            sage: # Timing information will depend on your machine
    14001458            sage: new_fan = fan._subdivide_palp(new_rays, True)
    14011459            R:1/1  C:2  T:...(ms)  T/new:...(ms)  T/all:...(ms)
    1402             sage: new_fan.ray_matrix()
    1403             [1 0 1]
    1404             [0 1 1]
     1460            sage: new_fan.rays()
     1461            N(1, 0),
     1462            N(0, 1),
     1463            N(1, 1)
     1464            in 2-d lattice N
    14051465            sage: for cone in new_fan: print cone.ambient_ray_indices()
    14061466            (1, 2)
    14071467            (0, 2)
     
    14701530        # Convert lattice polytopes to cones
    14711531        new_fan_rays = list(self.rays())
    14721532        new_fan_rays.extend(ray for ray in new_rays
    1473                                 if ray not in self.ray_set())
     1533                                if ray not in self.rays().set())
    14741534        cones = tuple(tuple(sorted(new_fan_rays.index(cone_polytope.vertex(v))
    14751535                            for v in range(cone_polytope.nvertices() - 1)))
    14761536                      for cone_polytope in cone_polytopes)
     
    15041564            sage: cone2 = Cone([(1,0), (0,1)])
    15051565            sage: f = Fan([cone1, cone2])
    15061566            sage: f.rays()
    1507             (N(0, 1), N(0, -1), N(1, 0))
     1567            N(0,  1),
     1568            N(0, -1),
     1569            N(1,  0)
     1570            in 2-d lattice N
    15081571            sage: f.cone_containing(0)  # ray index
    15091572            1-d cone of Rational polyhedral fan in 2-d lattice N
    15101573            sage: f.cone_containing(0, 1) # ray indices
     
    15121575            ...
    15131576            ValueError: there is no cone in
    15141577            Rational polyhedral fan in 2-d lattice N
    1515             containing all of the given rays! Rays: (N(0, 1), N(0, -1))
     1578            containing all of the given rays! Ray indices: [0, 1]
    15161579            sage: f.cone_containing(0, 2) # ray indices
    15171580            2-d cone of Rational polyhedral fan in 2-d lattice N
    15181581            sage: f.cone_containing((0,1))  # point
     
    15391602            sage: fan = Fan(cones=[(0,1,2,3), (0,1,4)],
    15401603            ...       rays=[(1,1,1), (1,-1,1), (1,-1,-1), (1,1,-1), (0,0,1)])
    15411604            sage: fan.cone_containing(0).rays()
    1542             (N(1, 1, 1),)
     1605            N(1, 1, 1)
     1606            in 3-d lattice N
    15431607        """
    15441608        if not points:
    15451609            return self.cones(dim=0)[0]
     
    15511615                generating_cones.intersection_update(self._ray_to_cones(ray))
    15521616            if not generating_cones:
    15531617                raise ValueError("there is no cone in %s containing all of "
    1554                         "the given rays! Rays: %s" % (self, self.rays(rays)))
     1618                        "the given rays! Ray indices: %s" % (self, rays))
    15551619            containing_cone = self.generating_cone(generating_cones.pop())
    15561620            for cone in generating_cones:
    15571621                containing_cone = containing_cone.intersection(
     
    16251689            sage: cone1 = Cone([(1,0), (0,1)])
    16261690            sage: cone2 = Cone([(-1,0)])
    16271691            sage: fan = Fan([cone1, cone2])
    1628             sage: fan.ray_matrix()
    1629             [ 0  1 -1]
    1630             [ 1  0  0]
     1692            sage: fan.rays()
     1693            N( 0, 1),
     1694            N( 1, 0),
     1695            N(-1, 0)
     1696            in 2-d lattice N
    16311697            sage: for cone in fan: print cone.ambient_ray_indices()
    16321698            (0, 1)
    16331699            (2,)
     
    19201986            sage: e_ray
    19211987            1-d cone of Rational polyhedral fan in 3-d lattice N
    19221988            sage: e_ray.rays()
    1923             (N(0, -1, 1),)
     1989            N(0, -1, 1)
     1990            in 3-d lattice N
    19241991            sage: e_ray is ray
    19251992            False
    19261993            sage: e_ray.is_equivalent(ray)
     
    19642031        except ValueError:
    19652032            raise ValueError("%s does not belong to %s!" % (cone, self))
    19662033        return result
    1967            
     2034
     2035    @cached_method
    19682036    def Gale_transform(self):
    19692037        r"""
    19702038        Return the Gale transform of ``self``.
     
    19822050            sage: _.base_ring()
    19832051            Integer Ring
    19842052        """
    1985         if "_Gale_transform" not in self.__dict__:
    1986             m = self.ray_matrix().augment(matrix(self.lattice_dim(), 1))
    1987             m = m.stack(matrix([1]*m.ncols()))
    1988             self._Gale_transform = matrix(ZZ, m.transpose().integer_kernel().matrix())
    1989         return self._Gale_transform
     2053        m = self.rays().matrix().stack(matrix(ZZ, 1, self.lattice_dim()))
     2054        m = m.augment(matrix(ZZ, m.nrows(), 1, [1]*m.nrows()))
     2055        return matrix(ZZ, m.integer_kernel().matrix())
    19902056
    19912057    def generating_cone(self, n):
    19922058        r"""
     
    21242190        if (self.lattice() != other.lattice()
    21252191            or self.dim() != other.dim()
    21262192            or self.ngenerating_cones() != other.ngenerating_cones()
    2127             or self.ray_set() != other.ray_set()):
     2193            or self.rays().set() != other.rays().set()):
    21282194            return False
    21292195        # Now we need to really compare cones, which can take a while
    21302196        return sorted(sorted(cone.rays()) for cone in self) \
     
    22572323            sage: fan.is_smooth(codim=1)
    22582324            True
    22592325            sage: fan.generating_cone(0).rays()
    2260             (N(-1, 1), N(-1, -1))
    2261             sage: fan.generating_cone(0).ray_matrix().det()
     2326            N(-1,  1),
     2327            N(-1, -1)
     2328            in 2-d lattice N
     2329            sage: fan.generating_cone(0).rays().matrix().det()
    22622330            2
    22632331        """
    22642332        if codim is None or codim < 0:
     
    24072475        else:
    24082476            rays = []
    24092477        rays.extend(ray for ray in normalize_rays(new_rays, self.lattice())
    2410                         if ray not in self.ray_set())
     2478                        if ray not in self.rays().set())
    24112479        if not rays:
    24122480            return self # Nothing has to be done
    24132481        if self.lattice().zero() in rays:
     
    25972665            + 3-d cone of Rational polyhedral fan in 3-d lattice N
    25982666            - 3-d cone of Rational polyhedral fan in 3-d lattice N
    25992667            + 3-d cone of Rational polyhedral fan in 3-d lattice N
    2600             sage: [ matrix(cone.ray_basis()).det() for cone in fan.generating_cones() ]
     2668            sage: [cone.rays().basis().matrix().det()
     2669            ...    for cone in fan.generating_cones()]
    26012670            [-1, 1, -1, 1]
    26022671
    26032672        A non-full dimensional fan::
     
    26402709                outward_v = [ Q.lift(q) for q in Q.gens() ]
    26412710               
    26422711            outward_vectors[c] = outward_v
    2643             orientation = sign(matrix(outward_v + list(c.ray_basis())).det())
     2712            orientation = sign(matrix(outward_v + list(c.rays().basis())).det())
    26442713            generating_cones.append(tuple([orientation, c]))
    26452714        boundaries = {self:FormalSum(generating_cones)}
    26462715
     
    26502719        for d in range(dim, -1, -1):
    26512720            for c in self(d):
    26522721                c_boundary = []
    2653                 c_matrix = matrix(outward_vectors[c] + list(c.ray_basis()))
     2722                c_matrix = matrix(outward_vectors[c] + list(c.rays().basis()))
    26542723                c_matrix_inv = c_matrix.inverse()
    26552724                for facet in c.facets():
    26562725                    outward_ray_indices = set(c.ambient_ray_indices()) \
    26572726                              .difference(set(facet.ambient_ray_indices()))
    26582727                    outward_vector = - sum(self.ray(i) for i in outward_ray_indices)
    26592728                    outward_vectors[facet] = [outward_vector] + outward_vectors[c]
    2660                     facet_matrix = matrix(outward_vectors[facet] + list(facet.ray_basis()))
     2729                    facet_matrix = matrix(outward_vectors[facet] + list(facet.rays().basis()))
    26612730                    orientation = sign((c_matrix_inv * facet_matrix).det())
    26622731                    c_boundary.append(tuple([orientation, facet]))
    26632732                boundaries[c] = FormalSum(c_boundary)
  • sage/geometry/fan_morphism.py

    diff --git a/sage/geometry/fan_morphism.py b/sage/geometry/fan_morphism.py
    a b  
    4646    [0 0]
    4747    Domain fan: Rational polyhedral fan in 2-d lattice N
    4848    Codomain fan: Rational polyhedral fan in 2-d lattice N   
    49     sage: fm.domain_fan().ray_matrix()
    50     [-1  1 -1  1  0  0]
    51     [ 1  1 -1 -1 -1  1]   
    52     sage: normal.ray_matrix()
    53     [-1  1 -1  1]
    54     [ 1  1 -1 -1]
     49    sage: fm.domain_fan().rays()
     50    N(-1,  1),
     51    N( 1,  1),
     52    N(-1, -1),
     53    N( 1, -1),
     54    N( 0, -1),
     55    N( 0,  1)
     56    in 2-d lattice N
     57    sage: normal.rays()
     58    N(-1,  1),
     59    N( 1,  1),
     60    N(-1, -1),
     61    N( 1, -1)
     62    in 2-d lattice N
    5563   
    5664As you see, it was necessary to insert two new rays (to prevent "upper" and
    5765"lower" cones of the normal fan from being mapped to the whole `x`-axis).
     
    177185        sage: fm = FanMorphism(phi, face)
    178186        sage: fm.codomain_fan()
    179187        Rational polyhedral fan in 2-d lattice N
    180         sage: fm.codomain_fan().ray_matrix()
    181         [ 1 -1]
    182         [ 0  0]
     188        sage: fm.codomain_fan().rays()
     189        N( 1, 0),
     190        N(-1, 0)
     191        in 2-d lattice N
    183192       
    184193    Now we demonstrate a more subtle example. We take the first quadrant as our
    185194    domain fan. Then we divide the first quadrant into three cones, throw away
     
    399408            ValueError: codomain (fan) must be given explicitly
    400409            if morphism is given by a matrix!
    401410            sage: fm = FanMorphism(identity_matrix(2), quadrant_bl, ZZ^2)
    402             sage: fm.codomain_fan().ray_matrix()  # indirect doctest
    403             [1 0 1]
    404             [0 1 1]
     411            sage: fm.codomain_fan().rays()  # indirect doctest
     412            (1, 0),
     413            (0, 1),
     414            (1, 1)
     415            in Ambient free module of rank 2
     416            over the principal ideal domain Integer Ring
    405417        """
    406418        # We literally try to construct the image fan and hope that it works.
    407419        # If it does not, the fan constructor will raise an exception.
     
    547559            is not contained in a single cone of the codomain fan!
    548560            sage: fm = FanMorphism(identity_matrix(2), quadrant,
    549561            ...                    quadrant_bl, subdivide=True)
    550             sage: fm.domain_fan().ray_matrix()  # indirect doctest
    551             [1 0 1]
    552             [0 1 1]
     562            sage: fm.domain_fan().rays()  # indirect doctest
     563            N(1, 0),
     564            N(0, 1),
     565            N(1, 1)
     566            in 2-d lattice N
    553567
    554568        Now we demonstrate a more subtle example. We take the first quadrant
    555569        as our ``domain_fan``. Then we divide the first quadrant into three
     
    585599            sage: Sigma_prime = FaceFan(lattice_polytope.octahedron(3))
    586600            sage: fm = FanMorphism(identity_matrix(3),
    587601            ...                    Sigma, Sigma_prime, subdivide=True)
    588             sage: fm.domain_fan().ray_matrix()
    589             [ 1  1  1]
    590             [ 1 -1  0]
    591             [ 0  0  0]
     602            sage: fm.domain_fan().rays()
     603            N(1,  1, 0),
     604            N(1, -1, 0),
     605            N(1,  0, 0)
     606            in 3-d lattice N
    592607            sage: [cone.ambient_ray_indices() for cone in fm.domain_fan()]
    593608            [(0, 2), (1, 2)]
    594609           
     
    748763            sage: F1 = Fan(cones=[(0,1,2), (1,2,3)],
    749764            ...            rays=[(1,1,1), (1,1,-1), (1,-1,1), (1,-1,-1)],
    750765            ...            lattice=N3)
    751             sage: F1.ray_matrix()
    752             [ 1  1  1  1]
    753             [ 1  1 -1 -1]
    754             [ 1 -1  1 -1]
     766            sage: F1.rays()
     767            N3(1,  1,  1),
     768            N3(1,  1, -1),
     769            N3(1, -1,  1),
     770            N3(1, -1, -1)
     771            in 3-d lattice N3
    755772            sage: [phi(ray) for ray in F1.rays()]
    756773            [N2(2, 1), N2(0, 1), N2(2, -1), N2(0, -1)]
    757774            sage: F2 = Fan(cones=[(0,1,2), (1,2,3)],
    758775            ...            rays=[(1,1,1), (1,1,-1), (1,2,1), (1,2,-1)],
    759776            ...            lattice=N3)
    760             sage: F2.ray_matrix()
    761             [ 1  1  1  1]
    762             [ 1  1  2  2]
    763             [ 1 -1  1 -1]
     777            sage: F2.rays()
     778            N3(1, 1,  1),
     779            N3(1, 1, -1),
     780            N3(1, 2,  1),
     781            N3(1, 2, -1)
     782            in 3-d lattice N3
    764783            sage: [phi(ray) for ray in F2.rays()]
    765784            [N2(2, 1), N2(0, 1), N2(2, 2), N2(0, 2)]
    766785            sage: F3 = Fan(cones=[(0,1), (1,2)],
     
    13041323            sage: fm = FanMorphism(matrix(2, 1, [1,-1]), fan, ToricLattice(1))
    13051324            sage: fm.kernel_fan()
    13061325            Rational polyhedral fan in Sublattice <N(1, 1)>
    1307             sage: _.ray_matrix()
    1308             [1]
    1309             [1]
     1326            sage: _.rays()
     1327            N(1, 1)
     1328            in Sublattice <N(1, 1)>
    13101329            sage: fm.kernel_fan().cones()
    13111330            ((0-d cone of Rational polyhedral fan in Sublattice <N(1, 1)>,),
    13121331             (1-d cone of Rational polyhedral fan in Sublattice <N(1, 1)>,))
     
    14661485        Consider a projection of a del Pezzo surface onto the projective line::
    14671486       
    14681487            sage: Sigma = toric_varieties.dP6().fan()
    1469             sage: Sigma.ray_matrix()
    1470             [ 0 -1 -1  0  1  1]
    1471             [ 1  0 -1 -1  0  1]
     1488            sage: Sigma.rays()
     1489            N( 0,  1),
     1490            N(-1,  0),
     1491            N(-1, -1),
     1492            N( 0, -1),
     1493            N( 1,  0),
     1494            N( 1,  1)
     1495            in 2-d lattice N
    14721496            sage: Sigma_p = toric_varieties.P1().fan()
    14731497            sage: phi = FanMorphism(matrix([[1], [-1]]), Sigma, Sigma_p)
    14741498           
     
    15571581       
    15581582            sage: psi.codomain().gens()
    15591583            (N(1, 1),)
    1560             sage: psi.codomain_fan().ray_matrix()
    1561             [ 1 -1]
    1562             [ 1 -1]
     1584            sage: psi.codomain_fan().rays()
     1585            N( 1,  1),
     1586            N(-1, -1)
     1587            in Sublattice <N(1, 1)>
    15631588           
    15641589        Restriction to image returns exactly the same map if the corresponding
    15651590        map of vector spaces is surjective, e.g. in the case of double
  • sage/geometry/point_collection.pyx

    diff --git a/sage/geometry/point_collection.pyx b/sage/geometry/point_collection.pyx
    a b  
    99
    1010- Andrey Novoseltsev (2011-04-25): initial version, based on cone module.
    1111
     12- Andrey Novoseltsev (2012-03-06): additions and doctest changes while
     13  switching cones to use point collections.
     14
    1215EXAMPLES:
    1316
    1417The idea behind :class:`point collections <PointCollection>` is to have a
     
    1619
    1720* behaves like a tuple *without significant performance penalty*::
    1821
    19     sage: from sage.geometry.point_collection import PointCollection
    20     sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    21     sage: c = PointCollection(c.rays(), c.lattice())
     22    sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    2223    sage: c[1]
    2324    N(1, 0, 1)
    2425    sage: for point in c: point
     
    2728    N(0, 1, 1)
    2829    N(1, 1, 1)
    2930   
    30 * prints like a matrix with points represented by columns and with some
    31   indication of the ambient space::
     31* prints in a convenient way and with clear indication of the ambient space::
    3232
    3333    sage: c
    34     [0 1 0 1]
    35     [0 0 1 1]
    36     [1 1 1 1]
     34    N(0, 0, 1),
     35    N(1, 0, 1),
     36    N(0, 1, 1),
     37    N(1, 1, 1)
    3738    in 3-d lattice N
    3839   
    3940* allows (cached) access to alternative representations::
     
    4445* allows introduction of additional methods::
    4546
    4647    sage: c.basis()
    47     [0 1 0]
    48     [0 0 1]
    49     [1 1 1]
     48    N(0, 0, 1),
     49    N(1, 0, 1),
     50    N(0, 1, 1)
    5051    in 3-d lattice N
    5152   
    5253Examples of natural point collections include ray and line generators of cones,
     
    6768"""
    6869
    6970#*****************************************************************************
    70 #       Copyright (C) 2011 Andrey Novoseltsev <novoselt@gmail.com>
     71#       Copyright (C) 2012 Andrey Novoseltsev <novoselt@gmail.com>
    7172#
    7273#  Distributed under the terms of the GNU General Public License (GPL)
    7374#  as published by the Free Software Foundation; either version 2 of
     
    7778
    7879from sage.structure.sage_object cimport SageObject
    7980
    80 from sage.matrix.all import column_matrix
     81from sage.matrix.all import matrix
    8182from sage.misc.all import latex
    8283
    8384
     
    9899        sage: from sage.geometry.point_collection import is_PointCollection
    99100        sage: is_PointCollection(1)
    100101        False
    101         sage: from sage.geometry.point_collection import PointCollection
    102102        sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    103         sage: is_PointCollection(c.rays()) # TODO: make it True
    104         False
    105         sage: c = PointCollection(c.rays(), c.lattice())
    106         sage: is_PointCollection(c)
     103        sage: is_PointCollection(c.rays())
    107104        True
    108105    """
    109106    return isinstance(x, PointCollection)
    110107
    111108
     109_output_format = "default"
     110
     111
    112112cdef class PointCollection(SageObject):
    113113    r"""
    114114    Create a point collection.
     
    184184
    185185        TESTS::
    186186
    187             sage: from sage.geometry.point_collection import PointCollection
    188             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    189             sage: c = PointCollection(c.rays(), c.lattice())
     187            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    190188            sage: c()
    191             []
     189            Empty collection
    192190            in 3-d lattice N
    193191            sage: c(2,1)
    194             [0 1]
    195             [1 0]
    196             [1 1]
     192            N(0, 1, 1),
     193            N(1, 0, 1)
    197194            in 3-d lattice N
    198195            sage: c(range(4)) == c
    199196            True
     
    226223
    227224        TESTS::
    228225
    229             sage: from sage.geometry.point_collection import PointCollection
    230             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    231             sage: c = PointCollection(c.rays(), c.lattice())
     226            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    232227            sage: cmp(c, c)
    233228            0
    234229            sage: cmp(c, 1) * cmp(1, c)
     
    257252
    258253        EXAMPLES::
    259254
    260             sage: from sage.geometry.point_collection import PointCollection
    261             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    262             sage: c = PointCollection(c.rays(), c.lattice())
     255            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    263256            sage: c[0]
    264257            N(0, 0, 1)
    265258        """
     
    275268
    276269        TESTS::
    277270
    278             sage: from sage.geometry.point_collection import PointCollection
    279             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    280             sage: c = PointCollection(c.rays(), c.lattice())
     271            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    281272            sage: hash(c) == hash(c)
    282273            True
    283274        """
     
    293284
    294285        TESTS::
    295286
    296             sage: from sage.geometry.point_collection import PointCollection
    297             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    298             sage: c = PointCollection(c.rays(), c.lattice())
     287            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    299288            sage: for point in c: print point
    300289            N(0, 0, 1)
    301290            N(1, 0, 1)
     
    314303
    315304        EXAMPLES::
    316305
    317             sage: from sage.geometry.point_collection import PointCollection
    318             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    319             sage: c = PointCollection(c.rays(), c.lattice())
     306            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    320307            sage: len(c)
    321308            4
    322309        """
    323310        return len(self._points)
    324311   
     312    def __list__(self):
     313        r"""
     314        Return a list of points of ``self``.
     315
     316        OUTPUT:
     317
     318        - a list.
     319
     320        TESTS::
     321
     322            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     323            sage: list(c)
     324            [N(0, 0, 1), N(1, 0, 1), N(0, 1, 1), N(1, 1, 1)]
     325        """
     326        return list(self._points)
     327
    325328    def __reduce__(self):
    326329        r"""
    327330        Prepare ``self`` for pickling.
     
    333336
    334337        TESTS::
    335338
    336             sage: from sage.geometry.point_collection import PointCollection
    337             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    338             sage: c = PointCollection(c.rays(), c.lattice())
     339            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    339340            sage: loads(dumps(c))
    340             [0 1 0 1]
    341             [0 0 1 1]
    342             [1 1 1 1]
     341            N(0, 0, 1),
     342            N(1, 0, 1),
     343            N(0, 1, 1),
     344            N(1, 1, 1)
    343345            in 3-d lattice N
    344346            sage: loads(dumps(c)) == c
    345347            True
    346348        """
    347349        return (PointCollection, (self._points, self._module))
    348350
     351    def __tuple__(self):
     352        r"""
     353        Return the tuple of points of ``self``.
     354
     355        OUTPUT:
     356
     357        - a tuple.
     358
     359        TESTS::
     360
     361            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     362            sage: tuple(c)
     363            (N(0, 0, 1), N(1, 0, 1), N(0, 1, 1), N(1, 1, 1))
     364        """
     365        return self._points
     366
    349367    def _latex_(self):
    350368        r"""
    351369        Return a LaTeX representation of ``self``.
     
    356374
    357375        TESTS::
    358376
    359             sage: from sage.geometry.point_collection import PointCollection
    360             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    361             sage: c = PointCollection(c.rays(), c.lattice())
     377            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    362378            sage: print c._latex_()
    363             \left(\begin{array}{rrrr}
    364             0 & 1 & 0 & 1 \\
    365             0 & 0 & 1 & 1 \\
    366             1 & 1 & 1 & 1
    367             \end{array}\right)_{N}
     379            \left(\left(0,\,0,\,1\right)_{N}, \left(1,\,0,\,1\right)_{N},
     380            \left(0,\,1,\,1\right)_{N}, \left(1,\,1,\,1\right)_{N}\right)_{N}
    368381        """
    369         return r"%s_{%s}" % (latex(self.matrix()), latex(self.module()))
     382        global _output_format
     383        if _output_format in ["default", "tuple"]:
     384            r = latex(tuple(self))
     385        elif _output_format == "matrix":
     386            r = latex(self.matrix())
     387        elif _output_format == "column matrix":
     388            r = latex(self.column_matrix())
     389        elif _output_format == "separated column matrix":
     390            r = latex(self.column_matrix())
     391            r = r.replace("r" * len(self), "|".join("r" * len(self)))
     392        return r"%s_{%s}" % (r, latex(self.module()))
     393
     394    def _matrix_(self, ring=None):
     395        r"""
     396        Return a matrix whose rows are points of ``self``.
     397       
     398        INPUT:
     399       
     400        - ``ring`` -- a base ring for the returned matrix (default: base ring of
     401          :meth:`module` of ``self``).
     402
     403        OUTPUT:
     404
     405        - a :class:`matrix <Matrix>`.
     406
     407        EXAMPLES::
     408
     409            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     410            sage: matrix(c)
     411            [0 0 1]
     412            [1 0 1]
     413            [0 1 1]
     414            [1 1 1]
     415        """
     416        if ring is None:
     417            return self.matrix()
     418        else:
     419            return self.matrix().change_ring(ring)
    370420
    371421    def _repr_(self):
    372422        r"""
     
    378428
    379429        TESTS::
    380430
    381             sage: from sage.geometry.point_collection import PointCollection
    382             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    383             sage: c = PointCollection(c.rays(), c.lattice())
     431            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    384432            sage: print c._repr_()
    385             [0 1 0 1]
    386             [0 0 1 1]
    387             [1 1 1 1]
     433            N(0, 0, 1),
     434            N(1, 0, 1),
     435            N(0, 1, 1),
     436            N(1, 1, 1)
    388437            in 3-d lattice N
    389438        """
    390         return "%s\nin %s" % (self.matrix(), self.module())
     439        global _output_format
     440        if _output_format == "default":
     441            r = map(repr, self)
     442            r = [point.split(",") for point in r]
     443            if not r:
     444                r = "Empty collection"
     445            else:
     446                if "(" in r[0][0]:
     447                    delimiter = "("
     448                elif "[" in r[0][0]:
     449                    delimiter = "["
     450                else:
     451                    raise ValueError("cannot parse point representation!")
     452                heads = []
     453                for point in r:
     454                    head, point[0] = point[0].rsplit(delimiter, 1)
     455                    heads.append(head + delimiter)
     456                format = "{{:<{}}}".format(max(map(len, heads)))
     457                widths = [0] * len(r[0])
     458                for point in r:
     459                    for i, coordinate in enumerate(point):
     460                        widths[i] = max(widths[i], len(coordinate))
     461                format += ",".join("{{:>{}}}".format(width) for width in widths)
     462                r = ",\n".join([format.format(head, *point)
     463                                for head, point in zip(heads, r)])
     464        elif _output_format == "tuple":
     465            r = tuple(self)
     466        elif _output_format == "matrix":
     467            r = self.matrix()
     468        else:
     469            r = self.column_matrix()
     470        return "{}\nin {}".format(r, self.module())
    391471
    392472    def basis(self):
    393473        r"""
     
    401481
    402482        EXAMPLES::
    403483
    404             sage: from sage.geometry.point_collection import PointCollection
    405             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    406             sage: c = PointCollection(c.rays(), c.lattice())
     484            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    407485            sage: c.basis()
    408             [0 1 0]
    409             [0 0 1]
    410             [1 1 1]
     486            N(0, 0, 1),
     487            N(1, 0, 1),
     488            N(0, 1, 1)
    411489            in 3-d lattice N
    412490   
    413491        Calling this method twice will always return *exactly the same* point
     
    417495            True
    418496        """
    419497        if self._basis is None:
    420             self._basis = self(self.matrix().pivots())
     498            self._basis = self(self.matrix().pivot_rows())
    421499        return self._basis
    422500           
    423501    def cardinality(self):
     
    430508
    431509        EXAMPLES::
    432510
    433             sage: from sage.geometry.point_collection import PointCollection
    434             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    435             sage: c = PointCollection(c.rays(), c.lattice())
     511            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    436512            sage: c.cardinality()
    437513            4
    438514        """
     
    456532       
    457533        EXAMPLES::
    458534
    459             sage: from sage.geometry.point_collection import PointCollection
    460             sage: c = Cone([(0,0,1), (1,1,1)])
    461             sage: c = PointCollection(c.rays(), c.lattice())
     535            sage: c = Cone([(0,0,1), (1,1,1)]).rays()
    462536            sage: c.cartesian_product(c)
    463             [0 1 0 1]
    464             [0 1 0 1]
    465             [1 1 1 1]
    466             [0 0 1 1]
    467             [0 0 1 1]
    468             [1 1 1 1]
     537            N+N(0, 0, 1, 0, 0, 1),
     538            N+N(1, 1, 1, 0, 0, 1),
     539            N+N(0, 0, 1, 1, 1, 1),
     540            N+N(1, 1, 1, 1, 1, 1)
    469541            in 6-d lattice N+N
    470542        """
    471543        assert is_PointCollection(other)
     
    478550            pq.set_immutable()
    479551        return PointCollection(PQ, module)
    480552
     553    def column_matrix(self):
     554        r"""
     555        Return a matrix whose columns are points of ``self``.
     556
     557        OUTPUT:
     558
     559        - a :class:`matrix <Matrix>`.
     560
     561        EXAMPLES::
     562
     563            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     564            sage: c.column_matrix()
     565            [0 1 0 1]
     566            [0 0 1 1]
     567            [1 1 1 1]
     568        """
     569        return self.matrix().transpose()
     570
    481571    def dimension(self):
    482572        r"""
    483573        Return the dimension of the space spanned by points of ``self``.
     
    490580
    491581        EXAMPLES::
    492582
    493             sage: from sage.geometry.point_collection import PointCollection
    494             sage: c = Cone([(0,0,1), (1,1,1)])
    495             sage: c = PointCollection(c.rays(), c.lattice())
     583            sage: c = Cone([(0,0,1), (1,1,1)]).rays()
    496584            sage: c.dimension()
    497585            2
    498586            sage: c.dim()
     
    515603
    516604        EXAMPLES::
    517605
    518             sage: from sage.geometry.point_collection import PointCollection
    519             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    520             sage: c = PointCollection(c.rays(), c.lattice())
     606            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    521607            sage: c.dual_module()
    522608            3-d lattice M
    523609        """
     
    528614            # TODO: add support for torsion modules as well?
    529615            return M.base_ring() ** M.dimension()
    530616   
     617    def index(self, *args):
     618        r"""
     619        Return the index of the first occurrence of ``point`` in ``self``.
     620
     621        INPUT:
     622
     623        - ``point`` -- a point of ``self``;
     624       
     625        - ``start`` -- (optional) an integer, if given, the search will start
     626          at this position;
     627
     628        - ``stop`` -- (optional) an integer, if given, the search will stop
     629          at this position.
     630         
     631        OUTPUT:
     632
     633        - an integer if ``point`` is in ``self[start:stop]``, otherwise a
     634          ``ValueError`` exception is raised.
     635
     636        EXAMPLES::
     637
     638            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     639            sage: c.index((0,1,1))
     640            Traceback (most recent call last):
     641            ...
     642            ValueError: tuple.index(x): x not in tuple
     643           
     644        Note that this was not a mistake: the *tuple* ``(0,1,1)`` is *not* a
     645        point of ``c``! We need to pass actual element of the ambient module of
     646        ``c`` to get their indices::
     647       
     648            sage: N = c.module()
     649            sage: c.index(N(0,1,1))
     650            2
     651            sage: c[2]
     652            N(0, 1, 1)
     653        """
     654        return self._points.index(*args)
     655
    531656    def matrix(self):
    532657        r"""
    533         Return a matrix whose columns are points of ``self``.
     658        Return a matrix whose rows are points of ``self``.
    534659
    535660        OUTPUT:
    536661
     
    538663
    539664        EXAMPLES::
    540665
    541             sage: from sage.geometry.point_collection import PointCollection
    542             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    543             sage: c = PointCollection(c.rays(), c.lattice())
     666            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    544667            sage: c.matrix()
    545             [0 1 0 1]
    546             [0 0 1 1]
    547             [1 1 1 1]
     668            [0 0 1]
     669            [1 0 1]
     670            [0 1 1]
     671            [1 1 1]
    548672        """
    549673        if self._matrix is None:
    550             M = column_matrix(self._module.base_ring(), len(self._points),
    551                               self._module.degree(), self._points)
     674            M = matrix(self._module.base_ring(), len(self._points),
     675                       self._module.degree(), self._points)
    552676            M.set_immutable()
    553677            self._matrix = M
    554678        return self._matrix
     
    563687
    564688        EXAMPLES::
    565689
    566             sage: from sage.geometry.point_collection import PointCollection
    567             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    568             sage: c = PointCollection(c.rays(), c.lattice())
     690            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    569691            sage: c.module()
    570692            3-d lattice N
    571693        """
    572         return self._module
     694        return self._module       
     695       
     696    @classmethod    # @staticmethod does not work in Cython so far
     697    def output_format(cls, format=None):
     698        r"""
     699        Return or set the output format for **ALL** point collections.
     700       
     701        INPUT:
     702       
     703        - ``format`` -- (optional) if given, must be one of the strings
     704            * "default" -- output one point per line with vertical alignment of
     705              coordinates in text mode, same as "tuple" for LaTeX;
     706            * "tuple" -- output ``tuple(self)`` with lattice information;
     707            * "matrix" -- output :meth:`matrix` with lattice information;
     708            * "column matrix" -- output :meth:`column_matrix` with lattice
     709              information;
     710            * "separated column matrix" -- same as "column matrix" for text
     711              mode, for LaTeX separate columns by lines (not shown by jsMath).
     712           
     713        OUTPUT:
     714       
     715        - a string with the current format (only if ``format`` was omitted).
     716       
     717        This function affects both regular and LaTeX output.
     718       
     719        EXAMPLES::
     720       
     721            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
     722            sage: c
     723            N(0, 0, 1),
     724            N(1, 0, 1),
     725            N(0, 1, 1),
     726            N(1, 1, 1)
     727            in 3-d lattice N
     728            sage: c.output_format()
     729            'default'
     730            sage: c.output_format("tuple")
     731            sage: c
     732            (N(0, 0, 1), N(1, 0, 1), N(0, 1, 1), N(1, 1, 1))
     733            in 3-d lattice N
     734            sage: c.output_format("matrix")
     735            sage: c
     736            [0 0 1]
     737            [1 0 1]
     738            [0 1 1]
     739            [1 1 1]
     740            in 3-d lattice N
     741            sage: c.output_format("column matrix")
     742            sage: c
     743            [0 1 0 1]
     744            [0 0 1 1]
     745            [1 1 1 1]
     746            in 3-d lattice N
     747            sage: c.output_format("separated column matrix")
     748            sage: c
     749            [0 1 0 1]
     750            [0 0 1 1]
     751            [1 1 1 1]
     752            in 3-d lattice N
     753           
     754        Note that the last two outpus are identical, separators are only
     755        inserted in the LaTeX mode::
     756       
     757            sage: latex(c)
     758            \left(\begin{array}{r|r|r|r}
     759            0 & 1 & 0 & 1 \\
     760            0 & 0 & 1 & 1 \\
     761            1 & 1 & 1 & 1
     762            \end{array}\right)_{N}
     763           
     764        Since this is a static method, you can call it for the class directly::
     765       
     766            sage: from sage.geometry.point_collection import PointCollection
     767            sage: PointCollection.output_format("default")
     768            sage: c
     769            N(0, 0, 1),
     770            N(1, 0, 1),
     771            N(0, 1, 1),
     772            N(1, 1, 1)
     773            in 3-d lattice N
     774        """
     775        global _output_format
     776        if format is None:
     777            return _output_format
     778        assert format in ["default", "tuple", "matrix", "column matrix",
     779                          "separated column matrix"]
     780        _output_format = format
    573781
    574782    def set(self):
    575783        r"""
     
    581789
    582790        EXAMPLES::
    583791
    584             sage: from sage.geometry.point_collection import PointCollection
    585             sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)])
    586             sage: c = PointCollection(c.rays(), c.lattice())
     792            sage: c = Cone([(0,0,1), (1,0,1), (0,1,1), (1,1,1)]).rays()
    587793            sage: c.set()
    588794            frozenset([N(0, 1, 1), N(1, 1, 1), N(0, 0, 1), N(1, 0, 1)])
    589795        """
  • sage/geometry/triangulation/element.py

    diff --git a/sage/geometry/triangulation/element.py b/sage/geometry/triangulation/element.py
    a b  
    559559            sage: fan
    560560            Rational polyhedral fan in 3-d lattice N
    561561            sage: fan.rays()
    562             (N(1, 1, 0), N(1, 3, 1), N(1, 2, 3), N(1, 0, 2),
    563              N(1, 1, 1), N(1, 1, 2), N(1, 2, 1), N(1, 2, 2))
     562            N(1, 1, 0),
     563            N(1, 3, 1),
     564            N(1, 2, 3),
     565            N(1, 0, 2),
     566            N(1, 1, 1),
     567            N(1, 1, 2),
     568            N(1, 2, 1),
     569            N(1, 2, 2)
     570            in 3-d lattice N
    564571        """
    565572        from sage.geometry.fan import Fan
    566573        if origin is None:
     
    727734            sage: N = triangulation.normal_cone();  N
    728735            4-d cone in 4-d lattice
    729736            sage: N.rays()
    730             ((-1, 0, 0, 0), (1, 0, 1, 0), (-1, 0, -1, 0), (1, 0, 0, -1),
    731              (-1, 0, 0, 1), (1, 1, 0, 0), (-1, -1, 0, 0))
     737            (-1,  0,  0,  0),
     738            ( 1,  0,  1,  0),
     739            (-1,  0, -1,  0),
     740            ( 1,  0,  0, -1),
     741            (-1,  0,  0,  1),
     742            ( 1,  1,  0,  0),
     743            (-1, -1,  0,  0)
     744            in Ambient free module of rank 4
     745            over the principal ideal domain Integer Ring
    732746            sage: N.dual().rays()
    733             ((-1, 1, 1, -1),)
     747            (-1, 1, 1, -1)
     748            in Ambient free module of rank 4
     749            over the principal ideal domain Integer Ring
    734750
    735751        TESTS::
    736752       
  • sage/schemes/generic/algebraic_scheme.py

    diff --git a/sage/schemes/generic/algebraic_scheme.py b/sage/schemes/generic/algebraic_scheme.py
    a b  
    22922292        polynomials = [ p.subs(inhomogenize) for p in self.defining_polynomials() ]
    22932293
    22942294        # map the monomial x^{D_m} to m, see reference.
    2295         n_rho_matrix = cone.ray_matrix()
     2295        n_rho_matrix = cone.rays().matrix()
    22962296        def pullback_polynomial(p):
    22972297            result = R.zero()
    22982298            for coefficient, monomial in p:
    22992299                exponent = monomial.exponents()[0]
    23002300                exponent = [ exponent[i] for i in cone.ambient_ray_indices() ]
    23012301                exponent = vector(ZZ,exponent)
    2302                 m = n_rho_matrix.solve_left(exponent)
     2302                m = n_rho_matrix.solve_right(exponent)
    23032303                assert all(x in ZZ for x in m), \
    23042304                    'The polynomial '+str(p)+' does not define a ZZ-divisor!'
    23052305                m_coeffs = dualcone.Hilbert_coefficients(m)
  • sage/schemes/toric/divisor.py

    diff --git a/sage/schemes/toric/divisor.py b/sage/schemes/toric/divisor.py
    a b  
    105105    sage: Kc = dP6.Kaehler_cone(); Kc
    106106    4-d cone in 4-d lattice
    107107    sage: Kc.rays()
    108     (Divisor class [0, 1, 1, 0],
    109      Divisor class [0, 0, 1, 1],
    110      Divisor class [1, 1, 0, 0],
    111      Divisor class [1, 1, 1, 0],
    112      Divisor class [0, 1, 1, 1])
     108    Divisor class [0, 1, 1, 0],
     109    Divisor class [0, 0, 1, 1],
     110    Divisor class [1, 1, 0, 0],
     111    Divisor class [1, 1, 1, 0],
     112    Divisor class [0, 1, 1, 1]
     113    in Basis lattice of The toric rational divisor class group
     114    of a 2-d CPR-Fano toric variety covered by 6 affine patches
    113115    sage: Kc.ray(1).lift()
    114116    V(y) + V(v)
    115117
     
    830832
    831833        assert cone.ambient() is fan
    832834        b = vector(self.coefficient(i) for i in cone.ambient_ray_indices())
    833         A = cone.ray_matrix()
     835        A = cone.rays().column_matrix()
    834836        try:
    835837            if cone.dim() == X.dimension():
    836838                # either unique solution or ValueError (if not QQ-Cartier)
     
    11831185            sage: X.rational_class_group().dimension()
    11841186            4
    11851187            sage: X.Kaehler_cone().rays()
    1186             (Divisor class [1, 0, 0, 0],)
     1188            Divisor class [1, 0, 0, 0]
     1189            in Basis lattice of The toric rational divisor class group
     1190            of a 3-d toric variety covered by 7 affine patches
    11871191            sage: antiK = -X.K()
    11881192            sage: antiK.divisor_class()
    11891193            Divisor class [2, 0, 0, 0]
  • sage/schemes/toric/fano_variety.py

    diff --git a/sage/schemes/toric/fano_variety.py b/sage/schemes/toric/fano_variety.py
    a b  
    305305        2-d CPR-Fano toric variety covered by 4 affine patches
    306306        sage: P1xP1.fan()
    307307        Rational polyhedral fan in 2-d lattice N
    308         sage: P1xP1.fan().ray_matrix()
    309         [ 1  0 -1  0]
    310         [ 0  1  0 -1]
     308        sage: P1xP1.fan().rays()
     309        N( 1,  0),
     310        N( 0,  1),
     311        N(-1,  0),
     312        N( 0, -1)
     313        in 2-d lattice N
    311314
    312315    "Unfortunately," this variety is smooth to start with and we cannot
    313316    perform any subdivisions of the underlying fan without leaving the
     
    325328    We will construct several varieties associated to it::
    326329
    327330        sage: FTV = CPRFanoToricVariety(Delta_polar=square)
    328         sage: FTV.fan().ray_matrix()
    329         [-1  1 -1  1]
    330         [ 1  1 -1 -1]
     331        sage: FTV.fan().rays()
     332        N(-1,  1),
     333        N( 1,  1),
     334        N(-1, -1),
     335        N( 1, -1)
     336        in 2-d lattice N
    331337        sage: FTV.gens()
    332338        (z0, z1, z2, z3)
    333339
    334340        sage: FTV = CPRFanoToricVariety(Delta_polar=square,
    335341        ...         coordinate_points=[0,1,2,3,8])
    336         sage: FTV.fan().ray_matrix()
    337         [-1  1 -1  1  1]
    338         [ 1  1 -1 -1  0]
     342        sage: FTV.fan().rays()
     343        N(-1,  1),
     344        N( 1,  1),
     345        N(-1, -1),
     346        N( 1, -1),
     347        N( 1,  0)
     348        in 2-d lattice N
    339349        sage: FTV.gens()
    340350        (z0, z1, z2, z3, z8)
    341351
    342352        sage: FTV = CPRFanoToricVariety(Delta_polar=square,
    343353        ...         coordinate_points=[8,0,2,1,3],
    344354        ...         coordinate_names="x+")
    345         sage: FTV.fan().ray_matrix()
    346         [ 1 -1 -1  1  1]
    347         [ 0  1 -1  1 -1]
     355        sage: FTV.fan().rays()
     356        N( 1,  0),
     357        N(-1,  1),
     358        N(-1, -1),
     359        N( 1,  1),
     360        N( 1, -1)
     361        in 2-d lattice N
    348362        sage: FTV.gens()
    349363        (x8, x0, x2, x1, x3)
    350364
    351365        sage: FTV = CPRFanoToricVariety(Delta_polar=square,
    352366        ...         coordinate_points="all",
    353367        ...         coordinate_names="x y Z+")
    354         sage: FTV.fan().ray_matrix()
    355         [-1  1 -1  1 -1  0  0  1]
    356         [ 1  1 -1 -1  0 -1  1  0]
     368        sage: FTV.fan().rays()
     369        N(-1,  1),
     370        N( 1,  1),
     371        N(-1, -1),
     372        N( 1, -1),
     373        N(-1,  0),
     374        N( 0, -1),
     375        N( 0,  1),
     376        N( 1,  0)
     377        in 2-d lattice N
    357378        sage: FTV.gens()
    358379        (x, y, Z2, Z3, Z4, Z5, Z7, Z8)
    359380
     
    414435        sage: FTV = CPRFanoToricVariety(Delta_polar=square,
    415436        ...         coordinate_points=[0,1,2,3,4],
    416437        ...         charts=charts)
    417         sage: FTV.fan().ray_matrix()
    418         [-1  1 -1  1 -1]
    419         [ 1  1 -1 -1  0]
     438        sage: FTV.fan().rays()
     439        N(-1,  1),
     440        N( 1,  1),
     441        N(-1, -1),
     442        N( 1, -1),
     443        N(-1,  0)
     444        in 2-d lattice N
    420445        sage: [cone.ambient_ray_indices() for cone in FTV.fan()]
    421446        [(0, 1), (1, 3), (2, 3), (2, 4), (0, 4)]
    422447
     
    440465        ...         coordinate_points=[0,1,2,3,4],
    441466        ...         charts=bad_charts,
    442467        ...         check=False)
    443         sage: FTV.fan().ray_matrix()
    444         [-1  1 -1  1 -1]
    445         [ 1  1 -1 -1  0]
     468        sage: FTV.fan().rays()
     469        N(-1,  1),
     470        N( 1,  1),
     471        N(-1, -1),
     472        N( 1, -1),
     473        N(-1,  0)
     474        in 2-d lattice N
    446475        sage: [cone.ambient_ray_indices() for cone in FTV.fan()]
    447476        [(0, 1), (1, 3), (2, 3), (2, 4), (0, 4), (2, 4), (0, 4)]
    448477
     
    586615            raise ValueError("given charts do not form a complete fan!")
    587616    # Subdivide this fan to use all required points
    588617    fan = fan.subdivide(new_rays=(ray for ray in rays
    589                                       if ray not in fan.ray_set()),
     618                                      if ray not in fan.rays().set()),
    590619                        make_simplicial=make_simplicial)
    591620    # Now create yet another fan making sure that the order of the rays is
    592621    # the same as requested (it is a bit difficult to get it from the start)
     
    11821211            sage: P1xP2 = P1.cartesian_product(P2); P1xP2
    11831212            3-d CPR-Fano toric variety covered by 6 affine patches
    11841213            sage: P1xP2.fan().rays()
    1185             (N+N(1, 0, 0), N+N(-1, 0, 0),
    1186              N+N(0, 1, 0), N+N(0, 0, 1), N+N(0, -1, -1))
     1214            N+N( 1,  0,  0),
     1215            N+N(-1,  0,  0),
     1216            N+N( 0,  1,  0),
     1217            N+N( 0,  0,  1),
     1218            N+N( 0, -1, -1)
     1219            in 3-d lattice N+N
    11871220            sage: P1xP2.Delta_polar()
    11881221            A lattice polytope: 3-dimensional, 5 vertices.
    11891222        """
  • sage/schemes/toric/library.py

    diff --git a/sage/schemes/toric/library.py b/sage/schemes/toric/library.py
    a b  
    288288            sage: dP6 = toric_varieties.dP6()
    289289            sage: dP6
    290290            2-d CPR-Fano toric variety covered by 6 affine patches
    291             sage: dP6.fan().ray_matrix()
    292             [ 0 -1 -1  0  1  1]
    293             [ 1  0 -1 -1  0  1]
     291            sage: dP6.fan().rays()
     292            N( 0,  1),
     293            N(-1,  0),
     294            N(-1, -1),
     295            N( 0, -1),
     296            N( 1,  0),
     297            N( 1,  1)
     298            in 2-d lattice N
    294299            sage: dP6.gens()
    295300            (x, u, y, v, z, w)
    296301        """
     
    318323            sage: dP7 = toric_varieties.dP7()
    319324            sage: dP7
    320325            2-d CPR-Fano toric variety covered by 5 affine patches
    321             sage: dP7.fan().ray_matrix()
    322             [ 0 -1 -1  0  1]
    323             [ 1  0 -1 -1  0]
     326            sage: dP7.fan().rays()
     327            N( 0,  1),
     328            N(-1,  0),
     329            N(-1, -1),
     330            N( 0, -1),
     331            N( 1,  0)
     332            in 2-d lattice N
    324333            sage: dP7.gens()
    325334            (x, u, y, v, z)
    326335        """
     
    348357            sage: dP8 = toric_varieties.dP8()
    349358            sage: dP8
    350359            2-d CPR-Fano toric variety covered by 4 affine patches
    351             sage: dP8.fan().ray_matrix()
    352             [ 1  0 -1  1]
    353             [ 1  1 -1  0]
     360            sage: dP8.fan().rays()
     361            N( 1,  1),
     362            N( 0,  1),
     363            N(-1, -1),
     364            N( 1,  0)
     365            in 2-d lattice N
    354366            sage: dP8.gens()
    355367            (t, x, y, z)
    356368        """
     
    378390            sage: P1xP1 = toric_varieties.P1xP1()
    379391            sage: P1xP1
    380392            2-d CPR-Fano toric variety covered by 4 affine patches
    381             sage: P1xP1.fan().ray_matrix()
    382             [ 1 -1  0  0]
    383             [ 0  0  1 -1]
     393            sage: P1xP1.fan().rays()
     394            N( 1,  0),
     395            N(-1,  0),
     396            N( 0,  1),
     397            N( 0, -1)
     398            in 2-d lattice N
    384399            sage: P1xP1.gens()
    385400            (s, t, x, y)
    386401        """
     
    408423            sage: P1xP1_Z2 = toric_varieties.P1xP1_Z2()
    409424            sage: P1xP1_Z2
    410425            2-d CPR-Fano toric variety covered by 4 affine patches
    411             sage: P1xP1_Z2.fan().ray_matrix()
    412             [ 1 -1 -1  1]
    413             [ 1 -1  1 -1]
     426            sage: P1xP1_Z2.fan().rays()
     427            N( 1,  1),
     428            N(-1, -1),
     429            N(-1,  1),
     430            N( 1, -1)
     431            in 2-d lattice N
    414432            sage: P1xP1_Z2.gens()
    415433            (s, t, x, y)
    416434            sage: P1xP1_Z2.Chow_group().degree(1)
     
    440458            sage: P1 = toric_varieties.P1()
    441459            sage: P1
    442460            1-d CPR-Fano toric variety covered by 2 affine patches
    443             sage: P1.fan().ray_matrix()
    444             [ 1 -1]
     461            sage: P1.fan().rays()
     462            N( 1),
     463            N(-1)
     464            in 1-d lattice N
    445465            sage: P1.gens()
    446466            (s, t)
    447467        """
     
    469489            sage: P2 = toric_varieties.P2()
    470490            sage: P2
    471491            2-d CPR-Fano toric variety covered by 3 affine patches
    472             sage: P2.fan().ray_matrix()
    473             [ 1  0 -1]
    474             [ 0  1 -1]
     492            sage: P2.fan().rays()
     493            N( 1,  0),
     494            N( 0,  1),
     495            N(-1, -1)
     496            in 2-d lattice N
    475497            sage: P2.gens()
    476498            (x, y, z)
    477499        """
     
    500522            sage: P3 = toric_varieties.P(3)
    501523            sage: P3
    502524            3-d CPR-Fano toric variety covered by 4 affine patches
    503             sage: P3.fan().ray_matrix()
    504             [ 1  0  0 -1]
    505             [ 0  1  0 -1]
    506             [ 0  0  1 -1]
     525            sage: P3.fan().rays()
     526            N( 1,  0,  0),
     527            N( 0,  1,  0),
     528            N( 0,  0,  1),
     529            N(-1, -1, -1)
     530            in 3-d lattice N
    507531            sage: P3.gens()
    508532            (z0, z1, z2, z3)
    509533        """
     
    544568            sage: A1 = toric_varieties.A1()
    545569            sage: A1
    546570            1-d affine toric variety
    547             sage: A1.fan().ray_matrix()
    548             [1]
     571            sage: A1.fan().rays()
     572            N(1)
     573            in 1-d lattice N
    549574            sage: A1.gens()
    550575            (z,)
    551576        """
     
    572597            sage: A2 = toric_varieties.A2()
    573598            sage: A2
    574599            2-d affine toric variety
    575             sage: A2.fan().ray_matrix()
    576             [1 0]
    577             [0 1]
     600            sage: A2.fan().rays()
     601            N(1, 0),
     602            N(0, 1)
     603            in 2-d lattice N
    578604            sage: A2.gens()
    579605            (x, y)
    580606        """
     
    603629            sage: A3 = toric_varieties.A(3)
    604630            sage: A3
    605631            3-d affine toric variety
    606             sage: A3.fan().ray_matrix()
    607             [1 0 0]
    608             [0 1 0]
    609             [0 0 1]
     632            sage: A3.fan().rays()
     633            N(1, 0, 0),
     634            N(0, 1, 0),
     635            N(0, 0, 1)
     636            in 3-d lattice N
    610637            sage: A3.gens()
    611638            (z0, z1, z2)
    612639        """
     
    647674            sage: A2_Z2 = toric_varieties.A2_Z2()
    648675            sage: A2_Z2
    649676            2-d affine toric variety
    650             sage: A2_Z2.fan().ray_matrix()
    651             [1 1]
    652             [0 2]
     677            sage: A2_Z2.fan().rays()
     678            N(1, 0),
     679            N(1, 2)
     680            in 2-d lattice N
    653681            sage: A2_Z2.gens()
    654682            (x, y)
    655683        """
     
    677705            sage: P1xA1 = toric_varieties.P1xA1()
    678706            sage: P1xA1
    679707            2-d toric variety covered by 2 affine patches
    680             sage: P1xA1.fan().ray_matrix()
    681             [ 1 -1  0]
    682             [ 0  0  1]
     708            sage: P1xA1.fan().rays()
     709            N( 1, 0),
     710            N(-1, 0),
     711            N( 0, 1)
     712            in 2-d lattice N
    683713            sage: P1xA1.gens()
    684714            (s, t, z)
    685715        """
     
    706736            sage: Conifold = toric_varieties.Conifold()
    707737            sage: Conifold
    708738            3-d affine toric variety
    709             sage: Conifold.fan().ray_matrix()
    710             [0 0 1 1]
    711             [0 1 0 1]
    712             [1 1 1 1]
     739            sage: Conifold.fan().rays()
     740            N(0, 0, 1),
     741            N(0, 1, 1),
     742            N(1, 0, 1),
     743            N(1, 1, 1)
     744            in 3-d lattice N
    713745            sage: Conifold.gens()
    714746            (u, x, y, v)
    715747        """
     
    734766
    735767        EXAMPLES::
    736768
    737             sage: dP6xdP6 = toric_varieties.dP6xdP6()   # long time (20s on sage.math, 2011)
    738             sage: dP6xdP6                               # long time
     769            sage: dP6xdP6 = toric_varieties.dP6xdP6()
     770            sage: dP6xdP6
    739771            4-d CPR-Fano toric variety covered by 36 affine patches
    740             sage: dP6xdP6.fan().ray_matrix()            # long time
    741             [ 0 -1 -1  0  1  1  0  0  0  0  0  0]
    742             [ 1  0 -1 -1  0  1  0  0  0  0  0  0]
    743             [ 0  0  0  0  0  0  0 -1 -1  0  1  1]
    744             [ 0  0  0  0  0  0  1  0 -1 -1  0  1]
    745             sage: dP6xdP6.gens()                        # long time
     772            sage: dP6xdP6.fan().rays()
     773            N( 0,  1,  0,  0),
     774            N(-1,  0,  0,  0),
     775            N(-1, -1,  0,  0),
     776            N( 0, -1,  0,  0),
     777            N( 1,  0,  0,  0),
     778            N( 1,  1,  0,  0),
     779            N( 0,  0,  0,  1),
     780            N( 0,  0, -1,  0),
     781            N( 0,  0, -1, -1),
     782            N( 0,  0,  0, -1),
     783            N( 0,  0,  1,  0),
     784            N( 0,  0,  1,  1)
     785            in 4-d lattice N
     786            sage: dP6xdP6.gens()
    746787            (x0, x1, x2, x3, x4, x5, y0, y1, y2, y3, y4, y5)
    747788        """
    748789        return self._make_CPRFanoToricVariety('dP6xdP6', names)
     
    772813            sage: Cube_face_fan = toric_varieties.Cube_face_fan()
    773814            sage: Cube_face_fan
    774815            3-d CPR-Fano toric variety covered by 6 affine patches
    775             sage: Cube_face_fan.fan().ray_matrix()
    776             [ 1  1 -1 -1 -1 -1  1  1]
    777             [ 1 -1  1 -1 -1  1 -1  1]
    778             [ 1  1  1  1 -1 -1 -1 -1]
     816            sage: Cube_face_fan.fan().rays()
     817            N( 1,  1,  1),
     818            N( 1, -1,  1),
     819            N(-1,  1,  1),
     820            N(-1, -1,  1),
     821            N(-1, -1, -1),
     822            N(-1,  1, -1),
     823            N( 1, -1, -1),
     824            N( 1,  1, -1)
     825            in 3-d lattice N
    779826            sage: Cube_face_fan.gens()
    780827            (z0, z1, z2, z3, z4, z5, z6, z7)
    781828        """
     
    807854            sage: Cube_sublattice = toric_varieties.Cube_sublattice()
    808855            sage: Cube_sublattice
    809856            3-d CPR-Fano toric variety covered by 6 affine patches
    810             sage: Cube_sublattice.fan().ray_matrix()
    811             [ 1  0  0 -1 -1  0  0  1]
    812             [ 0  1  0  1  0 -1  0 -1]
    813             [ 0  0  1  1  0  0 -1 -1]
     857            sage: Cube_sublattice.fan().rays()
     858            N( 1,  0,  0),
     859            N( 0,  1,  0),
     860            N( 0,  0,  1),
     861            N(-1,  1,  1),
     862            N(-1,  0,  0),
     863            N( 0, -1,  0),
     864            N( 0,  0, -1),
     865            N( 1, -1, -1)
     866            in 3-d lattice N
    814867            sage: Cube_sublattice.gens()
    815868            (z0, z1, z2, z3, z4, z5, z6, z7)
    816869
     
    855908            sage: Cube_nonpolyhedral = toric_varieties.Cube_nonpolyhedral()
    856909            sage: Cube_nonpolyhedral
    857910            3-d toric variety covered by 6 affine patches
    858             sage: Cube_nonpolyhedral.fan().ray_matrix()
    859             [ 1  1 -1 -1 -1 -1  1  1]
    860             [ 2 -1  1 -1 -1  1 -1  1]
    861             [ 3  1  1  1 -1 -1 -1 -1]
     911            sage: Cube_nonpolyhedral.fan().rays()
     912            N( 1,  2,  3),
     913            N( 1, -1,  1),
     914            N(-1,  1,  1),
     915            N(-1, -1,  1),
     916            N(-1, -1, -1),
     917            N(-1,  1, -1),
     918            N( 1, -1, -1),
     919            N( 1,  1, -1)
     920            in 3-d lattice N
    862921            sage: Cube_nonpolyhedral.gens()
    863922            (z0, z1, z2, z3, z4, z5, z6, z7)
    864923        """
     
    895954            sage: X_2 = toric_varieties.Cube_deformation(2)
    896955            sage: X_2
    897956            3-d toric variety covered by 6 affine patches
    898             sage: X_2.fan().ray_matrix()
    899             [ 1  1 -1 -1 -1 -1  1  1]
    900             [ 1 -1  1 -1 -1  1 -1  1]
    901             [ 5  1  1  1 -1 -1 -1 -1]
     957            sage: X_2.fan().rays()
     958            N( 1,  1,  5),
     959            N( 1, -1,  1),
     960            N(-1,  1,  1),
     961            N(-1, -1,  1),
     962            N(-1, -1, -1),
     963            N(-1,  1, -1),
     964            N( 1, -1, -1),
     965            N( 1,  1, -1)
     966            in 3-d lattice N
    902967            sage: X_2.gens()
    903968            (z0, z1, z2, z3, z4, z5, z6, z7)
    904969
     
    9431008
    9441009        EXAMPLES::
    9451010         
    946             sage: X = toric_varieties.BCdlOG()      # long time (56s on sage.math, 2011)
    947             sage: X                                 # long time
     1011            sage: X = toric_varieties.BCdlOG()
     1012            sage: X
    9481013            5-d CPR-Fano toric variety covered by 54 affine patches
    949             sage: X.fan().ray_matrix()              # long time
    950             [-1  0  0  0  0  0  0  0  0  0  0  0  1]
    951             [ 0 -1  0  0  0  0  0  0  0  0  1  1  0]
    952             [ 0  0 -1 -1  0  0  0  1  2  1  2  3  4]
    953             [ 2  2  2  1 -1  0  2  2  2  1  2  2  2]
    954             [ 3  3  3  2  0 -1  3  3  3  1  3  3  3]
    955             sage: X.gens()                          # long time
     1014            sage: X.fan().rays()
     1015            N(-1,  0,  0,  2,  3),
     1016            N( 0, -1,  0,  2,  3),
     1017            N( 0,  0, -1,  2,  3),
     1018            N( 0,  0, -1,  1,  2),
     1019            N( 0,  0,  0, -1,  0),
     1020            N( 0,  0,  0,  0, -1),
     1021            N( 0,  0,  0,  2,  3),
     1022            N( 0,  0,  1,  2,  3),
     1023            N( 0,  0,  2,  2,  3),
     1024            N( 0,  0,  1,  1,  1),
     1025            N( 0,  1,  2,  2,  3),
     1026            N( 0,  1,  3,  2,  3),
     1027            N( 1,  0,  4,  2,  3)
     1028            in 5-d lattice N
     1029            sage: X.gens()
    9561030            (v1, v2, c1, c2, v4, v5, b, e1, e2, e3, f, g, v6)
    9571031
    9581032        REFERENCES:
     
    9921066            sage: base = toric_varieties.BCdlOG_base() 
    9931067            sage: base
    9941068            3-d toric variety covered by 10 affine patches
    995             sage: base.fan().ray_matrix()
    996             [-1  0  0  0  0  0  1]
    997             [ 0 -1  0  0  1  1  0]
    998             [ 0  0 -1  1  2  3  4]
     1069            sage: base.fan().rays()
     1070            N(-1,  0,  0),
     1071            N( 0, -1,  0),
     1072            N( 0,  0, -1),
     1073            N( 0,  0,  1),
     1074            N( 0,  1,  2),
     1075            N( 0,  1,  3),
     1076            N( 1,  0,  4)
     1077            in 3-d lattice N
    9991078            sage: base.gens()
    10001079            (d4, d3, r2, r1, d2, u, d1)
    10011080        """
     
    10231102            sage: P2_112 = toric_varieties.P2_112()
    10241103            sage: P2_112
    10251104            2-d CPR-Fano toric variety covered by 3 affine patches
    1026             sage: P2_112.fan().ray_matrix()
    1027             [ 1  0 -1]
    1028             [ 0  1 -2]
     1105            sage: P2_112.fan().rays()
     1106            N( 1,  0),
     1107            N( 0,  1),
     1108            N(-1, -2)
     1109            in 2-d lattice N
    10291110            sage: P2_112.gens()
    10301111            (z0, z1, z2)
    10311112        """
     
    10531134            sage: P2_123 = toric_varieties.P2_123()
    10541135            sage: P2_123
    10551136            2-d CPR-Fano toric variety covered by 3 affine patches
    1056             sage: P2_123.fan().ray_matrix()
    1057             [ 1  0 -2]
    1058             [ 0  1 -3]
     1137            sage: P2_123.fan().rays()
     1138            N( 1,  0),
     1139            N( 0,  1),
     1140            N(-2, -3)
     1141            in 2-d lattice N
    10591142            sage: P2_123.gens()
    10601143            (z0, z1, z2)
    10611144        """
     
    10831166            sage: P4_11169 = toric_varieties.P4_11169()
    10841167            sage: P4_11169
    10851168            4-d CPR-Fano toric variety covered by 5 affine patches
    1086             sage: P4_11169.fan().ray_matrix()
    1087             [ 1  0  0  0 -9]
    1088             [ 0  1  0  0 -6]
    1089             [ 0  0  1  0 -1]
    1090             [ 0  0  0  1 -1]
     1169            sage: P4_11169.fan().rays()
     1170            N( 1,  0,  0,  0),
     1171            N( 0,  1,  0,  0),
     1172            N( 0,  0,  1,  0),
     1173            N( 0,  0,  0,  1),
     1174            N(-9, -6, -1, -1)
     1175            in 4-d lattice N
    10911176            sage: P4_11169.gens()
    10921177            (z0, z1, z2, z3, z4)
    10931178        """
     
    11131198
    11141199        EXAMPLES::
    11151200       
    1116             sage: P4_11169_resolved = toric_varieties.P4_11169_resolved()  # long time (2s on sage.math, 2011)
    1117             sage: P4_11169_resolved                      # long time
     1201            sage: P4_11169_resolved = toric_varieties.P4_11169_resolved()
     1202            sage: P4_11169_resolved
    11181203            4-d CPR-Fano toric variety covered by 9 affine patches
    1119             sage: P4_11169_resolved.fan().ray_matrix()   # long time
    1120             [ 1  0  0  0 -9 -3]
    1121             [ 0  1  0  0 -6 -2]
    1122             [ 0  0  1  0 -1  0]
    1123             [ 0  0  0  1 -1  0]
    1124             sage: P4_11169_resolved.gens()               # long time
     1204            sage: P4_11169_resolved.fan().rays()
     1205            N( 1,  0,  0,  0),
     1206            N( 0,  1,  0,  0),
     1207            N( 0,  0,  1,  0),
     1208            N( 0,  0,  0,  1),
     1209            N(-9, -6, -1, -1),
     1210            N(-3, -2,  0,  0)
     1211            in 4-d lattice N
     1212            sage: P4_11169_resolved.gens()
    11251213            (z0, z1, z2, z3, z4, z5)
    11261214        """
    11271215        return self._make_CPRFanoToricVariety('P4_11169_resolved', names)
     
    11481236            sage: P4_11133 = toric_varieties.P4_11133()
    11491237            sage: P4_11133
    11501238            4-d CPR-Fano toric variety covered by 5 affine patches
    1151             sage: P4_11133.fan().ray_matrix()
    1152             [ 1  0  0  0 -3]
    1153             [ 0  1  0  0 -3]
    1154             [ 0  0  1  0 -1]
    1155             [ 0  0  0  1 -1]
     1239            sage: P4_11133.fan().rays()
     1240            N( 1,  0,  0,  0),
     1241            N( 0,  1,  0,  0),
     1242            N( 0,  0,  1,  0),
     1243            N( 0,  0,  0,  1),
     1244            N(-3, -3, -1, -1)
     1245            in 4-d lattice N
    11561246            sage: P4_11133.gens()
    11571247            (z0, z1, z2, z3, z4)
    11581248        """
     
    11801270            sage: P4_11133_resolved = toric_varieties.P4_11133_resolved()
    11811271            sage: P4_11133_resolved
    11821272            4-d CPR-Fano toric variety covered by 9 affine patches
    1183             sage: P4_11133_resolved.fan().ray_matrix()
    1184             [ 1  0  0  0 -3 -1]
    1185             [ 0  1  0  0 -3 -1]
    1186             [ 0  0  1  0 -1  0]
    1187             [ 0  0  0  1 -1  0]
     1273            sage: P4_11133_resolved.fan().rays()
     1274            N( 1,  0,  0,  0),
     1275            N( 0,  1,  0,  0),
     1276            N( 0,  0,  1,  0),
     1277            N( 0,  0,  0,  1),
     1278            N(-3, -3, -1, -1),
     1279            N(-1, -1,  0,  0)
     1280            in 4-d lattice N
    11881281            sage: P4_11133_resolved.gens()
    11891282            (z0, z1, z2, z3, z4, z5)
    11901283        """
  • sage/schemes/toric/morphism.py

    diff --git a/sage/schemes/toric/morphism.py b/sage/schemes/toric/morphism.py
    a b  
    123123           
    124124    sage: A2_Z2 = toric_varieties.A2_Z2()
    125125    sage: A2_Z2.fan().rays()
    126     (N(1, 0), N(1, 2))
     126    N(1, 0),
     127    N(1, 2)
     128    in 2-d lattice N
    127129    sage: O2_P1 = A2_Z2.resolve(new_rays=[(1,1)])
    128130    sage: blowup = O2_P1.hom(identity_matrix(2), A2_Z2)
    129131    sage: blowup.as_polynomial_map()
     
    504506        for rho, x in zip(phi.domain_fan(1), R.gens()):
    505507            ray = rho.ray(0)
    506508            sigma = phi.image_cone(rho)
    507             degrees = sigma.ray_matrix().solve_right(phi(ray))
     509            degrees = sigma.rays().matrix().solve_left(phi(ray))
    508510            for i, d in zip(sigma.ambient_ray_indices(), degrees):
    509511                try:
    510512                    d = ZZ(d)
  • sage/schemes/toric/variety.py

    diff --git a/sage/schemes/toric/variety.py b/sage/schemes/toric/variety.py
    a b  
    9797    sage: P1xP1 = ToricVariety(fan)
    9898    sage: P1xP1
    9999    2-d toric variety covered by 4 affine patches
    100     sage: P1xP1.fan().ray_matrix()
    101     [ 1  0 -1  0]
    102     [ 0  1  0 -1]
     100    sage: P1xP1.fan().rays()
     101    N( 1,  0),
     102    N( 0,  1),
     103    N(-1,  0),
     104    N( 0, -1)
     105    in 2-d lattice N
    103106    sage: P1xP1.gens()
    104107    (z0, z1, z2, z3)
    105108
     
    141144    sage: patch = P1xP1.affine_patch(2)
    142145    sage: patch
    143146    2-d affine toric variety
    144     sage: patch.fan().ray_matrix()
    145     [1 0]
    146     [0 1]
     147    sage: patch.fan().rays()
     148    N(1, 0),
     149    N(0, 1)
     150    in 2-d lattice N
    147151    sage: patch.embedding_morphism()
    148152    Scheme morphism:
    149153      From: 2-d affine toric variety
     
    168172    sage: P1xP1.is_smooth()
    169173    True
    170174    sage: TV = ToricVariety(NormalFan(diamond))
    171     sage: TV.fan().ray_matrix()
    172     [-1  1 -1  1]
    173     [ 1  1 -1 -1]
     175    sage: TV.fan().rays()
     176    N(-1,  1),
     177    N( 1,  1),
     178    N(-1, -1),
     179    N( 1, -1)
     180    in 2-d lattice N
    174181    sage: TV.is_orbifold()
    175182    True
    176183    sage: TV.is_smooth()
     
    179186In higher dimensions worse things can happen::
    180187
    181188    sage: TV3 = ToricVariety(NormalFan(lattice_polytope.octahedron(3)))
    182     sage: TV3.fan().ray_matrix()
    183     [-1  1 -1  1 -1  1 -1  1]
    184     [-1 -1  1  1 -1 -1  1  1]
    185     [ 1  1  1  1 -1 -1 -1 -1]
     189    sage: TV3.fan().rays()
     190    N(-1, -1,  1),
     191    N( 1, -1,  1),
     192    N(-1,  1,  1),
     193    N( 1,  1,  1),
     194    N(-1, -1, -1),
     195    N( 1, -1, -1),
     196    N(-1,  1, -1),
     197    N( 1,  1, -1)
     198    in 3-d lattice N
    186199    sage: TV3.is_orbifold()
    187200    False
    188201
     
    400413    We will create the product of two projective lines::
    401414
    402415        sage: fan = FaceFan(lattice_polytope.octahedron(2))
    403         sage: fan.ray_matrix()
    404         [ 1  0 -1  0]
    405         [ 0  1  0 -1]
     416        sage: fan.rays()
     417        N( 1,  0),
     418        N( 0,  1),
     419        N(-1,  0),
     420        N( 0, -1)
     421        in 2-d lattice N
    406422        sage: P1xP1 = ToricVariety(fan)
    407423        sage: P1xP1.gens()
    408424        (z0, z1, z2, z3)
     
    904920        `(x, y)` for one and `(s, t)` for the other::
    905921
    906922            sage: fan = FaceFan(lattice_polytope.octahedron(2))
    907             sage: fan.ray_matrix()
    908             [ 1  0 -1  0]
    909             [ 0  1  0 -1]
     923            sage: fan.rays()
     924            N( 1,  0),
     925            N( 0,  1),
     926            N(-1,  0),
     927            N( 0, -1)
     928            in 2-d lattice N
    910929            sage: P1xP1 = ToricVariety(fan, "x s y t")
    911930            sage: P1xP1.inject_variables()
    912931            Defining x, s, y, t
     
    12321251        `(x, y)` for one and `(s, t)` for the other::
    12331252
    12341253            sage: fan = FaceFan(lattice_polytope.octahedron(2))
    1235             sage: fan.ray_matrix()
    1236             [ 1  0 -1  0]
    1237             [ 0  1  0 -1]
     1254            sage: fan.rays()
     1255            N( 1,  0),
     1256            N( 0,  1),
     1257            N(-1,  0),
     1258            N( 0, -1)
     1259            in 2-d lattice N
    12381260            sage: P1xP1 = ToricVariety(fan, "x s y t")
    12391261            sage: P1xP1.inject_variables()
    12401262            Defining x, s, y, t
     
    12731295        if '_homogeneous_degrees_group' not in self.__dict__:
    12741296            fan = self.fan()
    12751297            from sage.modules.free_module import FreeModule
    1276             degrees_group = FreeModule(ZZ, fan.nrays()).quotient(fan.ray_matrix().rows())
     1298            degrees_group = FreeModule(ZZ, fan.nrays()).quotient(
     1299                                                fan.rays().matrix().columns())
    12771300            self._homogeneous_degrees_group = degrees_group
    12781301        degrees_group = self._homogeneous_degrees_group
    12791302        S = self.coordinate_ring()
     
    14391462            sage: Kc
    14401463            2-d cone in 2-d lattice
    14411464            sage: Kc.rays()
    1442             (Divisor class [0, 1], Divisor class [1, 0])
     1465            Divisor class [0, 1],
     1466            Divisor class [1, 0]
     1467            in Basis lattice of The toric rational divisor class group
     1468            of a 2-d CPR-Fano toric variety covered by 4 affine patches
    14431469            sage: [ divisor_class.lift() for divisor_class in Kc.rays() ]
    14441470            [V(x), V(s)]
    14451471            sage: Kc.lattice()
     
    14641490        return self._Kaehler_cone
    14651491
    14661492    def Mori_cone(self):
    1467         """
     1493        r"""
    14681494        Returns the Mori cone of ``self``.
    14691495
    14701496        OUTPUT:
     
    14971523            sage: P4_11169.Mori_cone()
    14981524            2-d cone in 7-d lattice
    14991525            sage: P4_11169.Mori_cone().rays()
    1500             ((0, 0, 1, 1, 1, -3, 0), (3, 2, 0, 0, 0, 1, -6))
     1526            (0, 0, 1, 1, 1, -3,  0),
     1527            (3, 2, 0, 0, 0,  1, -6)
     1528            in Ambient free module of rank 7
     1529            over the principal ideal domain Integer Ring
    15011530        """
    15021531        if "_Mori_cone" not in self.__dict__:
    15031532            # Ideally, self.Kaehler_cone().dual() should be it, but
     
    16291658            sage: P1xP1 = P1.cartesian_product(P1); P1xP1
    16301659            2-d toric variety covered by 4 affine patches
    16311660            sage: P1xP1.fan().rays()
    1632             (N+N(-1, 0), N+N(1, 0), N+N(0, -1), N+N(0, 1))
     1661            N+N(-1,  0),
     1662            N+N( 1,  0),
     1663            N+N( 0, -1),
     1664            N+N( 0,  1)
     1665            in 2-d lattice N+N
    16331666        """
    16341667        return ToricVariety(self.fan().cartesian_product(other.fan()),
    16351668                            coordinate_names, coordinate_indices,
     
    16781711            sage: TV_res = TV.resolve(new_rays=[(0,1)])
    16791712            sage: TV_res.is_smooth()
    16801713            True
    1681             sage: TV_res.fan().ray_matrix()
    1682             [ 1 -1  0]
    1683             [ 1  1  1]
     1714            sage: TV_res.fan().rays()
     1715            N( 1, 1),
     1716            N(-1, 1),
     1717            N( 0, 1)
     1718            in 2-d lattice N
    16841719            sage: [cone.ambient_ray_indices() for cone in TV_res.fan()]
    16851720            [(0, 2), (1, 2)]
    16861721
     
    18081843        with coordinates `(x, y)` for one and `(s, t)` for the other::
    18091844
    18101845            sage: fan = FaceFan(lattice_polytope.octahedron(2))
    1811             sage: fan.ray_matrix()
    1812             [ 1  0 -1  0]
    1813             [ 0  1  0 -1]
     1846            sage: fan.rays()
     1847            N( 1,  0),
     1848            N( 0,  1),
     1849            N(-1,  0),
     1850            N( 0, -1)
     1851            in 2-d lattice N
    18141852            sage: P1xP1 = ToricVariety(fan, "x s y t")
    18151853            sage: P1xP1.inject_variables()
    18161854            Defining x, s, y, t
     
    25112549        basis = dual.Hilbert_basis()
    25122550        N = len(basis)
    25132551        names = normalize_names(names, N, DEFAULT_PREFIX)
    2514         A = matrix(ZZ,basis).transpose()
     2552        A = basis.column_matrix()
    25152553        IA = ToricIdeal(A, names, base_ring=self.base_ring())
    25162554        return (IA.ring(), IA, dual)
    25172555
     
    31213159        elif is_Cone(x):
    31223160            cone = fan.embed(x)
    31233161            assert cone.ambient() is fan
    3124             mult = cone.ray_matrix().index_in_saturation()
     3162            mult = cone.rays().column_matrix().index_in_saturation()
    31253163            x = prod((self.cover_ring().gen(i) for i in cone.ambient_ray_indices()),
    31263164                     z=self.cover_ring().one()) * mult
    31273165        else: