passagemath-polyhedra 10.6.31rc3__cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-polyhedra might be problematic. Click here for more details.
- passagemath_polyhedra-10.6.31rc3.dist-info/METADATA +367 -0
- passagemath_polyhedra-10.6.31rc3.dist-info/METADATA.bak +369 -0
- passagemath_polyhedra-10.6.31rc3.dist-info/RECORD +206 -0
- passagemath_polyhedra-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_polyhedra-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_polyhedra.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_polyhedra.libs/libgomp-e985bcbb.so.1.0.0 +0 -0
- sage/all__sagemath_polyhedra.py +50 -0
- sage/game_theory/all.py +8 -0
- sage/game_theory/catalog.py +6 -0
- sage/game_theory/catalog_normal_form_games.py +923 -0
- sage/game_theory/cooperative_game.py +844 -0
- sage/game_theory/matching_game.py +1181 -0
- sage/game_theory/normal_form_game.py +2697 -0
- sage/game_theory/parser.py +275 -0
- sage/geometry/all__sagemath_polyhedra.py +22 -0
- sage/geometry/cone.py +6940 -0
- sage/geometry/cone_catalog.py +847 -0
- sage/geometry/cone_critical_angles.py +1027 -0
- sage/geometry/convex_set.py +1119 -0
- sage/geometry/fan.py +3743 -0
- sage/geometry/fan_isomorphism.py +389 -0
- sage/geometry/fan_morphism.py +1884 -0
- sage/geometry/hasse_diagram.py +202 -0
- sage/geometry/hyperplane_arrangement/affine_subspace.py +390 -0
- sage/geometry/hyperplane_arrangement/all.py +1 -0
- sage/geometry/hyperplane_arrangement/arrangement.py +3895 -0
- sage/geometry/hyperplane_arrangement/check_freeness.py +145 -0
- sage/geometry/hyperplane_arrangement/hyperplane.py +773 -0
- sage/geometry/hyperplane_arrangement/library.py +825 -0
- sage/geometry/hyperplane_arrangement/ordered_arrangement.py +642 -0
- sage/geometry/hyperplane_arrangement/plot.py +520 -0
- sage/geometry/integral_points.py +35 -0
- sage/geometry/integral_points_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/integral_points_generic_dense.pyx +7 -0
- sage/geometry/lattice_polytope.py +5894 -0
- sage/geometry/linear_expression.py +773 -0
- sage/geometry/newton_polygon.py +767 -0
- sage/geometry/point_collection.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/point_collection.pyx +1008 -0
- sage/geometry/polyhedral_complex.py +2616 -0
- sage/geometry/polyhedron/all.py +8 -0
- sage/geometry/polyhedron/backend_cdd.py +460 -0
- sage/geometry/polyhedron/backend_cdd_rdf.py +231 -0
- sage/geometry/polyhedron/backend_field.py +347 -0
- sage/geometry/polyhedron/backend_normaliz.py +2503 -0
- sage/geometry/polyhedron/backend_number_field.py +168 -0
- sage/geometry/polyhedron/backend_polymake.py +765 -0
- sage/geometry/polyhedron/backend_ppl.py +582 -0
- sage/geometry/polyhedron/base.py +1206 -0
- sage/geometry/polyhedron/base0.py +1444 -0
- sage/geometry/polyhedron/base1.py +886 -0
- sage/geometry/polyhedron/base2.py +812 -0
- sage/geometry/polyhedron/base3.py +1845 -0
- sage/geometry/polyhedron/base4.py +1262 -0
- sage/geometry/polyhedron/base5.py +2700 -0
- sage/geometry/polyhedron/base6.py +1741 -0
- sage/geometry/polyhedron/base7.py +997 -0
- sage/geometry/polyhedron/base_QQ.py +1258 -0
- sage/geometry/polyhedron/base_RDF.py +98 -0
- sage/geometry/polyhedron/base_ZZ.py +934 -0
- sage/geometry/polyhedron/base_mutable.py +215 -0
- sage/geometry/polyhedron/base_number_field.py +122 -0
- sage/geometry/polyhedron/cdd_file_format.py +155 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/all.py +1 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/base.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/base.pxd +76 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/base.pyx +3859 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.pxd +39 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.pyx +1038 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/conversions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/conversions.pxd +9 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/conversions.pyx +501 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_data_structure.pxd +207 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.pxd +102 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.pyx +2274 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.pxd +370 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.pyx +84 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.pxd +31 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.pyx +587 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.pxd +52 -0
- sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.pyx +560 -0
- sage/geometry/polyhedron/constructor.py +773 -0
- sage/geometry/polyhedron/double_description.py +753 -0
- sage/geometry/polyhedron/double_description_inhomogeneous.py +564 -0
- sage/geometry/polyhedron/face.py +1060 -0
- sage/geometry/polyhedron/generating_function.py +1810 -0
- sage/geometry/polyhedron/lattice_euclidean_group_element.py +178 -0
- sage/geometry/polyhedron/library.py +3502 -0
- sage/geometry/polyhedron/misc.py +121 -0
- sage/geometry/polyhedron/modules/all.py +1 -0
- sage/geometry/polyhedron/modules/formal_polyhedra_module.py +155 -0
- sage/geometry/polyhedron/palp_database.py +447 -0
- sage/geometry/polyhedron/parent.py +1279 -0
- sage/geometry/polyhedron/plot.py +1986 -0
- sage/geometry/polyhedron/ppl_lattice_polygon.py +556 -0
- sage/geometry/polyhedron/ppl_lattice_polytope.py +1257 -0
- sage/geometry/polyhedron/representation.py +1723 -0
- sage/geometry/pseudolines.py +515 -0
- sage/geometry/relative_interior.py +445 -0
- sage/geometry/toric_plotter.py +1103 -0
- sage/geometry/triangulation/all.py +2 -0
- sage/geometry/triangulation/base.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/triangulation/base.pyx +963 -0
- sage/geometry/triangulation/data.h +147 -0
- sage/geometry/triangulation/data.pxd +4 -0
- sage/geometry/triangulation/element.py +914 -0
- sage/geometry/triangulation/functions.h +10 -0
- sage/geometry/triangulation/functions.pxd +4 -0
- sage/geometry/triangulation/point_configuration.py +2256 -0
- sage/geometry/triangulation/triangulations.h +49 -0
- sage/geometry/triangulation/triangulations.pxd +7 -0
- sage/geometry/voronoi_diagram.py +319 -0
- sage/interfaces/all__sagemath_polyhedra.py +1 -0
- sage/interfaces/polymake.py +2028 -0
- sage/numerical/all.py +13 -0
- sage/numerical/all__sagemath_polyhedra.py +11 -0
- sage/numerical/backends/all.py +1 -0
- sage/numerical/backends/all__sagemath_polyhedra.py +1 -0
- sage/numerical/backends/cvxopt_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/cvxopt_backend.pyx +1006 -0
- sage/numerical/backends/cvxopt_backend_test.py +19 -0
- sage/numerical/backends/cvxopt_sdp_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/cvxopt_sdp_backend.pyx +382 -0
- sage/numerical/backends/cvxpy_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/cvxpy_backend.pxd +41 -0
- sage/numerical/backends/cvxpy_backend.pyx +934 -0
- sage/numerical/backends/cvxpy_backend_test.py +13 -0
- sage/numerical/backends/generic_backend_test.py +24 -0
- sage/numerical/backends/interactivelp_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/interactivelp_backend.pxd +36 -0
- sage/numerical/backends/interactivelp_backend.pyx +1231 -0
- sage/numerical/backends/interactivelp_backend_test.py +12 -0
- sage/numerical/backends/logging_backend.py +391 -0
- sage/numerical/backends/matrix_sdp_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/matrix_sdp_backend.pxd +15 -0
- sage/numerical/backends/matrix_sdp_backend.pyx +478 -0
- sage/numerical/backends/ppl_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/ppl_backend.pyx +1126 -0
- sage/numerical/backends/ppl_backend_test.py +13 -0
- sage/numerical/backends/scip_backend.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/backends/scip_backend.pxd +22 -0
- sage/numerical/backends/scip_backend.pyx +1289 -0
- sage/numerical/backends/scip_backend_test.py +13 -0
- sage/numerical/interactive_simplex_method.py +5338 -0
- sage/numerical/knapsack.py +665 -0
- sage/numerical/linear_functions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/linear_functions.pxd +31 -0
- sage/numerical/linear_functions.pyx +1648 -0
- sage/numerical/linear_tensor.py +470 -0
- sage/numerical/linear_tensor_constraints.py +448 -0
- sage/numerical/linear_tensor_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/linear_tensor_element.pxd +6 -0
- sage/numerical/linear_tensor_element.pyx +459 -0
- sage/numerical/mip.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/mip.pxd +40 -0
- sage/numerical/mip.pyx +3667 -0
- sage/numerical/sdp.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/sdp.pxd +39 -0
- sage/numerical/sdp.pyx +1433 -0
- sage/rings/all__sagemath_polyhedra.py +3 -0
- sage/rings/polynomial/all__sagemath_polyhedra.py +10 -0
- sage/rings/polynomial/omega.py +982 -0
- sage/schemes/all__sagemath_polyhedra.py +2 -0
- sage/schemes/toric/all.py +10 -0
- sage/schemes/toric/chow_group.py +1248 -0
- sage/schemes/toric/divisor.py +2082 -0
- sage/schemes/toric/divisor_class.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/schemes/toric/divisor_class.pyx +322 -0
- sage/schemes/toric/fano_variety.py +1606 -0
- sage/schemes/toric/homset.py +650 -0
- sage/schemes/toric/ideal.py +451 -0
- sage/schemes/toric/library.py +1322 -0
- sage/schemes/toric/morphism.py +1958 -0
- sage/schemes/toric/points.py +1032 -0
- sage/schemes/toric/sheaf/all.py +1 -0
- sage/schemes/toric/sheaf/constructor.py +302 -0
- sage/schemes/toric/sheaf/klyachko.py +921 -0
- sage/schemes/toric/toric_subscheme.py +905 -0
- sage/schemes/toric/variety.py +3460 -0
- sage/schemes/toric/weierstrass.py +1078 -0
- sage/schemes/toric/weierstrass_covering.py +457 -0
- sage/schemes/toric/weierstrass_higher.py +288 -0
- sage_wheels/share/reflexive_polytopes/Full2d/zzdb.info +10 -0
- sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v03 +0 -0
- sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v04 +0 -0
- sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v05 +1 -0
- sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v06 +1 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.info +22 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v04 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v05 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v06 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v07 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v08 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v09 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v10 +0 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v11 +1 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v12 +1 -0
- sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v13 +1 -0
- sage_wheels/share/reflexive_polytopes/reflexive_polytopes_2d +80 -0
- sage_wheels/share/reflexive_polytopes/reflexive_polytopes_3d +37977 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-polyhedra
|
|
2
|
+
r"""
|
|
3
|
+
Miscellaneous helper functions
|
|
4
|
+
"""
|
|
5
|
+
# **********************************************************************
|
|
6
|
+
# Copyright (C) 2008 Marshall Hampton <hamptonio@gmail.com>
|
|
7
|
+
# Copyright (C) 2011 Volker Braun <vbraun.name@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
#
|
|
11
|
+
# https://www.gnu.org/licenses/
|
|
12
|
+
# **********************************************************************
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _to_space_separated_string(l, base_ring=None):
|
|
16
|
+
"""
|
|
17
|
+
Convert a container to a space-separated string.
|
|
18
|
+
|
|
19
|
+
INPUT:
|
|
20
|
+
|
|
21
|
+
- ``l`` -- anything iterable
|
|
22
|
+
|
|
23
|
+
- ``base_ring`` -- ring (default: ``None``); convert this ring, if given
|
|
24
|
+
|
|
25
|
+
OUTPUT: string
|
|
26
|
+
|
|
27
|
+
EXAMPLES::
|
|
28
|
+
|
|
29
|
+
sage: import sage.geometry.polyhedron.misc as P
|
|
30
|
+
sage: P._to_space_separated_string([2,3])
|
|
31
|
+
'2 3'
|
|
32
|
+
sage: P._to_space_separated_string([2, 1/5], RDF) # needs sage.rings.real_double
|
|
33
|
+
'2.0 0.2'
|
|
34
|
+
"""
|
|
35
|
+
if base_ring:
|
|
36
|
+
return ' '.join(repr(base_ring(x)) for x in l)
|
|
37
|
+
return ' '.join(repr(x) for x in l)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _set_to_None_if_empty(x):
|
|
41
|
+
"""
|
|
42
|
+
Helper function to clean up arguments.
|
|
43
|
+
|
|
44
|
+
This returns None if x is None or x is an empty container.
|
|
45
|
+
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: import sage.geometry.polyhedron.misc as P
|
|
49
|
+
sage: None == P._set_to_None_if_empty([])
|
|
50
|
+
True
|
|
51
|
+
sage: P._set_to_None_if_empty([1])
|
|
52
|
+
[1]
|
|
53
|
+
"""
|
|
54
|
+
if x is None:
|
|
55
|
+
return x
|
|
56
|
+
x = list(x)
|
|
57
|
+
if not x:
|
|
58
|
+
return None
|
|
59
|
+
return x
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _make_listlist(x):
|
|
63
|
+
"""
|
|
64
|
+
Helper function to clean up arguments.
|
|
65
|
+
|
|
66
|
+
INPUT:
|
|
67
|
+
|
|
68
|
+
- ``x`` -- ``None`` or an iterable of iterables
|
|
69
|
+
|
|
70
|
+
OUTPUT: list of lists
|
|
71
|
+
|
|
72
|
+
EXAMPLES::
|
|
73
|
+
|
|
74
|
+
sage: import sage.geometry.polyhedron.misc as P
|
|
75
|
+
sage: [] == P._make_listlist(tuple())
|
|
76
|
+
True
|
|
77
|
+
sage: [] == P._make_listlist(None)
|
|
78
|
+
True
|
|
79
|
+
sage: P._make_listlist([(1,2),[3,4]])
|
|
80
|
+
[[1, 2], [3, 4]]
|
|
81
|
+
"""
|
|
82
|
+
if x is None:
|
|
83
|
+
return []
|
|
84
|
+
return [list(y) for y in x]
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _common_length_of(l1, l2=None, l3=None):
|
|
88
|
+
"""
|
|
89
|
+
The arguments are containers or ``None``. The function applies
|
|
90
|
+
``len()`` to each element, and returns the common length. If the
|
|
91
|
+
length differs, :exc:`ValueError` is raised. Used to check arguments.
|
|
92
|
+
|
|
93
|
+
OUTPUT:
|
|
94
|
+
|
|
95
|
+
A tuple (number of entries, common length of the entries)
|
|
96
|
+
|
|
97
|
+
EXAMPLES::
|
|
98
|
+
|
|
99
|
+
sage: import sage.geometry.polyhedron.misc as P
|
|
100
|
+
sage: P._common_length_of([[1,2,3],[1,3,34]])
|
|
101
|
+
(2, 3)
|
|
102
|
+
"""
|
|
103
|
+
args = []
|
|
104
|
+
if l1 is not None:
|
|
105
|
+
args.append(l1)
|
|
106
|
+
if l2 is not None:
|
|
107
|
+
args.append(l2)
|
|
108
|
+
if l3 is not None:
|
|
109
|
+
args.append(l3)
|
|
110
|
+
|
|
111
|
+
length = None
|
|
112
|
+
num = 0
|
|
113
|
+
for l in args:
|
|
114
|
+
for i in l:
|
|
115
|
+
num += 1
|
|
116
|
+
length_i = len(i)
|
|
117
|
+
if length is not None and length_i != length:
|
|
118
|
+
raise ValueError("Argument lengths differ!")
|
|
119
|
+
length = length_i
|
|
120
|
+
|
|
121
|
+
return num, length
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-polyhedra
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-polyhedra
|
|
2
|
+
r"""
|
|
3
|
+
Formal modules generated by polyhedra
|
|
4
|
+
"""
|
|
5
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
6
|
+
from sage.categories.graded_modules_with_basis import GradedModulesWithBasis
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class FormalPolyhedraModule(CombinatorialFreeModule):
|
|
10
|
+
r"""
|
|
11
|
+
Class for formal modules generated by polyhedra.
|
|
12
|
+
|
|
13
|
+
It is formal because it is free -- it does not know
|
|
14
|
+
about linear relations of polyhedra.
|
|
15
|
+
|
|
16
|
+
A formal polyhedral module is graded by dimension.
|
|
17
|
+
|
|
18
|
+
INPUT:
|
|
19
|
+
|
|
20
|
+
- ``base_ring`` -- base ring of the module; unrelated to the
|
|
21
|
+
base ring of the polyhedra
|
|
22
|
+
|
|
23
|
+
- ``dimension`` -- the ambient dimension of the polyhedra
|
|
24
|
+
|
|
25
|
+
- ``basis`` -- the basis
|
|
26
|
+
|
|
27
|
+
EXAMPLES::
|
|
28
|
+
|
|
29
|
+
sage: from sage.geometry.polyhedron.modules.formal_polyhedra_module import FormalPolyhedraModule
|
|
30
|
+
sage: def closed_interval(a, b): return Polyhedron(vertices=[[a], [b]])
|
|
31
|
+
|
|
32
|
+
A three-dimensional vector space of polyhedra::
|
|
33
|
+
|
|
34
|
+
sage: I01 = closed_interval(0, 1); I01.rename('conv([0], [1])')
|
|
35
|
+
sage: I11 = closed_interval(1, 1); I11.rename('{[1]}')
|
|
36
|
+
sage: I12 = closed_interval(1, 2); I12.rename('conv([1], [2])')
|
|
37
|
+
sage: basis = [I01, I11, I12]
|
|
38
|
+
sage: M = FormalPolyhedraModule(QQ, 1, basis=basis); M
|
|
39
|
+
Free module generated by {conv([0], [1]), {[1]}, conv([1], [2])} over Rational Field
|
|
40
|
+
sage: M.get_order()
|
|
41
|
+
[conv([0], [1]), {[1]}, conv([1], [2])]
|
|
42
|
+
|
|
43
|
+
A one-dimensional subspace; bases of subspaces just use the indexing
|
|
44
|
+
set `0, \dots, d-1`, where `d` is the dimension::
|
|
45
|
+
|
|
46
|
+
sage: M_lower = M.submodule([M(I11)]); M_lower
|
|
47
|
+
Free module generated by {0} over Rational Field
|
|
48
|
+
sage: M_lower.print_options(prefix='S')
|
|
49
|
+
sage: M_lower.is_submodule(M)
|
|
50
|
+
True
|
|
51
|
+
sage: x = M(I01) - 2*M(I11) + M(I12)
|
|
52
|
+
sage: M_lower.reduce(x)
|
|
53
|
+
[conv([0], [1])] + [conv([1], [2])]
|
|
54
|
+
sage: M_lower.retract.domain() is M
|
|
55
|
+
True
|
|
56
|
+
sage: y = M_lower.retract(M(I11)); y
|
|
57
|
+
S[0]
|
|
58
|
+
sage: M_lower.lift(y)
|
|
59
|
+
[{[1]}]
|
|
60
|
+
|
|
61
|
+
Quotient space; bases of quotient space are families indexed by
|
|
62
|
+
elements of the ambient space::
|
|
63
|
+
|
|
64
|
+
sage: M_mod_lower = M.quotient_module(M_lower); M_mod_lower
|
|
65
|
+
Free module generated by {conv([0], [1]), conv([1], [2])} over Rational Field
|
|
66
|
+
sage: M_mod_lower.print_options(prefix='Q')
|
|
67
|
+
sage: M_mod_lower.retract(x)
|
|
68
|
+
Q[conv([0], [1])] + Q[conv([1], [2])]
|
|
69
|
+
sage: M_mod_lower.retract(M(I01) - 2*M(I11) + M(I12)) == M_mod_lower.retract(M(I01) + M(I12))
|
|
70
|
+
True
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def __classcall__(cls, base_ring, dimension, basis, category=None):
|
|
75
|
+
r"""
|
|
76
|
+
Normalize the arguments for caching.
|
|
77
|
+
|
|
78
|
+
TESTS::
|
|
79
|
+
|
|
80
|
+
sage: from sage.geometry.polyhedron.modules.formal_polyhedra_module import FormalPolyhedraModule
|
|
81
|
+
sage: FormalPolyhedraModule(QQ, 1, ()) is FormalPolyhedraModule(QQ, 1, [])
|
|
82
|
+
True
|
|
83
|
+
"""
|
|
84
|
+
if isinstance(basis, list):
|
|
85
|
+
basis = tuple(basis)
|
|
86
|
+
if isinstance(basis, tuple): # To make sure it only checks for finite input
|
|
87
|
+
from sage.geometry.polyhedron.base import Polyhedron_base
|
|
88
|
+
for P in basis:
|
|
89
|
+
if not isinstance(P, Polyhedron_base):
|
|
90
|
+
raise TypeError(f"{P} is not a polyhedron")
|
|
91
|
+
if P.ambient_space().dimension() != dimension:
|
|
92
|
+
raise TypeError(f"{P} does not belong to the ambient space")
|
|
93
|
+
if category is None:
|
|
94
|
+
category = GradedModulesWithBasis(base_ring)
|
|
95
|
+
return super().__classcall__(cls,
|
|
96
|
+
base_ring=base_ring,
|
|
97
|
+
dimension=dimension,
|
|
98
|
+
basis=basis,
|
|
99
|
+
category=category)
|
|
100
|
+
|
|
101
|
+
def __init__(self, base_ring, dimension, basis, category):
|
|
102
|
+
"""
|
|
103
|
+
Construct a free module generated by the polyhedra in ``basis``.
|
|
104
|
+
|
|
105
|
+
TESTS::
|
|
106
|
+
|
|
107
|
+
sage: from sage.geometry.polyhedron.modules.formal_polyhedra_module import FormalPolyhedraModule
|
|
108
|
+
sage: def closed_interval(a, b): return Polyhedron(vertices=[[a], [b]])
|
|
109
|
+
sage: I01 = closed_interval(0, 1); I01.rename('conv([0], [1])')
|
|
110
|
+
sage: I11 = closed_interval(1, 1); I11.rename('{[1]}')
|
|
111
|
+
sage: I12 = closed_interval(1, 2); I12.rename('conv([1], [2])')
|
|
112
|
+
sage: I02 = closed_interval(0, 2); I02.rename('conv([0], [2])')
|
|
113
|
+
sage: M = FormalPolyhedraModule(QQ, 1, basis=[I01, I11, I12, I02])
|
|
114
|
+
sage: TestSuite(M).run()
|
|
115
|
+
"""
|
|
116
|
+
super().__init__(base_ring, basis, prefix='', category=category)
|
|
117
|
+
|
|
118
|
+
def degree_on_basis(self, m):
|
|
119
|
+
r"""
|
|
120
|
+
The degree of an element of the basis is defined as the dimension of the polyhedron.
|
|
121
|
+
|
|
122
|
+
INPUT:
|
|
123
|
+
|
|
124
|
+
- ``m`` -- an element of the basis (a polyhedron)
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: from sage.geometry.polyhedron.modules.formal_polyhedra_module import FormalPolyhedraModule
|
|
129
|
+
sage: def closed_interval(a, b): return Polyhedron(vertices=[[a], [b]])
|
|
130
|
+
sage: I01 = closed_interval(0, 1); I01.rename('conv([0], [1])')
|
|
131
|
+
sage: I11 = closed_interval(1, 1); I11.rename('{[1]}')
|
|
132
|
+
sage: I12 = closed_interval(1, 2); I12.rename('conv([1], [2])')
|
|
133
|
+
sage: I02 = closed_interval(0, 2); I02.rename('conv([0], [2])')
|
|
134
|
+
sage: M = FormalPolyhedraModule(QQ, 1, basis=[I01, I11, I12, I02])
|
|
135
|
+
|
|
136
|
+
We can extract homogeneous components::
|
|
137
|
+
|
|
138
|
+
sage: O = M(I01) + M(I11) + M(I12)
|
|
139
|
+
sage: O.homogeneous_component(0)
|
|
140
|
+
[{[1]}]
|
|
141
|
+
sage: O.homogeneous_component(1)
|
|
142
|
+
[conv([0], [1])] + [conv([1], [2])]
|
|
143
|
+
|
|
144
|
+
We note that modulo the linear relations of polyhedra, this would only be a filtration,
|
|
145
|
+
not a grading, as the following example shows::
|
|
146
|
+
|
|
147
|
+
sage: X = M(I01) + M(I12) - M(I02)
|
|
148
|
+
sage: X.degree()
|
|
149
|
+
1
|
|
150
|
+
|
|
151
|
+
sage: Y = M(I11)
|
|
152
|
+
sage: Y.degree()
|
|
153
|
+
0
|
|
154
|
+
"""
|
|
155
|
+
return m.dimension()
|