Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/numpy/f2py/func2subr.py
7757 views
#!/usr/bin/env python31"""23Rules for building C/API module with f2py2e.45Copyright 1999,2000 Pearu Peterson all rights reserved,6Pearu Peterson <[email protected]>7Permission to use, modify, and distribute this software is given under the8terms of the NumPy License.910NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.11$Date: 2004/11/26 11:13:06 $12Pearu Peterson1314"""15__version__ = "$Revision: 1.16 $"[10:-1]1617f2py_version = 'See `f2py -v`'1819import copy2021from .auxfuncs import (22getfortranname, isexternal, isfunction, isfunction_wrap, isintent_in,23isintent_out, islogicalfunction, ismoduleroutine, isscalar,24issubroutine, issubroutine_wrap, outmess, show25)262728def var2fixfortran(vars, a, fa=None, f90mode=None):29if fa is None:30fa = a31if a not in vars:32show(vars)33outmess('var2fixfortran: No definition for argument "%s".\n' % a)34return ''35if 'typespec' not in vars[a]:36show(vars[a])37outmess('var2fixfortran: No typespec for argument "%s".\n' % a)38return ''39vardef = vars[a]['typespec']40if vardef == 'type' and 'typename' in vars[a]:41vardef = '%s(%s)' % (vardef, vars[a]['typename'])42selector = {}43lk = ''44if 'kindselector' in vars[a]:45selector = vars[a]['kindselector']46lk = 'kind'47elif 'charselector' in vars[a]:48selector = vars[a]['charselector']49lk = 'len'50if '*' in selector:51if f90mode:52if selector['*'] in ['*', ':', '(*)']:53vardef = '%s(len=*)' % (vardef)54else:55vardef = '%s(%s=%s)' % (vardef, lk, selector['*'])56else:57if selector['*'] in ['*', ':']:58vardef = '%s*(%s)' % (vardef, selector['*'])59else:60vardef = '%s*%s' % (vardef, selector['*'])61else:62if 'len' in selector:63vardef = '%s(len=%s' % (vardef, selector['len'])64if 'kind' in selector:65vardef = '%s,kind=%s)' % (vardef, selector['kind'])66else:67vardef = '%s)' % (vardef)68elif 'kind' in selector:69vardef = '%s(kind=%s)' % (vardef, selector['kind'])7071vardef = '%s %s' % (vardef, fa)72if 'dimension' in vars[a]:73vardef = '%s(%s)' % (vardef, ','.join(vars[a]['dimension']))74return vardef757677def createfuncwrapper(rout, signature=0):78assert isfunction(rout)7980extra_args = []81vars = rout['vars']82for a in rout['args']:83v = rout['vars'][a]84for i, d in enumerate(v.get('dimension', [])):85if d == ':':86dn = 'f2py_%s_d%s' % (a, i)87dv = dict(typespec='integer', intent=['hide'])88dv['='] = 'shape(%s, %s)' % (a, i)89extra_args.append(dn)90vars[dn] = dv91v['dimension'][i] = dn92rout['args'].extend(extra_args)93need_interface = bool(extra_args)9495ret = ['']9697def add(line, ret=ret):98ret[0] = '%s\n %s' % (ret[0], line)99name = rout['name']100fortranname = getfortranname(rout)101f90mode = ismoduleroutine(rout)102newname = '%sf2pywrap' % (name)103104if newname not in vars:105vars[newname] = vars[name]106args = [newname] + rout['args'][1:]107else:108args = [newname] + rout['args']109110l = var2fixfortran(vars, name, newname, f90mode)111if l[:13] == 'character*(*)':112if f90mode:113l = 'character(len=10)' + l[13:]114else:115l = 'character*10' + l[13:]116charselect = vars[name]['charselector']117if charselect.get('*', '') == '(*)':118charselect['*'] = '10'119sargs = ', '.join(args)120if f90mode:121add('subroutine f2pywrap_%s_%s (%s)' %122(rout['modulename'], name, sargs))123if not signature:124add('use %s, only : %s' % (rout['modulename'], fortranname))125else:126add('subroutine f2pywrap%s (%s)' % (name, sargs))127if not need_interface:128add('external %s' % (fortranname))129l = l + ', ' + fortranname130if need_interface:131for line in rout['saved_interface'].split('\n'):132if line.lstrip().startswith('use ') and '__user__' not in line:133add(line)134135args = args[1:]136dumped_args = []137for a in args:138if isexternal(vars[a]):139add('external %s' % (a))140dumped_args.append(a)141for a in args:142if a in dumped_args:143continue144if isscalar(vars[a]):145add(var2fixfortran(vars, a, f90mode=f90mode))146dumped_args.append(a)147for a in args:148if a in dumped_args:149continue150if isintent_in(vars[a]):151add(var2fixfortran(vars, a, f90mode=f90mode))152dumped_args.append(a)153for a in args:154if a in dumped_args:155continue156add(var2fixfortran(vars, a, f90mode=f90mode))157158add(l)159160if need_interface:161if f90mode:162# f90 module already defines needed interface163pass164else:165add('interface')166add(rout['saved_interface'].lstrip())167add('end interface')168169sargs = ', '.join([a for a in args if a not in extra_args])170171if not signature:172if islogicalfunction(rout):173add('%s = .not.(.not.%s(%s))' % (newname, fortranname, sargs))174else:175add('%s = %s(%s)' % (newname, fortranname, sargs))176if f90mode:177add('end subroutine f2pywrap_%s_%s' % (rout['modulename'], name))178else:179add('end')180return ret[0]181182183def createsubrwrapper(rout, signature=0):184assert issubroutine(rout)185186extra_args = []187vars = rout['vars']188for a in rout['args']:189v = rout['vars'][a]190for i, d in enumerate(v.get('dimension', [])):191if d == ':':192dn = 'f2py_%s_d%s' % (a, i)193dv = dict(typespec='integer', intent=['hide'])194dv['='] = 'shape(%s, %s)' % (a, i)195extra_args.append(dn)196vars[dn] = dv197v['dimension'][i] = dn198rout['args'].extend(extra_args)199need_interface = bool(extra_args)200201ret = ['']202203def add(line, ret=ret):204ret[0] = '%s\n %s' % (ret[0], line)205name = rout['name']206fortranname = getfortranname(rout)207f90mode = ismoduleroutine(rout)208209args = rout['args']210211sargs = ', '.join(args)212if f90mode:213add('subroutine f2pywrap_%s_%s (%s)' %214(rout['modulename'], name, sargs))215if not signature:216add('use %s, only : %s' % (rout['modulename'], fortranname))217else:218add('subroutine f2pywrap%s (%s)' % (name, sargs))219if not need_interface:220add('external %s' % (fortranname))221222if need_interface:223for line in rout['saved_interface'].split('\n'):224if line.lstrip().startswith('use ') and '__user__' not in line:225add(line)226227dumped_args = []228for a in args:229if isexternal(vars[a]):230add('external %s' % (a))231dumped_args.append(a)232for a in args:233if a in dumped_args:234continue235if isscalar(vars[a]):236add(var2fixfortran(vars, a, f90mode=f90mode))237dumped_args.append(a)238for a in args:239if a in dumped_args:240continue241add(var2fixfortran(vars, a, f90mode=f90mode))242243if need_interface:244if f90mode:245# f90 module already defines needed interface246pass247else:248add('interface')249for line in rout['saved_interface'].split('\n'):250if line.lstrip().startswith('use ') and '__user__' in line:251continue252add(line)253add('end interface')254255sargs = ', '.join([a for a in args if a not in extra_args])256257if not signature:258add('call %s(%s)' % (fortranname, sargs))259if f90mode:260add('end subroutine f2pywrap_%s_%s' % (rout['modulename'], name))261else:262add('end')263return ret[0]264265266def assubr(rout):267if isfunction_wrap(rout):268fortranname = getfortranname(rout)269name = rout['name']270outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n' % (271name, fortranname))272rout = copy.copy(rout)273fname = name274rname = fname275if 'result' in rout:276rname = rout['result']277rout['vars'][fname] = rout['vars'][rname]278fvar = rout['vars'][fname]279if not isintent_out(fvar):280if 'intent' not in fvar:281fvar['intent'] = []282fvar['intent'].append('out')283flag = 1284for i in fvar['intent']:285if i.startswith('out='):286flag = 0287break288if flag:289fvar['intent'].append('out=%s' % (rname))290rout['args'][:] = [fname] + rout['args']291return rout, createfuncwrapper(rout)292if issubroutine_wrap(rout):293fortranname = getfortranname(rout)294name = rout['name']295outmess('\t\tCreating wrapper for Fortran subroutine "%s"("%s")...\n' % (296name, fortranname))297rout = copy.copy(rout)298return rout, createsubrwrapper(rout)299return rout, ''300301302