passagemath-polyhedra 10.6.37__cp314-cp314-musllinux_1_2_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.
Files changed (209) hide show
  1. passagemath_polyhedra/__init__.py +3 -0
  2. passagemath_polyhedra-10.6.37.dist-info/METADATA +367 -0
  3. passagemath_polyhedra-10.6.37.dist-info/METADATA.bak +369 -0
  4. passagemath_polyhedra-10.6.37.dist-info/RECORD +209 -0
  5. passagemath_polyhedra-10.6.37.dist-info/WHEEL +5 -0
  6. passagemath_polyhedra-10.6.37.dist-info/top_level.txt +3 -0
  7. passagemath_polyhedra.libs/libgcc_s-0cd532bd.so.1 +0 -0
  8. passagemath_polyhedra.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  9. passagemath_polyhedra.libs/libgomp-8949ffbe.so.1.0.0 +0 -0
  10. passagemath_polyhedra.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
  11. sage/all__sagemath_polyhedra.py +50 -0
  12. sage/game_theory/all.py +8 -0
  13. sage/game_theory/catalog.py +6 -0
  14. sage/game_theory/catalog_normal_form_games.py +923 -0
  15. sage/game_theory/cooperative_game.py +844 -0
  16. sage/game_theory/matching_game.py +1181 -0
  17. sage/game_theory/normal_form_game.py +2697 -0
  18. sage/game_theory/parser.py +275 -0
  19. sage/geometry/all__sagemath_polyhedra.py +22 -0
  20. sage/geometry/cone.py +6940 -0
  21. sage/geometry/cone_catalog.py +847 -0
  22. sage/geometry/cone_critical_angles.py +1027 -0
  23. sage/geometry/convex_set.py +1119 -0
  24. sage/geometry/fan.py +3743 -0
  25. sage/geometry/fan_isomorphism.py +389 -0
  26. sage/geometry/fan_morphism.py +1884 -0
  27. sage/geometry/hasse_diagram.py +202 -0
  28. sage/geometry/hyperplane_arrangement/affine_subspace.py +390 -0
  29. sage/geometry/hyperplane_arrangement/all.py +1 -0
  30. sage/geometry/hyperplane_arrangement/arrangement.py +3905 -0
  31. sage/geometry/hyperplane_arrangement/check_freeness.py +145 -0
  32. sage/geometry/hyperplane_arrangement/hyperplane.py +773 -0
  33. sage/geometry/hyperplane_arrangement/library.py +825 -0
  34. sage/geometry/hyperplane_arrangement/ordered_arrangement.py +642 -0
  35. sage/geometry/hyperplane_arrangement/plot.py +520 -0
  36. sage/geometry/integral_points.py +35 -0
  37. sage/geometry/integral_points_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  38. sage/geometry/integral_points_generic_dense.pyx +7 -0
  39. sage/geometry/lattice_polytope.py +5894 -0
  40. sage/geometry/linear_expression.py +773 -0
  41. sage/geometry/newton_polygon.py +767 -0
  42. sage/geometry/point_collection.cpython-314-x86_64-linux-musl.so +0 -0
  43. sage/geometry/point_collection.pyx +1008 -0
  44. sage/geometry/polyhedral_complex.py +2616 -0
  45. sage/geometry/polyhedron/all.py +8 -0
  46. sage/geometry/polyhedron/backend_cdd.py +460 -0
  47. sage/geometry/polyhedron/backend_cdd_rdf.py +231 -0
  48. sage/geometry/polyhedron/backend_field.py +347 -0
  49. sage/geometry/polyhedron/backend_normaliz.py +2503 -0
  50. sage/geometry/polyhedron/backend_number_field.py +168 -0
  51. sage/geometry/polyhedron/backend_polymake.py +765 -0
  52. sage/geometry/polyhedron/backend_ppl.py +582 -0
  53. sage/geometry/polyhedron/base.py +1206 -0
  54. sage/geometry/polyhedron/base0.py +1444 -0
  55. sage/geometry/polyhedron/base1.py +886 -0
  56. sage/geometry/polyhedron/base2.py +812 -0
  57. sage/geometry/polyhedron/base3.py +1845 -0
  58. sage/geometry/polyhedron/base4.py +1262 -0
  59. sage/geometry/polyhedron/base5.py +2700 -0
  60. sage/geometry/polyhedron/base6.py +1741 -0
  61. sage/geometry/polyhedron/base7.py +997 -0
  62. sage/geometry/polyhedron/base_QQ.py +1258 -0
  63. sage/geometry/polyhedron/base_RDF.py +98 -0
  64. sage/geometry/polyhedron/base_ZZ.py +934 -0
  65. sage/geometry/polyhedron/base_mutable.py +215 -0
  66. sage/geometry/polyhedron/base_number_field.py +122 -0
  67. sage/geometry/polyhedron/cdd_file_format.py +155 -0
  68. sage/geometry/polyhedron/combinatorial_polyhedron/all.py +1 -0
  69. sage/geometry/polyhedron/combinatorial_polyhedron/base.cpython-314-x86_64-linux-musl.so +0 -0
  70. sage/geometry/polyhedron/combinatorial_polyhedron/base.pxd +76 -0
  71. sage/geometry/polyhedron/combinatorial_polyhedron/base.pyx +3859 -0
  72. sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.cpython-314-x86_64-linux-musl.so +0 -0
  73. sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.pxd +39 -0
  74. sage/geometry/polyhedron/combinatorial_polyhedron/combinatorial_face.pyx +1038 -0
  75. sage/geometry/polyhedron/combinatorial_polyhedron/conversions.cpython-314-x86_64-linux-musl.so +0 -0
  76. sage/geometry/polyhedron/combinatorial_polyhedron/conversions.pxd +9 -0
  77. sage/geometry/polyhedron/combinatorial_polyhedron/conversions.pyx +501 -0
  78. sage/geometry/polyhedron/combinatorial_polyhedron/face_data_structure.pxd +207 -0
  79. sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.pxd +102 -0
  81. sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.pyx +2274 -0
  82. sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.cpython-314-x86_64-linux-musl.so +0 -0
  83. sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.pxd +370 -0
  84. sage/geometry/polyhedron/combinatorial_polyhedron/face_list_data_structure.pyx +84 -0
  85. sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.cpython-314-x86_64-linux-musl.so +0 -0
  86. sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.pxd +31 -0
  87. sage/geometry/polyhedron/combinatorial_polyhedron/list_of_faces.pyx +587 -0
  88. sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.cpython-314-x86_64-linux-musl.so +0 -0
  89. sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.pxd +52 -0
  90. sage/geometry/polyhedron/combinatorial_polyhedron/polyhedron_face_lattice.pyx +560 -0
  91. sage/geometry/polyhedron/constructor.py +773 -0
  92. sage/geometry/polyhedron/double_description.py +753 -0
  93. sage/geometry/polyhedron/double_description_inhomogeneous.py +564 -0
  94. sage/geometry/polyhedron/face.py +1060 -0
  95. sage/geometry/polyhedron/generating_function.py +1810 -0
  96. sage/geometry/polyhedron/lattice_euclidean_group_element.py +178 -0
  97. sage/geometry/polyhedron/library.py +3502 -0
  98. sage/geometry/polyhedron/misc.py +121 -0
  99. sage/geometry/polyhedron/modules/all.py +1 -0
  100. sage/geometry/polyhedron/modules/formal_polyhedra_module.py +155 -0
  101. sage/geometry/polyhedron/palp_database.py +447 -0
  102. sage/geometry/polyhedron/parent.py +1279 -0
  103. sage/geometry/polyhedron/plot.py +1986 -0
  104. sage/geometry/polyhedron/ppl_lattice_polygon.py +556 -0
  105. sage/geometry/polyhedron/ppl_lattice_polytope.py +1257 -0
  106. sage/geometry/polyhedron/representation.py +1723 -0
  107. sage/geometry/pseudolines.py +515 -0
  108. sage/geometry/relative_interior.py +445 -0
  109. sage/geometry/toric_plotter.py +1103 -0
  110. sage/geometry/triangulation/all.py +2 -0
  111. sage/geometry/triangulation/base.cpython-314-x86_64-linux-musl.so +0 -0
  112. sage/geometry/triangulation/base.pyx +963 -0
  113. sage/geometry/triangulation/data.h +147 -0
  114. sage/geometry/triangulation/data.pxd +4 -0
  115. sage/geometry/triangulation/element.py +914 -0
  116. sage/geometry/triangulation/functions.h +10 -0
  117. sage/geometry/triangulation/functions.pxd +4 -0
  118. sage/geometry/triangulation/point_configuration.py +2256 -0
  119. sage/geometry/triangulation/triangulations.h +49 -0
  120. sage/geometry/triangulation/triangulations.pxd +7 -0
  121. sage/geometry/voronoi_diagram.py +319 -0
  122. sage/interfaces/all__sagemath_polyhedra.py +1 -0
  123. sage/interfaces/polymake.py +2028 -0
  124. sage/numerical/all.py +13 -0
  125. sage/numerical/all__sagemath_polyhedra.py +11 -0
  126. sage/numerical/backends/all.py +1 -0
  127. sage/numerical/backends/all__sagemath_polyhedra.py +1 -0
  128. sage/numerical/backends/cvxopt_backend.cpython-314-x86_64-linux-musl.so +0 -0
  129. sage/numerical/backends/cvxopt_backend.pyx +1006 -0
  130. sage/numerical/backends/cvxopt_backend_test.py +19 -0
  131. sage/numerical/backends/cvxopt_sdp_backend.cpython-314-x86_64-linux-musl.so +0 -0
  132. sage/numerical/backends/cvxopt_sdp_backend.pyx +382 -0
  133. sage/numerical/backends/cvxpy_backend.cpython-314-x86_64-linux-musl.so +0 -0
  134. sage/numerical/backends/cvxpy_backend.pxd +41 -0
  135. sage/numerical/backends/cvxpy_backend.pyx +934 -0
  136. sage/numerical/backends/cvxpy_backend_test.py +13 -0
  137. sage/numerical/backends/generic_backend_test.py +24 -0
  138. sage/numerical/backends/interactivelp_backend.cpython-314-x86_64-linux-musl.so +0 -0
  139. sage/numerical/backends/interactivelp_backend.pxd +36 -0
  140. sage/numerical/backends/interactivelp_backend.pyx +1231 -0
  141. sage/numerical/backends/interactivelp_backend_test.py +12 -0
  142. sage/numerical/backends/logging_backend.py +391 -0
  143. sage/numerical/backends/matrix_sdp_backend.cpython-314-x86_64-linux-musl.so +0 -0
  144. sage/numerical/backends/matrix_sdp_backend.pxd +15 -0
  145. sage/numerical/backends/matrix_sdp_backend.pyx +478 -0
  146. sage/numerical/backends/ppl_backend.cpython-314-x86_64-linux-musl.so +0 -0
  147. sage/numerical/backends/ppl_backend.pyx +1126 -0
  148. sage/numerical/backends/ppl_backend_test.py +13 -0
  149. sage/numerical/backends/scip_backend.cpython-314-x86_64-linux-musl.so +0 -0
  150. sage/numerical/backends/scip_backend.pxd +22 -0
  151. sage/numerical/backends/scip_backend.pyx +1289 -0
  152. sage/numerical/backends/scip_backend_test.py +13 -0
  153. sage/numerical/interactive_simplex_method.py +5338 -0
  154. sage/numerical/knapsack.py +665 -0
  155. sage/numerical/linear_functions.cpython-314-x86_64-linux-musl.so +0 -0
  156. sage/numerical/linear_functions.pxd +31 -0
  157. sage/numerical/linear_functions.pyx +1648 -0
  158. sage/numerical/linear_tensor.py +470 -0
  159. sage/numerical/linear_tensor_constraints.py +448 -0
  160. sage/numerical/linear_tensor_element.cpython-314-x86_64-linux-musl.so +0 -0
  161. sage/numerical/linear_tensor_element.pxd +6 -0
  162. sage/numerical/linear_tensor_element.pyx +459 -0
  163. sage/numerical/mip.cpython-314-x86_64-linux-musl.so +0 -0
  164. sage/numerical/mip.pxd +40 -0
  165. sage/numerical/mip.pyx +3667 -0
  166. sage/numerical/sdp.cpython-314-x86_64-linux-musl.so +0 -0
  167. sage/numerical/sdp.pxd +39 -0
  168. sage/numerical/sdp.pyx +1433 -0
  169. sage/rings/all__sagemath_polyhedra.py +3 -0
  170. sage/rings/polynomial/all__sagemath_polyhedra.py +10 -0
  171. sage/rings/polynomial/omega.py +982 -0
  172. sage/schemes/all__sagemath_polyhedra.py +2 -0
  173. sage/schemes/toric/all.py +10 -0
  174. sage/schemes/toric/chow_group.py +1248 -0
  175. sage/schemes/toric/divisor.py +2082 -0
  176. sage/schemes/toric/divisor_class.cpython-314-x86_64-linux-musl.so +0 -0
  177. sage/schemes/toric/divisor_class.pyx +322 -0
  178. sage/schemes/toric/fano_variety.py +1606 -0
  179. sage/schemes/toric/homset.py +650 -0
  180. sage/schemes/toric/ideal.py +451 -0
  181. sage/schemes/toric/library.py +1322 -0
  182. sage/schemes/toric/morphism.py +1958 -0
  183. sage/schemes/toric/points.py +1032 -0
  184. sage/schemes/toric/sheaf/all.py +1 -0
  185. sage/schemes/toric/sheaf/constructor.py +302 -0
  186. sage/schemes/toric/sheaf/klyachko.py +921 -0
  187. sage/schemes/toric/toric_subscheme.py +905 -0
  188. sage/schemes/toric/variety.py +3460 -0
  189. sage/schemes/toric/weierstrass.py +1078 -0
  190. sage/schemes/toric/weierstrass_covering.py +457 -0
  191. sage/schemes/toric/weierstrass_higher.py +288 -0
  192. sage_wheels/share/reflexive_polytopes/Full2d/zzdb.info +10 -0
  193. sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v03 +0 -0
  194. sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v04 +0 -0
  195. sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v05 +1 -0
  196. sage_wheels/share/reflexive_polytopes/Full2d/zzdb.v06 +1 -0
  197. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.info +22 -0
  198. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v04 +0 -0
  199. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v05 +0 -0
  200. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v06 +0 -0
  201. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v07 +0 -0
  202. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v08 +0 -0
  203. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v09 +0 -0
  204. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v10 +0 -0
  205. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v11 +1 -0
  206. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v12 +1 -0
  207. sage_wheels/share/reflexive_polytopes/Full3d/zzdb.v13 +1 -0
  208. sage_wheels/share/reflexive_polytopes/reflexive_polytopes_2d +80 -0
  209. sage_wheels/share/reflexive_polytopes/reflexive_polytopes_3d +37977 -0
