From 2b1c64b047628dfd5179cb98f637da57bb74452f Mon Sep 17 00:00:00 2001 From: Jonathan Kliem Date: Wed, 7 Jul 2021 14:24:36 +0200 Subject: [PATCH] double description for pyramid --- src/sage/geometry/polyhedron/base.py | 32 ++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/sage/geometry/polyhedron/base.py b/src/sage/geometry/polyhedron/base.py index cf2e2f24ada..85b6e5fd899 100644 --- a/src/sage/geometry/polyhedron/base.py +++ b/src/sage/geometry/polyhedron/base.py @@ -7788,13 +7788,25 @@ def pyramid(self): 'cdd' """ assert self.is_compact(), "Not a polytope." + c = self.center() - new_verts = \ - [[0] + x for x in self.Vrep_generator()] + \ - [[1] + list(self.center())] + from itertools import chain + new_verts = chain(([0] + x for x in self.Vrep_generator()), + [[1] + list(c)]) + new_ieqs = chain(([i.b()] + [-c*i.A() - i.b()] + list(i.A()) for i in self.inequalities()), + [[0, 1] + [0]*self.ambient_dim()]) + new_eqns = ([e.b()] + [0] + list(e.A()) for e in self.equations()) + pref_rep = 'Hrep' if self.n_vertices() > self.n_inequalities() else 'Vrep' parent = self.parent().base_extend(self.center().parent(), ambient_dim=self.ambient_dim()+1) - return parent.element_class(parent, [new_verts, [], []], None) + + if self.n_vertices() == 1: + # Fix the polyhedron with one vertex. + return parent.element_class(parent, [new_verts, [], []], None) + + return parent.element_class(parent, [new_verts, [], []], + [new_ieqs, new_eqns], + Vrep_minimal=True, Hrep_minimal=True, pref_rep=pref_rep) def _test_pyramid(self, tester=None, **options): """ @@ -7844,6 +7856,18 @@ def check_pyramid_certificate(P, cert): tester.assertTrue(pyr_polar.is_combinatorially_isomorphic(pyr_polar)) + # Basic properties of the pyramid. + + # Check that the prism preserves the backend. + tester.assertEqual(pyr.backend(), self.backend()) + + tester.assertEqual(1 + self.n_vertices(), pyr.n_vertices()) + tester.assertEqual(self.n_equations(), pyr.n_equations()) + tester.assertEqual(1 + self.n_inequalities(), pyr.n_inequalities()) + + if self.n_vertices() < 15 and self.n_facets() < 15: + pyr._test_basic_properties() + def bipyramid(self): """ Return a polyhedron that is a bipyramid over the original.