passagemath-objects 10.6.41__cp312-cp312-win_amd64.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 (281) hide show
  1. passagemath_objects/__init__.py +3 -0
  2. passagemath_objects-10.6.41.dist-info/DELVEWHEEL +2 -0
  3. passagemath_objects-10.6.41.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.41.dist-info/RECORD +281 -0
  5. passagemath_objects-10.6.41.dist-info/WHEEL +5 -0
  6. passagemath_objects-10.6.41.dist-info/top_level.txt +3 -0
  7. passagemath_objects.libs/libgmp-10-79b4110c7ea2b760f16cfef97e8a8a34.dll +0 -0
  8. sage/all__sagemath_objects.py +46 -0
  9. sage/arith/all__sagemath_objects.py +5 -0
  10. sage/arith/long.pxd +411 -0
  11. sage/arith/numerical_approx.cp312-win_amd64.pyd +0 -0
  12. sage/arith/numerical_approx.pxd +35 -0
  13. sage/arith/numerical_approx.pyx +75 -0
  14. sage/arith/power.cp312-win_amd64.pyd +0 -0
  15. sage/arith/power.pxd +31 -0
  16. sage/arith/power.pyx +127 -0
  17. sage/categories/action.cp312-win_amd64.pyd +0 -0
  18. sage/categories/action.pxd +29 -0
  19. sage/categories/action.pyx +641 -0
  20. sage/categories/algebra_functor.py +745 -0
  21. sage/categories/all__sagemath_objects.py +33 -0
  22. sage/categories/basic.py +71 -0
  23. sage/categories/cartesian_product.py +295 -0
  24. sage/categories/category.py +3401 -0
  25. sage/categories/category_cy_helper.cp312-win_amd64.pyd +0 -0
  26. sage/categories/category_cy_helper.pxd +8 -0
  27. sage/categories/category_cy_helper.pyx +322 -0
  28. sage/categories/category_singleton.cp312-win_amd64.pyd +0 -0
  29. sage/categories/category_singleton.pxd +3 -0
  30. sage/categories/category_singleton.pyx +342 -0
  31. sage/categories/category_types.py +637 -0
  32. sage/categories/category_with_axiom.py +2885 -0
  33. sage/categories/covariant_functorial_construction.py +703 -0
  34. sage/categories/facade_sets.py +228 -0
  35. sage/categories/functor.cp312-win_amd64.pyd +0 -0
  36. sage/categories/functor.pxd +7 -0
  37. sage/categories/functor.pyx +691 -0
  38. sage/categories/homset.py +1338 -0
  39. sage/categories/homsets.py +364 -0
  40. sage/categories/isomorphic_objects.py +73 -0
  41. sage/categories/map.cp312-win_amd64.pyd +0 -0
  42. sage/categories/map.pxd +34 -0
  43. sage/categories/map.pyx +2112 -0
  44. sage/categories/morphism.cp312-win_amd64.pyd +0 -0
  45. sage/categories/morphism.pxd +14 -0
  46. sage/categories/morphism.pyx +895 -0
  47. sage/categories/objects.py +167 -0
  48. sage/categories/primer.py +1696 -0
  49. sage/categories/pushout.py +4834 -0
  50. sage/categories/quotients.py +64 -0
  51. sage/categories/realizations.py +200 -0
  52. sage/categories/sets_cat.py +3228 -0
  53. sage/categories/sets_with_partial_maps.py +52 -0
  54. sage/categories/subobjects.py +64 -0
  55. sage/categories/subquotients.py +21 -0
  56. sage/categories/with_realizations.py +311 -0
  57. sage/cpython/__init__.py +28 -0
  58. sage/cpython/_py2_random.py +619 -0
  59. sage/cpython/all.py +3 -0
  60. sage/cpython/atexit.cp312-win_amd64.pyd +0 -0
  61. sage/cpython/atexit.pyx +269 -0
  62. sage/cpython/builtin_types.cp312-win_amd64.pyd +0 -0
  63. sage/cpython/builtin_types.pyx +7 -0
  64. sage/cpython/cython_metaclass.cp312-win_amd64.pyd +0 -0
  65. sage/cpython/cython_metaclass.h +117 -0
  66. sage/cpython/cython_metaclass.pxd +3 -0
  67. sage/cpython/cython_metaclass.pyx +130 -0
  68. sage/cpython/debug.cp312-win_amd64.pyd +0 -0
  69. sage/cpython/debug.pyx +302 -0
  70. sage/cpython/dict_del_by_value.cp312-win_amd64.pyd +0 -0
  71. sage/cpython/dict_del_by_value.pxd +9 -0
  72. sage/cpython/dict_del_by_value.pyx +191 -0
  73. sage/cpython/dict_internal.h +245 -0
  74. sage/cpython/getattr.cp312-win_amd64.pyd +0 -0
  75. sage/cpython/getattr.pxd +9 -0
  76. sage/cpython/getattr.pyx +439 -0
  77. sage/cpython/pycore_long.h +97 -0
  78. sage/cpython/pycore_long.pxd +10 -0
  79. sage/cpython/python_debug.h +44 -0
  80. sage/cpython/python_debug.pxd +47 -0
  81. sage/cpython/pyx_visit.h +13 -0
  82. sage/cpython/string.cp312-win_amd64.pyd +0 -0
  83. sage/cpython/string.pxd +76 -0
  84. sage/cpython/string.pyx +34 -0
  85. sage/cpython/string_impl.h +60 -0
  86. sage/cpython/type.cp312-win_amd64.pyd +0 -0
  87. sage/cpython/type.pxd +2 -0
  88. sage/cpython/type.pyx +40 -0
  89. sage/cpython/wrapperdescr.pxd +67 -0
  90. sage/ext/all__sagemath_objects.py +3 -0
  91. sage/ext/ccobject.h +64 -0
  92. sage/ext/cplusplus.pxd +17 -0
  93. sage/ext/mod_int.h +30 -0
  94. sage/ext/mod_int.pxd +24 -0
  95. sage/ext/stdsage.pxd +39 -0
  96. sage/groups/all__sagemath_objects.py +1 -0
  97. sage/groups/group.cp312-win_amd64.pyd +0 -0
  98. sage/groups/group.pxd +14 -0
  99. sage/groups/group.pyx +322 -0
  100. sage/groups/old.cp312-win_amd64.pyd +0 -0
  101. sage/groups/old.pxd +14 -0
  102. sage/groups/old.pyx +219 -0
  103. sage/libs/all__sagemath_objects.py +3 -0
  104. sage/libs/gmp/__init__.py +1 -0
  105. sage/libs/gmp/all.pxd +6 -0
  106. sage/libs/gmp/binop.pxd +23 -0
  107. sage/libs/gmp/misc.pxd +8 -0
  108. sage/libs/gmp/mpf.pxd +88 -0
  109. sage/libs/gmp/mpn.pxd +57 -0
  110. sage/libs/gmp/mpq.pxd +57 -0
  111. sage/libs/gmp/mpz.pxd +202 -0
  112. sage/libs/gmp/pylong.cp312-win_amd64.pyd +0 -0
  113. sage/libs/gmp/pylong.pxd +12 -0
  114. sage/libs/gmp/pylong.pyx +150 -0
  115. sage/libs/gmp/random.pxd +25 -0
  116. sage/libs/gmp/randomize.pxd +59 -0
  117. sage/libs/gmp/types.pxd +53 -0
  118. sage/libs/gmpxx.pxd +19 -0
  119. sage/misc/abstract_method.py +276 -0
  120. sage/misc/all__sagemath_objects.py +43 -0
  121. sage/misc/bindable_class.py +253 -0
  122. sage/misc/c3_controlled.cp312-win_amd64.pyd +0 -0
  123. sage/misc/c3_controlled.pxd +2 -0
  124. sage/misc/c3_controlled.pyx +1402 -0
  125. sage/misc/cachefunc.cp312-win_amd64.pyd +0 -0
  126. sage/misc/cachefunc.pxd +43 -0
  127. sage/misc/cachefunc.pyx +3781 -0
  128. sage/misc/call.py +188 -0
  129. sage/misc/classcall_metaclass.cp312-win_amd64.pyd +0 -0
  130. sage/misc/classcall_metaclass.pxd +14 -0
  131. sage/misc/classcall_metaclass.pyx +599 -0
  132. sage/misc/constant_function.cp312-win_amd64.pyd +0 -0
  133. sage/misc/constant_function.pyx +130 -0
  134. sage/misc/decorators.py +747 -0
  135. sage/misc/fast_methods.cp312-win_amd64.pyd +0 -0
  136. sage/misc/fast_methods.pxd +20 -0
  137. sage/misc/fast_methods.pyx +351 -0
  138. sage/misc/flatten.py +90 -0
  139. sage/misc/fpickle.cp312-win_amd64.pyd +0 -0
  140. sage/misc/fpickle.pyx +177 -0
  141. sage/misc/function_mangling.cp312-win_amd64.pyd +0 -0
  142. sage/misc/function_mangling.pxd +11 -0
  143. sage/misc/function_mangling.pyx +308 -0
  144. sage/misc/inherit_comparison.cp312-win_amd64.pyd +0 -0
  145. sage/misc/inherit_comparison.pxd +5 -0
  146. sage/misc/inherit_comparison.pyx +105 -0
  147. sage/misc/instancedoc.cp312-win_amd64.pyd +0 -0
  148. sage/misc/instancedoc.pyx +331 -0
  149. sage/misc/lazy_attribute.cp312-win_amd64.pyd +0 -0
  150. sage/misc/lazy_attribute.pyx +607 -0
  151. sage/misc/lazy_format.py +135 -0
  152. sage/misc/lazy_import.cp312-win_amd64.pyd +0 -0
  153. sage/misc/lazy_import.pyx +1299 -0
  154. sage/misc/lazy_import_cache.py +36 -0
  155. sage/misc/lazy_list.cp312-win_amd64.pyd +0 -0
  156. sage/misc/lazy_list.pxd +19 -0
  157. sage/misc/lazy_list.pyx +1187 -0
  158. sage/misc/lazy_string.cp312-win_amd64.pyd +0 -0
  159. sage/misc/lazy_string.pxd +7 -0
  160. sage/misc/lazy_string.pyx +546 -0
  161. sage/misc/misc.py +1066 -0
  162. sage/misc/misc_c.cp312-win_amd64.pyd +0 -0
  163. sage/misc/misc_c.pxd +3 -0
  164. sage/misc/misc_c.pyx +766 -0
  165. sage/misc/namespace_package.py +37 -0
  166. sage/misc/nested_class.cp312-win_amd64.pyd +0 -0
  167. sage/misc/nested_class.pxd +3 -0
  168. sage/misc/nested_class.pyx +394 -0
  169. sage/misc/persist.cp312-win_amd64.pyd +0 -0
  170. sage/misc/persist.pyx +1251 -0
  171. sage/misc/prandom.py +418 -0
  172. sage/misc/randstate.cp312-win_amd64.pyd +0 -0
  173. sage/misc/randstate.pxd +30 -0
  174. sage/misc/randstate.pyx +1059 -0
  175. sage/misc/repr.py +203 -0
  176. sage/misc/reset.cp312-win_amd64.pyd +0 -0
  177. sage/misc/reset.pyx +196 -0
  178. sage/misc/sage_ostools.cp312-win_amd64.pyd +0 -0
  179. sage/misc/sage_ostools.pyx +323 -0
  180. sage/misc/sage_timeit.py +276 -0
  181. sage/misc/sage_timeit_class.cp312-win_amd64.pyd +0 -0
  182. sage/misc/sage_timeit_class.pyx +120 -0
  183. sage/misc/sage_unittest.py +637 -0
  184. sage/misc/sageinspect.py +2768 -0
  185. sage/misc/session.cp312-win_amd64.pyd +0 -0
  186. sage/misc/session.pyx +392 -0
  187. sage/misc/superseded.py +557 -0
  188. sage/misc/test_nested_class.py +228 -0
  189. sage/misc/timing.py +264 -0
  190. sage/misc/unknown.py +222 -0
  191. sage/misc/verbose.py +253 -0
  192. sage/misc/weak_dict.cp312-win_amd64.pyd +0 -0
  193. sage/misc/weak_dict.pxd +15 -0
  194. sage/misc/weak_dict.pyx +1231 -0
  195. sage/modules/all__sagemath_objects.py +1 -0
  196. sage/modules/module.cp312-win_amd64.pyd +0 -0
  197. sage/modules/module.pxd +5 -0
  198. sage/modules/module.pyx +329 -0
  199. sage/rings/all__sagemath_objects.py +3 -0
  200. sage/rings/integer_fake.h +22 -0
  201. sage/rings/integer_fake.pxd +55 -0
  202. sage/sets/all__sagemath_objects.py +3 -0
  203. sage/sets/pythonclass.cp312-win_amd64.pyd +0 -0
  204. sage/sets/pythonclass.pxd +9 -0
  205. sage/sets/pythonclass.pyx +247 -0
  206. sage/structure/__init__.py +13 -0
  207. sage/structure/all.py +30 -0
  208. sage/structure/category_object.cp312-win_amd64.pyd +0 -0
  209. sage/structure/category_object.pxd +28 -0
  210. sage/structure/category_object.pyx +1087 -0
  211. sage/structure/coerce.cp312-win_amd64.pyd +0 -0
  212. sage/structure/coerce.pxd +44 -0
  213. sage/structure/coerce.pyx +2107 -0
  214. sage/structure/coerce_actions.cp312-win_amd64.pyd +0 -0
  215. sage/structure/coerce_actions.pxd +27 -0
  216. sage/structure/coerce_actions.pyx +988 -0
  217. sage/structure/coerce_dict.cp312-win_amd64.pyd +0 -0
  218. sage/structure/coerce_dict.pxd +51 -0
  219. sage/structure/coerce_dict.pyx +1557 -0
  220. sage/structure/coerce_exceptions.py +23 -0
  221. sage/structure/coerce_maps.cp312-win_amd64.pyd +0 -0
  222. sage/structure/coerce_maps.pxd +28 -0
  223. sage/structure/coerce_maps.pyx +718 -0
  224. sage/structure/debug_options.cp312-win_amd64.pyd +0 -0
  225. sage/structure/debug_options.pxd +6 -0
  226. sage/structure/debug_options.pyx +54 -0
  227. sage/structure/dynamic_class.py +541 -0
  228. sage/structure/element.cp312-win_amd64.pyd +0 -0
  229. sage/structure/element.pxd +272 -0
  230. sage/structure/element.pyx +4772 -0
  231. sage/structure/element_wrapper.cp312-win_amd64.pyd +0 -0
  232. sage/structure/element_wrapper.pxd +12 -0
  233. sage/structure/element_wrapper.pyx +582 -0
  234. sage/structure/factorization.py +1422 -0
  235. sage/structure/factorization_integer.py +105 -0
  236. sage/structure/factory.cp312-win_amd64.pyd +0 -0
  237. sage/structure/factory.pyx +786 -0
  238. sage/structure/formal_sum.py +489 -0
  239. sage/structure/gens_py.py +73 -0
  240. sage/structure/global_options.py +1743 -0
  241. sage/structure/indexed_generators.py +863 -0
  242. sage/structure/list_clone.cp312-win_amd64.pyd +0 -0
  243. sage/structure/list_clone.pxd +65 -0
  244. sage/structure/list_clone.pyx +1867 -0
  245. sage/structure/list_clone_demo.cp312-win_amd64.pyd +0 -0
  246. sage/structure/list_clone_demo.pyx +248 -0
  247. sage/structure/list_clone_timings.py +179 -0
  248. sage/structure/list_clone_timings_cy.cp312-win_amd64.pyd +0 -0
  249. sage/structure/list_clone_timings_cy.pyx +86 -0
  250. sage/structure/mutability.cp312-win_amd64.pyd +0 -0
  251. sage/structure/mutability.pxd +21 -0
  252. sage/structure/mutability.pyx +348 -0
  253. sage/structure/nonexact.py +69 -0
  254. sage/structure/parent.cp312-win_amd64.pyd +0 -0
  255. sage/structure/parent.pxd +112 -0
  256. sage/structure/parent.pyx +3093 -0
  257. sage/structure/parent_base.cp312-win_amd64.pyd +0 -0
  258. sage/structure/parent_base.pxd +13 -0
  259. sage/structure/parent_base.pyx +44 -0
  260. sage/structure/parent_gens.cp312-win_amd64.pyd +0 -0
  261. sage/structure/parent_gens.pxd +22 -0
  262. sage/structure/parent_gens.pyx +377 -0
  263. sage/structure/parent_old.cp312-win_amd64.pyd +0 -0
  264. sage/structure/parent_old.pxd +25 -0
  265. sage/structure/parent_old.pyx +294 -0
  266. sage/structure/proof/__init__.py +1 -0
  267. sage/structure/proof/all.py +243 -0
  268. sage/structure/proof/proof.py +300 -0
  269. sage/structure/richcmp.cp312-win_amd64.pyd +0 -0
  270. sage/structure/richcmp.pxd +213 -0
  271. sage/structure/richcmp.pyx +495 -0
  272. sage/structure/sage_object.cp312-win_amd64.pyd +0 -0
  273. sage/structure/sage_object.pxd +3 -0
  274. sage/structure/sage_object.pyx +988 -0
  275. sage/structure/sage_object_test.py +19 -0
  276. sage/structure/sequence.py +937 -0
  277. sage/structure/set_factories.py +1178 -0
  278. sage/structure/set_factories_example.py +527 -0
  279. sage/structure/support_view.py +179 -0
  280. sage/structure/test_factory.py +56 -0
  281. sage/structure/unique_representation.py +1359 -0
