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.
- passagemath_objects/__init__.py +3 -0
- passagemath_objects-10.6.41.dist-info/DELVEWHEEL +2 -0
- passagemath_objects-10.6.41.dist-info/METADATA +115 -0
- passagemath_objects-10.6.41.dist-info/RECORD +281 -0
- passagemath_objects-10.6.41.dist-info/WHEEL +5 -0
- passagemath_objects-10.6.41.dist-info/top_level.txt +3 -0
- passagemath_objects.libs/libgmp-10-79b4110c7ea2b760f16cfef97e8a8a34.dll +0 -0
- sage/all__sagemath_objects.py +46 -0
- sage/arith/all__sagemath_objects.py +5 -0
- sage/arith/long.pxd +411 -0
- sage/arith/numerical_approx.cp312-win_amd64.pyd +0 -0
- sage/arith/numerical_approx.pxd +35 -0
- sage/arith/numerical_approx.pyx +75 -0
- sage/arith/power.cp312-win_amd64.pyd +0 -0
- sage/arith/power.pxd +31 -0
- sage/arith/power.pyx +127 -0
- sage/categories/action.cp312-win_amd64.pyd +0 -0
- sage/categories/action.pxd +29 -0
- sage/categories/action.pyx +641 -0
- sage/categories/algebra_functor.py +745 -0
- sage/categories/all__sagemath_objects.py +33 -0
- sage/categories/basic.py +71 -0
- sage/categories/cartesian_product.py +295 -0
- sage/categories/category.py +3401 -0
- sage/categories/category_cy_helper.cp312-win_amd64.pyd +0 -0
- sage/categories/category_cy_helper.pxd +8 -0
- sage/categories/category_cy_helper.pyx +322 -0
- sage/categories/category_singleton.cp312-win_amd64.pyd +0 -0
- sage/categories/category_singleton.pxd +3 -0
- sage/categories/category_singleton.pyx +342 -0
- sage/categories/category_types.py +637 -0
- sage/categories/category_with_axiom.py +2885 -0
- sage/categories/covariant_functorial_construction.py +703 -0
- sage/categories/facade_sets.py +228 -0
- sage/categories/functor.cp312-win_amd64.pyd +0 -0
- sage/categories/functor.pxd +7 -0
- sage/categories/functor.pyx +691 -0
- sage/categories/homset.py +1338 -0
- sage/categories/homsets.py +364 -0
- sage/categories/isomorphic_objects.py +73 -0
- sage/categories/map.cp312-win_amd64.pyd +0 -0
- sage/categories/map.pxd +34 -0
- sage/categories/map.pyx +2112 -0
- sage/categories/morphism.cp312-win_amd64.pyd +0 -0
- sage/categories/morphism.pxd +14 -0
- sage/categories/morphism.pyx +895 -0
- sage/categories/objects.py +167 -0
- sage/categories/primer.py +1696 -0
- sage/categories/pushout.py +4834 -0
- sage/categories/quotients.py +64 -0
- sage/categories/realizations.py +200 -0
- sage/categories/sets_cat.py +3228 -0
- sage/categories/sets_with_partial_maps.py +52 -0
- sage/categories/subobjects.py +64 -0
- sage/categories/subquotients.py +21 -0
- sage/categories/with_realizations.py +311 -0
- sage/cpython/__init__.py +28 -0
- sage/cpython/_py2_random.py +619 -0
- sage/cpython/all.py +3 -0
- sage/cpython/atexit.cp312-win_amd64.pyd +0 -0
- sage/cpython/atexit.pyx +269 -0
- sage/cpython/builtin_types.cp312-win_amd64.pyd +0 -0
- sage/cpython/builtin_types.pyx +7 -0
- sage/cpython/cython_metaclass.cp312-win_amd64.pyd +0 -0
- sage/cpython/cython_metaclass.h +117 -0
- sage/cpython/cython_metaclass.pxd +3 -0
- sage/cpython/cython_metaclass.pyx +130 -0
- sage/cpython/debug.cp312-win_amd64.pyd +0 -0
- sage/cpython/debug.pyx +302 -0
- sage/cpython/dict_del_by_value.cp312-win_amd64.pyd +0 -0
- sage/cpython/dict_del_by_value.pxd +9 -0
- sage/cpython/dict_del_by_value.pyx +191 -0
- sage/cpython/dict_internal.h +245 -0
- sage/cpython/getattr.cp312-win_amd64.pyd +0 -0
- sage/cpython/getattr.pxd +9 -0
- sage/cpython/getattr.pyx +439 -0
- sage/cpython/pycore_long.h +97 -0
- sage/cpython/pycore_long.pxd +10 -0
- sage/cpython/python_debug.h +44 -0
- sage/cpython/python_debug.pxd +47 -0
- sage/cpython/pyx_visit.h +13 -0
- sage/cpython/string.cp312-win_amd64.pyd +0 -0
- sage/cpython/string.pxd +76 -0
- sage/cpython/string.pyx +34 -0
- sage/cpython/string_impl.h +60 -0
- sage/cpython/type.cp312-win_amd64.pyd +0 -0
- sage/cpython/type.pxd +2 -0
- sage/cpython/type.pyx +40 -0
- sage/cpython/wrapperdescr.pxd +67 -0
- sage/ext/all__sagemath_objects.py +3 -0
- sage/ext/ccobject.h +64 -0
- sage/ext/cplusplus.pxd +17 -0
- sage/ext/mod_int.h +30 -0
- sage/ext/mod_int.pxd +24 -0
- sage/ext/stdsage.pxd +39 -0
- sage/groups/all__sagemath_objects.py +1 -0
- sage/groups/group.cp312-win_amd64.pyd +0 -0
- sage/groups/group.pxd +14 -0
- sage/groups/group.pyx +322 -0
- sage/groups/old.cp312-win_amd64.pyd +0 -0
- sage/groups/old.pxd +14 -0
- sage/groups/old.pyx +219 -0
- sage/libs/all__sagemath_objects.py +3 -0
- sage/libs/gmp/__init__.py +1 -0
- sage/libs/gmp/all.pxd +6 -0
- sage/libs/gmp/binop.pxd +23 -0
- sage/libs/gmp/misc.pxd +8 -0
- sage/libs/gmp/mpf.pxd +88 -0
- sage/libs/gmp/mpn.pxd +57 -0
- sage/libs/gmp/mpq.pxd +57 -0
- sage/libs/gmp/mpz.pxd +202 -0
- sage/libs/gmp/pylong.cp312-win_amd64.pyd +0 -0
- sage/libs/gmp/pylong.pxd +12 -0
- sage/libs/gmp/pylong.pyx +150 -0
- sage/libs/gmp/random.pxd +25 -0
- sage/libs/gmp/randomize.pxd +59 -0
- sage/libs/gmp/types.pxd +53 -0
- sage/libs/gmpxx.pxd +19 -0
- sage/misc/abstract_method.py +276 -0
- sage/misc/all__sagemath_objects.py +43 -0
- sage/misc/bindable_class.py +253 -0
- sage/misc/c3_controlled.cp312-win_amd64.pyd +0 -0
- sage/misc/c3_controlled.pxd +2 -0
- sage/misc/c3_controlled.pyx +1402 -0
- sage/misc/cachefunc.cp312-win_amd64.pyd +0 -0
- sage/misc/cachefunc.pxd +43 -0
- sage/misc/cachefunc.pyx +3781 -0
- sage/misc/call.py +188 -0
- sage/misc/classcall_metaclass.cp312-win_amd64.pyd +0 -0
- sage/misc/classcall_metaclass.pxd +14 -0
- sage/misc/classcall_metaclass.pyx +599 -0
- sage/misc/constant_function.cp312-win_amd64.pyd +0 -0
- sage/misc/constant_function.pyx +130 -0
- sage/misc/decorators.py +747 -0
- sage/misc/fast_methods.cp312-win_amd64.pyd +0 -0
- sage/misc/fast_methods.pxd +20 -0
- sage/misc/fast_methods.pyx +351 -0
- sage/misc/flatten.py +90 -0
- sage/misc/fpickle.cp312-win_amd64.pyd +0 -0
- sage/misc/fpickle.pyx +177 -0
- sage/misc/function_mangling.cp312-win_amd64.pyd +0 -0
- sage/misc/function_mangling.pxd +11 -0
- sage/misc/function_mangling.pyx +308 -0
- sage/misc/inherit_comparison.cp312-win_amd64.pyd +0 -0
- sage/misc/inherit_comparison.pxd +5 -0
- sage/misc/inherit_comparison.pyx +105 -0
- sage/misc/instancedoc.cp312-win_amd64.pyd +0 -0
- sage/misc/instancedoc.pyx +331 -0
- sage/misc/lazy_attribute.cp312-win_amd64.pyd +0 -0
- sage/misc/lazy_attribute.pyx +607 -0
- sage/misc/lazy_format.py +135 -0
- sage/misc/lazy_import.cp312-win_amd64.pyd +0 -0
- sage/misc/lazy_import.pyx +1299 -0
- sage/misc/lazy_import_cache.py +36 -0
- sage/misc/lazy_list.cp312-win_amd64.pyd +0 -0
- sage/misc/lazy_list.pxd +19 -0
- sage/misc/lazy_list.pyx +1187 -0
- sage/misc/lazy_string.cp312-win_amd64.pyd +0 -0
- sage/misc/lazy_string.pxd +7 -0
- sage/misc/lazy_string.pyx +546 -0
- sage/misc/misc.py +1066 -0
- sage/misc/misc_c.cp312-win_amd64.pyd +0 -0
- sage/misc/misc_c.pxd +3 -0
- sage/misc/misc_c.pyx +766 -0
- sage/misc/namespace_package.py +37 -0
- sage/misc/nested_class.cp312-win_amd64.pyd +0 -0
- sage/misc/nested_class.pxd +3 -0
- sage/misc/nested_class.pyx +394 -0
- sage/misc/persist.cp312-win_amd64.pyd +0 -0
- sage/misc/persist.pyx +1251 -0
- sage/misc/prandom.py +418 -0
- sage/misc/randstate.cp312-win_amd64.pyd +0 -0
- sage/misc/randstate.pxd +30 -0
- sage/misc/randstate.pyx +1059 -0
- sage/misc/repr.py +203 -0
- sage/misc/reset.cp312-win_amd64.pyd +0 -0
- sage/misc/reset.pyx +196 -0
- sage/misc/sage_ostools.cp312-win_amd64.pyd +0 -0
- sage/misc/sage_ostools.pyx +323 -0
- sage/misc/sage_timeit.py +276 -0
- sage/misc/sage_timeit_class.cp312-win_amd64.pyd +0 -0
- sage/misc/sage_timeit_class.pyx +120 -0
- sage/misc/sage_unittest.py +637 -0
- sage/misc/sageinspect.py +2768 -0
- sage/misc/session.cp312-win_amd64.pyd +0 -0
- sage/misc/session.pyx +392 -0
- sage/misc/superseded.py +557 -0
- sage/misc/test_nested_class.py +228 -0
- sage/misc/timing.py +264 -0
- sage/misc/unknown.py +222 -0
- sage/misc/verbose.py +253 -0
- sage/misc/weak_dict.cp312-win_amd64.pyd +0 -0
- sage/misc/weak_dict.pxd +15 -0
- sage/misc/weak_dict.pyx +1231 -0
- sage/modules/all__sagemath_objects.py +1 -0
- sage/modules/module.cp312-win_amd64.pyd +0 -0
- sage/modules/module.pxd +5 -0
- sage/modules/module.pyx +329 -0
- sage/rings/all__sagemath_objects.py +3 -0
- sage/rings/integer_fake.h +22 -0
- sage/rings/integer_fake.pxd +55 -0
- sage/sets/all__sagemath_objects.py +3 -0
- sage/sets/pythonclass.cp312-win_amd64.pyd +0 -0
- sage/sets/pythonclass.pxd +9 -0
- sage/sets/pythonclass.pyx +247 -0
- sage/structure/__init__.py +13 -0
- sage/structure/all.py +30 -0
- sage/structure/category_object.cp312-win_amd64.pyd +0 -0
- sage/structure/category_object.pxd +28 -0
- sage/structure/category_object.pyx +1087 -0
- sage/structure/coerce.cp312-win_amd64.pyd +0 -0
- sage/structure/coerce.pxd +44 -0
- sage/structure/coerce.pyx +2107 -0
- sage/structure/coerce_actions.cp312-win_amd64.pyd +0 -0
- sage/structure/coerce_actions.pxd +27 -0
- sage/structure/coerce_actions.pyx +988 -0
- sage/structure/coerce_dict.cp312-win_amd64.pyd +0 -0
- sage/structure/coerce_dict.pxd +51 -0
- sage/structure/coerce_dict.pyx +1557 -0
- sage/structure/coerce_exceptions.py +23 -0
- sage/structure/coerce_maps.cp312-win_amd64.pyd +0 -0
- sage/structure/coerce_maps.pxd +28 -0
- sage/structure/coerce_maps.pyx +718 -0
- sage/structure/debug_options.cp312-win_amd64.pyd +0 -0
- sage/structure/debug_options.pxd +6 -0
- sage/structure/debug_options.pyx +54 -0
- sage/structure/dynamic_class.py +541 -0
- sage/structure/element.cp312-win_amd64.pyd +0 -0
- sage/structure/element.pxd +272 -0
- sage/structure/element.pyx +4772 -0
- sage/structure/element_wrapper.cp312-win_amd64.pyd +0 -0
- sage/structure/element_wrapper.pxd +12 -0
- sage/structure/element_wrapper.pyx +582 -0
- sage/structure/factorization.py +1422 -0
- sage/structure/factorization_integer.py +105 -0
- sage/structure/factory.cp312-win_amd64.pyd +0 -0
- sage/structure/factory.pyx +786 -0
- sage/structure/formal_sum.py +489 -0
- sage/structure/gens_py.py +73 -0
- sage/structure/global_options.py +1743 -0
- sage/structure/indexed_generators.py +863 -0
- sage/structure/list_clone.cp312-win_amd64.pyd +0 -0
- sage/structure/list_clone.pxd +65 -0
- sage/structure/list_clone.pyx +1867 -0
- sage/structure/list_clone_demo.cp312-win_amd64.pyd +0 -0
- sage/structure/list_clone_demo.pyx +248 -0
- sage/structure/list_clone_timings.py +179 -0
- sage/structure/list_clone_timings_cy.cp312-win_amd64.pyd +0 -0
- sage/structure/list_clone_timings_cy.pyx +86 -0
- sage/structure/mutability.cp312-win_amd64.pyd +0 -0
- sage/structure/mutability.pxd +21 -0
- sage/structure/mutability.pyx +348 -0
- sage/structure/nonexact.py +69 -0
- sage/structure/parent.cp312-win_amd64.pyd +0 -0
- sage/structure/parent.pxd +112 -0
- sage/structure/parent.pyx +3093 -0
- sage/structure/parent_base.cp312-win_amd64.pyd +0 -0
- sage/structure/parent_base.pxd +13 -0
- sage/structure/parent_base.pyx +44 -0
- sage/structure/parent_gens.cp312-win_amd64.pyd +0 -0
- sage/structure/parent_gens.pxd +22 -0
- sage/structure/parent_gens.pyx +377 -0
- sage/structure/parent_old.cp312-win_amd64.pyd +0 -0
- sage/structure/parent_old.pxd +25 -0
- sage/structure/parent_old.pyx +294 -0
- sage/structure/proof/__init__.py +1 -0
- sage/structure/proof/all.py +243 -0
- sage/structure/proof/proof.py +300 -0
- sage/structure/richcmp.cp312-win_amd64.pyd +0 -0
- sage/structure/richcmp.pxd +213 -0
- sage/structure/richcmp.pyx +495 -0
- sage/structure/sage_object.cp312-win_amd64.pyd +0 -0
- sage/structure/sage_object.pxd +3 -0
- sage/structure/sage_object.pyx +988 -0
- sage/structure/sage_object_test.py +19 -0
- sage/structure/sequence.py +937 -0
- sage/structure/set_factories.py +1178 -0
- sage/structure/set_factories_example.py +527 -0
- sage/structure/support_view.py +179 -0
- sage/structure/test_factory.py +56 -0
- 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)
|