Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/numpy/f2py/func2subr.py
7757 views
1
#!/usr/bin/env python3
2
"""
3
4
Rules for building C/API module with f2py2e.
5
6
Copyright 1999,2000 Pearu Peterson all rights reserved,
7
Pearu Peterson <[email protected]>
8
Permission to use, modify, and distribute this software is given under the
9
terms of the NumPy License.
10
11
NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
12
$Date: 2004/11/26 11:13:06 $
13
Pearu Peterson
14
15
"""
16
__version__ = "$Revision: 1.16 $"[10:-1]
17
18
f2py_version = 'See `f2py -v`'
19
20
import copy
21
22
from .auxfuncs import (
23
getfortranname, isexternal, isfunction, isfunction_wrap, isintent_in,
24
isintent_out, islogicalfunction, ismoduleroutine, isscalar,
25
issubroutine, issubroutine_wrap, outmess, show
26
)
27
28
29
def var2fixfortran(vars, a, fa=None, f90mode=None):
30
if fa is None:
31
fa = a
32
if a not in vars:
33
show(vars)
34
outmess('var2fixfortran: No definition for argument "%s".\n' % a)
35
return ''
36
if 'typespec' not in vars[a]:
37
show(vars[a])
38
outmess('var2fixfortran: No typespec for argument "%s".\n' % a)
39
return ''
40
vardef = vars[a]['typespec']
41
if vardef == 'type' and 'typename' in vars[a]:
42
vardef = '%s(%s)' % (vardef, vars[a]['typename'])
43
selector = {}
44
lk = ''
45
if 'kindselector' in vars[a]:
46
selector = vars[a]['kindselector']
47
lk = 'kind'
48
elif 'charselector' in vars[a]:
49
selector = vars[a]['charselector']
50
lk = 'len'
51
if '*' in selector:
52
if f90mode:
53
if selector['*'] in ['*', ':', '(*)']:
54
vardef = '%s(len=*)' % (vardef)
55
else:
56
vardef = '%s(%s=%s)' % (vardef, lk, selector['*'])
57
else:
58
if selector['*'] in ['*', ':']:
59
vardef = '%s*(%s)' % (vardef, selector['*'])
60
else:
61
vardef = '%s*%s' % (vardef, selector['*'])
62
else:
63
if 'len' in selector:
64
vardef = '%s(len=%s' % (vardef, selector['len'])
65
if 'kind' in selector:
66
vardef = '%s,kind=%s)' % (vardef, selector['kind'])
67
else:
68
vardef = '%s)' % (vardef)
69
elif 'kind' in selector:
70
vardef = '%s(kind=%s)' % (vardef, selector['kind'])
71
72
vardef = '%s %s' % (vardef, fa)
73
if 'dimension' in vars[a]:
74
vardef = '%s(%s)' % (vardef, ','.join(vars[a]['dimension']))
75
return vardef
76
77
78
def createfuncwrapper(rout, signature=0):
79
assert isfunction(rout)
80
81
extra_args = []
82
vars = rout['vars']
83
for a in rout['args']:
84
v = rout['vars'][a]
85
for i, d in enumerate(v.get('dimension', [])):
86
if d == ':':
87
dn = 'f2py_%s_d%s' % (a, i)
88
dv = dict(typespec='integer', intent=['hide'])
89
dv['='] = 'shape(%s, %s)' % (a, i)
90
extra_args.append(dn)
91
vars[dn] = dv
92
v['dimension'][i] = dn
93
rout['args'].extend(extra_args)
94
need_interface = bool(extra_args)
95
96
ret = ['']
97
98
def add(line, ret=ret):
99
ret[0] = '%s\n %s' % (ret[0], line)
100
name = rout['name']
101
fortranname = getfortranname(rout)
102
f90mode = ismoduleroutine(rout)
103
newname = '%sf2pywrap' % (name)
104
105
if newname not in vars:
106
vars[newname] = vars[name]
107
args = [newname] + rout['args'][1:]
108
else:
109
args = [newname] + rout['args']
110
111
l = var2fixfortran(vars, name, newname, f90mode)
112
if l[:13] == 'character*(*)':
113
if f90mode:
114
l = 'character(len=10)' + l[13:]
115
else:
116
l = 'character*10' + l[13:]
117
charselect = vars[name]['charselector']
118
if charselect.get('*', '') == '(*)':
119
charselect['*'] = '10'
120
sargs = ', '.join(args)
121
if f90mode:
122
add('subroutine f2pywrap_%s_%s (%s)' %
123
(rout['modulename'], name, sargs))
124
if not signature:
125
add('use %s, only : %s' % (rout['modulename'], fortranname))
126
else:
127
add('subroutine f2pywrap%s (%s)' % (name, sargs))
128
if not need_interface:
129
add('external %s' % (fortranname))
130
l = l + ', ' + fortranname
131
if need_interface:
132
for line in rout['saved_interface'].split('\n'):
133
if line.lstrip().startswith('use ') and '__user__' not in line:
134
add(line)
135
136
args = args[1:]
137
dumped_args = []
138
for a in args:
139
if isexternal(vars[a]):
140
add('external %s' % (a))
141
dumped_args.append(a)
142
for a in args:
143
if a in dumped_args:
144
continue
145
if isscalar(vars[a]):
146
add(var2fixfortran(vars, a, f90mode=f90mode))
147
dumped_args.append(a)
148
for a in args:
149
if a in dumped_args:
150
continue
151
if isintent_in(vars[a]):
152
add(var2fixfortran(vars, a, f90mode=f90mode))
153
dumped_args.append(a)
154
for a in args:
155
if a in dumped_args:
156
continue
157
add(var2fixfortran(vars, a, f90mode=f90mode))
158
159
add(l)
160
161
if need_interface:
162
if f90mode:
163
# f90 module already defines needed interface
164
pass
165
else:
166
add('interface')
167
add(rout['saved_interface'].lstrip())
168
add('end interface')
169
170
sargs = ', '.join([a for a in args if a not in extra_args])
171
172
if not signature:
173
if islogicalfunction(rout):
174
add('%s = .not.(.not.%s(%s))' % (newname, fortranname, sargs))
175
else:
176
add('%s = %s(%s)' % (newname, fortranname, sargs))
177
if f90mode:
178
add('end subroutine f2pywrap_%s_%s' % (rout['modulename'], name))
179
else:
180
add('end')
181
return ret[0]
182
183
184
def createsubrwrapper(rout, signature=0):
185
assert issubroutine(rout)
186
187
extra_args = []
188
vars = rout['vars']
189
for a in rout['args']:
190
v = rout['vars'][a]
191
for i, d in enumerate(v.get('dimension', [])):
192
if d == ':':
193
dn = 'f2py_%s_d%s' % (a, i)
194
dv = dict(typespec='integer', intent=['hide'])
195
dv['='] = 'shape(%s, %s)' % (a, i)
196
extra_args.append(dn)
197
vars[dn] = dv
198
v['dimension'][i] = dn
199
rout['args'].extend(extra_args)
200
need_interface = bool(extra_args)
201
202
ret = ['']
203
204
def add(line, ret=ret):
205
ret[0] = '%s\n %s' % (ret[0], line)
206
name = rout['name']
207
fortranname = getfortranname(rout)
208
f90mode = ismoduleroutine(rout)
209
210
args = rout['args']
211
212
sargs = ', '.join(args)
213
if f90mode:
214
add('subroutine f2pywrap_%s_%s (%s)' %
215
(rout['modulename'], name, sargs))
216
if not signature:
217
add('use %s, only : %s' % (rout['modulename'], fortranname))
218
else:
219
add('subroutine f2pywrap%s (%s)' % (name, sargs))
220
if not need_interface:
221
add('external %s' % (fortranname))
222
223
if need_interface:
224
for line in rout['saved_interface'].split('\n'):
225
if line.lstrip().startswith('use ') and '__user__' not in line:
226
add(line)
227
228
dumped_args = []
229
for a in args:
230
if isexternal(vars[a]):
231
add('external %s' % (a))
232
dumped_args.append(a)
233
for a in args:
234
if a in dumped_args:
235
continue
236
if isscalar(vars[a]):
237
add(var2fixfortran(vars, a, f90mode=f90mode))
238
dumped_args.append(a)
239
for a in args:
240
if a in dumped_args:
241
continue
242
add(var2fixfortran(vars, a, f90mode=f90mode))
243
244
if need_interface:
245
if f90mode:
246
# f90 module already defines needed interface
247
pass
248
else:
249
add('interface')
250
for line in rout['saved_interface'].split('\n'):
251
if line.lstrip().startswith('use ') and '__user__' in line:
252
continue
253
add(line)
254
add('end interface')
255
256
sargs = ', '.join([a for a in args if a not in extra_args])
257
258
if not signature:
259
add('call %s(%s)' % (fortranname, sargs))
260
if f90mode:
261
add('end subroutine f2pywrap_%s_%s' % (rout['modulename'], name))
262
else:
263
add('end')
264
return ret[0]
265
266
267
def assubr(rout):
268
if isfunction_wrap(rout):
269
fortranname = getfortranname(rout)
270
name = rout['name']
271
outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n' % (
272
name, fortranname))
273
rout = copy.copy(rout)
274
fname = name
275
rname = fname
276
if 'result' in rout:
277
rname = rout['result']
278
rout['vars'][fname] = rout['vars'][rname]
279
fvar = rout['vars'][fname]
280
if not isintent_out(fvar):
281
if 'intent' not in fvar:
282
fvar['intent'] = []
283
fvar['intent'].append('out')
284
flag = 1
285
for i in fvar['intent']:
286
if i.startswith('out='):
287
flag = 0
288
break
289
if flag:
290
fvar['intent'].append('out=%s' % (rname))
291
rout['args'][:] = [fname] + rout['args']
292
return rout, createfuncwrapper(rout)
293
if issubroutine_wrap(rout):
294
fortranname = getfortranname(rout)
295
name = rout['name']
296
outmess('\t\tCreating wrapper for Fortran subroutine "%s"("%s")...\n' % (
297
name, fortranname))
298
rout = copy.copy(rout)
299
return rout, createsubrwrapper(rout)
300
return rout, ''
301
302