@@ -0,0 +1,348 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Mutability Cython Implementation
4
+ """
5
+ ##########################################################################
6
+ #
7
+ # Sage: Open Source Mathematical Software
8
+ #
9
+ # Copyright (C) 2006 William Stein <wstein@gmail.com>
10
+ #
11
+ # Distributed under the terms of the GNU General Public License (GPL)
12
+ # https://www.gnu.org/licenses/
13
+ ##########################################################################
14
+
15
+ cimport cython
16
+ from sage.misc.decorators import sage_wraps
17
+
18
+ cdef class Mutability:
19
+ r"""
20
+ Class to mix in mutability feature.
21
+
22
+ EXAMPLES::
23
+
24
+ sage: class A(SageObject, Mutability):
25
+ ....: def __init__(self, val):
26
+ ....: self._val = val
27
+ ....: def change(self, val):
28
+ ....: self._require_mutable()
29
+ ....: self._val = val
30
+ ....: def __hash__(self):
31
+ ....: self._require_immutable()
32
+ ....: return hash(self._val)
33
+ sage: a = A(4)
34
+ sage: a._val
35
+ 4
36
+ sage: a.change(6); a._val
37
+ 6
38
+ sage: hash(a)
39
+ Traceback (most recent call last):
40
+ ...
41
+ ValueError: object is mutable; please make it immutable first
42
+ sage: a.set_immutable()
43
+ sage: a.change(4)
44
+ Traceback (most recent call last):
45
+ ...
46
+ ValueError: object is immutable; please change a copy instead
47
+ sage: hash(a)
48
+ 6
49
+ """
50
+
51
+ def __init__(self, is_immutable=False):
52
+ r"""
53
+ TESTS::
54
+
55
+ sage: class A(SageObject, Mutability):
56
+ ....: def __init__(self, val):
57
+ ....: self._val = val
58
+ ....: def change(self, val):
59
+ ....: self._require_mutable()
60
+ ....: self._val = val
61
+ ....: def __hash__(self):
62
+ ....: self._require_immutable()
63
+ ....: return hash(self._val)
64
+ sage: a = A(4)
65
+ sage: TestSuite(a).run(skip ='_test_pickling')
66
+ """
67
+ self._is_immutable = is_immutable
68
+
69
+ cpdef _require_mutable(self):
70
+ r"""
71
+ Whenever mutability is required, this method can be called.
72
+
73
+ EXAMPLES::
74
+
75
+ sage: class A(SageObject, Mutability):
76
+ ....: def __init__(self, val):
77
+ ....: self._val = val
78
+ ....: def change(self, val):
79
+ ....: self._require_mutable()
80
+ ....: self._val = val
81
+ ....: def __hash__(self):
82
+ ....: self._require_immutable()
83
+ ....: return hash(self._val)
84
+ sage: a = A(4)
85
+ sage: a.set_immutable()
86
+ sage: a.change(6)
87
+ Traceback (most recent call last):
88
+ ...
89
+ ValueError: object is immutable; please change a copy instead
90
+ """
91
+ if self._is_immutable:
92
+ raise ValueError("object is immutable; please change a copy instead")
93
+
94
+ cpdef _require_immutable(self):
95
+ r"""
96
+ Whenever immutability is required, this method can be called.
97
+
98
+ EXAMPLES::
99
+
100
+ sage: class A(SageObject, Mutability):
101
+ ....: def __init__(self, val):
102
+ ....: self._val = val
103
+ ....: def change(self, val):
104
+ ....: self._require_mutable()
105
+ ....: self._val = val
106
+ ....: def __hash__(self):
107
+ ....: self._require_immutable()
108
+ ....: return hash(self._val)
109
+ sage: a = A(4)
110
+ sage: hash(a)
111
+ Traceback (most recent call last):
112
+ ...
113
+ ValueError: object is mutable; please make it immutable first
114
+ """
115
+ if not self._is_immutable:
116
+ raise ValueError("object is mutable; please make it immutable first")
117
+
118
+ def set_immutable(self):
119
+ """
120
+ Make this object immutable, so it can never again be changed.
121
+
122
+ EXAMPLES::
123
+
124
+ sage: v = Sequence([1,2,3,4/5])
125
+ sage: v[0] = 5
126
+ sage: v
127
+ [5, 2, 3, 4/5]
128
+ sage: v.set_immutable()
129
+ sage: v[3] = 7
130
+ Traceback (most recent call last):
131
+ ...
132
+ ValueError: object is immutable; please change a copy instead.
133
+ """
134
+ self._is_immutable = 1
135
+
136
+ cpdef bint is_immutable(self) noexcept:
137
+ """
138
+ Return ``True`` if this object is immutable (cannot be changed)
139
+ and ``False`` if it is not.
140
+
141
+ To make this object immutable use self.set_immutable().
142
+
143
+ EXAMPLES::
144
+
145
+ sage: v = Sequence([1,2,3,4/5])
146
+ sage: v[0] = 5
147
+ sage: v
148
+ [5, 2, 3, 4/5]
149
+ sage: v.is_immutable()
150
+ False
151
+ sage: v.set_immutable()
152
+ sage: v.is_immutable()
153
+ True
154
+ """
155
+ return self._is_immutable
156
+
157
+ cpdef bint is_mutable(self) noexcept:
158
+ """
159
+ Return ``True`` if this object is mutable (can be changed)
160
+ and ``False`` if it is not.
161
+
162
+ To make this object immutable use ``self.set_immutable()``.
163
+
164
+ EXAMPLES::
165
+
166
+ sage: v = Sequence([1,2,3,4/5])
167
+ sage: v[0] = 5
168
+ sage: v
169
+ [5, 2, 3, 4/5]
170
+ sage: v.is_mutable()
171
+ True
172
+ sage: v.set_immutable()
173
+ sage: v.is_mutable()
174
+ False
175
+ """
176
+ return not self._is_immutable
177
+
178
+ def __getstate__(self):
179
+ r"""
180
+ Get the current state of ``self`` including the mutability status.
181
+
182
+ TESTS::
183
+
184
+ sage: class A(SageObject, Mutability):
185
+ ....: def __init__(self, val):
186
+ ....: self._val = val
187
+ ....: def change(self, val):
188
+ ....: self._require_mutable()
189
+ ....: self._val = val
190
+ ....: def __hash__(self):
191
+ ....: self._require_immutable()
192
+ ....: return hash(self._val)
193
+ sage: a = A(4)
194
+ sage: a.__dict__
195
+ {'_val': 4}
196
+ sage: a.__getstate__()
197
+ {'_is_immutable': False, '_val': 4}
198
+ sage: a.__reduce__() # indirect doctest
199
+ (<function _reconstructor at ...>,
200
+ (<class '__main__.A'>,
201
+ <class 'sage.structure.sage_object.SageObject'>,
202
+ <sage.structure.sage_object.SageObject object at ...>),
203
+ {'_is_immutable': False, '_val': 4})
204
+ """
205
+ state = getattr(self, '__dict__', {})
206
+ state['_is_immutable'] = self._is_immutable
207
+ return state
208
+
209
+ def __setstate__(self, state):
210
+ r"""
211
+ Set the state of ``self`` from the dictionary ``state`` including the
212
+ mutability status.
213
+
214
+ TESTS::
215
+
216
+ sage: class A(SageObject, Mutability):
217
+ ....: def __init__(self, val):
218
+ ....: self._val = val
219
+ ....: def change(self, val):
220
+ ....: self._require_mutable()
221
+ ....: self._val = val
222
+ ....: def __hash__(self):
223
+ ....: self._require_immutable()
224
+ ....: return hash(self._val)
225
+ sage: a = A(4)
226
+ sage: a.is_immutable()
227
+ False
228
+ sage: d = a.__getstate__(); d
229
+ {'_is_immutable': False, '_val': 4}
230
+ sage: d['_is_immutable'] = True
231
+ sage: a.__setstate__(d)
232
+ sage: a.is_immutable()
233
+ True
234
+ sage: a.__getstate__()
235
+ {'_is_immutable': True, '_val': 4}
236
+ """
237
+ if hasattr(self, '__dict__'):
238
+ self.__dict__ = state
239
+ self._is_immutable = state['_is_immutable']
240
+
241
+
242
+ ##########################################################################
243
+ # Method decorators for mutating methods resp. methods that assume immutability
244
+
245
+ def require_mutable(f):
246
+ """
247
+ A decorator that requires mutability for a method to be called.
248
+
249
+ .. NOTE::
250
+
251
+ Objects whose methods use this decorator should have an attribute
252
+ ``_is_immutable``. Otherwise, the object is assumed to be mutable.
253
+
254
+ EXAMPLES::
255
+
256
+ sage: from sage.structure.mutability import require_mutable, require_immutable
257
+ sage: class A():
258
+ ....: def __init__(self, val):
259
+ ....: self._m = val
260
+ ....: @require_mutable
261
+ ....: def change(self, new_val):
262
+ ....: 'change self'
263
+ ....: self._m = new_val
264
+ ....: @require_immutable
265
+ ....: def __hash__(self):
266
+ ....: 'implement hash'
267
+ ....: return hash(self._m)
268
+ sage: a = A(5)
269
+ sage: a.change(6)
270
+ sage: hash(a)
271
+ Traceback (most recent call last):
272
+ ...
273
+ ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
274
+ sage: a._is_immutable = True
275
+ sage: hash(a)
276
+ 6
277
+ sage: a.change(7) # indirect doctest
278
+ Traceback (most recent call last):
279
+ ...
280
+ ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
281
+ sage: from sage.misc.sageinspect import sage_getdoc
282
+ sage: print(sage_getdoc(a.change))
283
+ change self
284
+
285
+ AUTHORS:
286
+
287
+ - Simon King <simon.king@uni-jena.de>
288
+ """
289
+ @sage_wraps(f)
290
+ @cython.binding(True)
291
+ def new_f(self, *args, **kwds):
292
+ if getattr(self, '_is_immutable', False):
293
+ raise ValueError("{} instance is immutable, {} must not be called".format(type(self), repr(f)))
294
+ return f(self, *args, **kwds)
295
+ return new_f
296
+
297
+
298
+ def require_immutable(f):
299
+ """
300
+ A decorator that requires immutability for a method to be called.
301
+
302
+ .. NOTE::
303
+
304
+ Objects whose methods use this decorator should have an attribute
305
+ ``_is_immutable``. Otherwise, the object is assumed to be mutable.
306
+
307
+ EXAMPLES::
308
+
309
+ sage: from sage.structure.mutability import require_mutable, require_immutable
310
+ sage: class A():
311
+ ....: def __init__(self, val):
312
+ ....: self._m = val
313
+ ....: @require_mutable
314
+ ....: def change(self, new_val):
315
+ ....: 'change self'
316
+ ....: self._m = new_val
317
+ ....: @require_immutable
318
+ ....: def __hash__(self):
319
+ ....: 'implement hash'
320
+ ....: return hash(self._m)
321
+ sage: a = A(5)
322
+ sage: a.change(6)
323
+ sage: hash(a) # indirect doctest
324
+ Traceback (most recent call last):
325
+ ...
326
+ ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
327
+ sage: a._is_immutable = True
328
+ sage: hash(a)
329
+ 6
330
+ sage: a.change(7)
331
+ Traceback (most recent call last):
332
+ ...
333
+ ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
334
+ sage: from sage.misc.sageinspect import sage_getdoc
335
+ sage: print(sage_getdoc(a.__hash__))
336
+ implement hash
337
+
338
+ AUTHORS:
339
+
340
+ - Simon King <simon.king@uni-jena.de>
341
+ """
342
+ @sage_wraps(f)
343
+ @cython.binding(True)
344
+ def new_f(self, *args, **kwds):
345
+ if not getattr(self,'_is_immutable',False):
346
+ raise ValueError("{} instance is mutable, {} must not be called".format(type(self), repr(f)))
347
+ return f(self, *args, **kwds)
348
+ return new_f
@@ -0,0 +1,69 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ r"""
3
+ Precision management for non-exact objects
4
+
5
+ Manage the default precision for non-exact objects such as power series rings
6
+ or Laurent series rings.
7
+
8
+ EXAMPLES::
9
+
10
+ sage: R.<x> = PowerSeriesRing(QQ)
11
+ sage: R.default_prec()
12
+ 20
13
+ sage: cos(x)
14
+ 1 - 1/2*x^2 + 1/24*x^4 - 1/720*x^6 + 1/40320*x^8 - 1/3628800*x^10 +
15
+ 1/479001600*x^12 - 1/87178291200*x^14 + 1/20922789888000*x^16 -
16
+ 1/6402373705728000*x^18 + O(x^20)
17
+
18
+ ::
19
+
20
+ sage: R.<x> = PowerSeriesRing(QQ, default_prec=10)
21
+ sage: R.default_prec()
22
+ 10
23
+ sage: cos(x)
24
+ 1 - 1/2*x^2 + 1/24*x^4 - 1/720*x^6 + 1/40320*x^8 + O(x^10)
25
+
26
+ .. NOTE::
27
+
28
+ Subclasses of :class:`Nonexact` which require to change the default
29
+ precision should implement a method ``set_default_prec``.
30
+ """
31
+ from sage.rings.integer import Integer
32
+
33
+
34
+ class Nonexact:
35
+ r"""
36
+ A non-exact object with default precision.
37
+
38
+ INPUT:
39
+
40
+ - ``prec`` -- nonnegative integer representing the default precision of
41
+ ``self`` (default: 20)
42
+ """
43
+ def __init__(self, prec=20):
44
+ if prec < 0:
45
+ raise ValueError(f"prec (= {prec}) must be nonnegative")
46
+ self._default_prec = Integer(prec)
47
+
48
+ def default_prec(self):
49
+ r"""
50
+ Return the default precision for ``self``.
51
+
52
+ EXAMPLES::
53
+
54
+ sage: x = polygen(ZZ, 'x')
55
+ sage: R = QQ[[x]]
56
+ sage: R.default_prec()
57
+ 20
58
+
59
+ ::
60
+
61
+ sage: R.<x> = PowerSeriesRing(QQ, default_prec=10)
62
+ sage: R.default_prec()
63
+ 10
64
+ """
65
+ try:
66
+ return self._default_prec
67
+ except AttributeError:
68
+ self._default_prec = 20
69
+ return self._default_prec
@@ -0,0 +1,112 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ # ***************************************************************************
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ # https://www.gnu.org/licenses/
8
+ # ***************************************************************************
9
+
10
+ cimport sage.structure.category_object
11
+ from sage.structure.coerce_dict cimport MonoDict, TripleDict
12
+
13
+ cdef class Parent(sage.structure.category_object.CategoryObject):
14
+ cdef _element_constructor
15
+ cdef bint _element_init_pass_parent
16
+ cdef public _convert_method_name
17
+ cdef public _initial_coerce_list
18
+ cdef public _initial_action_list
19
+ cdef public _initial_convert_list
20
+ cdef readonly bint _coercions_used
21
+
22
+ # Flags, see below
23
+ cdef int flags
24
+ cdef inline bint get_flag(self, int flag) noexcept:
25
+ return self.flags & flag
26
+
27
+ cpdef register_coercion(self, mor)
28
+ cpdef register_action(self, action)
29
+ cpdef register_conversion(self, mor)
30
+ cpdef register_embedding(self, embedding)
31
+
32
+ cpdef bint is_exact(self) except -2
33
+
34
+ # Called from the __init__ method to set up coercion.
35
+ cdef int init_coerce(self, bint warn=*) except -1
36
+
37
+ # returns whether or not there is a Morphism from S to self
38
+ cpdef bint has_coerce_map_from(self, S) except -2
39
+
40
+ # returns a Morphism from S to self, or None
41
+ cpdef coerce_map_from(self, S)
42
+ cpdef _internal_coerce_map_from(self, S)
43
+ cpdef _coerce_map_from_(self, S)
44
+
45
+ # returns a Map from S to self, or None
46
+ cpdef convert_map_from(self, S)
47
+ cpdef _internal_convert_map_from(self, S)
48
+ cpdef _convert_map_from_(self, S)
49
+ cdef convert_method_map(self, S, method_name)
50
+
51
+ # returns the Action by/on self on/by S
52
+ # corresponding to op and self_on_left
53
+ cpdef get_action(self, S, op=*, bint self_on_left=*, self_el=*, S_el=*)
54
+ cpdef _get_action_(self, S, op, bint self_on_left)
55
+
56
+ # coerce x into self
57
+ cpdef coerce(self, x)
58
+
59
+ cpdef an_element(self)
60
+ cdef public object _cache_an_element
61
+
62
+ # For internal use
63
+ cpdef _generic_convert_map(self, S, category=*)
64
+ cpdef _generic_coerce_map(self, S)
65
+ cdef discover_coerce_map_from(self, S)
66
+ cdef discover_convert_map_from(self, S)
67
+ cdef discover_action(self, S, op, bint self_on_left, self_el=*, S_el=*)
68
+
69
+ # List consisting of Morphisms (from anything to self)
70
+ # and Parents for which the __call__ method of self
71
+ # results in natural coercion.
72
+ # Initialized at ring creation.
73
+ cdef list _coerce_from_list
74
+ # List of the domains of the registered coercions, to make
75
+ # sure that the maps in _coerce_from_list remain valid.
76
+ # This is important, since they are fundamental for discovering
77
+ # new coercions by backtracking.
78
+ cdef list _registered_domains
79
+ # Hashtable of everything we've (possibly recursively) discovered so far.
80
+ cdef MonoDict _coerce_from_hash
81
+
82
+ # List consisting of Actions (either by or on self)
83
+ # and Parents for which self._rmul_ and/or self._lmul_
84
+ # do the correct thing.
85
+ # Initialized at ring creation.
86
+ cdef list _action_list
87
+
88
+ # List consisting of Morphisms (from anything to self)
89
+ # and Parents for which the __call__ method of self
90
+ # does not result in type errors
91
+ # Initialized at ring creation.
92
+ cdef list _convert_from_list
93
+ # Hashtable of everything we've (possibly recursively) discovered so far.
94
+ cdef MonoDict _convert_from_hash
95
+ # An optional single Morphism that describes a canonical coercion out of self
96
+ cdef _embedding
97
+
98
+ # Write-only hashtable of all actions discovered using this parent.
99
+ # This is only needed to keep a strong reference to actions, to
100
+ # prevent them being garbage collected prematurely.
101
+ cdef TripleDict _action_hash
102
+
103
+
104
+ cdef class Set_generic(Parent):
105
+ pass
106
+
107
+
108
+ # Flags for Parent.flags
109
+ cdef enum:
110
+ # If this flag is set, call __richcmp__ on elements without
111
+ # coercion. This allows a completely custom comparison function.
112
+ Parent_richcmp_element_without_coercion = 1