Ticket #9188: trac_9188_fix_facet_normal.patch

File trac_9188_fix_facet_normal.patch, 3.7 KB (added by vbraun, 12 years ago)

Updated patch

  • sage/geometry/lattice_polytope.py

    # HG changeset patch
    # User Volker Braun <vbraun@stp.dias.ie>
    # Parent 4a404fd93aaa5ef019cdfed58f173fcbbdaa65a4
    Trac 9188: fix facet_normal for polytopes of less-than-full dimension.
    
    diff -r ae9ee29ae199 sage/geometry/lattice_polytope.py
    a b  
    521521            self._shift_vector = p0
    522522            if compute_vertices:
    523523                self._vertices = self._embed(H_polytope.vertices())
     524
     525            M = self._embedding_matrix
     526            basis = matrix( M.columns() + M.integer_kernel().basis() ).transpose()
     527            self._dual_embedding_scale = basis.det()
     528            dualbasis = matrix(ZZ, self._dual_embedding_scale * basis.inverse())
     529            self._dual_embedding_matrix = dualbasis.submatrix(0,0,M.ncols())
    524530       
    525531    def _compute_faces(self):
    526532        r"""
     
    15061512            (0, -1, 1)
    15071513            sage: p.facet_constant(0)
    15081514            1       
     1515
     1516        A lattice polytope of strictly smaller dimension (=2) than the
     1517        ambient dimension(=4)::
     1518
     1519            sage: LatticePolytope(matrix([(1, -1, 0), (-1, -1, 0), (1, 1, 0), (3, 3, 0)]))
     1520            A lattice polytope: 2-dimensional, 3 vertices.
     1521            sage: lp = LatticePolytope(matrix([(1, -1, 0), (-1, -1, 0), (1, 1, 0), (3, 3, 0)]))
     1522            sage: lp.vertices()
     1523            [ 1 -1  0]
     1524            [-1 -1  0]
     1525            [ 1  1  0]
     1526            [ 3  3  0]
     1527            sage: matrix([[ lp.facet_normal(i)*lp.vertex(j) + lp.facet_constant(i) for i in range(0,3)] for j in range(0,3)])
     1528            [-22   0   0]
     1529            [  0 -22   0]
     1530            [  0   0 -11]
    15091531        """
    15101532        if self.is_reflexive():
    15111533            return 1
    15121534        elif self.ambient_dim() == self.dim():
    15131535            return self._facet_constants[i]
    15141536        else:
    1515             return (self._sublattice_polytope.facet_constant(i)
    1516                     - self.facet_normal(i) * self._shift_vector)
     1537            return (self._sublattice_polytope.facet_constant(i) * self._dual_embedding_scale
     1538                    - self.facet_normal(i) * self._shift_vector )
    15171539       
    15181540    def facet_normal(self, i):
    15191541        r"""
     
    15651587            (0, -1, 1)
    15661588            sage: p.facet_constant(0)
    15671589            1       
     1590
     1591        Here is an example of a 3-dimensional polytope in 4d::
     1592
     1593            sage: lp = LatticePolytope(matrix([[1,1,-1,0],[1,-1,-1,0],[1,1,1,0],[3,3,3,0]]))
     1594            sage: lp.vertices()
     1595            [ 1  1 -1  0]
     1596            [ 1 -1 -1  0]
     1597            [ 1  1  1  0]
     1598            [ 3  3  3  0]
     1599            sage: ker = lp.vertices().integer_kernel().matrix()
     1600            sage: ker
     1601            [ 0  0  3 -1]
     1602            sage: [ ker * lp.facet_normal(i) for i in range(0,4) ]
     1603            [(0), (0), (0), (0)]
     1604            sage: matrix([lp.facet_normal(i) for i in range(0,4)]) * lp.vertices()
     1605            [  0   0 -20   0]
     1606            [  0 -20   0   0]
     1607            [ 10  10  10   0]
     1608            [-20   0   0   0]
     1609            sage: matrix([[ lp.facet_normal(i)*lp.vertex(j) + lp.facet_constant(i) for i in range(0,4)] for j in range(0,4)])
     1610            [  0   0   0 -20]
     1611            [  0 -20   0   0]
     1612            [-20   0   0   0]
     1613            [  0   0 -10   0]
    15681614        """
    15691615        if self.is_reflexive():
    15701616            return self.polar().vertex(i)
    15711617        elif self.ambient_dim() == self.dim():
    15721618            return self._facet_normals[i]
    15731619        else:
    1574             return (self._embedding_matrix
    1575                     * self._sublattice_polytope.facet_normal(i))
     1620            return ( self._sublattice_polytope.facet_normal(i) *
     1621                     self._dual_embedding_matrix )
    15761622
    15771623    def facets(self):
    15781624        r"""