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