passagemath-objects 10.6.41__cp314-cp314t-macosx_13_0_arm64.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-objects might be problematic. Click here for more details.

Files changed (280) hide show
  1. passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
  2. passagemath_objects/__init__.py +3 -0
  3. passagemath_objects-10.6.41.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.41.dist-info/RECORD +280 -0
  5. passagemath_objects-10.6.41.dist-info/WHEEL +6 -0
  6. passagemath_objects-10.6.41.dist-info/top_level.txt +3 -0
  7. sage/all__sagemath_objects.py +37 -0
  8. sage/arith/all__sagemath_objects.py +5 -0
  9. sage/arith/long.pxd +411 -0
  10. sage/arith/numerical_approx.cpython-314t-darwin.so +0 -0
  11. sage/arith/numerical_approx.pxd +35 -0
  12. sage/arith/numerical_approx.pyx +75 -0
  13. sage/arith/power.cpython-314t-darwin.so +0 -0
  14. sage/arith/power.pxd +31 -0
  15. sage/arith/power.pyx +127 -0
  16. sage/categories/action.cpython-314t-darwin.so +0 -0
  17. sage/categories/action.pxd +29 -0
  18. sage/categories/action.pyx +641 -0
  19. sage/categories/algebra_functor.py +745 -0
  20. sage/categories/all__sagemath_objects.py +33 -0
  21. sage/categories/basic.py +62 -0
  22. sage/categories/cartesian_product.py +295 -0
  23. sage/categories/category.py +3401 -0
  24. sage/categories/category_cy_helper.cpython-314t-darwin.so +0 -0
  25. sage/categories/category_cy_helper.pxd +8 -0
  26. sage/categories/category_cy_helper.pyx +322 -0
  27. sage/categories/category_singleton.cpython-314t-darwin.so +0 -0
  28. sage/categories/category_singleton.pxd +3 -0
  29. sage/categories/category_singleton.pyx +342 -0
  30. sage/categories/category_types.py +637 -0
  31. sage/categories/category_with_axiom.py +2876 -0
  32. sage/categories/covariant_functorial_construction.py +703 -0
  33. sage/categories/facade_sets.py +228 -0
  34. sage/categories/functor.cpython-314t-darwin.so +0 -0
  35. sage/categories/functor.pxd +7 -0
  36. sage/categories/functor.pyx +691 -0
  37. sage/categories/homset.py +1338 -0
  38. sage/categories/homsets.py +364 -0
  39. sage/categories/isomorphic_objects.py +73 -0
  40. sage/categories/map.cpython-314t-darwin.so +0 -0
  41. sage/categories/map.pxd +34 -0
  42. sage/categories/map.pyx +2112 -0
  43. sage/categories/morphism.cpython-314t-darwin.so +0 -0
  44. sage/categories/morphism.pxd +14 -0
  45. sage/categories/morphism.pyx +895 -0
  46. sage/categories/objects.py +167 -0
  47. sage/categories/primer.py +1696 -0
  48. sage/categories/pushout.py +4834 -0
  49. sage/categories/quotients.py +64 -0
  50. sage/categories/realizations.py +200 -0
  51. sage/categories/sets_cat.py +3228 -0
  52. sage/categories/sets_with_partial_maps.py +52 -0
  53. sage/categories/subobjects.py +64 -0
  54. sage/categories/subquotients.py +21 -0
  55. sage/categories/with_realizations.py +311 -0
  56. sage/cpython/__init__.py +19 -0
  57. sage/cpython/_py2_random.py +619 -0
  58. sage/cpython/all.py +3 -0
  59. sage/cpython/atexit.cpython-314t-darwin.so +0 -0
  60. sage/cpython/atexit.pyx +269 -0
  61. sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
  62. sage/cpython/builtin_types.pyx +7 -0
  63. sage/cpython/cython_metaclass.cpython-314t-darwin.so +0 -0
  64. sage/cpython/cython_metaclass.h +117 -0
  65. sage/cpython/cython_metaclass.pxd +3 -0
  66. sage/cpython/cython_metaclass.pyx +130 -0
  67. sage/cpython/debug.cpython-314t-darwin.so +0 -0
  68. sage/cpython/debug.pyx +302 -0
  69. sage/cpython/dict_del_by_value.cpython-314t-darwin.so +0 -0
  70. sage/cpython/dict_del_by_value.pxd +9 -0
  71. sage/cpython/dict_del_by_value.pyx +191 -0
  72. sage/cpython/dict_internal.h +245 -0
  73. sage/cpython/getattr.cpython-314t-darwin.so +0 -0
  74. sage/cpython/getattr.pxd +9 -0
  75. sage/cpython/getattr.pyx +439 -0
  76. sage/cpython/pycore_long.h +97 -0
  77. sage/cpython/pycore_long.pxd +10 -0
  78. sage/cpython/python_debug.h +44 -0
  79. sage/cpython/python_debug.pxd +47 -0
  80. sage/cpython/pyx_visit.h +13 -0
  81. sage/cpython/string.cpython-314t-darwin.so +0 -0
  82. sage/cpython/string.pxd +76 -0
  83. sage/cpython/string.pyx +34 -0
  84. sage/cpython/string_impl.h +60 -0
  85. sage/cpython/type.cpython-314t-darwin.so +0 -0
  86. sage/cpython/type.pxd +2 -0
  87. sage/cpython/type.pyx +40 -0
  88. sage/cpython/wrapperdescr.pxd +67 -0
  89. sage/ext/all__sagemath_objects.py +3 -0
  90. sage/ext/ccobject.h +64 -0
  91. sage/ext/cplusplus.pxd +17 -0
  92. sage/ext/mod_int.h +30 -0
  93. sage/ext/mod_int.pxd +24 -0
  94. sage/ext/stdsage.pxd +39 -0
  95. sage/groups/all__sagemath_objects.py +1 -0
  96. sage/groups/group.cpython-314t-darwin.so +0 -0
  97. sage/groups/group.pxd +14 -0
  98. sage/groups/group.pyx +322 -0
  99. sage/groups/old.cpython-314t-darwin.so +0 -0
  100. sage/groups/old.pxd +14 -0
  101. sage/groups/old.pyx +219 -0
  102. sage/libs/all__sagemath_objects.py +3 -0
  103. sage/libs/gmp/__init__.py +1 -0
  104. sage/libs/gmp/all.pxd +6 -0
  105. sage/libs/gmp/binop.pxd +23 -0
  106. sage/libs/gmp/misc.pxd +8 -0
  107. sage/libs/gmp/mpf.pxd +88 -0
  108. sage/libs/gmp/mpn.pxd +57 -0
  109. sage/libs/gmp/mpq.pxd +57 -0
  110. sage/libs/gmp/mpz.pxd +202 -0
  111. sage/libs/gmp/pylong.cpython-314t-darwin.so +0 -0
  112. sage/libs/gmp/pylong.pxd +12 -0
  113. sage/libs/gmp/pylong.pyx +150 -0
  114. sage/libs/gmp/random.pxd +25 -0
  115. sage/libs/gmp/randomize.pxd +59 -0
  116. sage/libs/gmp/types.pxd +53 -0
  117. sage/libs/gmpxx.pxd +19 -0
  118. sage/misc/abstract_method.py +276 -0
  119. sage/misc/all__sagemath_objects.py +43 -0
  120. sage/misc/bindable_class.py +253 -0
  121. sage/misc/c3_controlled.cpython-314t-darwin.so +0 -0
  122. sage/misc/c3_controlled.pxd +2 -0
  123. sage/misc/c3_controlled.pyx +1402 -0
  124. sage/misc/cachefunc.cpython-314t-darwin.so +0 -0
  125. sage/misc/cachefunc.pxd +43 -0
  126. sage/misc/cachefunc.pyx +3781 -0
  127. sage/misc/call.py +188 -0
  128. sage/misc/classcall_metaclass.cpython-314t-darwin.so +0 -0
  129. sage/misc/classcall_metaclass.pxd +14 -0
  130. sage/misc/classcall_metaclass.pyx +599 -0
  131. sage/misc/constant_function.cpython-314t-darwin.so +0 -0
  132. sage/misc/constant_function.pyx +130 -0
  133. sage/misc/decorators.py +747 -0
  134. sage/misc/fast_methods.cpython-314t-darwin.so +0 -0
  135. sage/misc/fast_methods.pxd +20 -0
  136. sage/misc/fast_methods.pyx +351 -0
  137. sage/misc/flatten.py +90 -0
  138. sage/misc/fpickle.cpython-314t-darwin.so +0 -0
  139. sage/misc/fpickle.pyx +177 -0
  140. sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
  141. sage/misc/function_mangling.pxd +11 -0
  142. sage/misc/function_mangling.pyx +308 -0
  143. sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
  144. sage/misc/inherit_comparison.pxd +5 -0
  145. sage/misc/inherit_comparison.pyx +105 -0
  146. sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
  147. sage/misc/instancedoc.pyx +331 -0
  148. sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
  149. sage/misc/lazy_attribute.pyx +607 -0
  150. sage/misc/lazy_format.py +135 -0
  151. sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
  152. sage/misc/lazy_import.pyx +1299 -0
  153. sage/misc/lazy_import_cache.py +36 -0
  154. sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
  155. sage/misc/lazy_list.pxd +19 -0
  156. sage/misc/lazy_list.pyx +1187 -0
  157. sage/misc/lazy_string.cpython-314t-darwin.so +0 -0
  158. sage/misc/lazy_string.pxd +7 -0
  159. sage/misc/lazy_string.pyx +546 -0
  160. sage/misc/misc.py +1066 -0
  161. sage/misc/misc_c.cpython-314t-darwin.so +0 -0
  162. sage/misc/misc_c.pxd +3 -0
  163. sage/misc/misc_c.pyx +766 -0
  164. sage/misc/namespace_package.py +37 -0
  165. sage/misc/nested_class.cpython-314t-darwin.so +0 -0
  166. sage/misc/nested_class.pxd +3 -0
  167. sage/misc/nested_class.pyx +394 -0
  168. sage/misc/persist.cpython-314t-darwin.so +0 -0
  169. sage/misc/persist.pyx +1251 -0
  170. sage/misc/prandom.py +418 -0
  171. sage/misc/randstate.cpython-314t-darwin.so +0 -0
  172. sage/misc/randstate.pxd +30 -0
  173. sage/misc/randstate.pyx +1059 -0
  174. sage/misc/repr.py +203 -0
  175. sage/misc/reset.cpython-314t-darwin.so +0 -0
  176. sage/misc/reset.pyx +196 -0
  177. sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
  178. sage/misc/sage_ostools.pyx +323 -0
  179. sage/misc/sage_timeit.py +276 -0
  180. sage/misc/sage_timeit_class.cpython-314t-darwin.so +0 -0
  181. sage/misc/sage_timeit_class.pyx +120 -0
  182. sage/misc/sage_unittest.py +637 -0
  183. sage/misc/sageinspect.py +2768 -0
  184. sage/misc/session.cpython-314t-darwin.so +0 -0
  185. sage/misc/session.pyx +392 -0
  186. sage/misc/superseded.py +557 -0
  187. sage/misc/test_nested_class.py +228 -0
  188. sage/misc/timing.py +264 -0
  189. sage/misc/unknown.py +222 -0
  190. sage/misc/verbose.py +253 -0
  191. sage/misc/weak_dict.cpython-314t-darwin.so +0 -0
  192. sage/misc/weak_dict.pxd +15 -0
  193. sage/misc/weak_dict.pyx +1231 -0
  194. sage/modules/all__sagemath_objects.py +1 -0
  195. sage/modules/module.cpython-314t-darwin.so +0 -0
  196. sage/modules/module.pxd +5 -0
  197. sage/modules/module.pyx +329 -0
  198. sage/rings/all__sagemath_objects.py +3 -0
  199. sage/rings/integer_fake.h +22 -0
  200. sage/rings/integer_fake.pxd +55 -0
  201. sage/sets/all__sagemath_objects.py +3 -0
  202. sage/sets/pythonclass.cpython-314t-darwin.so +0 -0
  203. sage/sets/pythonclass.pxd +9 -0
  204. sage/sets/pythonclass.pyx +247 -0
  205. sage/structure/__init__.py +4 -0
  206. sage/structure/all.py +30 -0
  207. sage/structure/category_object.cpython-314t-darwin.so +0 -0
  208. sage/structure/category_object.pxd +28 -0
  209. sage/structure/category_object.pyx +1087 -0
  210. sage/structure/coerce.cpython-314t-darwin.so +0 -0
  211. sage/structure/coerce.pxd +44 -0
  212. sage/structure/coerce.pyx +2107 -0
  213. sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
  214. sage/structure/coerce_actions.pxd +27 -0
  215. sage/structure/coerce_actions.pyx +988 -0
  216. sage/structure/coerce_dict.cpython-314t-darwin.so +0 -0
  217. sage/structure/coerce_dict.pxd +51 -0
  218. sage/structure/coerce_dict.pyx +1557 -0
  219. sage/structure/coerce_exceptions.py +23 -0
  220. sage/structure/coerce_maps.cpython-314t-darwin.so +0 -0
  221. sage/structure/coerce_maps.pxd +28 -0
  222. sage/structure/coerce_maps.pyx +718 -0
  223. sage/structure/debug_options.cpython-314t-darwin.so +0 -0
  224. sage/structure/debug_options.pxd +6 -0
  225. sage/structure/debug_options.pyx +54 -0
  226. sage/structure/dynamic_class.py +541 -0
  227. sage/structure/element.cpython-314t-darwin.so +0 -0
  228. sage/structure/element.pxd +272 -0
  229. sage/structure/element.pyx +4772 -0
  230. sage/structure/element_wrapper.cpython-314t-darwin.so +0 -0
  231. sage/structure/element_wrapper.pxd +12 -0
  232. sage/structure/element_wrapper.pyx +582 -0
  233. sage/structure/factorization.py +1422 -0
  234. sage/structure/factorization_integer.py +105 -0
  235. sage/structure/factory.cpython-314t-darwin.so +0 -0
  236. sage/structure/factory.pyx +786 -0
  237. sage/structure/formal_sum.py +489 -0
  238. sage/structure/gens_py.py +73 -0
  239. sage/structure/global_options.py +1743 -0
  240. sage/structure/indexed_generators.py +863 -0
  241. sage/structure/list_clone.cpython-314t-darwin.so +0 -0
  242. sage/structure/list_clone.pxd +65 -0
  243. sage/structure/list_clone.pyx +1867 -0
  244. sage/structure/list_clone_demo.cpython-314t-darwin.so +0 -0
  245. sage/structure/list_clone_demo.pyx +248 -0
  246. sage/structure/list_clone_timings.py +179 -0
  247. sage/structure/list_clone_timings_cy.cpython-314t-darwin.so +0 -0
  248. sage/structure/list_clone_timings_cy.pyx +86 -0
  249. sage/structure/mutability.cpython-314t-darwin.so +0 -0
  250. sage/structure/mutability.pxd +21 -0
  251. sage/structure/mutability.pyx +348 -0
  252. sage/structure/nonexact.py +69 -0
  253. sage/structure/parent.cpython-314t-darwin.so +0 -0
  254. sage/structure/parent.pxd +112 -0
  255. sage/structure/parent.pyx +3093 -0
  256. sage/structure/parent_base.cpython-314t-darwin.so +0 -0
  257. sage/structure/parent_base.pxd +13 -0
  258. sage/structure/parent_base.pyx +44 -0
  259. sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
  260. sage/structure/parent_gens.pxd +22 -0
  261. sage/structure/parent_gens.pyx +377 -0
  262. sage/structure/parent_old.cpython-314t-darwin.so +0 -0
  263. sage/structure/parent_old.pxd +25 -0
  264. sage/structure/parent_old.pyx +294 -0
  265. sage/structure/proof/__init__.py +1 -0
  266. sage/structure/proof/all.py +243 -0
  267. sage/structure/proof/proof.py +300 -0
  268. sage/structure/richcmp.cpython-314t-darwin.so +0 -0
  269. sage/structure/richcmp.pxd +213 -0
  270. sage/structure/richcmp.pyx +495 -0
  271. sage/structure/sage_object.cpython-314t-darwin.so +0 -0
  272. sage/structure/sage_object.pxd +3 -0
  273. sage/structure/sage_object.pyx +988 -0
  274. sage/structure/sage_object_test.py +19 -0
  275. sage/structure/sequence.py +937 -0
  276. sage/structure/set_factories.py +1178 -0
  277. sage/structure/set_factories_example.py +527 -0
  278. sage/structure/support_view.py +179 -0
  279. sage/structure/test_factory.py +56 -0
  280. sage/structure/unique_representation.py +1359 -0
