passagemath-objects 10.8.1a3__cp314-cp314-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 (283) hide show
  1. passagemath_objects/__init__.py +3 -0
  2. passagemath_objects-10.8.1a3.dist-info/DELVEWHEEL +2 -0
  3. passagemath_objects-10.8.1a3.dist-info/METADATA +114 -0
  4. passagemath_objects-10.8.1a3.dist-info/RECORD +283 -0
  5. passagemath_objects-10.8.1a3.dist-info/WHEEL +5 -0
  6. passagemath_objects-10.8.1a3.dist-info/top_level.txt +3 -0
  7. passagemath_objects.libs/libgmp-10-60021eeab4282b29024e43b2b1412b53.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.cp314-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.cp314-win_amd64.pyd +0 -0
  15. sage/arith/power.pxd +31 -0
  16. sage/arith/power.pyx +127 -0
  17. sage/categories/action.cp314-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 +292 -0
  24. sage/categories/category.py +3379 -0
  25. sage/categories/category_cy_helper.cp314-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.cp314-win_amd64.pyd +0 -0
  29. sage/categories/category_singleton.pxd +3 -0
  30. sage/categories/category_singleton.pyx +343 -0
  31. sage/categories/category_types.py +637 -0
  32. sage/categories/category_with_axiom.py +2889 -0
  33. sage/categories/covariant_functorial_construction.py +700 -0
  34. sage/categories/facade_sets.py +228 -0
  35. sage/categories/functor.cp314-win_amd64.pyd +0 -0
  36. sage/categories/functor.pxd +7 -0
  37. sage/categories/functor.pyx +659 -0
  38. sage/categories/homset.py +1289 -0
  39. sage/categories/homsets.py +364 -0
  40. sage/categories/isomorphic_objects.py +73 -0
  41. sage/categories/map.cp314-win_amd64.pyd +0 -0
  42. sage/categories/map.pxd +34 -0
  43. sage/categories/map.pyx +2106 -0
  44. sage/categories/morphism.cp314-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 +1695 -0
  49. sage/categories/pushout.py +4847 -0
  50. sage/categories/quotients.py +64 -0
  51. sage/categories/realizations.py +200 -0
  52. sage/categories/sets_cat.py +3305 -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 +22 -0
  58. sage/cpython/_py2_random.py +619 -0
  59. sage/cpython/all.py +3 -0
  60. sage/cpython/atexit.cp314-win_amd64.pyd +0 -0
  61. sage/cpython/atexit.pyx +269 -0
  62. sage/cpython/builtin_types.cp314-win_amd64.pyd +0 -0
  63. sage/cpython/builtin_types.pyx +7 -0
  64. sage/cpython/cython_metaclass.cp314-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.cp314-win_amd64.pyd +0 -0
  69. sage/cpython/debug.pyx +302 -0
  70. sage/cpython/dict_del_by_value.cp314-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 +80 -0
  74. sage/cpython/getattr.cp314-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.cp314-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.cp314-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.cp314-win_amd64.pyd +0 -0
  98. sage/groups/group.pxd +14 -0
  99. sage/groups/group.pyx +296 -0
  100. sage/groups/old.cp314-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.cp314-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.cp314-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.cp314-win_amd64.pyd +0 -0
  126. sage/misc/cachefunc.pxd +43 -0
  127. sage/misc/cachefunc.pyx +3801 -0
  128. sage/misc/call.py +188 -0
  129. sage/misc/classcall_metaclass.cp314-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.cp314-win_amd64.pyd +0 -0
  133. sage/misc/constant_function.pyx +130 -0
  134. sage/misc/decorators.py +739 -0
  135. sage/misc/fast_methods.cp314-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.cp314-win_amd64.pyd +0 -0
  140. sage/misc/fpickle.pyx +176 -0
  141. sage/misc/function_mangling.cp314-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.cp314-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.cp314-win_amd64.pyd +0 -0
  148. sage/misc/instancedoc.pyx +331 -0
  149. sage/misc/lazy_attribute.cp314-win_amd64.pyd +0 -0
  150. sage/misc/lazy_attribute.pyx +607 -0
  151. sage/misc/lazy_format.py +132 -0
  152. sage/misc/lazy_import.cp314-win_amd64.pyd +0 -0
  153. sage/misc/lazy_import.pxd +13 -0
  154. sage/misc/lazy_import.pyx +1307 -0
  155. sage/misc/lazy_import_cache.py +36 -0
  156. sage/misc/lazy_list.cp314-win_amd64.pyd +0 -0
  157. sage/misc/lazy_list.pxd +19 -0
  158. sage/misc/lazy_list.pyx +1187 -0
  159. sage/misc/lazy_string.cp314-win_amd64.pyd +0 -0
  160. sage/misc/lazy_string.pxd +7 -0
  161. sage/misc/lazy_string.pyx +546 -0
  162. sage/misc/misc.py +980 -0
  163. sage/misc/misc_c.cp314-win_amd64.pyd +0 -0
  164. sage/misc/misc_c.pxd +3 -0
  165. sage/misc/misc_c.pyx +765 -0
  166. sage/misc/namespace_package.py +37 -0
  167. sage/misc/nested_class.cp314-win_amd64.pyd +0 -0
  168. sage/misc/nested_class.pxd +3 -0
  169. sage/misc/nested_class.pyx +394 -0
  170. sage/misc/persist.cp314-win_amd64.pyd +0 -0
  171. sage/misc/persist.pyx +1279 -0
  172. sage/misc/prandom.py +418 -0
  173. sage/misc/randstate.cp314-win_amd64.pyd +0 -0
  174. sage/misc/randstate.pxd +31 -0
  175. sage/misc/randstate.pyx +1096 -0
  176. sage/misc/repr.py +203 -0
  177. sage/misc/reset.cp314-win_amd64.pyd +0 -0
  178. sage/misc/reset.pyx +196 -0
  179. sage/misc/sage_ostools.cp314-win_amd64.pyd +0 -0
  180. sage/misc/sage_ostools.pyx +323 -0
  181. sage/misc/sage_timeit.py +275 -0
  182. sage/misc/sage_timeit_class.cp314-win_amd64.pyd +0 -0
  183. sage/misc/sage_timeit_class.pyx +120 -0
  184. sage/misc/sage_unittest.py +639 -0
  185. sage/misc/sageinspect.py +2792 -0
  186. sage/misc/session.cp314-win_amd64.pyd +0 -0
  187. sage/misc/session.pyx +392 -0
  188. sage/misc/superseded.py +576 -0
  189. sage/misc/test_nested_class.py +228 -0
  190. sage/misc/timing.py +264 -0
  191. sage/misc/unknown.py +222 -0
  192. sage/misc/verbose.py +253 -0
  193. sage/misc/weak_dict.cp314-win_amd64.pyd +0 -0
  194. sage/misc/weak_dict.pxd +15 -0
  195. sage/misc/weak_dict.pyx +1197 -0
  196. sage/modules/all__sagemath_objects.py +1 -0
  197. sage/modules/module.cp314-win_amd64.pyd +0 -0
  198. sage/modules/module.pxd +5 -0
  199. sage/modules/module.pyx +329 -0
  200. sage/rings/all__sagemath_objects.py +3 -0
  201. sage/rings/integer_fake.h +22 -0
  202. sage/rings/integer_fake.pxd +55 -0
  203. sage/rings/integer_fake.pyi +8 -0
  204. sage/sets/all__sagemath_objects.py +3 -0
  205. sage/sets/pythonclass.cp314-win_amd64.pyd +0 -0
  206. sage/sets/pythonclass.pxd +9 -0
  207. sage/sets/pythonclass.pyx +247 -0
  208. sage/structure/__init__.py +13 -0
  209. sage/structure/all.py +30 -0
  210. sage/structure/category_object.cp314-win_amd64.pyd +0 -0
  211. sage/structure/category_object.pxd +28 -0
  212. sage/structure/category_object.pyx +1090 -0
  213. sage/structure/coerce.cp314-win_amd64.pyd +0 -0
  214. sage/structure/coerce.pxd +44 -0
  215. sage/structure/coerce.pyx +2113 -0
  216. sage/structure/coerce_actions.cp314-win_amd64.pyd +0 -0
  217. sage/structure/coerce_actions.pxd +27 -0
  218. sage/structure/coerce_actions.pyx +988 -0
  219. sage/structure/coerce_dict.cp314-win_amd64.pyd +0 -0
  220. sage/structure/coerce_dict.pxd +51 -0
  221. sage/structure/coerce_dict.pyx +1557 -0
  222. sage/structure/coerce_exceptions.py +23 -0
  223. sage/structure/coerce_maps.cp314-win_amd64.pyd +0 -0
  224. sage/structure/coerce_maps.pxd +24 -0
  225. sage/structure/coerce_maps.pyx +656 -0
  226. sage/structure/debug_options.cp314-win_amd64.pyd +0 -0
  227. sage/structure/debug_options.pxd +6 -0
  228. sage/structure/debug_options.pyx +54 -0
  229. sage/structure/dynamic_class.py +541 -0
  230. sage/structure/element.cp314-win_amd64.pyd +0 -0
  231. sage/structure/element.pxd +271 -0
  232. sage/structure/element.pyx +4584 -0
  233. sage/structure/element_wrapper.cp314-win_amd64.pyd +0 -0
  234. sage/structure/element_wrapper.pxd +12 -0
  235. sage/structure/element_wrapper.pyx +582 -0
  236. sage/structure/factorization.py +1457 -0
  237. sage/structure/factorization_integer.py +154 -0
  238. sage/structure/factory.cp314-win_amd64.pyd +0 -0
  239. sage/structure/factory.pyx +863 -0
  240. sage/structure/formal_sum.py +489 -0
  241. sage/structure/gens_py.py +73 -0
  242. sage/structure/global_options.py +1725 -0
  243. sage/structure/indexed_generators.py +863 -0
  244. sage/structure/list_clone.cp314-win_amd64.pyd +0 -0
  245. sage/structure/list_clone.pxd +65 -0
  246. sage/structure/list_clone.pyx +1867 -0
  247. sage/structure/list_clone_demo.cp314-win_amd64.pyd +0 -0
  248. sage/structure/list_clone_demo.pyx +248 -0
  249. sage/structure/list_clone_timings.py +179 -0
  250. sage/structure/list_clone_timings_cy.cp314-win_amd64.pyd +0 -0
  251. sage/structure/list_clone_timings_cy.pyx +86 -0
  252. sage/structure/mutability.cp314-win_amd64.pyd +0 -0
  253. sage/structure/mutability.pxd +21 -0
  254. sage/structure/mutability.pyx +346 -0
  255. sage/structure/nonexact.py +69 -0
  256. sage/structure/parent.cp314-win_amd64.pyd +0 -0
  257. sage/structure/parent.pxd +112 -0
  258. sage/structure/parent.pyx +3087 -0
  259. sage/structure/parent_base.cp314-win_amd64.pyd +0 -0
  260. sage/structure/parent_base.pxd +13 -0
  261. sage/structure/parent_base.pyx +35 -0
  262. sage/structure/parent_gens.cp314-win_amd64.pyd +0 -0
  263. sage/structure/parent_gens.pxd +22 -0
  264. sage/structure/parent_gens.pyx +374 -0
  265. sage/structure/parent_old.cp314-win_amd64.pyd +0 -0
  266. sage/structure/parent_old.pxd +24 -0
  267. sage/structure/parent_old.pyx +278 -0
  268. sage/structure/proof/__init__.py +1 -0
  269. sage/structure/proof/all.py +243 -0
  270. sage/structure/proof/proof.py +300 -0
  271. sage/structure/richcmp.cp314-win_amd64.pyd +0 -0
  272. sage/structure/richcmp.pxd +212 -0
  273. sage/structure/richcmp.pyx +494 -0
  274. sage/structure/sage_object.cp314-win_amd64.pyd +0 -0
  275. sage/structure/sage_object.pxd +3 -0
  276. sage/structure/sage_object.pyx +1088 -0
  277. sage/structure/sage_object_test.py +19 -0
  278. sage/structure/sequence.py +937 -0
  279. sage/structure/set_factories.py +1178 -0
  280. sage/structure/set_factories_example.py +527 -0
  281. sage/structure/support_view.py +164 -0
  282. sage/structure/test_factory.py +56 -0
  283. sage/structure/unique_representation.py +1443 -0
