passagemath-objects 10.6.46__cp314-cp314t-macosx_13_0_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/.dylibs/libgmp.10.dylib +0 -0
- passagemath_objects/__init__.py +3 -0
- passagemath_objects-10.6.46.dist-info/METADATA +115 -0
- passagemath_objects-10.6.46.dist-info/RECORD +280 -0
- passagemath_objects-10.6.46.dist-info/WHEEL +6 -0
- passagemath_objects-10.6.46.dist-info/top_level.txt +3 -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-314t-darwin.so +0 -0
- sage/arith/numerical_approx.pxd +35 -0
- sage/arith/numerical_approx.pyx +75 -0
- sage/arith/power.cpython-314t-darwin.so +0 -0
- sage/arith/power.pxd +31 -0
- sage/arith/power.pyx +127 -0
- sage/categories/action.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/categories/category_cy_helper.pxd +8 -0
- sage/categories/category_cy_helper.pyx +322 -0
- sage/categories/category_singleton.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/categories/map.pxd +34 -0
- sage/categories/map.pyx +2106 -0
- sage/categories/morphism.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/cpython/atexit.pyx +269 -0
- sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
- sage/cpython/builtin_types.pyx +7 -0
- sage/cpython/cython_metaclass.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/cpython/debug.pyx +302 -0
- sage/cpython/dict_del_by_value.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/groups/group.pxd +14 -0
- sage/groups/group.pyx +322 -0
- sage/groups/old.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/misc/c3_controlled.pxd +2 -0
- sage/misc/c3_controlled.pyx +1402 -0
- sage/misc/cachefunc.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/misc/classcall_metaclass.pxd +14 -0
- sage/misc/classcall_metaclass.pyx +599 -0
- sage/misc/constant_function.cpython-314t-darwin.so +0 -0
- sage/misc/constant_function.pyx +130 -0
- sage/misc/decorators.py +747 -0
- sage/misc/fast_methods.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/misc/fpickle.pyx +177 -0
- sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
- sage/misc/function_mangling.pxd +11 -0
- sage/misc/function_mangling.pyx +308 -0
- sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
- sage/misc/inherit_comparison.pxd +5 -0
- sage/misc/inherit_comparison.pyx +105 -0
- sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
- sage/misc/instancedoc.pyx +331 -0
- sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_attribute.pyx +607 -0
- sage/misc/lazy_format.py +135 -0
- sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_import.pyx +1299 -0
- sage/misc/lazy_import_cache.py +36 -0
- sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
- sage/misc/lazy_list.pxd +19 -0
- sage/misc/lazy_list.pyx +1187 -0
- sage/misc/lazy_string.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/misc/nested_class.pxd +3 -0
- sage/misc/nested_class.pyx +394 -0
- sage/misc/persist.cpython-314t-darwin.so +0 -0
- sage/misc/persist.pyx +1251 -0
- sage/misc/prandom.py +418 -0
- sage/misc/randstate.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/misc/reset.pyx +196 -0
- sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
- sage/misc/sage_ostools.pyx +323 -0
- sage/misc/sage_timeit.py +275 -0
- sage/misc/sage_timeit_class.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.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-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/category_object.pxd +28 -0
- sage/structure/category_object.pyx +1087 -0
- sage/structure/coerce.cpython-314t-darwin.so +0 -0
- sage/structure/coerce.pxd +44 -0
- sage/structure/coerce.pyx +2107 -0
- sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
- sage/structure/coerce_actions.pxd +27 -0
- sage/structure/coerce_actions.pyx +988 -0
- sage/structure/coerce_dict.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/coerce_maps.pxd +28 -0
- sage/structure/coerce_maps.pyx +718 -0
- sage/structure/debug_options.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/element.pxd +272 -0
- sage/structure/element.pyx +4772 -0
- sage/structure/element_wrapper.cpython-314t-darwin.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-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/list_clone.pxd +65 -0
- sage/structure/list_clone.pyx +1867 -0
- sage/structure/list_clone_demo.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/list_clone_timings_cy.pyx +86 -0
- sage/structure/mutability.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/parent.pxd +112 -0
- sage/structure/parent.pyx +3093 -0
- sage/structure/parent_base.cpython-314t-darwin.so +0 -0
- sage/structure/parent_base.pxd +13 -0
- sage/structure/parent_base.pyx +44 -0
- sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
- sage/structure/parent_gens.pxd +22 -0
- sage/structure/parent_gens.pyx +377 -0
- sage/structure/parent_old.cpython-314t-darwin.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-314t-darwin.so +0 -0
- sage/structure/richcmp.pxd +213 -0
- sage/structure/richcmp.pyx +495 -0
- sage/structure/sage_object.cpython-314t-darwin.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
sage/libs/gmp/types.pxd
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
from libc.stdio cimport FILE
|
|
3
|
+
|
|
4
|
+
cdef extern from "gmp.h":
|
|
5
|
+
# GMP's configuration of how many bits are stuffed into a limb
|
|
6
|
+
cdef unsigned int GMP_LIMB_BITS
|
|
7
|
+
cdef int mp_bits_per_limb
|
|
8
|
+
|
|
9
|
+
# Underlying typedefs
|
|
10
|
+
ctypedef unsigned long mp_limb_t
|
|
11
|
+
ctypedef long mp_limb_signed_t
|
|
12
|
+
ctypedef unsigned long mp_bitcnt_t
|
|
13
|
+
ctypedef long mp_size_t
|
|
14
|
+
ctypedef long mp_exp_t
|
|
15
|
+
|
|
16
|
+
ctypedef mp_limb_t* mp_ptr
|
|
17
|
+
ctypedef mp_limb_t* mp_srcptr
|
|
18
|
+
|
|
19
|
+
# This internal structure is not guaranteed to stay the same with
|
|
20
|
+
# future releases of GMP or MPIR.
|
|
21
|
+
ctypedef struct __mpz_struct:
|
|
22
|
+
int _mp_alloc
|
|
23
|
+
int _mp_size
|
|
24
|
+
mp_ptr _mp_d
|
|
25
|
+
|
|
26
|
+
ctypedef struct __mpq_struct:
|
|
27
|
+
__mpz_struct _mp_num
|
|
28
|
+
__mpz_struct _mp_den
|
|
29
|
+
|
|
30
|
+
ctypedef struct __mpf_struct:
|
|
31
|
+
int _mp_prec
|
|
32
|
+
int _mp_size
|
|
33
|
+
mp_exp_t _mp_exp
|
|
34
|
+
mp_limb_t *_mp_d
|
|
35
|
+
|
|
36
|
+
ctypedef struct __gmp_randstate_struct:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
# User facing types
|
|
40
|
+
ctypedef __mpz_struct mpz_t[1]
|
|
41
|
+
ctypedef __mpq_struct mpq_t[1]
|
|
42
|
+
ctypedef __mpf_struct mpf_t[1]
|
|
43
|
+
ctypedef __gmp_randstate_struct gmp_randstate_t[1]
|
|
44
|
+
|
|
45
|
+
ctypedef __mpz_struct *mpz_ptr
|
|
46
|
+
ctypedef __mpq_struct *mpq_ptr
|
|
47
|
+
ctypedef __mpf_struct *mpf_ptr
|
|
48
|
+
ctypedef __mpz_struct *mpz_srcptr
|
|
49
|
+
ctypedef __mpq_struct *mpq_srcptr
|
|
50
|
+
ctypedef __mpf_struct *mpf_srcptr
|
|
51
|
+
|
|
52
|
+
# Cython doesn't want to take the address of an mpz_t
|
|
53
|
+
cdef mpz_t* address_of_mpz "&"(mpz_t x)
|
sage/libs/gmpxx.pxd
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
# distutils: language = c++
|
|
3
|
+
# distutils: libraries = gmpxx gmp
|
|
4
|
+
|
|
5
|
+
from sage.libs.gmp.types cimport mpz_t, mpq_t
|
|
6
|
+
|
|
7
|
+
cdef extern from 'gmpxx.h':
|
|
8
|
+
cdef cppclass mpz_class:
|
|
9
|
+
mpz_class()
|
|
10
|
+
mpz_class(int i)
|
|
11
|
+
mpz_class(mpz_t z)
|
|
12
|
+
mpz_class(mpz_class)
|
|
13
|
+
mpz_t get_mpz_t()
|
|
14
|
+
mpz_class operator % (mpz_class, mpz_class)
|
|
15
|
+
|
|
16
|
+
cdef cppclass mpq_class:
|
|
17
|
+
mpq_class()
|
|
18
|
+
mpz_t get_num_mpz_t()
|
|
19
|
+
mpz_t get_den_mpz_t()
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
"""
|
|
3
|
+
Abstract methods
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2008 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# ****************************************************************************
|
|
11
|
+
|
|
12
|
+
import types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def abstract_method(f=None, optional=False):
|
|
16
|
+
r"""
|
|
17
|
+
Abstract methods.
|
|
18
|
+
|
|
19
|
+
INPUT:
|
|
20
|
+
|
|
21
|
+
- ``f`` -- a function
|
|
22
|
+
- ``optional`` -- boolean (default: ``False``)
|
|
23
|
+
|
|
24
|
+
The decorator :obj:`abstract_method` can be used to declare
|
|
25
|
+
methods that should be implemented by all concrete derived
|
|
26
|
+
classes. This declaration should typically include documentation
|
|
27
|
+
for the specification for this method.
|
|
28
|
+
|
|
29
|
+
The purpose is to enforce a consistent and visual syntax for such
|
|
30
|
+
declarations. It is used by the Sage categories for automated
|
|
31
|
+
tests (see ``Sets.Parent.test_not_implemented``).
|
|
32
|
+
|
|
33
|
+
EXAMPLES:
|
|
34
|
+
|
|
35
|
+
We create a class with an abstract method::
|
|
36
|
+
|
|
37
|
+
sage: class A():
|
|
38
|
+
....:
|
|
39
|
+
....: @abstract_method
|
|
40
|
+
....: def my_method(self):
|
|
41
|
+
....: '''
|
|
42
|
+
....: The method :meth:`my_method` computes my_method
|
|
43
|
+
....:
|
|
44
|
+
....: EXAMPLES::
|
|
45
|
+
....:
|
|
46
|
+
....: '''
|
|
47
|
+
....: pass
|
|
48
|
+
|
|
49
|
+
sage: A.my_method
|
|
50
|
+
<abstract method my_method at ...>
|
|
51
|
+
|
|
52
|
+
The current policy is that a :exc:`NotImplementedError` is raised
|
|
53
|
+
when accessing the method through an instance, even before the
|
|
54
|
+
method is called::
|
|
55
|
+
|
|
56
|
+
sage: x = A()
|
|
57
|
+
sage: x.my_method
|
|
58
|
+
Traceback (most recent call last):
|
|
59
|
+
...
|
|
60
|
+
NotImplementedError: <abstract method my_method at ...>
|
|
61
|
+
|
|
62
|
+
It is also possible to mark abstract methods as optional::
|
|
63
|
+
|
|
64
|
+
sage: class A():
|
|
65
|
+
....:
|
|
66
|
+
....: @abstract_method(optional = True)
|
|
67
|
+
....: def my_method(self):
|
|
68
|
+
....: '''
|
|
69
|
+
....: The method :meth:`my_method` computes my_method
|
|
70
|
+
....:
|
|
71
|
+
....: EXAMPLES::
|
|
72
|
+
....:
|
|
73
|
+
....: '''
|
|
74
|
+
....: pass
|
|
75
|
+
|
|
76
|
+
sage: A.my_method
|
|
77
|
+
<optional abstract method my_method at ...>
|
|
78
|
+
|
|
79
|
+
sage: x = A()
|
|
80
|
+
sage: x.my_method
|
|
81
|
+
NotImplemented
|
|
82
|
+
|
|
83
|
+
The official mantra for testing whether an optional abstract
|
|
84
|
+
method is implemented is::
|
|
85
|
+
|
|
86
|
+
sage: if x.my_method is not NotImplemented:
|
|
87
|
+
....: x.my_method()
|
|
88
|
+
....: else:
|
|
89
|
+
....: print("x.my_method is not available.")
|
|
90
|
+
x.my_method is not available.
|
|
91
|
+
|
|
92
|
+
.. rubric:: Discussion
|
|
93
|
+
|
|
94
|
+
The policy details are not yet fixed. The purpose of this first
|
|
95
|
+
implementation is to let developers experiment with it and give
|
|
96
|
+
feedback on what's most practical.
|
|
97
|
+
|
|
98
|
+
The advantage of the current policy is that attempts at using a
|
|
99
|
+
non implemented methods are caught as early as possible. On the
|
|
100
|
+
other hand, one cannot use introspection directly to fetch the
|
|
101
|
+
documentation::
|
|
102
|
+
|
|
103
|
+
sage: x.my_method? # todo: not implemented
|
|
104
|
+
|
|
105
|
+
Instead one needs to do::
|
|
106
|
+
|
|
107
|
+
sage: A._my_method? # todo: not implemented
|
|
108
|
+
|
|
109
|
+
This could probably be fixed in :mod:`sage.misc.sageinspect`.
|
|
110
|
+
|
|
111
|
+
.. TODO:: what should be the recommended mantra for existence testing from the class?
|
|
112
|
+
|
|
113
|
+
.. TODO::
|
|
114
|
+
|
|
115
|
+
should extra information appear in the output? The name of the
|
|
116
|
+
class? That of the super class where the abstract method is
|
|
117
|
+
defined?
|
|
118
|
+
|
|
119
|
+
.. TODO:: look for similar decorators on the web, and merge
|
|
120
|
+
|
|
121
|
+
.. rubric:: Implementation details
|
|
122
|
+
|
|
123
|
+
Technically, an abstract_method is a non-data descriptor (see
|
|
124
|
+
Invoking Descriptors in the Python reference manual).
|
|
125
|
+
|
|
126
|
+
The syntax ``@abstract_method`` w.r.t. @abstract_method(optional = True)
|
|
127
|
+
is achieved by a little trick which we test here::
|
|
128
|
+
|
|
129
|
+
sage: abstract_method(optional = True)
|
|
130
|
+
<function abstract_method.<locals>.<lambda> at ...>
|
|
131
|
+
sage: abstract_method(optional = True)(version)
|
|
132
|
+
<optional abstract method version at ...>
|
|
133
|
+
sage: abstract_method(version, optional = True)
|
|
134
|
+
<optional abstract method version at ...>
|
|
135
|
+
"""
|
|
136
|
+
if f is None:
|
|
137
|
+
return lambda f: AbstractMethod(f, optional=optional)
|
|
138
|
+
else:
|
|
139
|
+
return AbstractMethod(f, optional)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class AbstractMethod:
|
|
143
|
+
def __init__(self, f, optional=False):
|
|
144
|
+
"""
|
|
145
|
+
Constructor for abstract methods.
|
|
146
|
+
|
|
147
|
+
EXAMPLES::
|
|
148
|
+
|
|
149
|
+
sage: def f(x):
|
|
150
|
+
....: "doc of f"
|
|
151
|
+
....: return 1
|
|
152
|
+
sage: x = abstract_method(f); x
|
|
153
|
+
<abstract method f at ...>
|
|
154
|
+
sage: x.__doc__
|
|
155
|
+
'doc of f'
|
|
156
|
+
sage: x.__name__
|
|
157
|
+
'f'
|
|
158
|
+
sage: x.__module__
|
|
159
|
+
'__main__'
|
|
160
|
+
"""
|
|
161
|
+
assert (isinstance(f, types.FunctionType) or
|
|
162
|
+
getattr(type(f), '__name__', None) == 'cython_function_or_method')
|
|
163
|
+
assert isinstance(optional, bool)
|
|
164
|
+
self._f = f
|
|
165
|
+
self._optional = optional
|
|
166
|
+
self.__doc__ = f.__doc__
|
|
167
|
+
self.__name__ = f.__name__
|
|
168
|
+
try:
|
|
169
|
+
self.__module__ = f.__module__
|
|
170
|
+
except AttributeError:
|
|
171
|
+
pass
|
|
172
|
+
|
|
173
|
+
def __repr__(self):
|
|
174
|
+
"""
|
|
175
|
+
EXAMPLES::
|
|
176
|
+
|
|
177
|
+
sage: abstract_method(version)
|
|
178
|
+
<abstract method version at ...>
|
|
179
|
+
|
|
180
|
+
sage: abstract_method(version, optional = True)
|
|
181
|
+
<optional abstract method version at ...>
|
|
182
|
+
"""
|
|
183
|
+
return "<" + ("optional " if self._optional else "") + "abstract method %s at %s>" % (self.__name__, hex(id(self._f)))
|
|
184
|
+
|
|
185
|
+
def _sage_src_lines_(self):
|
|
186
|
+
r"""
|
|
187
|
+
Return the source code location for the wrapped function.
|
|
188
|
+
|
|
189
|
+
EXAMPLES::
|
|
190
|
+
|
|
191
|
+
sage: from sage.misc.sageinspect import sage_getsourcelines
|
|
192
|
+
sage: g = abstract_method(version)
|
|
193
|
+
sage: (src, lines) = sage_getsourcelines(g)
|
|
194
|
+
sage: src[0]
|
|
195
|
+
'def version():\n'
|
|
196
|
+
sage: lines
|
|
197
|
+
20
|
|
198
|
+
"""
|
|
199
|
+
from sage.misc.sageinspect import sage_getsourcelines
|
|
200
|
+
return sage_getsourcelines(self._f)
|
|
201
|
+
|
|
202
|
+
def __get__(self, instance, cls):
|
|
203
|
+
"""
|
|
204
|
+
Implement the attribute access protocol.
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: class A: pass
|
|
209
|
+
sage: def f(x): return 1
|
|
210
|
+
sage: f = abstract_method(f)
|
|
211
|
+
sage: f.__get__(A(), A)
|
|
212
|
+
Traceback (most recent call last):
|
|
213
|
+
...
|
|
214
|
+
NotImplementedError: <abstract method f at ...>
|
|
215
|
+
"""
|
|
216
|
+
if instance is None:
|
|
217
|
+
return self
|
|
218
|
+
elif self._optional:
|
|
219
|
+
return NotImplemented
|
|
220
|
+
else:
|
|
221
|
+
raise NotImplementedError(repr(self))
|
|
222
|
+
|
|
223
|
+
def is_optional(self):
|
|
224
|
+
"""
|
|
225
|
+
Return whether an abstract method is optional or not.
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: class AbstractClass:
|
|
230
|
+
....: @abstract_method
|
|
231
|
+
....: def required(): pass
|
|
232
|
+
....:
|
|
233
|
+
....: @abstract_method(optional = True)
|
|
234
|
+
....: def optional(): pass
|
|
235
|
+
sage: AbstractClass.required.is_optional()
|
|
236
|
+
False
|
|
237
|
+
sage: AbstractClass.optional.is_optional()
|
|
238
|
+
True
|
|
239
|
+
"""
|
|
240
|
+
return self._optional
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def abstract_methods_of_class(cls):
|
|
244
|
+
"""
|
|
245
|
+
Return the required and optional abstract methods of the class.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: class AbstractClass:
|
|
250
|
+
....: @abstract_method
|
|
251
|
+
....: def required1(): pass
|
|
252
|
+
....:
|
|
253
|
+
....: @abstract_method(optional = True)
|
|
254
|
+
....: def optional2(): pass
|
|
255
|
+
....:
|
|
256
|
+
....: @abstract_method(optional = True)
|
|
257
|
+
....: def optional1(): pass
|
|
258
|
+
....:
|
|
259
|
+
....: @abstract_method
|
|
260
|
+
....: def required2(): pass
|
|
261
|
+
|
|
262
|
+
sage: sage.misc.abstract_method.abstract_methods_of_class(AbstractClass)
|
|
263
|
+
{'optional': ['optional1', 'optional2'],
|
|
264
|
+
'required': ['required1', 'required2']}
|
|
265
|
+
"""
|
|
266
|
+
result = {"required": [],
|
|
267
|
+
"optional": []}
|
|
268
|
+
for name in dir(cls):
|
|
269
|
+
entry = getattr(cls, name)
|
|
270
|
+
if not isinstance(entry, AbstractMethod):
|
|
271
|
+
continue
|
|
272
|
+
if entry.is_optional():
|
|
273
|
+
result["optional"].append(name)
|
|
274
|
+
else:
|
|
275
|
+
result["required"].append(name)
|
|
276
|
+
return result
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
# Subset of sage.misc.all that is made available by the sage-objects distribution
|
|
3
|
+
|
|
4
|
+
import sage.structure.all # to break a cyclic import
|
|
5
|
+
|
|
6
|
+
from sage.misc.lazy_attribute import lazy_attribute, lazy_class_attribute
|
|
7
|
+
from sage.misc.lazy_import import lazy_import
|
|
8
|
+
|
|
9
|
+
from sage.misc.verbose import (set_verbose, set_verbose_files,
|
|
10
|
+
get_verbose_files, unset_verbose_files, get_verbose)
|
|
11
|
+
lazy_import('sage.misc.verbose', 'verbose',
|
|
12
|
+
deprecation=17815)
|
|
13
|
+
from sage.misc.call import attrcall
|
|
14
|
+
|
|
15
|
+
from sage.misc.misc_c import prod, running_total, balanced_sum
|
|
16
|
+
mul = prod
|
|
17
|
+
add = sum
|
|
18
|
+
|
|
19
|
+
from sage.misc.repr import repr_lincomb
|
|
20
|
+
|
|
21
|
+
from sage.misc.flatten import flatten
|
|
22
|
+
|
|
23
|
+
from sage.misc.persist import save, load, dumps, loads, db, db_save
|
|
24
|
+
|
|
25
|
+
from sage.misc.constant_function import ConstantFunction
|
|
26
|
+
|
|
27
|
+
from sage.misc.sage_unittest import TestSuite
|
|
28
|
+
|
|
29
|
+
from sage.misc.decorators import specialize, sage_wraps, infix_operator
|
|
30
|
+
|
|
31
|
+
from sage.misc.unknown import Unknown, UnknownError
|
|
32
|
+
|
|
33
|
+
from sage.misc.cachefunc import CachedFunction, cached_function, cached_method, cached_in_parent_method, disk_cached_function
|
|
34
|
+
|
|
35
|
+
from sage.misc.abstract_method import abstract_method
|
|
36
|
+
|
|
37
|
+
from sage.misc.timing import walltime, cputime
|
|
38
|
+
|
|
39
|
+
from sage.misc.randstate import seed, set_random_seed, initial_seed, current_randstate
|
|
40
|
+
from sage.misc.prandom import *
|
|
41
|
+
from sage.misc.sage_timeit_class import timeit
|
|
42
|
+
from sage.misc.session import load_session, save_session, show_identifiers
|
|
43
|
+
from sage.misc.reset import reset, restore
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-objects
|
|
2
|
+
"""
|
|
3
|
+
Bindable classes
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2012 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
# https://www.gnu.org/licenses/
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
import functools
|
|
15
|
+
from sage.misc.nested_class import NestedClassMetaclass
|
|
16
|
+
from sage.misc.classcall_metaclass import ClasscallMetaclass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BindableClass(metaclass=ClasscallMetaclass):
|
|
20
|
+
"""
|
|
21
|
+
Bindable classes.
|
|
22
|
+
|
|
23
|
+
This class implements a binding behavior for nested classes that
|
|
24
|
+
derive from it. Namely, if a nested class ``Outer.Inner`` derives
|
|
25
|
+
from ``BindableClass``, and if ``outer`` is an instance of
|
|
26
|
+
``Outer``, then ``outer.Inner(...)`` is equivalent to
|
|
27
|
+
``Outer.Inner(outer, ...)``.
|
|
28
|
+
|
|
29
|
+
EXAMPLES:
|
|
30
|
+
|
|
31
|
+
Let us consider the following class ``Outer`` with a nested class ``Inner``::
|
|
32
|
+
|
|
33
|
+
sage: from sage.misc.nested_class import NestedClassMetaclass
|
|
34
|
+
sage: class Outer(metaclass=NestedClassMetaclass):
|
|
35
|
+
....: class Inner:
|
|
36
|
+
....: def __init__(self, *args):
|
|
37
|
+
....: print(args)
|
|
38
|
+
....: def f(self, *args):
|
|
39
|
+
....: print("{} {}".format(self, args))
|
|
40
|
+
....: @staticmethod
|
|
41
|
+
....: def f_static(*args):
|
|
42
|
+
....: print(args)
|
|
43
|
+
|
|
44
|
+
sage: outer = Outer()
|
|
45
|
+
|
|
46
|
+
By default, when ``Inner`` is a class nested in ``Outer``,
|
|
47
|
+
accessing ``outer.Inner`` returns the ``Inner`` class as is::
|
|
48
|
+
|
|
49
|
+
sage: outer.Inner is Outer.Inner
|
|
50
|
+
True
|
|
51
|
+
|
|
52
|
+
In particular, ``outer`` is completely ignored in the following call::
|
|
53
|
+
|
|
54
|
+
sage: x = outer.Inner(1,2,3)
|
|
55
|
+
(1, 2, 3)
|
|
56
|
+
|
|
57
|
+
This is similar to what happens with a static method::
|
|
58
|
+
|
|
59
|
+
sage: outer.f_static(1,2,3)
|
|
60
|
+
(1, 2, 3)
|
|
61
|
+
|
|
62
|
+
In some cases, we would want instead ``Inner`` to receive ``outer``
|
|
63
|
+
as parameter, like in a usual method call::
|
|
64
|
+
|
|
65
|
+
sage: outer.f(1,2,3)
|
|
66
|
+
<__main__.Outer object at ...> (1, 2, 3)
|
|
67
|
+
|
|
68
|
+
To this end, ``outer.f`` returns a *bound method*::
|
|
69
|
+
|
|
70
|
+
sage: outer.f
|
|
71
|
+
<bound method Outer.f of <__main__.Outer object at ...>>
|
|
72
|
+
|
|
73
|
+
so that ``outer.f(1,2,3)`` is equivalent to::
|
|
74
|
+
|
|
75
|
+
sage: Outer.f(outer, 1,2,3)
|
|
76
|
+
<__main__.Outer object at ...> (1, 2, 3)
|
|
77
|
+
|
|
78
|
+
:class:`BindableClass` gives this binding behavior to all its subclasses::
|
|
79
|
+
|
|
80
|
+
sage: from sage.misc.bindable_class import BindableClass
|
|
81
|
+
sage: class Outer(metaclass=NestedClassMetaclass):
|
|
82
|
+
....: class Inner(BindableClass):
|
|
83
|
+
....: " some documentation "
|
|
84
|
+
....: def __init__(self, outer, *args):
|
|
85
|
+
....: print("{} {}".format(outer, args))
|
|
86
|
+
|
|
87
|
+
Calling ``Outer.Inner`` returns the (unbound) class as usual::
|
|
88
|
+
|
|
89
|
+
sage: Outer.Inner
|
|
90
|
+
<class '__main__.Outer.Inner'>
|
|
91
|
+
|
|
92
|
+
However, ``outer.Inner(1,2,3)`` is equivalent to ``Outer.Inner(outer, 1,2,3)``::
|
|
93
|
+
|
|
94
|
+
sage: outer = Outer()
|
|
95
|
+
sage: x = outer.Inner(1,2,3)
|
|
96
|
+
<__main__.Outer object at ...> (1, 2, 3)
|
|
97
|
+
|
|
98
|
+
To achieve this, ``outer.Inner`` returns (some sort of) bound class::
|
|
99
|
+
|
|
100
|
+
sage: outer.Inner
|
|
101
|
+
<bound class '__main__.Outer.Inner' of <__main__.Outer object at ...>>
|
|
102
|
+
|
|
103
|
+
.. NOTE::
|
|
104
|
+
|
|
105
|
+
This is not actually a class, but an instance of
|
|
106
|
+
:class:`functools.partial`::
|
|
107
|
+
|
|
108
|
+
sage: type(outer.Inner).mro()
|
|
109
|
+
[<class 'sage.misc.bindable_class.BoundClass'>,
|
|
110
|
+
<... 'functools.partial'>,
|
|
111
|
+
<... 'object'>]
|
|
112
|
+
|
|
113
|
+
Still, documentation works as usual::
|
|
114
|
+
|
|
115
|
+
sage: outer.Inner.__doc__
|
|
116
|
+
'...some documentation '
|
|
117
|
+
|
|
118
|
+
TESTS::
|
|
119
|
+
|
|
120
|
+
sage: from sage.misc.bindable_class import Outer
|
|
121
|
+
sage: TestSuite(Outer.Inner).run()
|
|
122
|
+
sage: outer = Outer()
|
|
123
|
+
sage: TestSuite(outer.Inner).run(skip=["_test_pickling"])
|
|
124
|
+
"""
|
|
125
|
+
@staticmethod
|
|
126
|
+
def __classget__(cls, instance, owner):
|
|
127
|
+
"""
|
|
128
|
+
Bind ``cls`` to ``instance``, returning a ``BoundClass``.
|
|
129
|
+
|
|
130
|
+
INPUT:
|
|
131
|
+
|
|
132
|
+
- ``instance`` -- an object of the outer class or ``None``
|
|
133
|
+
|
|
134
|
+
For technical details, see the Section :python:`Implementing Descriptor
|
|
135
|
+
<reference/datamodel.html#implementing-descriptors>` in the Python
|
|
136
|
+
reference manual.
|
|
137
|
+
|
|
138
|
+
EXAMPLES::
|
|
139
|
+
|
|
140
|
+
sage: from sage.misc.bindable_class import Outer
|
|
141
|
+
sage: Outer.Inner
|
|
142
|
+
<class 'sage.misc.bindable_class.Outer.Inner'>
|
|
143
|
+
sage: Outer().Inner
|
|
144
|
+
<bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
|
|
145
|
+
"""
|
|
146
|
+
if instance is None:
|
|
147
|
+
return cls
|
|
148
|
+
return BoundClass(cls, instance)
|
|
149
|
+
# We probably do not need to use sage_wraps, since
|
|
150
|
+
# sageinspect already supports partial functions
|
|
151
|
+
# return sage_wraps(cls)(BoundClass(cls, instance))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class BoundClass(functools.partial):
|
|
155
|
+
"""
|
|
156
|
+
TESTS::
|
|
157
|
+
|
|
158
|
+
sage: from sage.misc.sageinspect import *
|
|
159
|
+
sage: from sage.misc.bindable_class import Outer
|
|
160
|
+
sage: x = Outer()
|
|
161
|
+
sage: c = x.Inner; c
|
|
162
|
+
<bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
|
|
163
|
+
|
|
164
|
+
Introspection works, at least partially::
|
|
165
|
+
|
|
166
|
+
sage: sage_getdoc(c).strip()
|
|
167
|
+
'Some documentation for Outer.Inner'
|
|
168
|
+
sage: sage_getfile(c)
|
|
169
|
+
'.../sage/misc/bindable_class.py'
|
|
170
|
+
|
|
171
|
+
sage: c = x.Inner2
|
|
172
|
+
sage: sage_getdoc(c).strip()
|
|
173
|
+
'Some documentation for Inner2'
|
|
174
|
+
sage: sage_getsourcelines(c)
|
|
175
|
+
(['class Inner2(BindableClass):...], ...)
|
|
176
|
+
|
|
177
|
+
.. warning::
|
|
178
|
+
|
|
179
|
+
Since ``c`` is not a class (as tested by :func:`inspect.isclass`),
|
|
180
|
+
and has a ``__call__`` method, IPython's introspection
|
|
181
|
+
(with ``c?``) insists on showing not only its
|
|
182
|
+
documentation but also its class documentation and call
|
|
183
|
+
documentation (see :meth:`IPython.OInspect.Inspector.pdoc`)
|
|
184
|
+
if available.
|
|
185
|
+
|
|
186
|
+
Until a better approach is found, we reset the documentation
|
|
187
|
+
of :class:`BoundClass` below, and make an exception for
|
|
188
|
+
:meth:`__init__` to the strict rule that every method should
|
|
189
|
+
be doctested::
|
|
190
|
+
|
|
191
|
+
sage: c.__class__.__doc__
|
|
192
|
+
sage: c.__class__.__init__.__doc__
|
|
193
|
+
|
|
194
|
+
Make sure classes which inherit from :class:`functools.partial` have the correct
|
|
195
|
+
syntax, see :issue:`14748`::
|
|
196
|
+
|
|
197
|
+
sage: import warnings
|
|
198
|
+
sage: warnings.simplefilter('error', DeprecationWarning)
|
|
199
|
+
sage: import functools
|
|
200
|
+
sage: def f(x, y): return x^y
|
|
201
|
+
sage: g = functools.partial(f, 2, 3)
|
|
202
|
+
sage: g()
|
|
203
|
+
8
|
|
204
|
+
|
|
205
|
+
The following has correct syntax and no :class:`DeprecationWarning`::
|
|
206
|
+
|
|
207
|
+
sage: class mynewpartial(functools.partial):
|
|
208
|
+
....: def __init__(self, f, i, j):
|
|
209
|
+
....: functools.partial.__init__(self)
|
|
210
|
+
sage: g = mynewpartial(f, 2, 3)
|
|
211
|
+
sage: g()
|
|
212
|
+
8
|
|
213
|
+
"""
|
|
214
|
+
__doc__ = None # See warning above
|
|
215
|
+
|
|
216
|
+
def __init__(self, *args):
|
|
217
|
+
super().__init__()
|
|
218
|
+
self.__doc__ = self.func.__doc__
|
|
219
|
+
|
|
220
|
+
def __repr__(self):
|
|
221
|
+
"""
|
|
222
|
+
TESTS:
|
|
223
|
+
|
|
224
|
+
sage: from sage.misc.bindable_class import Outer
|
|
225
|
+
sage: x = Outer(); x
|
|
226
|
+
<sage.misc.bindable_class.Outer object at ...>
|
|
227
|
+
sage: x.Inner
|
|
228
|
+
<bound class 'sage.misc.bindable_class.Outer.Inner' of <sage.misc.bindable_class.Outer object at ...>>
|
|
229
|
+
"""
|
|
230
|
+
return "<bound %s of %s>" % (repr(self.func)[1:-1], self.args[0])
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
##############################################################################
|
|
234
|
+
# Test classes
|
|
235
|
+
##############################################################################
|
|
236
|
+
|
|
237
|
+
class Inner2(BindableClass):
|
|
238
|
+
"""
|
|
239
|
+
Some documentation for Inner2
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
# We need NestedClassMetaclass to work around a Python pickling bug
|
|
244
|
+
class Outer(metaclass=NestedClassMetaclass):
|
|
245
|
+
"""
|
|
246
|
+
A class with a bindable nested class, for testing purposes
|
|
247
|
+
"""
|
|
248
|
+
class Inner(BindableClass):
|
|
249
|
+
"""
|
|
250
|
+
Some documentation for Outer.Inner
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
Inner2 = Inner2
|
|
Binary file
|