@@ -0,0 +1,637 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Specific category classes
4
+
5
+ This is placed in a separate file from categories.py to avoid circular imports
6
+ (as morphisms must be very low in the hierarchy with the new coercion model).
7
+ """
8
+
9
+ #*****************************************************************************
10
+ # Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu> and
11
+ # William Stein <wstein@math.ucsd.edu>
12
+ # 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>
13
+ #
14
+ # Distributed under the terms of the GNU General Public License (GPL)
15
+ # http://www.gnu.org/licenses/
16
+ #*****************************************************************************
17
+
18
+ from sage.categories.category import Category, CategoryWithParameters, JoinCategory
19
+ from sage.misc.lazy_import import lazy_import
20
+ from sage.misc.unknown import Unknown
21
+
22
+ lazy_import('sage.categories.objects', 'Objects')
23
+ lazy_import('sage.misc.latex', 'latex')
24
+
25
+ lazy_import('sage.categories.chain_complexes', 'ChainComplexes',
26
+ deprecation=29917)
27
+
28
+ ####################################################################
29
+ # Different types of categories
30
+ ####################################################################
31
+
32
+ #############################################################
33
+ # Category of elements of some object
34
+ #############################################################
35
+
36
+
37
+ class Elements(Category):
38
+ """
39
+ The category of all elements of a given parent.
40
+
41
+ EXAMPLES::
42
+
43
+ sage: a = IntegerRing()(5)
44
+ sage: C = a.category(); C
45
+ Category of elements of Integer Ring
46
+ sage: a in C
47
+ True
48
+ sage: 2/3 in C
49
+ False
50
+ sage: loads(C.dumps()) == C
51
+ True
52
+ """
53
+ def __init__(self, object):
54
+ """
55
+ EXAMPLES::
56
+
57
+ sage: TestSuite(Elements(ZZ)).run()
58
+ """
59
+ Category.__init__(self)
60
+ self.__object = object
61
+
62
+ @classmethod
63
+ def an_instance(cls):
64
+ """
65
+ Return an instance of this class.
66
+
67
+ EXAMPLES::
68
+
69
+ sage: Elements.an_instance()
70
+ Category of elements of Rational Field
71
+ """
72
+ from sage.rings.rational_field import QQ
73
+ return cls(QQ)
74
+
75
+ def _call_(self, x):
76
+ """
77
+ EXAMPLES::
78
+
79
+ sage: # needs sage.modules
80
+ sage: V = VectorSpace(QQ, 3)
81
+ sage: x = V.0
82
+ sage: C = x.category()
83
+ sage: C
84
+ Category of elements of Vector space of dimension 3 over Rational Field
85
+ sage: w = C([1, 2, 3]); w # indirect doctest
86
+ (1, 2, 3)
87
+ sage: w.category()
88
+ Category of elements of Vector space of dimension 3 over Rational Field
89
+ """
90
+ return self.__object(x)
91
+
92
+ def super_categories(self):
93
+ """
94
+ EXAMPLES::
95
+
96
+ sage: Elements(ZZ).super_categories()
97
+ [Category of objects]
98
+
99
+ .. TODO::
100
+
101
+ Check that this is what we want.
102
+ """
103
+ return [Objects()]
104
+
105
+ def object(self):
106
+ """
107
+ EXAMPLES::
108
+
109
+ sage: Elements(ZZ).object()
110
+ Integer Ring
111
+ """
112
+ return self.__object
113
+
114
+ def __reduce__(self):
115
+ """
116
+ EXAMPLES::
117
+
118
+ sage: C = Elements(ZZ)
119
+ sage: loads(dumps(C)) == C
120
+ True
121
+ """
122
+ return Elements, (self.__object, )
123
+
124
+ def _repr_object_names(self):
125
+ """
126
+ EXAMPLES::
127
+
128
+ sage: Elements(ZZ)._repr_object_names()
129
+ 'elements of Integer Ring'
130
+ """
131
+ return "elements of %s" % self.object()
132
+
133
+ def _latex_(self):
134
+ r"""
135
+ EXAMPLES::
136
+
137
+ sage: V = VectorSpace(QQ, 3) # needs sage.modules
138
+ sage: x = V.0 # needs sage.modules
139
+ sage: latex(x.category()) # indirect doctest # needs sage.modules
140
+ \mathbf{Elt}_{\Bold{Q}^{3}}
141
+ """
142
+ return "\\mathbf{Elt}_{%s}" % latex(self.__object)
143
+
144
+
145
+ #############################################################
146
+ # Category of objects over some base object
147
+ #############################################################
148
+ class Category_over_base(CategoryWithParameters):
149
+ r"""
150
+ A base class for categories over some base object.
151
+
152
+ INPUT:
153
+
154
+ - ``base`` -- a category `C` or an object of such a category
155
+
156
+ Assumption: the classes for the parents, elements, morphisms, of
157
+ ``self`` should only depend on `C`. See :issue:`11935` for details.
158
+
159
+ EXAMPLES::
160
+
161
+ sage: Algebras(GF(2)).element_class is Algebras(GF(3)).element_class
162
+ True
163
+
164
+ sage: C = GF(2).category()
165
+ sage: Algebras(GF(2)).parent_class is Algebras(C).parent_class
166
+ True
167
+
168
+ sage: C = ZZ.category()
169
+ sage: Algebras(ZZ).element_class is Algebras(C).element_class
170
+ True
171
+ """
172
+
173
+ def __init__(self, base, name=None):
174
+ r"""
175
+ Initialize ``self``.
176
+
177
+ The ``name`` parameter is ignored.
178
+
179
+ EXAMPLES::
180
+
181
+ sage: S = Spec(ZZ)
182
+ sage: C = Schemes(S); C
183
+ Category of schemes over Integer Ring
184
+ sage: C.__class__.__init__ == sage.categories.category_types.Category_over_base.__init__
185
+ True
186
+ sage: C.base() is S
187
+ True
188
+ sage: TestSuite(C).run()
189
+ """
190
+ self.__base = base
191
+ Category.__init__(self)
192
+
193
+ def _test_category_over_bases(self, **options):
194
+ """
195
+ Run generic tests on this category with parameters.
196
+
197
+ .. SEEALSO:: :class:`TestSuite`.
198
+
199
+ EXAMPLES::
200
+
201
+ sage: Modules(QQ)._test_category_over_bases()
202
+ """
203
+ tester = self._tester(**options)
204
+ from sage.categories.category_singleton import Category_singleton
205
+ from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
206
+ from .bimodules import Bimodules
207
+ from .schemes import Schemes
208
+ for cat in self.super_categories():
209
+ tester.assertTrue(isinstance(cat, (Category_singleton, Category_over_base,
210
+ CategoryWithAxiom_over_base_ring,
211
+ Bimodules, Schemes)),
212
+ "The super categories of a category over base should"
213
+ " be a category over base (or the related Bimodules)"
214
+ " or a singleton category")
215
+
216
+ def _make_named_class_key(self, name):
217
+ r"""
218
+ Return what the element/parent/... classes depend on.
219
+
220
+ Since :issue:`11935`, the element and parent classes of a
221
+ category over base only depend on the category of the base (or
222
+ the base itself if it is a category).
223
+
224
+ .. SEEALSO::
225
+
226
+ - :meth:`CategoryWithParameters`
227
+ - :meth:`CategoryWithParameters._make_named_class_key`
228
+
229
+ EXAMPLES::
230
+
231
+ sage: Modules(ZZ)._make_named_class_key('element_class')
232
+ Join of Category of Dedekind domains
233
+ and Category of euclidean domains
234
+ and Category of noetherian rings
235
+ and Category of infinite enumerated sets
236
+ and Category of metric spaces
237
+ sage: Modules(QQ)._make_named_class_key('parent_class')
238
+ Join of Category of number fields
239
+ and Category of quotient fields
240
+ and Category of metric spaces
241
+ sage: Schemes(Spec(ZZ))._make_named_class_key('parent_class')
242
+ Category of schemes
243
+ sage: ModularAbelianVarieties(QQ)._make_named_class_key('parent_class')
244
+ Join of Category of number fields
245
+ and Category of quotient fields
246
+ and Category of metric spaces
247
+ sage: Algebras(Fields())._make_named_class_key('morphism_class')
248
+ Category of fields
249
+ """
250
+ if isinstance(self.__base, Category):
251
+ return self.__base
252
+ return self.__base.category()
253
+
254
+ @classmethod
255
+ def an_instance(cls):
256
+ """
257
+ Return an instance of this class.
258
+
259
+ EXAMPLES::
260
+
261
+ sage: Algebras.an_instance()
262
+ Category of algebras over Rational Field
263
+ """
264
+ from sage.rings.rational_field import QQ
265
+ return cls(QQ)
266
+
267
+ def base(self):
268
+ """
269
+ Return the base over which elements of this category are
270
+ defined.
271
+
272
+ EXAMPLES::
273
+
274
+ sage: C = Algebras(QQ)
275
+ sage: C.base()
276
+ Rational Field
277
+ """
278
+ return self.__base
279
+
280
+ def _repr_object_names(self):
281
+ r"""
282
+ Return the name of the objects of this category.
283
+
284
+ .. SEEALSO:: :meth:`Category._repr_object_names`
285
+
286
+ EXAMPLES::
287
+
288
+ sage: Algebras(QQ)._repr_object_names()
289
+ 'algebras over Rational Field'
290
+ sage: Algebras(Fields())._repr_object_names()
291
+ 'algebras over fields'
292
+ sage: Algebras(GF(2).category())._repr_object_names()
293
+ 'algebras over (finite enumerated fields and subquotients of monoids and quotients of semigroups)'
294
+ """
295
+ base = self.__base
296
+ if isinstance(base, Category):
297
+ if isinstance(base, JoinCategory):
298
+ name = '('+' and '.join(C._repr_object_names() for C in base.super_categories())+')'
299
+ else:
300
+ name = base._repr_object_names()
301
+ else:
302
+ name = base
303
+ return Category._repr_object_names(self) + " over %s" % name
304
+
305
+ def _latex_(self):
306
+ r"""
307
+ EXAMPLES::
308
+
309
+ sage: latex(ModulesWithBasis(ZZ))
310
+ \mathbf{ModulesWithBasis}_{\Bold{Z}}
311
+ """
312
+ return "\\mathbf{%s}_{%s}" % (self._label, latex(self.__base))
313
+
314
+ # def construction(self):
315
+ # return (self.__class__, self.__base)
316
+
317
+ # How to deal with HomsetWithBase
318
+ # def _homset(self, X, Y):
319
+ # """
320
+ # Given two objects X and Y in this category, returns the
321
+ # collection of the morphisms of this category between X and Y
322
+ # """
323
+ # assert(X in self and Y in self)
324
+ # from sage.categories.homset import Homset, HomsetWithBase
325
+ # if X._base is not X and X._base is not None: # does this ever fail?
326
+ # return HomsetWithBase(X, Y, self)
327
+ # else:
328
+ # return Homset(X, Y, self)
329
+
330
+ #############################################################
331
+ # Category of objects over some base ring
332
+ #############################################################
333
+
334
+
335
+ class AbelianCategory(Category):
336
+ def is_abelian(self):
337
+ """
338
+ Return ``True`` as ``self`` is an abelian category.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: CommutativeAdditiveGroups().is_abelian()
343
+ True
344
+ """
345
+ return True
346
+
347
+
348
+ class Category_over_base_ring(Category_over_base):
349
+ def __init__(self, base, name=None):
350
+ """
351
+ Initialize ``self``.
352
+
353
+ EXAMPLES::
354
+
355
+ sage: C = Algebras(GF(2)); C
356
+ Category of algebras over Finite Field of size 2
357
+ sage: TestSuite(C).run()
358
+ """
359
+ from sage.categories.rings import Rings
360
+ if not (base in Rings() or
361
+ isinstance(base, Category) and base.is_subcategory(Rings())):
362
+ raise ValueError("base must be a ring or a subcategory of Rings()")
363
+ Category_over_base.__init__(self, base, name)
364
+
365
+ def base_ring(self):
366
+ """
367
+ Return the base ring over which elements of this category are
368
+ defined.
369
+
370
+ EXAMPLES::
371
+
372
+ sage: C = Algebras(GF(2))
373
+ sage: C.base_ring()
374
+ Finite Field of size 2
375
+ """
376
+ return self.base()
377
+
378
+ def _subcategory_hook_(self, C):
379
+ """
380
+ A quick test whether a category ``C`` may be a subcategory of
381
+ this category.
382
+
383
+ INPUT:
384
+
385
+ - ``C`` -- a category (type not tested)
386
+
387
+ OUTPUT:
388
+
389
+ A boolean if it is certain that ``C`` is (or is not) a
390
+ subcategory of ``self``. :obj:`~sage.misc.unknown.Unknown`
391
+ otherwise.
392
+
393
+ EXAMPLES:
394
+
395
+ The answer is ``False`` if the subcategory class of ``C`` is
396
+ not a subclass of the subcategory class of ``self``::
397
+
398
+ sage: Algebras(QQ)._subcategory_hook_(VectorSpaces(QQ))
399
+ False
400
+ sage: VectorSpaces(QQ)._subcategory_hook_(Algebras(ZZ))
401
+ False
402
+
403
+ .. WARNING::
404
+
405
+ This test currently includes some false negatives::
406
+
407
+ sage: VectorSpaces(Fields())._subcategory_hook_(Algebras(Fields().Finite()))
408
+ False
409
+ sage: Modules(Rings())._subcategory_hook_(Modules(GroupAlgebras(Rings())))
410
+ False
411
+
412
+ The answer is ``Unknown`` if ``C`` is not a category over base ring::
413
+
414
+ sage: VectorSpaces(QQ)._subcategory_hook_(VectorSpaces(QQ) & Rings())
415
+ Unknown
416
+
417
+ sage: # needs sage.combinat sage.modules
418
+ sage: Sym = SymmetricFunctions(QQ)
419
+ sage: from sage.combinat.sf.sfa import SymmetricFunctionsBases
420
+ sage: Modules(QQ)._subcategory_hook_(SymmetricFunctionsBases(Sym))
421
+ Unknown
422
+ sage: SymmetricFunctionsBases(Sym).is_subcategory(Modules(QQ))
423
+ True
424
+
425
+ Case 1: the two bases are categories; then the base of ``C``
426
+ shall be a subcategory of the base of ``self``::
427
+
428
+ sage: VectorSpaces(Fields())._subcategory_hook_(Algebras(Fields()))
429
+ True
430
+ sage: VectorSpaces(Fields())._subcategory_hook_(Algebras(Fields().Finite())) # todo: not implemented
431
+ True
432
+ sage: VectorSpaces(Fields().Finite())._subcategory_hook_(Algebras(Fields()))
433
+ False
434
+
435
+ Case 2: the base of ``self`` is a category; then the base of
436
+ ``C`` shall be a parent in this category::
437
+
438
+ sage: VectorSpaces(Fields())._subcategory_hook_(Algebras(QQ)) # todo: not implemented
439
+ True
440
+ sage: VectorSpaces(Fields().Finite())._subcategory_hook_(Algebras(QQ))
441
+ False
442
+
443
+ Case 3: the two bases are parents; then they should coincide::
444
+
445
+ sage: VectorSpaces(QQ)._subcategory_hook_(Algebras(QQ))
446
+ True
447
+ sage: VectorSpaces(CC)._subcategory_hook_(Algebras(QQ)) # base ring in different categories # needs sage.rings.real_mpfr
448
+ False
449
+ sage: VectorSpaces(GF(2))._subcategory_hook_(Algebras(GF(3))) # base ring in the same category
450
+ False
451
+
452
+ Note; we need both previous tests since the distinction is
453
+ made respectively using the parent class or the base ring::
454
+
455
+ sage: issubclass(Algebras(QQ).parent_class, # needs sage.modules
456
+ ....: VectorSpaces(CC).parent_class)
457
+ False
458
+ sage: issubclass(Algebras(GF(2)).parent_class,
459
+ ....: VectorSpaces(GF(3)).parent_class)
460
+ True
461
+
462
+ Check that :issue:`16618` is fixed: this ``_subcategory_hook_``
463
+ method is only valid for :class:`Category_over_base_ring`, not
464
+ :class:`Category_over_base`::
465
+
466
+ sage: # needs sage.groups
467
+ sage: from sage.categories.category_types import Category_over_base
468
+ sage: D = Modules(Rings())
469
+ sage: class Cs(Category_over_base):
470
+ ....: def super_categories(self):
471
+ ....: return [D]
472
+ sage: C = Cs(SymmetricGroup(3))
473
+ sage: C.is_subcategory(D)
474
+ True
475
+ sage: D._subcategory_hook_(C)
476
+ Unknown
477
+ sage: import __main__
478
+ sage: __main__.Cs = Cs # Fake Cs being defined in a python module
479
+ sage: TestSuite(C).run()
480
+ """
481
+ if not issubclass(C.parent_class, self.parent_class):
482
+ return False
483
+ if not isinstance(C, Category_over_base_ring):
484
+ return Unknown
485
+ base_ring = self.base_ring()
486
+ if C.base_ring() is base_ring:
487
+ return True
488
+ if isinstance(base_ring, Category):
489
+ if isinstance(C.base(), Category):
490
+ return C.base().is_subcategory(base_ring)
491
+ # otherwise, C.base() is a parent
492
+ return C.base() in base_ring
493
+ return False
494
+
495
+ def __contains__(self, x):
496
+ """
497
+ Return whether ``x`` is an object of this category.
498
+
499
+ In most cases, ``x`` is an object in this category, if and
500
+ only if the category of ``x`` is a subcategory of ``self``.
501
+ Exception: ``x`` is also an object in this category if ``x``
502
+ is in a category over a base ring category ``C``, and ``self``
503
+ is a category over a base ring in ``C``.
504
+
505
+ This method implements this exception.
506
+
507
+ EXAMPLES::
508
+
509
+ sage: QQ['x'] in Algebras(QQ)
510
+ True
511
+ sage: ZZ['x'] in Algebras(ZZ)
512
+ True
513
+
514
+ We also would want the following to hold::
515
+
516
+ sage: QQ['x'] in Algebras(Fields()) # todo: not implemented
517
+ True
518
+ """
519
+ try:
520
+ # The issubclass test handles extension types or when the
521
+ # category is not fully initialized
522
+ if isinstance(x, self.parent_class) or \
523
+ issubclass(x.category().parent_class, self.parent_class):
524
+ if isinstance(self.base(), Category):
525
+ return True
526
+ else:
527
+ return x.base_ring() is self.base_ring()
528
+ else:
529
+ return super().__contains__(x)
530
+ except AttributeError:
531
+ return False
532
+
533
+
534
+ #############################################################
535
+ # Category of objects in some ambient object
536
+ #############################################################
537
+ class Category_in_ambient(Category):
538
+ def __init__(self, ambient, name=None):
539
+ """
540
+ Initialize ``self``.
541
+
542
+ The parameter ``name`` is ignored.
543
+
544
+ EXAMPLES::
545
+
546
+ sage: C = Ideals(IntegerRing())
547
+ sage: TestSuite(C).run()
548
+ """
549
+ self.__ambient = ambient
550
+ Category.__init__(self)
551
+
552
+ def ambient(self):
553
+ """
554
+ Return the ambient object in which objects of this category are
555
+ embedded.
556
+
557
+ EXAMPLES::
558
+
559
+ sage: C = Ideals(IntegerRing())
560
+ sage: C.ambient()
561
+ Integer Ring
562
+ """
563
+ return self.__ambient
564
+
565
+ def _repr_(self):
566
+ """
567
+ EXAMPLES::
568
+
569
+ sage: Ideals(IntegerRing())
570
+ Category of ring ideals in Integer Ring
571
+ """
572
+ return Category._repr_(self) + " in %s" % self.__ambient
573
+
574
+ # def construction(self):
575
+ # return (self.__class__, self.__ambient)
576
+
577
+
578
+ class Category_module(AbelianCategory, Category_over_base_ring):
579
+ pass
580
+
581
+
582
+ class Category_ideal(Category_in_ambient):
583
+
584
+ @classmethod
585
+ def an_instance(cls):
586
+ """
587
+ Return an instance of this class.
588
+
589
+ EXAMPLES::
590
+
591
+ sage: AlgebraIdeals.an_instance()
592
+ Category of algebra ideals in Univariate Polynomial Ring in x over Rational Field
593
+ """
594
+ from sage.rings.rational_field import QQ
595
+ return cls(QQ['x'])
596
+
597
+ def ring(self):
598
+ """
599
+ Return the ambient ring used to describe objects ``self``.
600
+
601
+ EXAMPLES::
602
+
603
+ sage: C = Ideals(IntegerRing())
604
+ sage: C.ring()
605
+ Integer Ring
606
+ """
607
+ return self.ambient()
608
+
609
+ def __contains__(self, x):
610
+ """
611
+ EXAMPLES::
612
+
613
+ sage: C = Ideals(IntegerRing())
614
+ sage: IntegerRing().zero_ideal() in C
615
+ True
616
+ """
617
+ if super().__contains__(x):
618
+ return True
619
+ from sage.rings.ideal import Ideal_generic
620
+ return isinstance(x, Ideal_generic) and x.ring() == self.ring()
621
+
622
+ def __call__(self, v):
623
+ """
624
+ EXAMPLES::
625
+
626
+ sage: R.<x,y> = ZZ[]
627
+ sage: Ig = [x, y]
628
+ sage: I = R.ideal(Ig)
629
+ sage: C = Ideals(R)
630
+ sage: C(Ig)
631
+ Ideal (x, y) of Multivariate Polynomial Ring in x, y over Integer Ring
632
+ sage: I == C(I)
633
+ True
634
+ """
635
+ if v in self:
636
+ return v
637
+ return self.ring().ideal(v)