@@ -0,0 +1,520 @@
1
+ # sage_setup: distribution = sagemath-polyhedra
2
+ # sage.doctest: needs sage.plot sage.symbolic
3
+ """
4
+ Plotting of Hyperplane Arrangements
5
+
6
+ PLOT OPTIONS:
7
+
8
+ Beside the usual plot options (enter ``plot?``), the plot command for
9
+ hyperplane arrangements includes the following:
10
+
11
+ - ``hyperplane_colors`` -- color or list of colors, one for each
12
+ hyperplane (default: equally spread range of hues)
13
+
14
+ - ``hyperplane_labels`` -- boolean, ``'short'``, ``'long'`` (default:
15
+ ``False``). If ``False``, no labels are shown; if 'short' or 'long',
16
+ the hyperplanes are given short or long labels, respectively. If
17
+ ``True``, the hyperplanes are given long labels.
18
+
19
+ - ``label_colors`` -- color or list of colors, one for each hyperplane
20
+ (default: black)
21
+
22
+ - ``label_fontsize`` -- size for hyperplane_label font (default:
23
+ ``14``); this does not work for 3d plots
24
+
25
+ - ``label_offsets`` -- amount be which labels are offset from
26
+ h.point() for each hyperplane h. The format is different for each
27
+ dimension: if the hyperplanes have dimension 0, the offset can be a
28
+ single number or a list of numbers, one for each hyperplane; if the
29
+ hyperplanes have dimension 1, the offset can be a single 2-tuple, or
30
+ a list of 2-tuples, one for each hyperplane; if the hyperplanes have
31
+ dimension 2, the offset can be a single 3-tuple or a list of
32
+ 3-tuples, one for each hyperplane. (Defaults: 0-dim: ``0.1``,
33
+ 1-dim: ``(0,1)``, 2-dim: ``(0,0,0.2)``).
34
+
35
+ - ``hyperplane_legend`` -- boolean, ``'short'``, ``'long'`` (default:
36
+ ``'long'``; in 3-d: ``False``). If ``False``, no legend is shown;
37
+ if ``True``, ``'short'``, or ``'long'``, the legend is shown with
38
+ the default, long, or short labeling, respectively. (For
39
+ arrangements of lines or planes, only.)
40
+
41
+ - ``hyperplane_opacities`` -- a number or list of numbers, one for each
42
+ hyperplane, between 0 and 1; only applies to 3d plots
43
+
44
+ - ``point_sizes`` -- number or list of numbers, one for each hyperplane
45
+ giving the sizes of points in a zero-dimensional arrangement
46
+ (default: ``50``)
47
+
48
+ - ``ranges`` -- range for the parameters or a list of ranges of
49
+ parameters, one for each hyperplane, for the parametric plots of the
50
+ hyperplanes. If a single positive number `r` is given for
51
+ ``ranges``, then all parameters run from -r to r. Otherwise, for a
52
+ line in the plane, the range has the form ``[a,b]`` (default:
53
+ ``[-3,3]``), and for a plane in 3-space, the range has the form
54
+ ``[[a,b],[c,d]]`` (default: ``[[-3,3],[-3,3]]``). The ranges are
55
+ centered around ``hyperplane_arrangement.point()``.
56
+
57
+ EXAMPLES::
58
+
59
+ sage: H3.<x,y,z> = HyperplaneArrangements(QQ)
60
+ sage: A = H3([(1,0,0), 0], [(0,0,1), 5])
61
+ sage: A.plot(hyperplane_opacities=0.5, hyperplane_labels=True,
62
+ ....: hyperplane_legend=False)
63
+ Graphics3d Object
64
+
65
+ sage: c = H3([(1,0,0),0], [(0,0,1),5])
66
+ sage: c.plot(ranges=10)
67
+ Graphics3d Object
68
+ sage: c.plot(ranges=[[9.5,10], [-3,3]])
69
+ Graphics3d Object
70
+ sage: c.plot(ranges=[[[9.5,10], [-3,3]], [[-6,6], [-5,5]]])
71
+ Graphics3d Object
72
+
73
+
74
+ sage: H2.<s,t> = HyperplaneArrangements(QQ)
75
+ sage: h = H2([(1,1),0], [(1,-1),0], [(0,1),2])
76
+ sage: h.plot(ranges=20)
77
+ Graphics object consisting of 3 graphics primitives
78
+ sage: h.plot(ranges=[-1, 10])
79
+ Graphics object consisting of 3 graphics primitives
80
+ sage: h.plot(ranges=[[-1, 1], [-5, 5], [-1, 10]])
81
+ Graphics object consisting of 3 graphics primitives
82
+
83
+ sage: a = hyperplane_arrangements.coordinate(3)
84
+ sage: opts = {'hyperplane_colors':['yellow', 'green', 'blue']}
85
+ sage: opts['hyperplane_labels'] = True
86
+ sage: opts['label_offsets'] = [(0,2,2), (2,0,2), (2,2,0)]
87
+ sage: opts['hyperplane_legend'] = False
88
+ sage: opts['hyperplane_opacities'] = 0.7
89
+ sage: a.plot(**opts)
90
+ Graphics3d Object
91
+ sage: opts['hyperplane_labels'] = 'short'
92
+ sage: a.plot(**opts)
93
+ Graphics3d Object
94
+
95
+ sage: H.<u> = HyperplaneArrangements(QQ)
96
+ sage: pts = H(3*u+4, 2*u+5, 7*u+1)
97
+ sage: pts.plot(hyperplane_colors=['yellow','black','blue'])
98
+ Graphics object consisting of 3 graphics primitives
99
+ sage: pts.plot(point_sizes=[50,100,200], hyperplane_colors='blue')
100
+ Graphics object consisting of 3 graphics primitives
101
+
102
+ sage: H.<x,y,z> = HyperplaneArrangements(QQ)
103
+ sage: a = H(x, y+1, y+2)
104
+ sage: a.plot(hyperplane_labels=True, label_colors='blue', label_fontsize=18)
105
+ Graphics3d Object
106
+ sage: a.plot(hyperplane_labels=True, label_colors=['red','green','black'])
107
+ Graphics3d Object
108
+ """
109
+ from copy import copy
110
+ from colorsys import hsv_to_rgb
111
+
112
+ from sage.misc.lazy_import import lazy_import
113
+ lazy_import("sage.plot.plot3d.parametric_plot3d", "parametric_plot3d")
114
+ lazy_import("sage.plot.plot3d.shapes2", "text3d")
115
+ lazy_import("sage.plot.graphics", "Graphics")
116
+ lazy_import("sage.plot.line", "line")
117
+ lazy_import("sage.plot.text", "text")
118
+ lazy_import("sage.plot.point", "point")
119
+ lazy_import("sage.plot.plot", "parametric_plot")
120
+
121
+
122
+ def plot(hyperplane_arrangement, **kwds):
123
+ r"""
124
+ Return a plot of the hyperplane arrangement.
125
+
126
+ If the arrangement is in 4 dimensions but inessential, a plot of
127
+ the essentialization is returned.
128
+
129
+ .. NOTE::
130
+
131
+ This function is available as the
132
+ :meth:`~sage.geometry.hyperplane_arrangement.arrangement.HyperplaneArrangementElement.plot`
133
+ method of hyperplane arrangements. You should not call this
134
+ function directly, only through the method.
135
+
136
+ INPUT:
137
+
138
+ - ``hyperplane_arrangement`` -- the hyperplane arrangement to plot
139
+
140
+ - ``**kwds`` -- plot options: see
141
+ :mod:`sage.geometry.hyperplane_arrangement.plot`
142
+
143
+ OUTPUT: a graphics object of the plot
144
+
145
+ EXAMPLES::
146
+
147
+ sage: B = hyperplane_arrangements.semiorder(4)
148
+ sage: B.plot() # needs sage.combinat
149
+ Displaying the essentialization.
150
+ Graphics3d Object
151
+ """
152
+ N = len(hyperplane_arrangement)
153
+ dim = hyperplane_arrangement.dimension()
154
+ if hyperplane_arrangement.base_ring().characteristic() != 0:
155
+ raise NotImplementedError('must be a field of characteristic 0')
156
+ elif dim == 4:
157
+ if not hyperplane_arrangement.is_essential():
158
+ print('Displaying the essentialization.')
159
+ hyperplane_arrangement = hyperplane_arrangement.essentialization()
160
+ elif dim not in [1,2,3]: # revise to handle 4d
161
+ return # silently
162
+ # handle extra keywords
163
+ if 'hyperplane_colors' in kwds:
164
+ hyp_colors = kwds.pop('hyperplane_colors')
165
+ if not isinstance(hyp_colors, list): # we assume its a single color then
166
+ hyp_colors = [hyp_colors] * N
167
+ else:
168
+ HSV_tuples = [(i*1.0/N, 0.8, 0.9) for i in range(N)]
169
+ hyp_colors = [hsv_to_rgb(*x) for x in HSV_tuples]
170
+ if 'hyperplane_labels' in kwds:
171
+ hyp_labels = kwds.pop('hyperplane_labels')
172
+ has_hyp_label = True
173
+ if not isinstance(hyp_labels, list): # we assume its a boolean then
174
+ hyp_labels = [hyp_labels] * N
175
+ relabeled = []
176
+ for i in range(N):
177
+ if hyp_labels[i] in [True,'long']:
178
+ relabeled.append(True)
179
+ else:
180
+ relabeled.append(str(i))
181
+ hyp_labels = relabeled
182
+ else:
183
+ has_hyp_label = False
184
+ if 'label_colors' in kwds:
185
+ label_colors = kwds.pop('label_colors')
186
+ has_label_color = True
187
+ if not isinstance(label_colors, list): # we assume its a single color then
188
+ label_colors = [label_colors] * N
189
+ else:
190
+ has_label_color = False
191
+ if 'label_fontsize' in kwds:
192
+ label_fontsize = kwds.pop('label_fontsize')
193
+ has_label_fontsize = True
194
+ if not isinstance(label_fontsize, list): # we assume its a single size then
195
+ label_fontsize = [label_fontsize] * N
196
+ else:
197
+ has_label_fontsize = False
198
+ if 'label_offsets' in kwds:
199
+ has_offsets = True
200
+ offsets = kwds.pop('label_offsets')
201
+ else:
202
+ has_offsets = False # give default values below
203
+ hyperplane_legend = kwds.pop('hyperplane_legend', 'long' if dim < 3 else False)
204
+ if 'hyperplane_opacities' in kwds:
205
+ hyperplane_opacities = kwds.pop('hyperplane_opacities')
206
+ has_opacity = True
207
+ if not isinstance(hyperplane_opacities, list): # we assume a single number then
208
+ hyperplane_opacities = [hyperplane_opacities] * N
209
+ else:
210
+ has_opacity = False
211
+ point_sizes = kwds.pop('point_sizes', 50)
212
+ if not isinstance(point_sizes, list):
213
+ point_sizes = [point_sizes] * N
214
+ if 'ranges' in kwds:
215
+ ranges_set = True
216
+ ranges = kwds.pop('ranges')
217
+ if type(ranges) not in [list,tuple]: # ranges is a single number
218
+ ranges = [ranges] * N
219
+ # So ranges is some type of list.
220
+ elif dim == 2: # arrangement of lines in the plane
221
+ if type(ranges[0]) not in [list,tuple]: # a single interval
222
+ ranges = [ranges] * N
223
+ elif dim == 3: # arrangement of planes in 3-space
224
+ if type(ranges[0][0]) not in [list,tuple]:
225
+ ranges = [ranges] * N
226
+ elif dim not in [2,3]: # ranges is not an option unless dim is 2 or 3
227
+ ranges_set = False
228
+ else: # a list of intervals, one for each hyperplane is given
229
+ pass # ranges does not need to be modified
230
+ else:
231
+ ranges_set = False # give default values below
232
+ # the extra keywords have now been handled
233
+ # now handle the legend
234
+ if dim in [1,2]: # points on a line or lines in the plane
235
+ if hyperplane_legend in [True,'long']:
236
+ hyps = hyperplane_arrangement.hyperplanes()
237
+ legend_labels = [hyps[i]._latex_() for i in range(N)]
238
+ elif hyperplane_legend == 'short' :
239
+ legend_labels = [str(i) for i in range(N)]
240
+ else: # dim==3, arrangement of planes in 3-space
241
+ if hyperplane_legend in [True, 'long']:
242
+ legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'long')
243
+ elif hyperplane_legend == 'short':
244
+ legend3d = legend_3d(hyperplane_arrangement, hyp_colors, 'short')
245
+ ## done handling the legend
246
+ ## now create the plot
247
+ p = Graphics()
248
+ for i in range(N):
249
+ newk = copy(kwds)
250
+ if has_hyp_label:
251
+ newk['hyperplane_label'] = hyp_labels[i]
252
+ if has_offsets:
253
+ if not isinstance(offsets, list):
254
+ newk['label_offset'] = offsets
255
+ else:
256
+ newk['label_offset'] = offsets[i]
257
+ else:
258
+ newk['hyperplane_label'] = False
259
+ if has_label_color:
260
+ newk['label_color'] = label_colors[i]
261
+ if has_label_fontsize:
262
+ newk['label_fontsize'] = label_fontsize[i]
263
+ if has_opacity:
264
+ newk['opacity'] = hyperplane_opacities[i]
265
+ if dim == 1:
266
+ newk['point_size'] = point_sizes[i]
267
+ if dim in [1,2] and hyperplane_legend: # more options than T/F
268
+ newk['legend_label'] = legend_labels[i]
269
+ if ranges_set:
270
+ newk['ranges'] = ranges[i]
271
+ p += plot_hyperplane(hyperplane_arrangement[i], rgbcolor=hyp_colors[i], **newk)
272
+ if dim == 1:
273
+ if hyperplane_legend: # there are more options than T/F
274
+ p.legend(True)
275
+ return p
276
+ elif dim == 2:
277
+ if hyperplane_legend: # there are more options than T/F
278
+ p.legend(True)
279
+ return p
280
+ else: # dim==3
281
+ if hyperplane_legend: # there are more options than T/F
282
+ return p, legend3d
283
+ else:
284
+ return p
285
+
286
+
287
+ def plot_hyperplane(hyperplane, **kwds):
288
+ r"""
289
+ Return the plot of a single hyperplane.
290
+
291
+ INPUT:
292
+
293
+ - ``**kwds`` -- plot options: see below
294
+
295
+ OUTPUT: a graphics object of the plot
296
+
297
+ .. RUBRIC:: Plot Options
298
+
299
+ Beside the usual plot options (enter ``plot?``), the plot command for
300
+ hyperplanes includes the following:
301
+
302
+ - ``hyperplane_label`` -- boolean value or string (default: ``True``);
303
+ if ``True``, the hyperplane is labeled with its equation, if a
304
+ string, it is labeled by that string, otherwise it is not
305
+ labeled
306
+
307
+ - ``label_color`` -- (default: ``'black'``) color for hyperplane_label
308
+
309
+ - ``label_fontsize`` -- size for ``hyperplane_label`` font (default: 14)
310
+ (does not work in 3d, yet)
311
+
312
+ - ``label_offset`` -- (default: 0-dim: 0.1, 1-dim: (0,1),
313
+ 2-dim: (0,0,0.2)); amount by which label is offset from
314
+ ``hyperplane.point()``
315
+
316
+ - ``point_size`` -- (default: 50) size of points in a zero-dimensional
317
+ arrangement or of an arrangement over a finite field
318
+
319
+ - ``ranges`` -- range for the parameters for the parametric plot of the
320
+ hyperplane. If a single positive number ``r`` is given for the
321
+ value of ``ranges``, then the ranges for all parameters are set to
322
+ `[-r, r]`. Otherwise, for a line in the plane, ``ranges`` has the
323
+ form ``[a, b]`` (default: [-3,3]), and for a plane in 3-space, the
324
+ ``ranges`` has the form ``[[a, b], [c, d]]`` (default: [[-3,3],[-3,3]]).
325
+ (The ranges are centered around ``hyperplane.point()``.)
326
+
327
+ EXAMPLES::
328
+
329
+ sage: H1.<x> = HyperplaneArrangements(QQ)
330
+ sage: a = 3*x + 4
331
+ sage: a.plot() # indirect doctest
332
+ Graphics object consisting of 3 graphics primitives
333
+ sage: a.plot(point_size=100, hyperplane_label='hello')
334
+ Graphics object consisting of 3 graphics primitives
335
+
336
+ sage: H2.<x,y> = HyperplaneArrangements(QQ)
337
+ sage: b = 3*x + 4*y + 5
338
+ sage: b.plot()
339
+ Graphics object consisting of 2 graphics primitives
340
+ sage: b.plot(ranges=(1,5), label_offset=(2,-1))
341
+ Graphics object consisting of 2 graphics primitives
342
+ sage: opts = {'hyperplane_label': True, 'label_color': 'green',
343
+ ....: 'label_fontsize': 24, 'label_offset': (0,1.5)}
344
+ sage: b.plot(**opts)
345
+ Graphics object consisting of 2 graphics primitives
346
+
347
+ sage: H3.<x,y,z> = HyperplaneArrangements(QQ)
348
+ sage: c = 2*x + 3*y + 4*z + 5
349
+ sage: c.plot()
350
+ Graphics3d Object
351
+ sage: c.plot(label_offset=(1,0,1), color='green', label_color='red',
352
+ ....: frame=False)
353
+ Graphics3d Object
354
+ sage: d = -3*x + 2*y + 2*z + 3
355
+ sage: d.plot(opacity=0.8)
356
+ Graphics3d Object
357
+ sage: e = 4*x + 2*z + 3
358
+ sage: e.plot(ranges=[[-1,1],[0,8]], label_offset=(2,2,1), aspect_ratio=1)
359
+ Graphics3d Object
360
+ """
361
+ if hyperplane.base_ring().characteristic():
362
+ raise NotImplementedError('base field must have characteristic zero')
363
+ elif hyperplane.dimension() not in [0, 1, 2]: # dimension of hyperplane, not ambient space
364
+ raise ValueError('can only plot hyperplanes in dimensions 1, 2, 3')
365
+ # handle extra keywords
366
+ if 'hyperplane_label' in kwds:
367
+ hyp_label = kwds.pop('hyperplane_label')
368
+ if not hyp_label:
369
+ has_hyp_label = False
370
+ else:
371
+ has_hyp_label = True
372
+ else: # default
373
+ hyp_label = True
374
+ has_hyp_label = True
375
+ if has_hyp_label:
376
+ if hyp_label: # then label hyperplane with its equation
377
+ if hyperplane.dimension() == 2: # jmol does not like latex
378
+ label = hyperplane._repr_linear(include_zero=False)
379
+ else:
380
+ label = hyperplane._latex_()
381
+ else:
382
+ label = hyp_label # a string
383
+ if 'label_color' in kwds:
384
+ label_color = kwds.pop('label_color')
385
+ else:
386
+ label_color = 'black'
387
+ if 'label_fontsize' in kwds:
388
+ label_fontsize = kwds.pop('label_fontsize')
389
+ else:
390
+ label_fontsize = 14
391
+ if 'label_offset' in kwds:
392
+ has_offset = True
393
+ label_offset = kwds.pop('label_offset')
394
+ else:
395
+ has_offset = False # give default values below
396
+ if 'point_size' in kwds:
397
+ pt_size = kwds.pop('point_size')
398
+ else:
399
+ pt_size = 50
400
+ if 'ranges' in kwds:
401
+ ranges_set = True
402
+ ranges = kwds.pop('ranges')
403
+ else:
404
+ ranges_set = False # give default values below
405
+ # the extra keywords have now been handled
406
+ # now create the plot
407
+ if hyperplane.dimension() == 0: # a point on a line
408
+ x, = hyperplane.A()
409
+ d = hyperplane.b()
410
+ p = point((d/x,0), size=pt_size, **kwds)
411
+ if has_hyp_label:
412
+ if not has_offset:
413
+ label_offset = 0.1
414
+ p += text(label, (d/x,label_offset),
415
+ color=label_color,fontsize=label_fontsize)
416
+ p += text('',(d/x,label_offset+0.4)) # add space at top
417
+ if 'ymax' not in kwds:
418
+ kwds['ymax'] = 0.5
419
+ elif hyperplane.dimension() == 1: # a line in the plane
420
+ pnt = hyperplane.point()
421
+ w = hyperplane.linear_part().matrix()
422
+ from sage.symbolic.ring import SR
423
+ t = SR.var('t')
424
+ if ranges_set:
425
+ if isinstance(ranges, (list, tuple)):
426
+ t0, t1 = ranges
427
+ else: # ranges should be a single positive number
428
+ t0, t1 = -ranges, ranges
429
+ else: # default
430
+ t0, t1 = -3, 3
431
+ p = parametric_plot(pnt + t * w[0], (t, t0, t1), **kwds)
432
+ if has_hyp_label:
433
+ if has_offset:
434
+ b0, b1 = label_offset
435
+ else:
436
+ b0, b1 = 0, 0.2
437
+ label = text(label,(pnt[0] + b0, pnt[1] + b1),
438
+ color=label_color,fontsize=label_fontsize)
439
+ p += label
440
+ elif hyperplane.dimension() == 2: # a plane in 3-space
441
+ pnt = hyperplane.point()
442
+ w = hyperplane.linear_part().matrix()
443
+ from sage.symbolic.ring import SR
444
+ s, t = SR.var('s t')
445
+ if ranges_set:
446
+ if isinstance(ranges, (list, tuple)):
447
+ s0, s1 = ranges[0]
448
+ t0, t1 = ranges[1]
449
+ else: # ranges should be a single positive integers
450
+ s0, s1 = -ranges, ranges
451
+ t0, t1 = -ranges, ranges
452
+ else: # default
453
+ s0, s1 = -3, 3
454
+ t0, t1 = -3, 3
455
+ p = parametric_plot3d(pnt+s*w[0]+t*w[1], (s,s0,s1), (t,t0,t1), **kwds)
456
+ if has_hyp_label:
457
+ if has_offset:
458
+ b0, b1, b2 = label_offset
459
+ else:
460
+ b0, b1, b2 = 0, 0, 0
461
+ label = text3d(label,(pnt[0]+b0, pnt[1]+b1, pnt[2]+b2),
462
+ color=label_color, fontsize=label_fontsize)
463
+ p += label
464
+ return p
465
+
466
+
467
+ def legend_3d(hyperplane_arrangement, hyperplane_colors, length):
468
+ r"""
469
+ Create plot of a 3d legend for an arrangement of planes in 3-space.
470
+
471
+ The ``length`` parameter determines whether short or long labels
472
+ are used in the legend.
473
+
474
+ INPUT:
475
+
476
+ - ``hyperplane_arrangement`` -- a hyperplane arrangement
477
+
478
+ - ``hyperplane_colors`` -- list of colors
479
+
480
+ - ``length`` -- either ``'short'`` or ``'long'``
481
+
482
+ OUTPUT: a graphics object
483
+
484
+ EXAMPLES::
485
+
486
+ sage: a = hyperplane_arrangements.semiorder(3)
487
+ sage: from sage.geometry.hyperplane_arrangement.plot import legend_3d
488
+ sage: legend_3d(a, list(colors.values())[:6], length='long') # needs sage.combinat
489
+ Graphics object consisting of 6 graphics primitives
490
+
491
+ sage: b = hyperplane_arrangements.semiorder(4)
492
+ sage: c = b.essentialization()
493
+ sage: legend_3d(c, list(colors.values())[:12], length='long') # needs sage.combinat
494
+ Graphics object consisting of 12 graphics primitives
495
+
496
+ sage: legend_3d(c, list(colors.values())[:12], length='short') # needs sage.combinat
497
+ Graphics object consisting of 12 graphics primitives
498
+
499
+ sage: p = legend_3d(c, list(colors.values())[:12], length='short') # needs sage.combinat
500
+ sage: p.set_legend_options(ncol=4) # needs sage.combinat
501
+ sage: type(p) # needs sage.combinat
502
+ <class 'sage.plot.graphics.Graphics'>
503
+ """
504
+ if hyperplane_arrangement.dimension() != 3:
505
+ raise ValueError('arrangements must be in 3-space')
506
+ hyps = hyperplane_arrangement.hyperplanes()
507
+ N = len(hyperplane_arrangement)
508
+ if length == 'short':
509
+ labels = [' ' + str(i) for i in range(N)]
510
+ else:
511
+ labels = [' ' + hyps[i]._repr_linear(include_zero=False) for i in
512
+ range(N)]
513
+ p = Graphics()
514
+ for i in range(N):
515
+ p += line([(0,0),(0,0)], color=hyperplane_colors[i], thickness=8,
516
+ legend_label=labels[i], axes=False)
517
+ p.set_legend_options(title='Hyperplanes', loc='center', labelspacing=0.4,
518
+ fancybox=True, font_size='x-large', ncol=2)
519
+ p.legend(True)
520
+ return p
@@ -0,0 +1,35 @@
1
+ # sage_setup: distribution = sagemath-polyhedra
2
+ r"""
3
+ Cython helper methods to compute integral points in polyhedra
4
+ """
5
+
6
+ try:
7
+ from .integral_points_integer_dense import (
8
+ parallelotope_points,
9
+ ray_matrix_normal_form,
10
+ loop_over_parallelotope_points,
11
+ simplex_points,
12
+ rectangular_box_points,
13
+ print_cache,
14
+ Inequality_generic,
15
+ Inequality_int,
16
+ InequalityCollection,
17
+ )
18
+ except ImportError:
19
+ from .integral_points_generic_dense import (
20
+ parallelotope_points,
21
+ ray_matrix_normal_form,
22
+ loop_over_parallelotope_points,
23
+ simplex_points,
24
+ rectangular_box_points,
25
+ print_cache,
26
+ Inequality_generic,
27
+ Inequality_int,
28
+ InequalityCollection,
29
+ )
30
+
31
+
32
+ # __all__ is needed to generate Sphinx documentation
33
+ __all__ = ['InequalityCollection', 'Inequality_generic', 'Inequality_int',
34
+ 'loop_over_parallelotope_points', 'parallelotope_points', 'print_cache',
35
+ 'ray_matrix_normal_form', 'rectangular_box_points', 'simplex_points']
@@ -0,0 +1,7 @@
1
+ # sage_setup: distribution = sagemath-polyhedra
2
+ # cython: wraparound=False, boundscheck=False
3
+
4
+ from sage.modules.vector_integer_dense cimport Vector_integer_dense as VectorClass
5
+ from sage.matrix.matrix_dense cimport Matrix_dense as MatrixClass
6
+
7
+ include "integral_points.pxi"