@@ -0,0 +1,659 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Functors
4
+
5
+ AUTHORS:
6
+
7
+ - David Kohel and William Stein
8
+
9
+ - David Joyner (2005-12-17): examples
10
+
11
+ - Robert Bradshaw (2007-06-23): Pyrexify
12
+
13
+ - Simon King (2010-04-30): more examples, several bug fixes,
14
+ re-implementation of the default call method,
15
+ making functors applicable to morphisms (not only to objects)
16
+
17
+ - Simon King (2010-12): Pickling of functors without losing domain and codomain
18
+ """
19
+
20
+ # ****************************************************************************
21
+ # Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu> and
22
+ # William Stein <wstein@math.ucsd.edu>
23
+ #
24
+ # Distributed under the terms of the GNU General Public License (GPL)
25
+ #
26
+ # This code is distributed in the hope that it will be useful,
27
+ # but WITHOUT ANY WARRANTY; without even the implied warranty
28
+ # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
29
+ #
30
+ # See the GNU General Public License for more details; the full text
31
+ # is available at:
32
+ #
33
+ # https://www.gnu.org/licenses/
34
+ # ****************************************************************************
35
+
36
+ from sage.categories import category
37
+
38
+
39
+ def _Functor_unpickle(Cl, D, domain, codomain):
40
+ """
41
+ Generic unpickling function for functors.
42
+
43
+ AUTHOR:
44
+
45
+ - Simon King (2010-12): :issue:`10460`
46
+
47
+ EXAMPLES::
48
+
49
+ sage: # needs sage.modules
50
+ sage: R.<x,y> = InfinitePolynomialRing(QQ)
51
+ sage: F = R.construction()[0]
52
+ sage: F == loads(dumps(F))
53
+ True
54
+ sage: F.domain(), loads(dumps(F)).domain()
55
+ (Category of rings, Category of rings)
56
+ """
57
+ F = Functor.__new__(Cl)
58
+ Functor.__init__(F, domain, codomain)
59
+ for s, v in D:
60
+ setattr(F, s, v)
61
+ return F
62
+
63
+
64
+ cdef class Functor(SageObject):
65
+ """
66
+ A class for functors between two categories.
67
+
68
+ NOTE:
69
+
70
+ - In the first place, a functor is given by its domain and codomain,
71
+ which are both categories.
72
+ - When defining a sub-class, the user should not implement a call method.
73
+ Instead, one should implement three methods, which are composed in the
74
+ default call method:
75
+
76
+ - ``_coerce_into_domain(self, x)`` -- return an object of ``self``'s
77
+ domain, corresponding to ``x``, or raise a :exc:`TypeError`.
78
+ - Default: Raise :exc:`TypeError` if ``x`` is not in ``self``'s domain.
79
+
80
+ - ``_apply_functor(self, x)`` -- apply ``self`` to an object ``x`` of
81
+ ``self``'s domain.
82
+ - Default: Conversion into ``self``'s codomain.
83
+
84
+ - ``_apply_functor_to_morphism(self, f)`` -- apply ``self`` to a morphism
85
+ ``f`` in ``self``'s domain.
86
+ - Default: Return ``self(f.domain()).hom(f,self(f.codomain()))``.
87
+
88
+ EXAMPLES::
89
+
90
+ sage: rings = Rings()
91
+ sage: abgrps = CommutativeAdditiveGroups()
92
+ sage: F = ForgetfulFunctor(rings, abgrps)
93
+ sage: F.domain()
94
+ Category of rings
95
+ sage: F.codomain()
96
+ Category of commutative additive groups
97
+ sage: from sage.categories.functor import Functor
98
+ sage: isinstance(F, Functor)
99
+ True
100
+ sage: I = IdentityFunctor(abgrps)
101
+ sage: I
102
+ The identity functor on Category of commutative additive groups
103
+ sage: I.domain()
104
+ Category of commutative additive groups
105
+ sage: isinstance(I, Functor)
106
+ True
107
+
108
+ Note that by default, an instance of the class Functor is coercion
109
+ from the domain into the codomain. The above subclasses overloaded
110
+ this behaviour. Here we illustrate the default::
111
+
112
+ sage: from sage.categories.functor import Functor
113
+ sage: F = Functor(Rings(), Fields())
114
+ sage: F
115
+ Functor from Category of rings to Category of fields
116
+ sage: F(ZZ)
117
+ Rational Field
118
+ sage: F(GF(2))
119
+ Finite Field of size 2
120
+
121
+ Functors are not only about the objects of a category, but also about
122
+ their morphisms. We illustrate it, again, with the coercion functor
123
+ from rings to fields.
124
+
125
+ ::
126
+
127
+ sage: R1.<x> = ZZ[]
128
+ sage: R2.<a,b> = QQ[]
129
+ sage: f = R1.hom([a + b], R2)
130
+ sage: f
131
+ Ring morphism:
132
+ From: Univariate Polynomial Ring in x over Integer Ring
133
+ To: Multivariate Polynomial Ring in a, b over Rational Field
134
+ Defn: x |--> a + b
135
+ sage: F(f) # needs sage.libs.singular
136
+ Ring morphism:
137
+ From: Fraction Field of Univariate Polynomial Ring in x over Integer Ring
138
+ To: Fraction Field of Multivariate Polynomial Ring in a, b over Rational Field
139
+ Defn: x |--> a + b
140
+ sage: F(f)(1/x) # needs sage.libs.singular
141
+ 1/(a + b)
142
+
143
+ We can also apply a polynomial ring construction functor to our homomorphism. The
144
+ result is a homomorphism that is defined on the base ring::
145
+
146
+ sage: F = QQ['t'].construction()[0]
147
+ sage: F
148
+ Poly[t]
149
+ sage: F(f)
150
+ Ring morphism:
151
+ From: Univariate Polynomial Ring in t
152
+ over Univariate Polynomial Ring in x over Integer Ring
153
+ To: Univariate Polynomial Ring in t
154
+ over Multivariate Polynomial Ring in a, b over Rational Field
155
+ Defn: Induced from base ring by
156
+ Ring morphism:
157
+ From: Univariate Polynomial Ring in x over Integer Ring
158
+ To: Multivariate Polynomial Ring in a, b over Rational Field
159
+ Defn: x |--> a + b
160
+ sage: p = R1['t']('(-x^2 + x)*t^2 + (x^2 - x)*t - 4*x^2 - x + 1')
161
+ sage: F(f)(p)
162
+ (-a^2 - 2*a*b - b^2 + a + b)*t^2 + (a^2 + 2*a*b + b^2 - a - b)*t
163
+ - 4*a^2 - 8*a*b - 4*b^2 - a - b + 1
164
+ """
165
+ def __init__(self, domain, codomain):
166
+ """
167
+ TESTS::
168
+
169
+ sage: from sage.categories.functor import Functor
170
+ sage: F = Functor(Rings(), Fields())
171
+ sage: F
172
+ Functor from Category of rings to Category of fields
173
+ sage: F(ZZ)
174
+ Rational Field
175
+ sage: F(GF(2))
176
+ Finite Field of size 2
177
+ """
178
+ if not isinstance(domain, category.Category):
179
+ raise TypeError("domain (=%s) must be a category" % domain)
180
+ if not isinstance(codomain, category.Category):
181
+ raise TypeError("codomain (=%s) must be a category" % codomain)
182
+ self.__domain = domain
183
+ self.__codomain = codomain
184
+
185
+ def __hash__(self):
186
+ r"""
187
+ TESTS::
188
+
189
+ sage: from sage.categories.functor import Functor
190
+ sage: F = Functor(Rings(), Fields())
191
+ sage: hash(F) # random
192
+ 42
193
+ """
194
+ return hash(self.__domain) ^ hash(self.__codomain)
195
+
196
+ def __reduce__(self):
197
+ """
198
+ Generic pickling of functors.
199
+
200
+ AUTHOR:
201
+
202
+ - Simon King (2010-12): :issue:`10460`
203
+
204
+ TESTS::
205
+
206
+ sage: from sage.categories.pushout import CompositeConstructionFunctor
207
+ sage: F = CompositeConstructionFunctor(QQ.construction()[0],ZZ['x'].construction()[0],QQ.construction()[0],ZZ['y'].construction()[0])
208
+ sage: F == loads(dumps(F))
209
+ True
210
+ sage: F.codomain()
211
+ Category of rings
212
+ """
213
+ return (_Functor_unpickle,
214
+ (self.__class__, list(self.__dict__.items()),
215
+ self.__domain, self.__codomain))
216
+
217
+ def _apply_functor(self, x):
218
+ """
219
+ Apply the functor to an object of ``self``'s domain.
220
+
221
+ NOTE:
222
+
223
+ Each subclass of :class:`Functor` should overload this method. By default,
224
+ this method coerces into the codomain, without checking whether the
225
+ argument belongs to the domain.
226
+
227
+ TESTS::
228
+
229
+ sage: from sage.categories.functor import Functor
230
+ sage: F = Functor(FiniteFields(), Fields())
231
+ sage: F._apply_functor(ZZ)
232
+ Rational Field
233
+ """
234
+ return self.__codomain(x)
235
+
236
+ def _apply_functor_to_morphism(self, f):
237
+ """
238
+ Apply the functor to a morphism between two objects of ``self``'s domain.
239
+
240
+ NOTE:
241
+
242
+ Each subclass of :class:`Functor` should overload this method. By
243
+ default, this method coerces into the codomain, without checking
244
+ whether the argument belongs to the domain.
245
+
246
+ TESTS::
247
+
248
+ sage: # needs sage.rings.finite_rings
249
+ sage: from sage.categories.functor import Functor
250
+ sage: F = Functor(Rings(), Fields())
251
+ sage: k.<a> = GF(25)
252
+ sage: f = k.hom([-a - 4])
253
+ sage: R.<t> = k[]
254
+ sage: fR = R.hom(f, R)
255
+ sage: fF = F(fR) # indirect doctest
256
+ sage: fF
257
+ Ring endomorphism of Fraction Field of
258
+ Univariate Polynomial Ring in t over Finite Field in a of size 5^2
259
+ Defn: Induced from base ring by
260
+ Ring endomorphism of Univariate Polynomial Ring in t
261
+ over Finite Field in a of size 5^2
262
+ Defn: Induced from base ring by
263
+ Ring endomorphism of Finite Field in a of size 5^2
264
+ Defn: a |--> 4*a + 1
265
+ sage: fF((a^2+a)*t^2/(a*t - a^2))
266
+ ((4*a + 2)*t^2)/(t + a + 4)
267
+ """
268
+ try:
269
+ return self(f.domain()).hom(f, self(f.codomain()))
270
+ except Exception:
271
+ raise TypeError(f'unable to transform {f} into a morphism in {self.codomain()}')
272
+
273
+ def _coerce_into_domain(self, x):
274
+ """
275
+ Interpret the argument as an object of ``self``'s domain.
276
+
277
+ NOTE:
278
+
279
+ A subclass of :class:`Functor` may overload this method. It should
280
+ return an object of ``self``'s domain, and should raise a
281
+ :exc:`TypeError` if this is impossible.
282
+
283
+ By default, the argument will not be changed, but a
284
+ :exc:`TypeError` will be raised if the argument does not
285
+ belong to the domain.
286
+
287
+ TESTS::
288
+
289
+ sage: from sage.categories.functor import Functor
290
+ sage: F = Functor(Fields(),Fields())
291
+ sage: F(QQ)
292
+ Rational Field
293
+ sage: F(ZZ) # indirect doctest
294
+ Traceback (most recent call last):
295
+ ...
296
+ TypeError: x (=Integer Ring) is not in Category of fields
297
+ """
298
+ if x not in self.__domain:
299
+ raise TypeError("x (=%s) is not in %s" % (x, self.__domain))
300
+ return x
301
+
302
+ def _repr_(self) -> str:
303
+ """
304
+ TESTS::
305
+
306
+ sage: from sage.categories.functor import Functor
307
+ sage: F = Functor(Rings(),Fields())
308
+ sage: F #indirect doctest
309
+ Functor from Category of rings to Category of fields
310
+
311
+ A functor can be renamed if its type is a Python class
312
+ (see :issue:`16156`)::
313
+
314
+ sage: I = IdentityFunctor(Rings()); I
315
+ The identity functor on Category of rings
316
+ sage: I.rename('Id'); I
317
+ Id
318
+ """
319
+ return "Functor from %s to %s" % (self.__domain, self.__codomain)
320
+
321
+ def __call__(self, x):
322
+ """
323
+ NOTE:
324
+
325
+ Implement _coerce_into_domain, _apply_functor and
326
+ _apply_functor_to_morphism when subclassing Functor.
327
+
328
+ TESTS:
329
+
330
+ The default::
331
+
332
+ sage: from sage.categories.functor import Functor
333
+ sage: F = Functor(Rings(),Fields())
334
+ sage: F
335
+ Functor from Category of rings to Category of fields
336
+ sage: F(ZZ)
337
+ Rational Field
338
+ sage: F(GF(2))
339
+ Finite Field of size 2
340
+
341
+ Two subclasses::
342
+
343
+ sage: F1 = ForgetfulFunctor(FiniteFields(), Fields())
344
+ sage: F1(GF(5)) # indirect doctest
345
+ Finite Field of size 5
346
+ sage: F1(ZZ)
347
+ Traceback (most recent call last):
348
+ ...
349
+ TypeError: x (=Integer Ring) is not in Category of finite enumerated fields
350
+ sage: F2 = IdentityFunctor(Fields())
351
+ sage: F2(RR) is RR #indirect doctest
352
+ True
353
+ sage: F2(ZZ['x','y'])
354
+ Traceback (most recent call last):
355
+ ...
356
+ TypeError: x (=Multivariate Polynomial Ring in x, y over Integer Ring)
357
+ is not in Category of fields
358
+
359
+ The last example shows that it is tested whether the result of
360
+ applying the functor lies in the functor's codomain. Note that
361
+ the matrix functor used to be defined similar to this example,
362
+ which was fixed in :issue:`8807`::
363
+
364
+ sage: class IllFunctor(Functor):
365
+ ....: def __init__(self, m, n):
366
+ ....: self._m = m
367
+ ....: self._n = n
368
+ ....: Functor.__init__(self, Rings(), Rings())
369
+ ....: def _apply_functor(self, R):
370
+ ....: return MatrixSpace(R, self._m, self._n)
371
+ sage: F = IllFunctor(2, 2)
372
+ sage: F(QQ) # needs sage.modules
373
+ Full MatrixSpace of 2 by 2 dense matrices over Rational Field
374
+ sage: F = IllFunctor(2, 3)
375
+ sage: F(QQ) # needs sage.modules
376
+ Traceback (most recent call last):
377
+ ...
378
+ TypeError: Functor from Category of rings to Category of rings
379
+ is ill-defined, since it sends x (=Rational Field) to something
380
+ that is not in Category of rings.
381
+ """
382
+ from sage.categories.morphism import Morphism
383
+ if isinstance(x, Morphism):
384
+ return self._apply_functor_to_morphism(x)
385
+ y = self._apply_functor(self._coerce_into_domain(x))
386
+ if not ((y in self.__codomain) or (y in self.__codomain.Homsets())):
387
+ raise TypeError("%s is ill-defined, since it sends x (=%s) to something that is not in %s." % (repr(self), x, self.__codomain))
388
+ return y
389
+
390
+ def domain(self):
391
+ """
392
+ The domain of ``self``.
393
+
394
+ EXAMPLES::
395
+
396
+ sage: F = ForgetfulFunctor(FiniteFields(), Fields())
397
+ sage: F.domain()
398
+ Category of finite enumerated fields
399
+ """
400
+ return self.__domain
401
+
402
+ def codomain(self):
403
+ """
404
+ The codomain of ``self``.
405
+
406
+ EXAMPLES::
407
+
408
+ sage: F = ForgetfulFunctor(FiniteFields(), Fields())
409
+ sage: F.codomain()
410
+ Category of fields
411
+ """
412
+ return self.__codomain
413
+
414
+
415
+ ###########################################
416
+ # The natural functors in Sage
417
+ ###########################################
418
+
419
+ class ForgetfulFunctor_generic(Functor):
420
+ """
421
+ The forgetful functor, i.e., embedding of a subcategory.
422
+
423
+ NOTE:
424
+
425
+ Forgetful functors should be created using :func:`ForgetfulFunctor`,
426
+ since the init method of this class does not check whether the
427
+ domain is a subcategory of the codomain.
428
+
429
+ EXAMPLES::
430
+
431
+ sage: F = ForgetfulFunctor(FiniteFields(), Fields()) # indirect doctest
432
+ sage: F
433
+ The forgetful functor
434
+ from Category of finite enumerated fields
435
+ to Category of fields
436
+ sage: F(GF(3))
437
+ Finite Field of size 3
438
+ """
439
+ def __reduce__(self):
440
+ """
441
+ EXAMPLES::
442
+
443
+ sage: F = ForgetfulFunctor(Groups(), Sets())
444
+ sage: loads(F.dumps()) == F
445
+ True
446
+ """
447
+ return ForgetfulFunctor, (self.domain(), self.codomain())
448
+
449
+ def _repr_(self):
450
+ """
451
+ TESTS::
452
+
453
+ sage: F = ForgetfulFunctor(FiniteFields(), Fields())
454
+ sage: F # indirect doctest
455
+ The forgetful functor from Category of finite enumerated fields
456
+ to Category of fields
457
+ """
458
+ return "The forgetful functor from %s to %s" % (self.domain(),
459
+ self.codomain())
460
+
461
+ def __eq__(self, other):
462
+ """
463
+ NOTE:
464
+
465
+ It is tested whether the second argument belongs to the class
466
+ of forgetful functors and has the same domain and codomain as
467
+ ``self``. If the second argument is a functor of a different class
468
+ but happens to be a forgetful functor, both arguments will
469
+ still be considered as being *different*.
470
+
471
+ TESTS::
472
+
473
+ sage: F1 = ForgetfulFunctor(FiniteFields(), Fields())
474
+
475
+ This is to test against a bug occurring in a previous version
476
+ (see :issue:`8800`)::
477
+
478
+ sage: F1 == QQ #indirect doctest
479
+ False
480
+
481
+ We now compare with the fraction field functor, that has a
482
+ different domain::
483
+
484
+ sage: F2 = QQ.construction()[0]
485
+ sage: F1 == F2 #indirect doctest
486
+ False
487
+ """
488
+ from sage.categories.pushout import IdentityConstructionFunctor
489
+ if not isinstance(other, (self.__class__, IdentityConstructionFunctor)):
490
+ return False
491
+ return (self.domain() == other.domain() and
492
+ self.codomain() == other.codomain())
493
+
494
+ def __ne__(self, other):
495
+ """
496
+ Return whether ``self`` is not equal to ``other``.
497
+
498
+ EXAMPLES::
499
+
500
+ sage: F1 = ForgetfulFunctor(FiniteFields(), Fields())
501
+ sage: F1 != F1
502
+ False
503
+ sage: F1 != QQ
504
+ True
505
+ """
506
+ return not self == other
507
+
508
+
509
+ class IdentityFunctor_generic(ForgetfulFunctor_generic):
510
+ """
511
+ Generic identity functor on any category.
512
+
513
+ NOTE:
514
+
515
+ This usually is created using :func:`IdentityFunctor`.
516
+
517
+ EXAMPLES::
518
+
519
+ sage: F = IdentityFunctor(Fields()) #indirect doctest
520
+ sage: F
521
+ The identity functor on Category of fields
522
+ sage: F(RR) is RR
523
+ True
524
+ sage: F(ZZ)
525
+ Traceback (most recent call last):
526
+ ...
527
+ TypeError: x (=Integer Ring) is not in Category of fields
528
+
529
+ TESTS::
530
+
531
+ sage: R = IdentityFunctor(Rings())
532
+ sage: P, _ = QQ['t'].construction()
533
+ sage: R == P
534
+ False
535
+ sage: P == R
536
+ False
537
+ sage: R == QQ
538
+ False
539
+ """
540
+ def __init__(self, C):
541
+ """
542
+ TESTS::
543
+
544
+ sage: from sage.categories.functor import IdentityFunctor_generic
545
+ sage: F = IdentityFunctor_generic(Groups())
546
+ sage: F == IdentityFunctor(Groups())
547
+ True
548
+ sage: F
549
+ The identity functor on Category of groups
550
+ """
551
+ ForgetfulFunctor_generic.__init__(self, C, C)
552
+
553
+ def __reduce__(self):
554
+ """
555
+ EXAMPLES::
556
+
557
+ sage: F = IdentityFunctor(Groups())
558
+ sage: loads(F.dumps()) == F
559
+ True
560
+ """
561
+ return IdentityFunctor, (self.domain(), )
562
+
563
+ def _repr_(self):
564
+ """
565
+ TESTS::
566
+
567
+ sage: fields = Fields()
568
+ sage: F = IdentityFunctor(fields)
569
+ sage: F #indirect doctest
570
+ The identity functor on Category of fields
571
+ """
572
+ return "The identity functor on %s" % (self.domain())
573
+
574
+ def _apply_functor(self, x):
575
+ """
576
+ Apply the functor to an object of ``self``'s domain.
577
+
578
+ TESTS::
579
+
580
+ sage: fields = Fields()
581
+ sage: F = IdentityFunctor(fields)
582
+ sage: F._apply_functor(QQ)
583
+ Rational Field
584
+
585
+ It is not tested here whether the argument belongs to the domain
586
+ (this test is done in the default method ``_coerce_into_domain``)::
587
+
588
+ sage: F._apply_functor(ZZ)
589
+ Integer Ring
590
+ """
591
+ return x
592
+
593
+
594
+ def IdentityFunctor(C):
595
+ """
596
+ Construct the identity functor of the given category.
597
+
598
+ INPUT:
599
+
600
+ - ``C`` -- a category
601
+
602
+ OUTPUT: the identity functor in ``C``
603
+
604
+ EXAMPLES::
605
+
606
+ sage: rings = Rings()
607
+ sage: F = IdentityFunctor(rings)
608
+ sage: F(ZZ['x','y']) is ZZ['x','y']
609
+ True
610
+ """
611
+ return IdentityFunctor_generic(C)
612
+
613
+
614
+ def ForgetfulFunctor(domain, codomain):
615
+ """
616
+ Construct the forgetful function from one category to another.
617
+
618
+ INPUT:
619
+
620
+ - ``C``, ``D`` -- two categories
621
+
622
+ OUTPUT:
623
+
624
+ A functor that returns the corresponding object of ``D`` for
625
+ any element of ``C``, by forgetting the extra structure.
626
+
627
+ ASSUMPTION:
628
+
629
+ The category ``C`` must be a sub-category of ``D``.
630
+
631
+ EXAMPLES::
632
+
633
+ sage: rings = Rings()
634
+ sage: abgrps = CommutativeAdditiveGroups()
635
+ sage: F = ForgetfulFunctor(rings, abgrps)
636
+ sage: F
637
+ The forgetful functor
638
+ from Category of rings
639
+ to Category of commutative additive groups
640
+
641
+ It would be a mistake to call it in opposite order::
642
+
643
+ sage: F = ForgetfulFunctor(abgrps, rings)
644
+ Traceback (most recent call last):
645
+ ...
646
+ ValueError: Forgetful functor not supported for domain
647
+ Category of commutative additive groups
648
+
649
+ If both categories are equal, the forgetful functor is the same as the
650
+ identity functor::
651
+
652
+ sage: ForgetfulFunctor(abgrps, abgrps) == IdentityFunctor(abgrps)
653
+ True
654
+ """
655
+ if domain == codomain:
656
+ return IdentityFunctor(domain)
657
+ if not domain.is_subcategory(codomain):
658
+ raise ValueError("Forgetful functor not supported for domain %s" % domain)
659
+ return ForgetfulFunctor_generic(domain, codomain)