Skip to content

Commit e5ee5d4

Browse files
Merge branch 'main' into l_function_name
2 parents 5af4b65 + c1bcf87 commit e5ee5d4

File tree

182 files changed

+4626
-2894
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+4626
-2894
lines changed

bin/all_rst_to_pxd.sh

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
if [ $# -eq 0 ]
6+
then
7+
echo "Usage: bin/all_rst_to_pxd.sh /path/to/flint/doc/source"
8+
exit 1
9+
fi
10+
11+
FLINT_DOC_DIR=$1
12+
13+
modules=(
14+
# "flint"
15+
"mpoly"
16+
# "thread_pool"
17+
# "machine_vectors"
18+
# "gr"
19+
# "gr_domains"
20+
# "gr_generic"
21+
# "gr_implementing"
22+
# "gr_mat"
23+
# "gr_mpoly"
24+
# "gr_poly"
25+
# "gr_special"
26+
# "gr_vec"
27+
"ulong_extras"
28+
"fmpz"
29+
# "fmpz_extras"
30+
"fmpz_factor"
31+
"fmpz_lll"
32+
"fmpz_mat"
33+
"fmpz_mpoly"
34+
"fmpz_mpoly_factor"
35+
"fmpz_mpoly_q"
36+
"fmpz_poly"
37+
"fmpz_poly_factor"
38+
# "fmpz_poly_mat"
39+
# "fmpz_poly_q"
40+
"fmpz_vec"
41+
# "long_extras"
42+
# "longlong"
43+
# "mpn_extras"
44+
# "aprcl"
45+
"arith"
46+
# "fft"
47+
# "fft_small"
48+
# "qsieve"
49+
"fmpq"
50+
"fmpq_mat"
51+
"fmpq_mpoly"
52+
"fmpq_mpoly_factor"
53+
"fmpq_poly"
54+
"fmpq_vec"
55+
"nmod"
56+
"nmod_mat"
57+
"nmod_mpoly"
58+
"nmod_mpoly_factor"
59+
"nmod_poly"
60+
"nmod_poly_factor"
61+
# "nmod_poly_mat"
62+
"nmod_vec"
63+
# "mpn_mod"
64+
"fmpz_mod"
65+
"fmpz_mod_mat"
66+
"fmpz_mod_mpoly"
67+
"fmpz_mod_mpoly_factor"
68+
"fmpz_mod_poly"
69+
"fmpz_mod_poly_factor"
70+
"fmpz_mod_vec"
71+
"dirichlet"
72+
# "dlog"
73+
# "bool_mat"
74+
# "perm"
75+
# "qfb"
76+
# "nf"
77+
# "nf_elem"
78+
# "fmpzi"
79+
# "qqbar"
80+
"mag"
81+
# "nfloat"
82+
"arf"
83+
# "acf"
84+
"arb"
85+
# "arb_calc"
86+
"arb_fmpz_poly"
87+
# "arb_fpwrap"
88+
"arb_hypgeom"
89+
"arb_mat"
90+
"arb_poly"
91+
"acb"
92+
"acb_calc"
93+
"acb_dft"
94+
"acb_dirichlet"
95+
"acb_elliptic"
96+
"acb_hypgeom"
97+
"acb_mat"
98+
"acb_modular"
99+
"acb_poly"
100+
"acb_theta"
101+
"bernoulli"
102+
# "hypgeom"
103+
"partitions"
104+
# "ca"
105+
# "ca_ext"
106+
# "ca_field"
107+
# "ca_mat"
108+
# "ca_poly"
109+
# "ca_vec"
110+
# "calcium"
111+
# "fexpr"
112+
# "fexpr_builtin"
113+
"fq"
114+
# "fq_embed"
115+
"fq_mat"
116+
"fq_poly"
117+
"fq_poly_factor"
118+
# "fq_vec"
119+
"fq_nmod"
120+
# "fq_nmod_embed"
121+
"fq_nmod_mat"
122+
# "fq_nmod_mpoly"
123+
# "fq_nmod_mpoly_factor"
124+
"fq_nmod_poly"
125+
"fq_nmod_poly_factor"
126+
# "fq_nmod_vec"
127+
"fq_zech"
128+
# "fq_zech_embed"
129+
"fq_zech_mat"
130+
"fq_zech_poly"
131+
"fq_zech_poly_factor"
132+
# "fq_zech_vec"
133+
"fq_default"
134+
"fq_default_mat"
135+
"fq_default_poly"
136+
"fq_default_poly_factor"
137+
# "padic"
138+
# "padic_mat"
139+
# "padic_poly"
140+
# "qadic"
141+
# "double_extras"
142+
# "double_interval"
143+
# "d_mat"
144+
# "d_vec"
145+
# "mpfr_mat"
146+
# "mpfr_vec"
147+
)
148+
149+
for module in ${modules[@]}; do
150+
echo "Processing $module"
151+
bin/rst_to_pxd.py flint/$module \
152+
--flint-doc-dir=$FLINT_DOC_DIR \
153+
> src/flint/flintlib/functions/$module.pxd
154+
done

bin/rst_to_pxd.py

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,16 @@
4040
# recognize a function definition in rst
4141
is_func = re.compile(r"\.\.( )+(c:)?function( )*::")
4242
# rename types to avoid python -- c name collisions
43-
rename_types = [(re.compile(r"\bfmpz\b"),"fmpz_struct"),(re.compile(r"\bfmpq\b"), "fmpq_struct")]
43+
rename_types = [
44+
(re.compile(r"\bfmpz\b"),"fmpz_struct"),
45+
(re.compile(r"\bfmpq\b"), "fmpq_struct"),
46+
(re.compile(r"\bin\b"), "in_"),
47+
(re.compile(r"\blambda\b"), "lambda_"),
48+
]
4449
# comment out functions which use these types
4550
comment_types = re.compile(r"(\bFILE\b)|(\bmpz_t\b)|(\bmpq_t\b)")
4651
comment_set = set(["FILE", "mpz_t", "mpq_t"])
47-
c_types = set(["char", "short", "long", "int", "float", "double"])
52+
c_types = set(["void", "char", "short", "long", "int", "float", "double"])
4853
type_modifers = re.compile(r"\*|(\bconst\b)|(\bunsigned\b)|(\bsigned\b)")
4954
import_dict = {}
5055

@@ -57,8 +62,14 @@ def get_cython_struct_types(file):
5762
l = line.strip()
5863
if l[:8] == "ctypedef":
5964
if l[-1] == ']':
65+
# ctypedef foo foo_t[0]
6066
l = l[:l.rfind('[')]
67+
elif '(' in l:
68+
# ctypedef int (*foo_func)(...)
69+
l = l[l.index('('):].lstrip('(*')
70+
l = l[:l.index(')')]
6171
else:
72+
# ctypedef foo:
6273
l = l.strip(':')
6374
ret.append(l.split()[-1])
6475
return ret
@@ -67,25 +78,30 @@ def fill_import_dict(pyflintlibdir):
6778
"""
6879
Get a map from cython structs to the pxd that defines them
6980
"""
70-
with os.scandir(pyflintlibdir) as entry:
81+
import_dict['fmpq_struct'] = 'types.fmpq'
82+
83+
with os.scandir(pyflintlibdir + '/types') as entry:
7184
for f in entry:
7285
if fnmatch.fnmatch(f.name, "*.pxd"):
7386
with open(f.path) as pxd:
7487
for t in get_cython_struct_types(pxd):
75-
import_dict[t] = f.name.split('.')[0]
88+
import_dict[t] = 'types.' + f.name.split('.')[0]
7689

7790
def undecorate(str):
7891
"""
7992
remove variable name, const, ``*``, etc. to just get types
8093
"""
8194
ret = str.strip()
82-
ret = ret[:ret.rfind(' ')]
83-
ret = re.sub(type_modifers, '', ret)
84-
return ret.strip()
95+
if ' ' in ret:
96+
ret = ret[:ret.rfind(' ')]
97+
ret = re.sub(type_modifers, '', ret).strip()
98+
return ret
8599

86100
def get_parameter_types(str):
87101
params = str[str.find("(") + 1 : str.rfind(")")].split(",")
88-
return [undecorate(s) for s in params]
102+
ret_type = str.split('(')[0].rsplit(' ', 1)[0]
103+
params.append(ret_type)
104+
return [undecorate(s) for s in params if s]
89105

90106
def clean_types(function):
91107
ret = function.strip()
@@ -98,8 +114,15 @@ def get_functions(file):
98114
Get a list of functions from an rst file
99115
"""
100116
ret = []
117+
macros = []
101118
in_list = False
102119
for line in file:
120+
# Keep track of the macros
121+
# We want to give them types in cython...
122+
if line.startswith('.. macro'):
123+
macros.append(line.strip())
124+
continue
125+
103126
m = is_func.match(line)
104127
if m:
105128
ret.append( clean_types(line[m.end():]))
@@ -110,7 +133,7 @@ def get_functions(file):
110133
in_list = False
111134
else:
112135
ret.append(clean_types(line))
113-
return ret
136+
return ret, macros
114137

115138
def get_all_types(function_list):
116139
ret = set()
@@ -119,6 +142,11 @@ def get_all_types(function_list):
119142
ret.add(t)
120143
return ret
121144

145+
146+
def has_types(line, types):
147+
return any(t in types for t in get_parameter_types(line))
148+
149+
122150
def gen_imports(function_list):
123151
"""
124152
Generate import statements for known functions.
@@ -132,10 +160,12 @@ def gen_imports(function_list):
132160
imports[import_dict[t]].append(t)
133161
else:
134162
ret.add(t)
135-
for k,v in imports.items():
136-
types = ", ".join(v)
163+
for k,v in sorted(imports.items()):
164+
types = ", ".join(sorted(v))
137165
print("from flint.flintlib." + k + " cimport " + types)
138-
return ret
166+
return sorted(ret)
167+
168+
139169

140170
def generate_pxd_file(h_name, opts):
141171
fill_import_dict(opts.flint_lib_dir)
@@ -146,14 +176,18 @@ def generate_pxd_file(h_name, opts):
146176
docdir = opts.flint_doc_dir
147177
name = name[6:]
148178
with open(os.path.join(docdir, name + ".rst")) as f:
149-
l = get_functions(f)
150-
s = gen_imports(l)
179+
l, macros = get_functions(f)
180+
unknown_types = gen_imports(l)
181+
print()
182+
for t in unknown_types:
183+
print("# unknown type " + t)
151184
print()
152-
print ("\n# unimported types ", s - comment_set)
185+
for m in macros:
186+
print("# " + m)
153187
print()
154188
print(r'cdef extern from "' + h_name +r'.h":')
155189
for f in l:
156-
if comment_types.search(f):
190+
if has_types(f, unknown_types):
157191
print(" # " + f)
158192
else:
159193
print(" " + f)

doc/source/fmpq_mpoly.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
**fmpq_mpoly** -- multivariate polynomials over the rational numbers
2+
===============================================================================
3+
4+
.. autoclass :: flint.fmpq_mpoly_ctx
5+
:members:
6+
:inherited-members:
7+
:undoc-members:
8+
9+
.. autoclass :: flint.fmpq_mpoly
10+
:members:
11+
:inherited-members:
12+
:undoc-members:
13+
14+
.. autoclass :: flint.fmpq_mpoly_vec
15+
:members:
16+
:inherited-members:
17+
:undoc-members:
18+

doc/source/fmpz_mod_mpoly.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
**fmpz_mod_mpoly** -- multivariate polynomials over the integers mod n
2+
===============================================================================
3+
4+
.. autoclass :: flint.fmpz_mod_mpoly_ctx
5+
:members:
6+
:inherited-members:
7+
:undoc-members:
8+
9+
.. autoclass :: flint.fmpz_mod_mpoly
10+
:members:
11+
:inherited-members:
12+
:undoc-members:
13+
14+
.. autoclass :: flint.fmpz_mod_mpoly_vec
15+
:members:
16+
:inherited-members:
17+
:undoc-members:
18+

doc/source/fmpz_mpoly.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
**fmpz_mpoly** -- multivariate polynomials over the integers
2+
===============================================================================
3+
4+
.. autoclass :: flint.fmpz_mpoly_ctx
5+
:members:
6+
:inherited-members:
7+
:undoc-members:
8+
9+
.. autoclass :: flint.fmpz_mpoly
10+
:members:
11+
:inherited-members:
12+
:undoc-members:
13+
14+
.. autoclass :: flint.fmpz_mpoly_vec
15+
:members:
16+
:inherited-members:
17+
:undoc-members:
18+

doc/source/index.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,13 @@ Polynomial types
7373
:maxdepth: 1
7474

7575
fmpz_poly.rst
76+
fmpz_mpoly.rst
7677
fmpq_poly.rst
78+
fmpq_mpoly.rst
7779
nmod_poly.rst
80+
nmod_mpoly.rst
7881
fmpz_mod_poly.rst
82+
fmpz_mod_mpoly.rst
7983
fq_default_poly.rst
8084
arb_poly.rst
8185
acb_poly.rst

doc/source/nmod_mpoly.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
**nmod_mpoly** -- multivariate polynomials over the integers mod n (word-size n)
2+
===============================================================================
3+
4+
.. autoclass :: flint.nmod_mpoly_ctx
5+
:members:
6+
:inherited-members:
7+
:undoc-members:
8+
9+
.. autoclass :: flint.nmod_mpoly
10+
:members:
11+
:inherited-members:
12+
:undoc-members:
13+
14+
.. autoclass :: flint.nmod_mpoly_vec
15+
:members:
16+
:inherited-members:
17+
:undoc-members:
18+

0 commit comments

Comments
 (0)